mimic-data 1.0.3 โ†’ 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,349 +1,567 @@
1
- # mimic-data
2
-
3
- Library TypeScript ringan tanpa dependency eksternal untuk menghasilkan data dummy yang realistis dengan dukungan lokalisasi yang kuat.
4
-
5
- ## โœจ Fitur
6
-
7
- - ๐ŸŒ **44 Locale** - Coverage global yang sangat luas
8
- - ๐Ÿชถ **Ringan** - Zero runtime dependencies
9
- - ๐Ÿ“ฆ **Tree-shakeable** - Hanya bundle yang Anda gunakan
10
- - ๐Ÿ”ง **TypeScript Native** - Full type safety
11
- - ๐ŸŽฏ **Mudah Digunakan** - API yang sederhana dan intuitif
12
-
13
- ## ๐Ÿ“ฆ Instalasi
14
-
15
- ```bash
16
- npm install mimic-data
17
- # atau
18
- yarn add mimic-data
19
- # atau
20
- pnpm add mimic-data
21
- ```
22
-
23
- ## ๐Ÿš€ Penggunaan Dasar
24
-
25
- ### Metode 1: Factory Function (Rekomendasi)
26
-
27
- ```typescript
28
- import { createMimic } from 'mimic-data';
29
-
30
- // Buat instance dengan locale tertentu
31
- const mimic = createMimic('id_ID');
32
-
33
- // Generate data
34
- console.log(mimic.identity.fullName());
35
- // Output: "Budi Santoso"
36
-
37
- console.log(mimic.location.fullAddress());
38
- // Output: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345"
39
- ```
40
-
41
- ### Metode 2: Class Langsung
42
-
43
- ```typescript
44
- import { Mimic, locales } from 'mimic-data';
45
-
46
- const mimic = new Mimic(locales.ja_JP);
47
-
48
- console.log(mimic.identity.fullName());
49
- // Output: "Tanaka Kenji"
50
-
51
- console.log(mimic.location.fullAddress());
52
- // Output: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
53
- ```
54
-
55
- ## ๐ŸŒ Locale yang Tersedia (44 Negara!)
56
-
57
- ### Americas ๐ŸŒŽ (6)
58
- - `en_US` / `en` / `us` / `usa` - ๐Ÿ‡บ๐Ÿ‡ธ USA (imperial)
59
- - `en_CA` / `ca` / `canada` - ๐Ÿ‡จ๐Ÿ‡ฆ Canada (metric)
60
- - `es_MX` / `mx` / `mexico` - ๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico (metric)
61
- - `pt_BR` / `pt` / `br` / `brazil` - ๐Ÿ‡ง๐Ÿ‡ท Brazil (metric)
62
- - `es_AR` / `ar` / `argentina` - ๐Ÿ‡ฆ๐Ÿ‡ท Argentina (metric)
63
- - `es_CL` / `cl` / `chile` - ๐Ÿ‡จ๐Ÿ‡ฑ Chile (metric)
64
-
65
- ### Europe ๐ŸŒ (19)
66
- - `en_GB` / `gb` / `uk` / `britain` - ๐Ÿ‡ฌ๐Ÿ‡ง UK (metric)
67
- - `de_DE` / `de` / `germany` / `deutsch` - ๐Ÿ‡ฉ๐Ÿ‡ช Germany (metric)
68
- - `de_AT` / `at` / `austria` - ๐Ÿ‡ฆ๐Ÿ‡น Austria (metric)
69
- - `de_CH` / `ch` / `switzerland` - ๐Ÿ‡จ๐Ÿ‡ญ Switzerland (metric)
70
- - `fr_FR` / `fr` / `france` - ๐Ÿ‡ซ๐Ÿ‡ท France (metric)
71
- - `it_IT` / `it` / `italy` / `italia` - ๐Ÿ‡ฎ๐Ÿ‡น Italy (metric)
72
- - `es_ES` / `es` / `spain` / `espaรฑa` - ๐Ÿ‡ช๐Ÿ‡ธ Spain (metric)
73
- - `pt_PT` / `portugal` - ๐Ÿ‡ต๐Ÿ‡น Portugal (metric)
74
- - `nl_NL` / `nl` / `netherlands` / `holland` - ๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands (metric)
75
- - `nl_BE` / `be` / `belgium` - ๐Ÿ‡ง๐Ÿ‡ช Belgium (metric)
76
- - `ru_RU` / `ru` / `russia` - ๐Ÿ‡ท๐Ÿ‡บ Russia (metric)
77
- - `pl_PL` / `pl` / `poland` / `polska` - ๐Ÿ‡ต๐Ÿ‡ฑ Poland (metric)
78
- - `tr_TR` / `tr` / `turkey` / `turkiye` - ๐Ÿ‡น๐Ÿ‡ท Turkey (metric)
79
- - `sv_SE` / `sv` / `se` / `sweden` / `sverige` - ๐Ÿ‡ธ๐Ÿ‡ช Sweden (metric)
80
- - `nb_NO` / `no` / `norway` / `norge` - ๐Ÿ‡ณ๐Ÿ‡ด Norway (metric)
81
- - `da_DK` / `da` / `dk` / `denmark` / `danmark` - ๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark (metric)
82
- - `fi_FI` / `fi` / `finland` / `suomi` - ๐Ÿ‡ซ๐Ÿ‡ฎ Finland (metric)
83
- - `el_GR` / `el` / `gr` / `greece` - ๐Ÿ‡ฌ๐Ÿ‡ท Greece (metric)
84
- - `cs_CZ` / `cs` / `cz` / `czech` - ๐Ÿ‡จ๐Ÿ‡ฟ Czech Republic (metric)
85
- - `hu_HU` / `hu` / `hungary` - ๐Ÿ‡ญ๐Ÿ‡บ Hungary (metric)
86
- - `ro_RO` / `ro` / `romania` - ๐Ÿ‡ท๐Ÿ‡ด Romania (metric)
87
-
88
- ### Asia-Pacific ๐ŸŒ (13)
89
- - `zh_CN` / `zh` / `cn` / `china` - ๐Ÿ‡จ๐Ÿ‡ณ China (metric)
90
- - `ja_JP` / `ja` / `jp` / `japan` - ๐Ÿ‡ฏ๐Ÿ‡ต Japan (metric)
91
- - `ko_KR` / `ko` / `kr` / `korea` - ๐Ÿ‡ฐ๐Ÿ‡ท South Korea (metric)
92
- - `en_IN` / `in` / `india` - ๐Ÿ‡ฎ๐Ÿ‡ณ India (metric)
93
- - `id_ID` / `id` / `indonesia` - ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia (metric)
94
- - `th_TH` / `th` / `thailand` - ๐Ÿ‡น๐Ÿ‡ญ Thailand (metric)
95
- - `vi_VN` / `vi` / `vn` / `vietnam` - ๐Ÿ‡ป๐Ÿ‡ณ Vietnam (metric)
96
- - `ms_MY` / `ms` / `my` / `malaysia` - ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia (metric)
97
- - `en_SG` / `sg` / `singapore` - ๐Ÿ‡ธ๐Ÿ‡ฌ Singapore (metric)
98
- - `en_PH` / `ph` / `philippines` - ๐Ÿ‡ต๐Ÿ‡ญ Philippines (metric)
99
- - `en_AU` / `au` / `aus` / `australia` - ๐Ÿ‡ฆ๐Ÿ‡บ Australia (metric)
100
- - `en_NZ` / `nz` / `new-zealand` - ๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand (metric)
101
- - `he_IL` / `he` / `il` / `israel` - ๐Ÿ‡ฎ๐Ÿ‡ฑ Israel (metric)
102
-
103
- ### Middle East & Africa ๐ŸŒ (6)
104
- - `ar_AE` / `ae` / `uae` / `emirates` - ๐Ÿ‡ฆ๐Ÿ‡ช UAE (metric)
105
- - `ar_SA` / `sa` / `saudi` / `saudi-arabia` - ๐Ÿ‡ธ๐Ÿ‡ฆ Saudi Arabia (metric)
106
- - `ar_EG` / `eg` / `egypt` - ๐Ÿ‡ช๐Ÿ‡ฌ Egypt (metric)
107
- - `en_ZA` / `za` / `south-africa` - ๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa (metric)
108
-
109
- **Total: 44 Locales dengan 120+ Aliases!**
110
-
111
- ## ๐Ÿ“š API Reference
112
-
113
- ### Identity (Identitas)
114
-
115
- ```typescript
116
- // Nama depan berdasarkan gender
117
- mimic.identity.firstName('male'); // "Takashi"
118
- mimic.identity.firstName('female'); // "Yuki"
119
- mimic.identity.firstName(); // Random gender
120
-
121
- // Nama belakang
122
- mimic.identity.lastName(); // "Tanaka"
123
-
124
- // Nama lengkap (format sesuai budaya)
125
- mimic.identity.fullName('male'); // Japan: "Tanaka Takashi"
126
- // US: "John Smith"
127
- // ID: "Budi Santoso"
128
-
129
- // Gender
130
- mimic.identity.gender(); // "male" | "female"
131
-
132
- // Umur dengan range
133
- mimic.identity.age(); // 18-65 (default)
134
- mimic.identity.age({ min: 25, max: 40 }); // Custom range
135
-
136
- // Tanggal lahir
137
- mimic.identity.dateOfBirth();
138
- mimic.identity.dateOfBirth({ min: 30, max: 50 });
139
-
140
- // Generate semua data person sekaligus
141
- const person = mimic.identity.person('female', { min: 25, max: 35 });
142
- // {
143
- // firstName: "Yuki",
144
- // lastName: "Tanaka",
145
- // fullName: "Tanaka Yuki",
146
- // gender: "female",
147
- // age: 28,
148
- // dateOfBirth: Date
149
- // }
150
- ```
151
-
152
- ### Location (Lokasi)
153
-
154
- ```typescript
155
- // Komponen alamat individual
156
- mimic.location.street(); // "Chuo-dori"
157
- mimic.location.city(); // "Tokyo"
158
- mimic.location.state(); // "Kanagawa"
159
- mimic.location.zipCode(); // "123-4567" (Japan format)
160
-
161
- // Alamat lengkap (format sesuai negara)
162
- mimic.location.fullAddress();
163
- // Japan: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
164
- // US: "1234 Main Street, New York, California 12345"
165
- // ID: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345"
166
-
167
- // Generate semua data address sekaligus
168
- const address = mimic.location.address();
169
- // {
170
- // street: "Chuo-dori",
171
- // city: "Tokyo",
172
- // state: "Kanagawa",
173
- // zipCode: "123-4567",
174
- // fullAddress: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
175
- // }
176
- ```
177
-
178
- ### Physical (Data Fisik)
179
-
180
- ```typescript
181
- // Tinggi (unit sesuai locale)
182
- mimic.physical.height();
183
- // Metric: { height: 175, weight: 0, heightUnit: 'cm', weightUnit: 'kg' }
184
- // Imperial: { height: 5.9, weight: 0, heightUnit: 'ft', weightUnit: 'lb' }
185
-
186
- // Berat (unit sesuai locale)
187
- mimic.physical.weight();
188
- // Metric: { height: 0, weight: 70, heightUnit: 'cm', weightUnit: 'kg' }
189
- // Imperial: { height: 0, weight: 154, heightUnit: 'ft', weightUnit: 'lb' }
190
-
191
- // Generate semua data physical sekaligus
192
- const physical = mimic.physical.data();
193
- // Metric: { height: 175, weight: 70, heightUnit: 'cm', weightUnit: 'kg' }
194
- // Imperial: { height: 5.9, weight: 154, heightUnit: 'ft', weightUnit: 'lb' }
195
- ```
196
-
197
- ### Work (Data Pekerjaan)
198
-
199
- ```typescript
200
- mimic.work.jobTitle(); // "Software Engineer"
201
- mimic.work.department(); // "Engineering"
202
-
203
- // Generate semua data work sekaligus
204
- const work = mimic.work.data();
205
- // {
206
- // jobTitle: "Software Engineer",
207
- // department: "Engineering"
208
- // }
209
- ```
210
-
211
- ### Mengganti Locale
212
-
213
- ```typescript
214
- const mimic = createMimic('en_US');
215
- console.log(mimic.identity.fullName()); // "John Smith"
216
-
217
- mimic.setLocale(locales.ja_JP);
218
- console.log(mimic.identity.fullName()); // "Tanaka Kenji"
219
- ```
220
-
221
- ## ๐ŸŽฏ Contoh Lengkap
222
-
223
- ```typescript
224
- import { createMimic } from 'mimic-real-data';
225
-
226
- // Generate data karyawan Indonesia
227
- const mimic = createMimic('id_ID');
228
-
229
- const employee = {
230
- ...mimic.identity.person('male', { min: 25, max: 40 }),
231
- ...mimic.location.address(),
232
- ...mimic.physical.data(),
233
- ...mimic.work.data()
234
- };
235
-
236
- console.log(employee);
237
- // {
238
- // firstName: "Budi",
239
- // lastName: "Santoso",
240
- // fullName: "Budi Santoso",
241
- // gender: "male",
242
- // age: 32,
243
- // dateOfBirth: 1992-05-15T00:00:00.000Z,
244
- // street: "Jl. Merdeka",
245
- // city: "Jakarta",
246
- // state: "DKI Jakarta",
247
- // zipCode: "12345",
248
- // fullAddress: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345",
249
- // height: 175,
250
- // weight: 70,
251
- // heightUnit: "cm",
252
- // weightUnit: "kg",
253
- // jobTitle: "Software Engineer",
254
- // department: "Engineering"
255
- // }
256
- ```
257
-
258
- ## ๐Ÿ› ๏ธ Development
259
-
260
- ```bash
261
- # Install dependencies
262
- npm install
263
-
264
- # Build
265
- npm run build
266
-
267
- # Development mode (watch)
268
- npm run dev
269
-
270
- # Run tests
271
- npm test
272
-
273
- # Type check
274
- npm run type-check
275
- ```
276
-
277
- ## ๐Ÿ“ Lisensi
278
-
279
- MIT
280
-
281
- ## ๐Ÿค Kontribusi
282
-
283
- Kontribusi sangat diterima! Silakan buka issue atau pull request.
284
-
285
- ### Menambahkan Locale Baru (Sangat Mudah!)
286
-
287
- Dengan **Registry System**, menambah locale baru sangat mudah:
288
-
289
- 1. **Buat file locale** di `src/locales/xx_XX.ts`
290
- 2. **Implement interface** `LocaleDefinition`
291
- 3. **Import dan register** di `src/index.ts`
292
-
293
- **Contoh: Menambahkan locale Spanyol**
294
-
295
- ```typescript
296
- // 1. Buat file: src/locales/es_ES.ts
297
- import { LocaleDefinition } from '../types';
298
- import { Random } from '../core/random';
299
-
300
- export const es_ES: LocaleDefinition = {
301
- firstNamesMale: ['Carlos', 'Josรฉ', 'Antonio', ...],
302
- firstNamesFemale: ['Marรญa', 'Carmen', 'Ana', ...],
303
- lastNames: ['Garcรญa', 'Fernรกndez', 'Lรณpez', ...],
304
- streets: ['Calle Mayor', 'Avenida Castellana', ...],
305
- cities: ['Madrid', 'Barcelona', 'Valencia', ...],
306
- states: ['Madrid', 'Cataluรฑa', 'Andalucรญa', ...],
307
- zipCodePattern: '#####',
308
- jobTitles: ['Ingeniero de Software', ...],
309
- departments: ['Ingenierรญa', 'Marketing', ...],
310
- metricSystem: 'metric',
311
-
312
- formatFullName(firstName, lastName) {
313
- return `${firstName} ${lastName}`;
314
- },
315
-
316
- formatAddress(street, city, state, zipCode) {
317
- return `${street} ${Random.int(1, 200)}, ${zipCode} ${city}`;
318
- },
319
-
320
- generateZipCode() {
321
- return String(Random.int(10000, 99999));
322
- }
323
- };
324
-
325
- // 2. Register di src/index.ts
326
- import { es_ES } from './locales/es_ES';
327
- localeRegistry.register('es_ES', es_ES, ['es', 'spain', 'espaรฑa']);
328
-
329
- // 3. Export (opsional, untuk advanced usage)
330
- export const locales = {
331
- // ... existing locales
332
- es_ES
333
- };
334
- ```
335
-
336
- **Selesai!** Locale baru Anda langsung tersedia:
337
-
338
- ```typescript
339
- const mimic = createMimic('es'); // atau 'es_ES' atau 'spain'
340
- console.log(mimic.identity.fullName()); // "Carlos Garcรญa"
341
- ```
342
-
343
- ## ๐Ÿ™ Acknowledgments
344
-
345
- Terinspirasi oleh library seperti Faker.js, namun dengan fokus pada:
346
- - Zero runtime dependencies
347
- - Lokalisasi yang lebih akurat
348
- - Bundle size yang lebih kecil
1
+ # mimic-data
2
+
3
+ Library TypeScript ringan tanpa dependency eksternal untuk menghasilkan data dummy yang realistis dengan dukungan lokalisasi yang kuat.
4
+
5
+ ## โœจ Fitur
6
+
7
+ - ๐ŸŒ **44 Locale** - Coverage global yang sangat luas
8
+ - ๐Ÿชถ **Ringan** - Zero runtime dependencies
9
+ - ๐Ÿ“ฆ **Tree-shakeable** - Hanya bundle yang Anda gunakan
10
+ - ๐Ÿ”ง **TypeScript Native** - Full type safety
11
+ - ๐ŸŽฏ **Mudah Digunakan** - API yang sederhana dan intuitif
12
+
13
+ ## ๐Ÿ“ฆ Instalasi
14
+
15
+ ```bash
16
+ npm install mimic-data
17
+ # atau
18
+ yarn add mimic-data
19
+ # atau
20
+ pnpm add mimic-data
21
+ ```
22
+
23
+ ## ๐Ÿš€ Penggunaan Dasar
24
+
25
+ ### Metode 1: Factory Function (Rekomendasi)
26
+
27
+ ```typescript
28
+ import { createMimic } from 'mimic-data';
29
+
30
+ // Buat instance dengan locale tertentu
31
+ const mimic = createMimic('id_ID');
32
+
33
+ // Generate data
34
+ console.log(mimic.identity.fullName());
35
+ // Output: "Budi Santoso"
36
+
37
+ console.log(mimic.location.fullAddress());
38
+ // Output: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345"
39
+ ```
40
+
41
+ ### Metode 2: Class Langsung
42
+
43
+ ```typescript
44
+ import { Mimic, locales } from 'mimic-data';
45
+
46
+ const mimic = new Mimic(locales.ja_JP);
47
+
48
+ console.log(mimic.identity.fullName());
49
+ // Output: "Tanaka Kenji"
50
+
51
+ console.log(mimic.location.fullAddress());
52
+ // Output: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
53
+ ```
54
+
55
+ ## ๐ŸŒ Locale yang Tersedia (101 Locale!)
56
+
57
+ ### Americas ๐ŸŒŽ (17)
58
+ - `en_US` / `en` / `us` / `usa` - ๐Ÿ‡บ๐Ÿ‡ธ USA (imperial)
59
+ - `es_US` / `es-us` - ๐Ÿ‡บ๐Ÿ‡ธ USA (Spanish)
60
+ - `en_CA` / `ca` / `canada` - ๐Ÿ‡จ๐Ÿ‡ฆ Canada (metric)
61
+ - `fr_CA` / `fr-ca` - ๐Ÿ‡จ๐Ÿ‡ฆ Canada (French)
62
+ - `es_MX` / `mx` / `mexico` - ๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico (metric)
63
+ - `pt_BR` / `pt` / `br` / `brazil` - ๐Ÿ‡ง๐Ÿ‡ท Brazil (metric)
64
+ - `es_AR` / `ar` / `argentina` - ๐Ÿ‡ฆ๐Ÿ‡ท Argentina (metric)
65
+ - `es_CL` / `cl` / `chile` - ๐Ÿ‡จ๐Ÿ‡ฑ Chile (metric)
66
+ - `es_CO` / `co` / `colombia` - ๐Ÿ‡จ๐Ÿ‡ด Colombia (metric)
67
+ - `es_PE` / `pe` / `peru` - ๐Ÿ‡ต๐Ÿ‡ช Peru (metric)
68
+ - `es_VE` / `ve` / `venezuela` - ๐Ÿ‡ป๐Ÿ‡ช Venezuela (metric)
69
+ - `es_EC` / `ec` / `ecuador` - ๐Ÿ‡ช๐Ÿ‡จ Ecuador (metric)
70
+ - `es_BO` / `bo` / `bolivia` - ๐Ÿ‡ง๐Ÿ‡ด Bolivia (metric)
71
+ - `es_PY` / `py` / `paraguay` - ๐Ÿ‡ต๐Ÿ‡พ Paraguay (metric)
72
+ - `es_GT` / `gt` / `guatemala` - ๐Ÿ‡ฌ๐Ÿ‡น Guatemala (metric)
73
+ - `es_CR` / `cr` / `costa-rica` - ๐Ÿ‡จ๐Ÿ‡ท Costa Rica (metric)
74
+ - `es_DO` / `do` / `dominican-republic` - ๐Ÿ‡ฉ๐Ÿ‡ด Dominican Republic (metric)
75
+
76
+ ### Europe ๐ŸŒ (38)
77
+ - `en_GB` / `gb` / `uk` - ๐Ÿ‡ฌ๐Ÿ‡ง UK (metric)
78
+ - `en_IE` / `ie` / `ireland` - ๐Ÿ‡ฎ๐Ÿ‡ช Ireland (metric)
79
+ - `de_DE` / `de` / `germany` - ๐Ÿ‡ฉ๐Ÿ‡ช Germany (metric)
80
+ - `de_AT` / `at` / `austria` - ๐Ÿ‡ฆ๐Ÿ‡น Austria (metric)
81
+ - `de_CH` / `ch` / `switzerland` - ๐Ÿ‡จ๐Ÿ‡ญ Switzerland (German)
82
+ - `fr_CH` / `fr-ch` - ๐Ÿ‡จ๐Ÿ‡ญ Switzerland (French)
83
+ - `it_CH` / `it-ch` - ๐Ÿ‡จ๐Ÿ‡ญ Switzerland (Italian)
84
+ - `fr_FR` / `fr` / `france` - ๐Ÿ‡ซ๐Ÿ‡ท France (metric)
85
+ - `fr_BE` / `fr-be` - ๐Ÿ‡ง๐Ÿ‡ช Belgium (French)
86
+ - `nl_BE` / `be` / `belgium` - ๐Ÿ‡ง๐Ÿ‡ช Belgium (Dutch)
87
+ - `it_IT` / `it` / `italy` - ๐Ÿ‡ฎ๐Ÿ‡น Italy (metric)
88
+ - `es_ES` / `es` / `spain` - ๐Ÿ‡ช๐Ÿ‡ธ Spain (metric)
89
+ - `ca_ES` / `ca` / `catalonia` - ๐Ÿ‡ช๐Ÿ‡ธ Spain (Catalan)
90
+ - `pt_PT` / `portugal` - ๐Ÿ‡ต๐Ÿ‡น Portugal (metric)
91
+ - `nl_NL` / `nl` / `netherlands` - ๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands (metric)
92
+ - `de_LU` / `de-lu` - ๐Ÿ‡ฑ๐Ÿ‡บ Luxembourg (German)
93
+ - `fr_LU` / `fr-lu` - ๐Ÿ‡ฑ๐Ÿ‡บ Luxembourg (French)
94
+ - `de_LI` / `li` / `liechtenstein` - ๐Ÿ‡ฑ๐Ÿ‡ฎ Liechtenstein (metric)
95
+ - `ru_RU` / `ru` / `russia` - ๐Ÿ‡ท๐Ÿ‡บ Russia (metric)
96
+ - `pl_PL` / `pl` / `poland` - ๐Ÿ‡ต๐Ÿ‡ฑ Poland (metric)
97
+ - `tr_TR` / `tr` / `turkey` - ๐Ÿ‡น๐Ÿ‡ท Turkey (metric)
98
+ - `sv_SE` / `sv` / `se` / `sweden` - ๐Ÿ‡ธ๐Ÿ‡ช Sweden (metric)
99
+ - `nb_NO` / `no` / `norway` - ๐Ÿ‡ณ๐Ÿ‡ด Norway (metric)
100
+ - `da_DK` / `da` / `dk` / `denmark` - ๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark (metric)
101
+ - `fi_FI` / `fi` / `finland` - ๐Ÿ‡ซ๐Ÿ‡ฎ Finland (metric)
102
+ - `el_GR` / `el` / `gr` / `greece` - ๐Ÿ‡ฌ๐Ÿ‡ท Greece (metric)
103
+ - `cs_CZ` / `cs` / `cz` / `czech` - ๐Ÿ‡จ๐Ÿ‡ฟ Czech Republic (metric)
104
+ - `hu_HU` / `hu` / `hungary` - ๐Ÿ‡ญ๐Ÿ‡บ Hungary (metric)
105
+ - `ro_RO` / `ro` / `romania` - ๐Ÿ‡ท๐Ÿ‡ด Romania (metric)
106
+ - `uk_UA` / `ua` / `ukraine` - ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine (metric)
107
+ - `sk_SK` / `sk` / `slovakia` - ๐Ÿ‡ธ๐Ÿ‡ฐ Slovakia (metric)
108
+ - `hr_HR` / `hr` / `croatia` - ๐Ÿ‡ญ๐Ÿ‡ท Croatia (metric)
109
+ - `rs_RS` / `rs` / `serbia` - ๐Ÿ‡ท๐Ÿ‡ธ Serbia (metric)
110
+ - `lt_LT` / `lt` / `lithuania` - ๐Ÿ‡ฑ๐Ÿ‡น Lithuania (metric)
111
+ - `lv_LV` / `lv` / `latvia` - ๐Ÿ‡ฑ๐Ÿ‡ป Latvia (metric)
112
+ - `et_EE` / `ee` / `estonia` - ๐Ÿ‡ช๐Ÿ‡ช Estonia (metric)
113
+ - `bg_BG` / `bg` / `bulgaria` - ๐Ÿ‡ง๐Ÿ‡ฌ Bulgaria (metric)
114
+ - `is_IS` / `is` / `iceland` - ๐Ÿ‡ฎ๐Ÿ‡ธ Iceland (metric)
115
+
116
+ ### Asia-Pacific ๐ŸŒ (20)
117
+ - `zh_CN` / `zh` / `cn` / `china` - ๐Ÿ‡จ๐Ÿ‡ณ China (metric)
118
+ - `zh_TW` / `tw` / `taiwan` - ๐Ÿ‡น๐Ÿ‡ผ Taiwan (metric)
119
+ - `zh_HK` / `hk` / `hongkong` - ๐Ÿ‡ญ๐Ÿ‡ฐ Hong Kong (metric)
120
+ - `ja_JP` / `ja` / `jp` / `japan` - ๐Ÿ‡ฏ๐Ÿ‡ต Japan (metric)
121
+ - `ko_KR` / `ko` / `kr` / `korea` - ๐Ÿ‡ฐ๐Ÿ‡ท South Korea (metric)
122
+ - `id_ID` / `id` / `indonesia` - ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia (metric)
123
+ - `ms_MY` / `ms` / `my` / `malaysia` - ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia (metric)
124
+ - `th_TH` / `th` / `thailand` - ๐Ÿ‡น๐Ÿ‡ญ Thailand (metric)
125
+ - `vi_VN` / `vi` / `vn` / `vietnam` - ๐Ÿ‡ป๐Ÿ‡ณ Vietnam (metric)
126
+ - `en_SG` / `sg` / `singapore` - ๐Ÿ‡ธ๐Ÿ‡ฌ Singapore (metric)
127
+ - `en_PH` / `ph` / `philippines` - ๐Ÿ‡ต๐Ÿ‡ญ Philippines (metric)
128
+ - `en_AU` / `au` / `australia` - ๐Ÿ‡ฆ๐Ÿ‡บ Australia (metric)
129
+ - `en_NZ` / `nz` / `new-zealand` - ๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand (metric)
130
+ - `en_IN` / `in` / `india` - ๐Ÿ‡ฎ๐Ÿ‡ณ India (English)
131
+ - `hi_IN` / `hi` / `hindi` - ๐Ÿ‡ฎ๐Ÿ‡ณ India (Hindi)
132
+ - `bn_IN` / `bn-in` - ๐Ÿ‡ฎ๐Ÿ‡ณ India (Bengali)
133
+ - `bn_BD` / `bd` / `bangladesh` - ๐Ÿ‡ง๐Ÿ‡ฉ Bangladesh (metric)
134
+ - `ne_NP` / `np` / `nepal` - ๐Ÿ‡ณ๐Ÿ‡ต Nepal (metric)
135
+ - `ur_PK` / `ur` / `urdu` - ๐Ÿ‡ต๐Ÿ‡ฐ Pakistan (Urdu)
136
+ - `en_PK` / `pk` / `pakistan` - ๐Ÿ‡ต๐Ÿ‡ฐ Pakistan (English)
137
+
138
+ ### Middle East & Africa ๐ŸŒ (26)
139
+ - `ar_SA` / `sa` / `saudi` - ๐Ÿ‡ธ๐Ÿ‡ฆ Saudi Arabia (metric)
140
+ - `ar_AE` / `ae` / `uae` - ๐Ÿ‡ฆ๐Ÿ‡ช UAE (metric)
141
+ - `ar_EG` / `eg` / `egypt` - ๐Ÿ‡ช๐Ÿ‡ฌ Egypt (metric)
142
+ - `ar_MA` / `ma` / `morocco` - ๐Ÿ‡ฒ๐Ÿ‡ฆ Morocco (metric)
143
+ - `ar_IQ` / `iq` / `iraq` - ๐Ÿ‡ฎ๐Ÿ‡ถ Iraq (metric)
144
+ - `ar_KW` / `kw` / `kuwait` - ๐Ÿ‡ฐ๐Ÿ‡ผ Kuwait (metric)
145
+ - `ar_QA` / `qa` / `qatar` - ๐Ÿ‡ถ๐Ÿ‡ฆ Qatar (metric)
146
+ - `ar_BH` / `bh` / `bahrain` - ๐Ÿ‡ง๐Ÿ‡ญ Bahrain (metric)
147
+ - `ar_DZ` / `dz` / `algeria` - ๐Ÿ‡ฉ๐Ÿ‡ฟ Algeria (metric)
148
+ - `ar_JO` / `jo` / `jordan` - ๐Ÿ‡ฏ๐Ÿ‡ด Jordan (metric)
149
+ - `ar_LB` / `lb` / `lebanon` - ๐Ÿ‡ฑ๐Ÿ‡ง Lebanon (metric)
150
+ - `ar_LY` / `ly` / `libya` - ๐Ÿ‡ฑ๐Ÿ‡พ Libya (metric)
151
+ - `ar_OM` / `om` / `oman` - ๐Ÿ‡ด๐Ÿ‡ฒ Oman (metric)
152
+ - `ar_SD` / `sd` / `sudan` - ๐Ÿ‡ธ๐Ÿ‡ฉ Sudan (metric)
153
+ - `ar_SY` / `sy` / `syria` - ๐Ÿ‡ธ๐Ÿ‡พ Syria (metric)
154
+ - `ar_TN` / `tn` / `tunisia` - ๐Ÿ‡น๐Ÿ‡ณ Tunisia (metric)
155
+ - `ar_YE` / `ye` / `yemen` - ๐Ÿ‡พ๐Ÿ‡ช Yemen (metric)
156
+ - `he_IL` / `he` / `il` / `israel` - ๐Ÿ‡ฎ๐Ÿ‡ฑ Israel (metric)
157
+ - `fa_IR` / `fa` / `iran` - ๐Ÿ‡ฎ๐Ÿ‡ท Iran (metric)
158
+ - `en_ZA` / `za` / `south-africa` - ๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa (English)
159
+ - `af_ZA` / `af` / `afrikaans` - ๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa (Afrikaans)
160
+ - `en_NG` / `ng` / `nigeria` - ๐Ÿ‡ณ๐Ÿ‡ฌ Nigeria (metric)
161
+ - `en_KE` / `ke` / `kenya` - ๐Ÿ‡ฐ๐Ÿ‡ช Kenya (English)
162
+ - `sw_KE` / `sw-ke` - ๐Ÿ‡ฐ๐Ÿ‡ช Kenya (Swahili)
163
+ - `sw_TZ` / `sw-tz` - ๐Ÿ‡น๐Ÿ‡ฟ Tanzania (Swahili)
164
+ - `pt_MZ` / `mz` / `mozambique` - ๐Ÿ‡ฒ๐Ÿ‡ฟ Mozambique (metric)
165
+
166
+ **Total: 101 Locale dengan 250+ Aliases!**
167
+
168
+ ## ๐Ÿ“š API Reference
169
+
170
+ ### Identity (Identitas)
171
+
172
+ ```typescript
173
+ // Nama depan berdasarkan gender
174
+ mimic.identity.firstName('male'); // "Takashi"
175
+ mimic.identity.firstName('female'); // "Yuki"
176
+ mimic.identity.firstName(); // Random gender
177
+
178
+ // Nama belakang
179
+ mimic.identity.lastName(); // "Tanaka"
180
+
181
+ // Nama lengkap (format sesuai budaya)
182
+ mimic.identity.fullName('male'); // Japan: "Tanaka Takashi"
183
+ // US: "John Smith"
184
+ // ID: "Budi Santoso"
185
+
186
+ // Gender
187
+ mimic.identity.gender(); // "male" | "female"
188
+
189
+ // Umur dengan range
190
+ mimic.identity.age(); // 18-65 (default)
191
+ mimic.identity.age({ min: 25, max: 40 }); // Custom range
192
+
193
+ // Tanggal lahir
194
+ mimic.identity.dateOfBirth();
195
+ mimic.identity.dateOfBirth({ min: 30, max: 50 });
196
+
197
+ // Generate semua data person sekaligus
198
+ const person = mimic.identity.person('female', { min: 25, max: 35 });
199
+ // {
200
+ // firstName: "Yuki",
201
+ // lastName: "Tanaka",
202
+ // fullName: "Tanaka Yuki",
203
+ // gender: "female",
204
+ // age: 28,
205
+ // dateOfBirth: Date
206
+ // }
207
+
208
+ // ๐Ÿš€ NEW: Generate multiple persons at once
209
+ const persons = mimic.identity.persons(10); // Array of 10 persons
210
+
211
+ // ๐Ÿš€ NEW: Generate unique persons (no duplicate full names)
212
+ const uniquePersons = mimic.identity.uniquePersons(5);
213
+ ```
214
+
215
+ ### Location (Lokasi)
216
+
217
+ ```typescript
218
+ // Komponen alamat individual
219
+ mimic.location.street(); // "Chuo-dori"
220
+ mimic.location.city(); // "Tokyo"
221
+ mimic.location.state(); // "Kanagawa"
222
+ mimic.location.zipCode(); // "123-4567" (Japan format)
223
+
224
+ // Alamat lengkap (format sesuai negara)
225
+ mimic.location.fullAddress();
226
+ // Japan: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
227
+ // US: "1234 Main Street, New York, California 12345"
228
+ // ID: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345"
229
+
230
+ // Generate semua data address sekaligus
231
+ const address = mimic.location.address();
232
+ // {
233
+ // street: "Chuo-dori",
234
+ // city: "Tokyo",
235
+ // state: "Kanagawa",
236
+ // zipCode: "123-4567",
237
+ // fullAddress: "ใ€’123-4567 Tokyo, Yokohama, Chuo-dori 2-5-10"
238
+ // }
239
+
240
+ // ๐Ÿš€ NEW: Generate multiple addresses at once
241
+ const addresses = mimic.location.addresses(10); // Array of 10 addresses
242
+
243
+ // ๐Ÿš€ NEW: Generate unique addresses (no duplicate full addresses)
244
+ const uniqueAddresses = mimic.location.uniqueAddresses(5);
245
+ ```
246
+
247
+ ### Physical (Data Fisik)
248
+
249
+ ```typescript
250
+ // Tinggi (unit sesuai locale)
251
+ mimic.physical.height();
252
+ // Metric: { height: 175, weight: 0, heightUnit: 'cm', weightUnit: 'kg' }
253
+ // Imperial: { height: 5.9, weight: 0, heightUnit: 'ft', weightUnit: 'lb' }
254
+
255
+ // Berat (unit sesuai locale)
256
+ mimic.physical.weight();
257
+ // Metric: { height: 0, weight: 70, heightUnit: 'cm', weightUnit: 'kg' }
258
+ // Imperial: { height: 0, weight: 154, heightUnit: 'ft', weightUnit: 'lb' }
259
+
260
+ // Generate semua data physical sekaligus
261
+ const physical = mimic.physical.data();
262
+ // Metric: { height: 175, weight: 70, heightUnit: 'cm', weightUnit: 'kg' }
263
+ // Imperial: { height: 5.9, weight: 154, heightUnit: 'ft', weightUnit: 'lb' }
264
+
265
+ // ๐Ÿš€ NEW: Generate multiple physical data at once
266
+ const physicals = mimic.physical.datas(10); // Array of 10 physical data
267
+ ```
268
+
269
+ ### Work (Data Pekerjaan)
270
+
271
+ ```typescript
272
+ mimic.work.jobTitle(); // "Software Engineer"
273
+ mimic.work.department(); // "Engineering"
274
+
275
+ // Generate semua data work sekaligus
276
+ const work = mimic.work.data();
277
+ // {
278
+ // jobTitle: "Software Engineer",
279
+ // department: "Engineering"
280
+ // }
281
+
282
+ // ๐Ÿš€ NEW: Generate multiple work data at once
283
+ const works = mimic.work.datas(10); // Array of 10 work data
284
+
285
+ // ๐Ÿš€ NEW: Generate unique job titles
286
+ const uniqueJobTitles = mimic.work.uniqueJobTitles(5);
287
+
288
+ // ๐Ÿš€ NEW: Generate unique departments
289
+ const uniqueDepartments = mimic.work.uniqueDepartments(3);
290
+ ```
291
+
292
+ ### Contact (Kontak) - NEW! ๐Ÿ“ง
293
+
294
+ ```typescript
295
+ // Generate email
296
+ mimic.contact.email('John', 'Doe'); // "john.doe123@gmail.com"
297
+ mimic.contact.email('Jane'); // "jane456@yahoo.com"
298
+ mimic.contact.email(); // "random789@outlook.com"
299
+
300
+ // Generate phone number (locale-specific format)
301
+ mimic.contact.phone(); // US: "+1 (555) 123-4567"
302
+ // ID: "+62 812-3456-7890"
303
+
304
+ // Generate website
305
+ mimic.contact.website(); // "www.acme-corp.com"
306
+ mimic.contact.website('Google');// "www.google.com"
307
+
308
+ // Generate complete contact data
309
+ const contact = mimic.contact.data('John', 'Doe');
310
+ // {
311
+ // email: "john.doe123@gmail.com",
312
+ // phone: "+1 (555) 123-4567",
313
+ // website: "www.john-doe.com"
314
+ // }
315
+
316
+ // ๐Ÿš€ Generate multiple contact data
317
+ const contacts = mimic.contact.datas(10);
318
+ ```
319
+
320
+ ### Company (Perusahaan) - NEW! ๐Ÿข
321
+
322
+ ```typescript
323
+ // Generate company name
324
+ mimic.company.name(); // "Techflow Solutions"
325
+ // "PT Telkom Indonesia" (id_ID)
326
+
327
+ // Generate industry
328
+ mimic.company.industry(); // "Technology"
329
+ // "Teknologi" (id_ID)
330
+
331
+ // Generate catch phrase
332
+ mimic.company.catchPhrase(); // "Empower innovative solutions"
333
+
334
+ // Generate complete company data
335
+ const company = mimic.company.data();
336
+ // {
337
+ // name: "Quantumspark Labs",
338
+ // industry: "Technology",
339
+ // catchPhrase: "Transform cutting-edge experiences"
340
+ // }
341
+
342
+ // ๐Ÿš€ Generate multiple company data
343
+ const companies = mimic.company.datas(10);
344
+ ```
345
+
346
+ ### Mengganti Locale
347
+
348
+ ```typescript
349
+ const mimic = createMimic('en_US');
350
+ console.log(mimic.identity.fullName()); // "John Smith"
351
+
352
+ mimic.setLocale(locales.ja_JP);
353
+ console.log(mimic.identity.fullName()); // "Tanaka Kenji"
354
+ ```
355
+
356
+ ## ๐Ÿš€ Fitur Baru (v1.1.0)
357
+
358
+ ### ๐Ÿ” Seeded Random (Reproducible Data)
359
+
360
+ Generate data yang sama secara konsisten untuk testing:
361
+
362
+ ```typescript
363
+ import { createMimic, Random } from 'mimic-data';
364
+
365
+ // Set seed untuk reproducible randomness
366
+ Random.seed(12345);
367
+
368
+ const mimic = createMimic('en_US');
369
+ const person1 = mimic.identity.person('male', { min: 25, max: 35 });
370
+
371
+ // Reset seed yang sama
372
+ Random.seed(12345);
373
+ const person2 = mimic.identity.person('male', { min: 25, max: 35 });
374
+
375
+ // person1 dan person2 akan IDENTIK!
376
+ console.log(person1.fullName === person2.fullName); // true
377
+ console.log(person1.age === person2.age); // true
378
+
379
+ // Reset ke random non-deterministik
380
+ Random.unseed();
381
+ ```
382
+
383
+ ### ๐Ÿ“ฆ Bulk Generation
384
+
385
+ Generate banyak data sekaligus dengan performa optimal:
386
+
387
+ ```typescript
388
+ import { createMimic } from 'mimic-data';
389
+
390
+ const mimic = createMimic('id_ID');
391
+
392
+ // Generate 100 persons sekaligus
393
+ const persons = mimic.identity.persons(100);
394
+
395
+ // Generate 50 unique addresses (no duplicates)
396
+ const addresses = mimic.location.uniqueAddresses(50);
397
+
398
+ // Generate 200 complete mock entities
399
+ const entities = mimic.generateMockEntities(200, {
400
+ gender: 'female',
401
+ ageRange: { min: 20, max: 40 }
402
+ });
403
+
404
+ // Generate unique mock entities
405
+ const uniqueEntities = mimic.generateUniqueMockEntities(100);
406
+ ```
407
+
408
+ ### ๐ŸŽฏ Random Utilities
409
+
410
+ ```typescript
411
+ import { Random } from 'mimic-data';
412
+
413
+ // Generate multiple values
414
+ const numbers = Random.multiple(() => Random.int(1, 100), 10);
415
+
416
+ // Generate unique values (no duplicates)
417
+ const uniqueNumbers = Random.unique(() => Random.int(1, 1000), 20);
418
+
419
+ // Shuffle array
420
+ const shuffled = Random.shuffle([1, 2, 3, 4, 5]);
421
+
422
+ // Pick random element
423
+ const randomItem = Random.pick(['apple', 'banana', 'cherry']);
424
+ ```
425
+
426
+ ### โšก Performance Improvements
427
+
428
+ - **Caching**: Generator methods di-cache untuk performa lebih cepat
429
+ - **Bulk Operations**: Generate banyak data dalam satu panggilan
430
+ - **Optimized Getters**: Tidak ada recreation pada setiap akses
431
+
432
+ ```typescript
433
+ // Getter methods sekarang di-cache (lebih cepat)
434
+ const identity1 = mimic.identity;
435
+ const identity2 = mimic.identity;
436
+ console.log(identity1 === identity2); // true (same cached instance)
437
+ ```
438
+
439
+ ## ๐ŸŽฏ Contoh Lengkap
440
+
441
+ ```typescript
442
+ import { createMimic } from 'mimic-data';
443
+
444
+ // Generate data karyawan Indonesia
445
+ const mimic = createMimic('id_ID');
446
+
447
+ const employee = {
448
+ ...mimic.identity.person('male', { min: 25, max: 40 }),
449
+ ...mimic.location.address(),
450
+ ...mimic.physical.data(),
451
+ ...mimic.work.data()
452
+ };
453
+
454
+ console.log(employee);
455
+ // {
456
+ // firstName: "Budi",
457
+ // lastName: "Santoso",
458
+ // fullName: "Budi Santoso",
459
+ // gender: "male",
460
+ // age: 32,
461
+ // dateOfBirth: 1992-05-15T00:00:00.000Z,
462
+ // street: "Jl. Merdeka",
463
+ // city: "Jakarta",
464
+ // state: "DKI Jakarta",
465
+ // zipCode: "12345",
466
+ // fullAddress: "Jl. Merdeka No. 123, RT 5/RW 3, Jakarta, DKI Jakarta 12345",
467
+ // height: 175,
468
+ // weight: 70,
469
+ // heightUnit: "cm",
470
+ // weightUnit: "kg",
471
+ // jobTitle: "Software Engineer",
472
+ // department: "Engineering"
473
+ // }
474
+ ```
475
+
476
+ ## ๐Ÿ› ๏ธ Development
477
+
478
+ ```bash
479
+ # Install dependencies
480
+ npm install
481
+
482
+ # Build
483
+ npm run build
484
+
485
+ # Development mode (watch)
486
+ npm run dev
487
+
488
+ # Run tests
489
+ npm test
490
+
491
+ # Type check
492
+ npm run type-check
493
+ ```
494
+
495
+ ## ๐Ÿ“ Lisensi
496
+
497
+ MIT
498
+
499
+ ## ๐Ÿค Kontribusi
500
+
501
+ Kontribusi sangat diterima! Silakan buka issue atau pull request.
502
+
503
+ ### Menambahkan Locale Baru (Sangat Mudah!)
504
+
505
+ Dengan **Registry System**, menambah locale baru sangat mudah:
506
+
507
+ 1. **Buat file locale** di `src/locales/xx_XX.ts`
508
+ 2. **Implement interface** `LocaleDefinition`
509
+ 3. **Import dan register** di `src/index.ts`
510
+
511
+ **Contoh: Menambahkan locale Spanyol**
512
+
513
+ ```typescript
514
+ // 1. Buat file: src/locales/es_ES.ts
515
+ import { LocaleDefinition } from '../types';
516
+ import { Random } from '../core/random';
517
+
518
+ export const es_ES: LocaleDefinition = {
519
+ firstNamesMale: ['Carlos', 'Josรฉ', 'Antonio', ...],
520
+ firstNamesFemale: ['Marรญa', 'Carmen', 'Ana', ...],
521
+ lastNames: ['Garcรญa', 'Fernรกndez', 'Lรณpez', ...],
522
+ streets: ['Calle Mayor', 'Avenida Castellana', ...],
523
+ cities: ['Madrid', 'Barcelona', 'Valencia', ...],
524
+ states: ['Madrid', 'Cataluรฑa', 'Andalucรญa', ...],
525
+ zipCodePattern: '#####',
526
+ jobTitles: ['Ingeniero de Software', ...],
527
+ departments: ['Ingenierรญa', 'Marketing', ...],
528
+ metricSystem: 'metric',
529
+
530
+ formatFullName(firstName, lastName) {
531
+ return `${firstName} ${lastName}`;
532
+ },
533
+
534
+ formatAddress(street, city, state, zipCode) {
535
+ return `${street} ${Random.int(1, 200)}, ${zipCode} ${city}`;
536
+ },
537
+
538
+ generateZipCode() {
539
+ return String(Random.int(10000, 99999));
540
+ }
541
+ };
542
+
543
+ // 2. Register di src/index.ts
544
+ import { es_ES } from './locales/es_ES';
545
+ localeRegistry.register('es_ES', es_ES, ['es', 'spain', 'espaรฑa']);
546
+
547
+ // 3. Export (opsional, untuk advanced usage)
548
+ export const locales = {
549
+ // ... existing locales
550
+ es_ES
551
+ };
552
+ ```
553
+
554
+ **Selesai!** Locale baru Anda langsung tersedia:
555
+
556
+ ```typescript
557
+ const mimic = createMimic('es'); // atau 'es_ES' atau 'spain'
558
+ console.log(mimic.identity.fullName()); // "Carlos Garcรญa"
559
+ ```
560
+
561
+ ## ๐Ÿ™ Acknowledgments
562
+
563
+ Terinspirasi oleh library seperti Faker.js, namun dengan fokus pada:
564
+ - Zero runtime dependencies
565
+ - Lokalisasi yang lebih akurat
566
+ - Bundle size yang lebih kecil
349
567
  - TypeScript-first approach