Loading...
Loading...
Lightweight, zero-dependency library for generating realistic dummy data with strong localization support.
A lightweight TypeScript library with zero runtime dependencies for generating realistic, locale-aware dummy data. Inspired by Faker.js, but smaller and focused on accurate localization.
npm install mimic-data
# or
yarn add mimic-data
# or
pnpm add mimic-data
import { createMimic } from 'mimic-data';
const mimic = createMimic('id_ID');
console.log(mimic.identity.fullName());
// "Budi Santoso"
console.log(mimic.location.fullAddress());
// "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345"
createMimic(locale?: string): MimicCreates a Mimic instance for the specified locale. Defaults to en_US when omitted.
const mimic = createMimic('ja_JP');
const mimicDefault = createMimic(); // uses en_US
| Export | Description |
|---|---|
createMimic | Factory function to create Mimic |
Mimic | Main data generation class |
locales | Object with all locale definitions |
Random | Random number utility class |
localeRegistry | Locale registry for advanced usage |
getAvailableLocales() | Returns canonical locale codes |
getAllLocaleCodes() | Returns locale codes + aliases |
| Module | Method | Description |
|---|---|---|
identity | firstName(gender?) | Random first name (male/female/random) |
lastName() | Random last name | |
fullName(gender?) | Full name in locale format | |
gender() | Random gender | |
age(range?) | Age (default 18-65) | |
dateOfBirth(range?) | Date of birth as Date object | |
person(gender?, range?) | Complete person data | |
persons(count, gender?, range?) | Multiple persons | |
uniquePersons(count, gender?, range?) | Unique persons (by full name) | |
location | street() | Random street name |
city() | Random city | |
state() | Random state/province | |
zipCode() | Random zip/postal code | |
fullAddress() | Formatted full address | |
address() | Complete address data | |
addresses(count) | Multiple addresses | |
uniqueAddresses(count) | Unique addresses | |
physical | height() | Height + weight (metric or imperial) |
weight() | Weight + height (metric or imperial) | |
data() | Complete physical data | |
datas(count) | Multiple physical data | |
work | jobTitle() | Random job title |
department() | Random department | |
data() | Complete work data | |
datas(count) | Multiple work data | |
uniqueJobTitles(count) | Unique job titles | |
uniqueDepartments(count) | Unique departments | |
contact | email(firstName?, lastName?) | Email address |
phone() | Phone number (region-appropriate) | |
website(name?) | Website URL from company name | |
data(firstName?, lastName?) | Complete contact data | |
datas(count) | Multiple contact data | |
company | name() | Company name |
industry() | Industry | |
catchPhrase() | Company tagline | |
data() | Complete company data | |
datas(count) | Multiple company data | |
Mimic | setLocale(locale) | Switch locale |
generateMockEntities(count, options?) | Generate complete entities | |
generateUniqueMockEntities(count, options?) | Unique complete entities |
en_US / en / us / usa — 🇺🇸 USA (imperial)es_US / es-us — 🇺🇸 USA (Spanish)en_CA / en-ca / canada — 🇨🇦 Canada (metric)fr_CA / fr-ca — 🇨🇦 Canada (French)es_MX / mx / mexico — 🇲🇽 Mexicopt_BR / pt / br / brazil — 🇧🇷 Braziles_AR / ar / argentina — 🇦🇷 Argentinaes_CL / cl / chile — 🇨🇱 Chilees_CO / co / colombia — 🇨🇴 Colombiaes_PE / pe / peru — 🇵🇪 Perues_VE / ve / venezuela — 🇻🇪 Venezuelaes_EC / ec / ecuador — 🇪🇨 Ecuadores_BO / bo / bolivia — 🇧🇴 Boliviaes_PY / py / paraguay — 🇵🇾 Paraguayes_GT / gt / guatemala — 🇬🇹 Guatemalaes_CR / cr / costa-rica — 🇨🇷 Costa Ricaes_DO / do / dominican-republic — 🇩🇴 Dominican Republices_CU / cu / cuba — 🇨🇺 Cubaes_SV / es-sv / el-salvador — 🇸🇻 El Salvadores_HN / hn / honduras — 🇭🇳 Hondurases_NI / ni / nicaragua — 🇳🇮 Nicaraguaes_PA / pa / panama — 🇵🇦 Panamaes_UY / uy / uruguay — 🇺🇾 Uruguayen_JM / jm / jamaica — 🇯🇲 Jamaicaen_TT / tt / trinidad-and-tobago — 🇹🇹 Trinidad & Tobagoen_GY / gy / guyana — 🇬🇾 Guyanaen_BZ / bz / belize — 🇧🇿 Belizeen_BS / bs / bahamas — 🇧🇸 Bahamasen_BB / bb / barbados — 🇧🇧 Barbadosen_AG / ag / antigua-and-barbuda — 🇦🇬 Antigua & Barbudaen_DM / dm / dominica — 🇩🇲 Dominicaen_GD / gd / grenada — 🇬🇩 Grenadaen_KN / kn / saint-kitts-and-nevis — 🇰🇳 St. Kitts & Nevisen_LC / lc / saint-lucia — 🇱🇨 St. Luciaen_VC / vc / saint-vincent — 🇻🇨 St. Vincent & Grenadinesfr_HT / ht / haiti — 🇭🇹 Haitinl_SR / sr / suriname — 🇸🇷 Surinameen_GB / gb / uk — 🇬🇧 UKen_IE / ie / ireland — 🇮🇪 Ireland (English)ga_IE / ga / gaeilge — 🇮🇪 Ireland (Irish Gaelic)cy_GB / cy / wales — 🏴 Wales (Welsh)de_DE / de / germany — 🇩🇪 Germanyde_AT / at / austria — 🇦🇹 Austriade_CH / ch / switzerland — 🇨🇭 Switzerland (German)fr_CH / fr-ch — 🇨🇭 Switzerland (French)it_CH / it-ch — 🇨🇭 Switzerland (Italian)fr_FR / fr / france — 🇫🇷 Francefr_BE / fr-be — 🇧🇪 Belgium (French)nl_BE / be / belgium — 🇧🇪 Belgium (Dutch)it_IT / it / italy — 🇮🇹 Italyes_ES / es / spain — 🇪🇸 Spainca_ES / catalonia / catalan — 🇪🇸 Spain (Catalan)pt_PT / portugal — 🇵🇹 Portugalnl_NL / nl / netherlands — 🇳🇱 Netherlandsde_LU / de-lu — 🇱🇺 Luxembourg (German)fr_LU / fr-lu — 🇱🇺 Luxembourg (French)de_LI / li / liechtenstein — 🇱🇮 Liechtensteinru_RU / ru / russia — 🇷🇺 Russiapl_PL / pl / poland — 🇵🇱 Polandtr_TR / tr / turkey — 🇹🇷 Turkeysv_SE / sv / se / sweden — 🇸🇪 Swedennb_NO / no / norway — 🇳🇴 Norwayda_DK / da / dk / denmark — 🇩🇰 Denmarkfi_FI / fi / finland — 🇫🇮 Finlandel_GR / el / gr / greece — 🇬🇷 Greececs_CZ / cs / cz / czech — 🇨🇿 Czech Republichu_HU / hu / hungary — 🇭🇺 Hungaryro_RO / ro / romania — 🇷🇴 Romaniauk_UA / ua / ukraine — 🇺🇦 Ukrainesk_SK / sk / slovakia — 🇸🇰 Slovakiahr_HR / hr / croatia — 🇭🇷 Croatiars_RS / rs / serbia — 🇷🇸 Serbialt_LT / lt / lithuania — 🇱🇹 Lithuanialv_LV / lv / latvia — 🇱🇻 Latviaet_EE / ee / estonia — 🇪🇪 Estoniabg_BG / bg / bulgaria — 🇧🇬 Bulgariais_IS / is / iceland — 🇮🇸 Icelandsq_AL / al / albania — 🇦🇱 Albaniabs_BA / ba / bosnia-herzegovina — 🇧🇦 Bosnia & Herzegovinamk_MK / mk / north-macedonia — 🇲🇰 North Macedoniasl_SI / si / slovenia — 🇸🇮 Sloveniamt_MT / mt / malta — 🇲🇹 Maltabe_BY / by / belarus — 🇧🇾 Belarussr_ME / me / montenegro — 🇲🇪 Montenegroro_MD / md / moldova — 🇲🇩 Moldovael_CY / el-cy / cyprus — 🇨🇾 Cyprus (Greek)tr_CY / tr-cy — 🇨🇾 Cyprus (Turkish)fo_FO / fo / faroe-islands — 🇫🇴 Faroe Islandsca_AD / ad / andorra — 🇦🇩 Andorrafr_MC / mc / monaco — 🇲🇨 Monacoit_SM / sm / san-marino — 🇸🇲 San Marinoit_VA / va / vatican — 🇻🇦 Vatican Cityen_GI / gi / gibraltar — 🇬🇮 Gibraltarzh_CN / zh / cn / china — 🇨🇳 Chinazh_TW / tw / taiwan — 🇹🇼 Taiwanzh_HK / hk / hongkong — 🇭🇰 Hong Kongja_JP / ja / jp / japan — 🇯🇵 Japanko_KR / ko / kr / korea — 🇰🇷 South Koreaid_ID / id / indonesia — 🇮🇩 Indonesiams_MY / ms / my / malaysia — 🇲🇾 Malaysiath_TH / th / thailand — 🇹🇭 Thailandvi_VN / vi / vn / vietnam — 🇻🇳 Vietnamkm_KH / kh / cambodia — 🇰🇭 Cambodialo_LA / la / laos — 🇱🇦 Laosmy_MM / mm / myanmar — 🇲🇲 Myanmarmn_MN / mn / mongolia — 🇲🇳 Mongoliaen_SG / sg / singapore — 🇸🇬 Singaporeen_PH / ph / philippines — 🇵🇭 Philippinesen_AU / au / australia — 🇦🇺 Australiaen_NZ / nz / new-zealand — 🇳🇿 New Zealanden_IN / in / india — 🇮🇳 India (English)hi_IN / hi / hindi — 🇮🇳 India (Hindi)bn_IN / bn-in — 🇮🇳 India (Bengali)si_LK / lk / sri-lanka — 🇱🇰 Sri Lankabn_BD / bd / bangladesh — 🇧🇩 Bangladeshne_NP / np / nepal — 🇳🇵 Nepaldz_BT / bt / bhutan — 🇧🇹 Bhutandv_MV / mv / maldives — 🇲🇻 Maldivesur_PK / ur / urdu — 🇵🇰 Pakistan (Urdu)en_PK / pk / pakistan — 🇵🇰 Pakistan (English)ps_AF / af / afghanistan — 🇦🇫 Afghanistankk_KZ / kz / kazakhstan — 🇰🇿 Kazakhstanky_KG / kg / kyrgyzstan — 🇰🇬 Kyrgyzstantg_TJ / tj / tajikistan — 🇹🇯 Tajikistantk_TM / tm / turkmenistan — 🇹🇲 Turkmenistanuz_UZ / uz / uzbekistan — 🇺🇿 Uzbekistanka_GE / ge / georgia — 🇬🇪 Georgiahy_AM / hy / armenia — 🇦🇲 Armeniaaz_AZ / az / azerbaijan — 🇦🇿 Azerbaijanms_BN / bn / brunei — 🇧🇳 Bruneipt_TL / tl / timor-leste — 🇹🇱 Timor-Lestezh_MO / mo / macau — 🇲🇴 Macau (Chinese)pt_MO / pt-mo / macau-portuguese — 🇲🇴 Macau (Portuguese)Middle East (19):
ar_SA / sa / saudi — 🇸🇦 Saudi Arabiaar_AE / ae / uae — 🇦🇪 UAEar_EG / eg / egypt — 🇪🇬 Egyptar_MA / ma / morocco — 🇲🇦 Moroccoar_DZ / dz / algeria — 🇩🇿 Algeriaar_TN / tn / tunisia — 🇹🇳 Tunisiaar_LY / ly / libya — 🇱🇾 Libyaar_SD / sd / sudan — 🇸🇩 Sudanar_IQ / iq / iraq — 🇮🇶 Iraqar_KW / kw / kuwait — 🇰🇼 Kuwaitar_QA / qa / qatar — 🇶🇦 Qatarar_BH / bh / bahrain — 🇧🇭 Bahrainar_OM / om / oman — 🇴🇲 Omanar_YE / ye / yemen — 🇾🇪 Yemenar_JO / jo / jordan — 🇯🇴 Jordanar_LB / lb / lebanon — 🇱🇧 Lebanonar_SY / sy / syria — 🇸🇾 Syriahe_IL / he / il / israel — 🇮🇱 Israelfa_IR / fa / iran — 🇮🇷 Iranar_PS / ps / palestine — 🇵🇸 Palestinear_MR / mr / mauritania — 🇲🇷 MauritaniaSub-Saharan Africa (67):
en_ZA / za / south-africa — 🇿🇦 South Africa (English)af_ZA / af / afrikaans — 🇿🇦 South Africa (Afrikaans)en_NA / na / namibia — 🇳🇦 Namibiaen_BW / bw / botswana — 🇧🇼 Botswanaen_ZW / zw / zimbabwe — 🇿🇼 Zimbabween_ZM / zm / zambia — 🇿🇲 Zambiaen_LS / ls / lesotho — 🇱🇸 Lesothoen_SZ / sz / eswatini — 🇸🇿 Eswatinien_NG / ng / nigeria — 🇳🇬 Nigeriaen_GH / gh / ghana — 🇬🇭 Ghanaen_SL / sl / sierra-leone — 🇸🇱 Sierra Leoneen_LR / lr / liberia — 🇱🇷 Liberiaen_GM / gm / gambia — 🇬🇲 Gambiaen_UG / ug / uganda — 🇺🇬 Ugandaen_KE / ke / kenya — 🇰🇪 Kenya (English)sw_KE / sw-ke — 🇰🇪 Kenya (Swahili)sw_TZ / sw-tz — 🇹🇿 Tanzania (Swahili)rw_RW / rw / rwanda — 🇷🇼 Rwandaso_SO / so / somalia — 🇸🇴 Somaliaam_ET / am / ethiopia — 🇪🇹 Ethiopiamg_MG / mg / madagascar — 🇲🇬 Madagascarfr_CM / cm / cameroon — 🇨🇲 Cameroonfr_CI / ci / cote-d-ivoire — 🇨🇮 Côte d'Ivoirefr_SN / sn / senegal — 🇸🇳 Senegalfr_ML / ml / mali — 🇲🇱 Malifr_NE / ne / niger — 🇳🇪 Nigerfr_BF / bf / burkina-faso — 🇧🇫 Burkina Fasofr_BJ / bj / benin — 🇧🇯 Beninfr_TG / tg / togo — 🇹🇬 Togofr_GA / ga / gabon — 🇬🇦 Gabonpt_AO / ao / angola — 🇦🇴 Angolapt_MZ / mz / mozambique — 🇲🇿 Mozambiquept_CV / cv / cape-verde — 🇨🇻 Cape Verdept_GW / gw / guinea-bissau — 🇬🇼 Guinea-Bissaupt_ST / st / sao-tome — 🇸🇹 São Tomé & Príncipear_PS / ps / palestine — 🇵🇸 Palestinear_MR / mr / mauritania — 🇲🇷 Mauritaniaar_KM / km / comoros — 🇰🇲 Comorosar_DJ / dj / djibouti — 🇩🇯 Djiboutien_MU / mu / mauritius — 🇲🇺 Mauritiusfr_SC / fr-sc / seychelles-french — 🇸🇨 Seychelles (French)en_SC / sc / seychelles — 🇸🇨 Seychelles (English)fr_GN / gn / guinea-conakry — 🇬🇳 Guineaes_GQ / gq / equatorial-guinea — 🇬🇶 Equatorial Guineaen_SS / ss / south-sudan — 🇸🇸 South Sudanti_ER / er / eritrea — 🇪🇷 Eritreams_BN / bn / brunei — 🇧🇳 Bruneipt_TL / tl / timor-leste — 🇹🇱 Timor-Lestezh_MO / mo / macau — 🇲🇴 Macau (Chinese)pt_MO / pt-mo / macau-portuguese — 🇲🇴 Macau (Portuguese)ca_AD / ad / andorra — 🇦🇩 Andorrafr_MC / mc / monaco — 🇲🇨 Monacoit_SM / sm / san-marino — 🇸🇲 San Marinoit_VA / va / vatican — 🇻🇦 Vatican Cityen_GI / gi / gibraltar — 🇬🇮 Gibraltarimport { createMimic } from 'mimic-data';
const mimic = createMimic('ja_JP');
console.log(mimic.identity.fullName());
// "Tanaka Kenji"
console.log(mimic.location.fullAddress());
// "〒123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
import { Mimic, locales } from 'mimic-data';
const mimic = new Mimic(locales.de_DE);
console.log(mimic.identity.fullName('female'));
// "Maria Müller"
import { createMimic, Random } from 'mimic-data';
Random.seed(12345);
const mimic = createMimic('en_US');
const person1 = mimic.identity.person('male', { min: 25, max: 35 });
Random.seed(12345);
const person2 = mimic.identity.person('male', { min: 25, max: 35 });
console.log(person1.fullName === person2.fullName); // true
Random.unseed();
import { createMimic } from 'mimic-data';
const mimic = createMimic('id_ID');
const persons = mimic.identity.persons(100);
const addresses = mimic.location.uniqueAddresses(50);
const employees = mimic.generateMockEntities(200, {
gender: 'female',
ageRange: { min: 20, max: 40 }
});
import { createMimic } from 'mimic-data';
const mimic = createMimic('id_ID');
const employee = {
...mimic.identity.person('male', { min: 25, max: 40 }),
...mimic.location.address(),
...mimic.physical.data(),
...mimic.work.data(),
...mimic.contact.data(),
...mimic.company.data()
};
console.log(employee);
// {
// firstName: "Budi",
// lastName: "Santoso",
// fullName: "Budi Santoso",
// gender: "male",
// age: 32,
// dateOfBirth: 1992-05-15T00:00:00.000Z,
// street: "Jl. Merdeka",
// city: "Jakarta",
// state: "DKI Jakarta",
// zipCode: "12345",
// fullAddress: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345",
// height: 175,
// weight: 70,
// heightUnit: "cm",
// weightUnit: "kg",
// jobTitle: "Software Engineer",
// department: "Engineering",
// email: "budi.santoso123@gmail.com",
// phone: "+62 812-3456-7890",
// website: "www.budi-santoso.com",
// name: "Techflow Solutions",
// industry: "Technology",
// catchPhrase: "Empower innovative solutions"
// }
import {
Gender,
MetricSystem,
PersonData,
AddressData,
PhysicalData,
WorkData,
ContactData,
CompanyData,
AgeRange,
LocaleDefinition
} from 'mimic-data';
const person: PersonData = mimic.identity.person('female', { min: 25, max: 35 });
const address: AddressData = mimic.location.address();
const physical: PhysicalData = mimic.physical.data();
const work: WorkData = mimic.work.data();
const contact: ContactData = mimic.contact.data();
const company: CompanyData = mimic.company.data();
type Gender = 'male' | 'female';
type MetricSystem = 'metric' | 'imperial';
interface PersonData {
firstName: string;
lastName: string;
fullName: string;
gender: Gender;
age: number;
dateOfBirth: Date;
}
interface AddressData {
street: string;
city: string;
state: string;
zipCode: string;
fullAddress: string;
}
interface PhysicalData {
height: number;
weight: number;
heightUnit: 'cm' | 'ft';
weightUnit: 'kg' | 'lb';
}
interface WorkData {
jobTitle: string;
department: string;
}
interface ContactData {
email: string;
phone: string;
website: string;
}
interface CompanyData {
name: string;
industry: string;
catchPhrase: string;
}
interface AgeRange {
min?: number;
max?: number;
}
import { Random } from 'mimic-data';
Random.seed(12345);
Random.int(1, 100);
Random.float(1.5, 10.5, 2);
Random.boolean();
Random.pick(['a', 'b', 'c']);
Random.shuffle([1, 2, 3, 4, 5]);
Random.multiple(() => Random.int(1, 100), 10);
Random.unique(() => Random.int(1, 1000), 20);
# Install dependencies
npm install
# Build
npm run build
# Development mode (watch)
npm run dev
# Run tests
npm test
# Type check
npm run type-check
MIT
Contributions are welcome! Please open an issue or pull request on GitHub.
src/locales/xx_XX.tsLocaleDefinition interfacesrc/index.ts// 1. Create file: src/locales/es_ES.ts
import { LocaleDefinition } from '../types';
import { Random } from '../core/random';
export const es_ES: LocaleDefinition = {
firstNamesMale: ['Carlos', 'José', 'Antonio'],
firstNamesFemale: ['María', 'Carmen', 'Ana'],
lastNames: ['García', 'Fernández', 'López'],
streets: ['Calle Mayor', 'Avenida Castellana'],
cities: ['Madrid', 'Barcelona', 'Valencia'],
states: ['Madrid', 'Cataluña', 'Andalucía'],
zipCodePattern: '#####',
jobTitles: ['Ingeniero de Software'],
departments: ['Ingeniería', 'Marketing'],
metricSystem: 'metric',
formatFullName(firstName, lastName) {
return `${firstName} ${lastName}`;
},
formatAddress(street, city, state, zipCode) {
return `${street} ${Random.int(1, 200)}, ${zipCode} ${city}`;
},
generateZipCode() {
return String(Random.int(10000, 99999));
}
};
// 2. Register in src/index.ts
import { es_ES } from './locales/es_ES';
localeRegistry.register('es_ES', es_ES, ['es', 'spain', 'españa']);
Inspired by libraries like Faker.js, with a focus on: