GitHub - xnodeoncode/i45-sample-data: Sample datasets for testing and development
A library of sample datasets that can be used during testing and development. Fully typed with TypeScript definitions included.
Installation
npm i i45-sample-data --save-dev
Features
- ✅ Fully TypeScript supported with comprehensive type definitions
- ✅ ES Modules (ESM) support
- ✅ Tree-shakeable exports with individual imports
- ✅ Zero dependencies for production
- ✅ 18+ dataset types with proper interfaces
- ✅ Optimized bundle size - import only what you need
Bundle Size
The package is optimized for tree-shaking to minimize your production bundle:
// ⚠️ Full import - bundles all datasets (~40-50KB minified) import { SampleData } from "i45-sample-data"; // ✅ Tree-shakeable - only bundles what you use (~2-10KB each) import { Books } from "i45-sample-data/collections"; import { Astronomy } from "i45-sample-data/lists"; import { DataHelpers } from "i45-sample-data/helpers";
Tips for minimal bundle size:
- Use individual imports (
/collections,/lists, etc.) instead of the main entry point - Only import the datasets you actually use
- Helper methods add ~2KB when imported
Package marked with sideEffects: false for optimal tree-shaking with modern bundlers (webpack, Rollup, Vite, esbuild).
Usage
Standard Import (Full Library)
import { SampleData } from "i45-sample-data"; // Lists - Simple string arrays console.log("Astronomy", SampleData.Lists.Astronomy); console.log("States", SampleData.Lists.States); // Dictionaries - Key-value pairs console.log("States", SampleData.Dictionaries.States); console.log("Countries", SampleData.Dictionaries.Countries); // Collections - Arrays of objects console.log("Books", SampleData.Collections.Books); console.log("Students", SampleData.Collections.Students); console.log("Countries", SampleData.Collections.Countries); console.log("TriviaQuestions", SampleData.Collections.TriviaQuestions); console.log("Albums", SampleData.Collections.Albums); console.log("Songs", SampleData.Collections.Songs); console.log("Players", SampleData.Collections.Players); console.log("Recipes", SampleData.Collections.Recipes); console.log("States", SampleData.Collections.States); console.log("DailyWeather", SampleData.Collections.DailyWeather); // Objects - Structured data console.log("KeyCodes", SampleData.Objects.KeyCodes); console.log("States", SampleData.Objects.States); console.log("Movies", SampleData.Objects.Movies);
Tree-Shakeable Imports (Optimized Bundle Size)
Import only the datasets you need to minimize your bundle size:
// Import specific collections import { Books, TriviaQuestions, Students } from "i45-sample-data/collections"; // Import specific lists import { Astronomy, States } from "i45-sample-data/lists"; // Import specific dictionaries import { Countries } from "i45-sample-data/dictionaries"; // Import specific objects import { KeyCodes, Movies } from "i45-sample-data/objects"; console.log("Books:", Books); console.log("Astronomy:", Astronomy);
TypeScript with Tree-Shaking
import { Books, type Book } from "i45-sample-data/collections"; import { Astronomy } from "i45-sample-data/lists"; // Type-safe access with minimal bundle size const books: Book[] = Books; const astronomyTerms: string[] = Astronomy; console.log(books[0].title);
TypeScript (Standard Import)
import { SampleData } from "i45-sample-data"; // Lists - Simple string arrays console.log("Astronomy", SampleData.Lists.Astronomy); console.log("States", SampleData.Lists.States); // Dictionaries - Key-value pairs console.log("States", SampleData.Dictionaries.States); console.log("Countries", SampleData.Dictionaries.Countries); // Collections - Arrays of objects console.log("Books", SampleData.Collections.Books); console.log("Students", SampleData.Collections.Students); console.log("Countries", SampleData.Collections.Countries); console.log("TriviaQuestions", SampleData.Collections.TriviaQuestions); console.log("Albums", SampleData.Collections.Albums); console.log("Songs", SampleData.Collections.Songs); console.log("Players", SampleData.Collections.Players); console.log("Recipes", SampleData.Collections.Recipes); console.log("States", SampleData.Collections.States); console.log("DailyWeather", SampleData.Collections.DailyWeather); // Objects - Structured data console.log("KeyCodes", SampleData.Objects.KeyCodes); console.log("States", SampleData.Objects.States); console.log("Movies", SampleData.Objects.Movies);
TypeScript
import { SampleData, type Book, type TriviaQuestion, type Student, } from "i45-sample-data"; // Type-safe access to data const books: Book[] = SampleData.Collections.Books; const firstBook: Book = books[0]; // Intellisense works perfectly console.log(firstBook.title, firstBook.author, firstBook.isbn); // Type-safe function parameters function displayQuestion(question: TriviaQuestion): void { console.log(`${question.category}: ${question.question}`); console.log(`Difficulty: ${question.difficulty}`); } // Generic fetch with type parameter type ApiResponse = { data: Student[] }; const result = await SampleData.fetch<ApiResponse>( "https://api.example.com/students" );
Helper Methods
SampleData Helper Methods
Convenience methods for working with sample data:
import { SampleData } from "i45-sample-data"; // Get a random book const randomBook = SampleData.random(SampleData.Collections.Books); // Get 3 random trivia questions const questions = SampleData.randomMultiple( SampleData.Collections.TriviaQuestions, 3 ); // Shuffle the states list const shuffledStates = SampleData.shuffle(SampleData.Lists.States);
DataHelpers for Advanced Manipulation
Import DataHelpers for advanced data manipulation utilities:
import { TriviaQuestions, Books } from "i45-sample-data/collections"; import { DataHelpers } from "i45-sample-data/helpers"; // Filter by difficulty const easyQuestions = DataHelpers.filterBy( TriviaQuestions, "difficulty", "easy" ); // Filter with custom function const intermediateQuestions = DataHelpers.filterWhere( TriviaQuestions, (i) => i.difficulty == "easy" || i.difficulty == "medium" ); // Filter where property values are between a min and max value. const longBooks = DataHelpers.range(Books, "pages", 300, 400); // Search across multiple fields const science = DataHelpers.search(TriviaQuestions, "science", [ "category", "question", ]); // Group by difficulty const grouped = DataHelpers.groupBy(TriviaQuestions, "difficulty"); // { easy: [...], medium: [...], hard: [...] } // Paginate results const page1 = DataHelpers.paginate(TriviaQuestions, 1, 5); // { data: [...5 items], page: 1, total: 10, hasNext: true, ... } // Sort by property const sorted = DataHelpers.sortBy(TriviaQuestions, "difficulty", "asc"); // Get unique values const difficulties = DataHelpers.unique(TriviaQuestions, "difficulty"); // Extract specific fields const simplified = DataHelpers.pluck(TriviaQuestions, "question", "difficulty");
Available DataHelper methods:
filterBy()- Filter by property valuesearch()- Search across string fieldsfilterWhere()- Filter with custom functionrange()- Filter by property value within min and maxgroupBy()- Group by propertycountBy()- Count occurrencessortBy()- Sort by propertypaginate()- Paginate with metadataunique()- Get unique valuespluck()- Extract properties
Available Types
All TypeScript interfaces are exported for use in your projects:
Book- ISBN, title, author, publisher detailsTriviaQuestion- Trivia questions with difficulty and categoryAlbum- Music album informationSong- Song metadata with audio featuresPlayer- Soccer player dataRecipe- Cooking recipes with ingredients and instructionsStudent- Student records with gradesState- US state informationCountry- Country data with currency and languageDailyWeather- Weather forecast dataKeyCodes- Keyboard key code mappingsMovie- Movie metadata- And more...
Sample Output
console.log(SampleData.Collections.TriviaQuestions); // output [ { type: "multiple", difficulty: "easy", category: "Science & Nature", question: "The element involved in making human blood red is which of the following?", correct_answer: "Iron", incorrect_answers: ["Copper", "Iridium", "Gold"], }, { type: "multiple", difficulty: "easy", category: "Entertainment: Video Games", question: "How many flagship monsters appear in Monster Hunter Gernerations?", correct_answer: "4", incorrect_answers: ["3", "5", "6"], }, { type: "multiple", difficulty: "hard", category: "Entertainment: Video Games", question: "'Gimmick!' is a Japanese Famicom game in the cartridge. What is it called?", correct_answer: "FME-7", incorrect_answers: ["VRC6", "VRC7", "MMC5"], }, { type: "boolean", difficulty: "medium", category: "Animals", question: "Finnish Lapphund dogs were used for herding reindeer.", correct_answer: "True", incorrect_answers: ["False"], }, ];
Using in React Component (App.tsx)
import "./App.css"; import { SampleData, type TriviaQuestion } from "i45-sample-data"; function App() { const questions: TriviaQuestion[] = SampleData.Collections.TriviaQuestions; return ( <> <div> {questions.map((question, index) => ( <div id={`q-${index}`} key={index} className="question-div"> <h3>{question.question}</h3> <p>Category: {question.category}</p> <p>Difficulty: {question.difficulty}</p> <p>Type: {question.type}</p> <p>Correct Answer: {question.correct_answer}</p> <p>Incorrect Answers: {question.incorrect_answers.join(", ")}</p> </div> ))} </div> </> ); } export default App;
Simple API Call
The from method makes a get request using the fetch api and returns the results in JSON format.
The apiKey parameter is optional - only provide it if your API requires authentication.
Signature: SampleData.from(uri: string, apiKey?: string): Promise<any>
NOTE: This method makes an HTTP Get request and, if an API key is provided, passes it in the x-api-key request header. To make an HTTP Post request, or to include other headers such as custom content types, see the section API Call with Custom Headers.
import { SampleData } from "i45-sample-data"; // Make an async API call to a public endpoint (no API key needed) const data = await SampleData.from( "https://jsonplaceholder.typicode.com/posts" ); console.log(data); // Or with an API key for authenticated endpoints const protectedData = await SampleData.from( "https://api.example.com/protected", "YOUR_API_KEY" ); console.log(protectedData);
API Call with Custom Headers
options object, and returns a typed Response.
See the Fetch API MDN Web Docs for more information.
import { SampleData } from "i45-sample-data"; // With TypeScript, you can specify the response type type Post = { id: number; title: string; body: string; userId: number }; const data = await SampleData.fetch<Post[]>( "https://jsonplaceholder.typicode.com/posts", { headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY", }, } ); // data is now typed as Post[] console.log("Data from API", data);
Backward Compatibility
The following deprecated properties are still available but not recommended:
// ⚠️ Deprecated - Use Collections instead SampleData.JsonData.Books; // ⚠️ Deprecated - Use Dictionaries instead SampleData.KeyValueLists.States; // ✅ Recommended SampleData.Collections.Books; SampleData.Dictionaries.States;
License
ISC