fhir-test-data 0.1.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.
@@ -0,0 +1,4302 @@
1
+ import {
2
+ createRng,
3
+ pickRandom,
4
+ randomDigits,
5
+ randomInt
6
+ } from "./chunk-U2QJNKBG.js";
7
+
8
+ // src/core/types.ts
9
+ var SUPPORTED_RESOURCE_TYPES = [
10
+ "Patient",
11
+ "Practitioner",
12
+ "PractitionerRole",
13
+ "Organization",
14
+ "Observation",
15
+ "Condition",
16
+ "AllergyIntolerance",
17
+ "MedicationStatement",
18
+ "Bundle"
19
+ ];
20
+ var SUPPORTED_FHIR_VERSIONS = ["R4", "R4B", "R5"];
21
+ var SUPPORTED_LOCALES = ["us", "uk", "au", "ca", "de", "fr", "nl", "in", "jp", "kr", "sg", "br", "mx", "za"];
22
+
23
+ // src/core/generators/addresses.ts
24
+ function generateAddress(template, rng) {
25
+ const city = pickRandom(template.cities, rng);
26
+ const street = pickRandom(template.streets, rng);
27
+ const number = randomInt(1, 9999, rng);
28
+ const postalCode = template.generatePostalCode(rng, city.state);
29
+ const formatLine = template.formatLine ?? ((n, s) => `${n} ${s}`);
30
+ const address = {
31
+ line: [formatLine(number, street)],
32
+ city: city.name,
33
+ postalCode,
34
+ country: template.country
35
+ };
36
+ if (city.state !== void 0) address.state = city.state;
37
+ if (city.district !== void 0) address.district = city.district;
38
+ return address;
39
+ }
40
+
41
+ // src/core/generators/names.ts
42
+ function generateName(pool, gender, rng) {
43
+ const givenPool = gender === "male" ? pool.given.male : pool.given.female;
44
+ const given = pickRandom(givenPool, rng);
45
+ const family = pickRandom(pool.family, rng);
46
+ const name = {
47
+ family,
48
+ given: [given],
49
+ gender
50
+ };
51
+ if (pool.prefixes !== void 0 && pool.prefixes.length > 0) {
52
+ if (rng() < 0.3) {
53
+ name.familyPrefix = pickRandom(pool.prefixes, rng);
54
+ }
55
+ }
56
+ return name;
57
+ }
58
+
59
+ // src/core/builders/utils.ts
60
+ function generateUuidV4(rng) {
61
+ const hex = (bits) => Math.floor(rng() * (1 << bits)).toString(16).padStart(bits / 4, "0");
62
+ const p1 = hex(32);
63
+ const p2 = hex(16);
64
+ const p3 = "4" + hex(12);
65
+ const variant = (8 + Math.floor(rng() * 4)).toString(16);
66
+ const p4 = variant + hex(12);
67
+ const p5 = hex(32) + hex(16);
68
+ return `${p1}-${p2}-${p3}-${p4}-${p5}`;
69
+ }
70
+ function deepMerge(base, overrides) {
71
+ const result = { ...base };
72
+ for (const key of Object.keys(overrides)) {
73
+ const overrideVal = overrides[key];
74
+ const baseVal = base[key];
75
+ if (overrideVal !== null && typeof overrideVal === "object" && !Array.isArray(overrideVal) && baseVal !== null && typeof baseVal === "object" && !Array.isArray(baseVal)) {
76
+ result[key] = deepMerge(
77
+ baseVal,
78
+ overrideVal
79
+ );
80
+ } else {
81
+ result[key] = overrideVal;
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ function generateDate(minYear, maxYear, rng) {
87
+ const year = randomInt(minYear, maxYear, rng);
88
+ const month = randomInt(1, 12, rng);
89
+ const daysInMonth = new Date(year, month, 0).getDate();
90
+ const day = randomInt(1, daysInMonth, rng);
91
+ return `${year.toString()}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`;
92
+ }
93
+ function generateDateTime(minYear, maxYear, rng) {
94
+ const date = generateDate(minYear, maxYear, rng);
95
+ const hour = randomInt(0, 23, rng);
96
+ const min = randomInt(0, 59, rng);
97
+ const sec = randomInt(0, 59, rng);
98
+ return `${date}T${hour.toString().padStart(2, "0")}:${min.toString().padStart(2, "0")}:${sec.toString().padStart(2, "0")}+00:00`;
99
+ }
100
+
101
+ // src/core/generators/check-digits.ts
102
+ function luhnCheckDigit(digits) {
103
+ let sum = 0;
104
+ for (let i = digits.length - 1; i >= 0; i--) {
105
+ const pos = digits.length - 1 - i;
106
+ let d = Number(digits[i]);
107
+ if (pos % 2 === 0) {
108
+ d *= 2;
109
+ if (d > 9) d -= 9;
110
+ }
111
+ sum += d;
112
+ }
113
+ return ((10 - sum % 10) % 10).toString();
114
+ }
115
+ function luhnValidate(value) {
116
+ if (!/^\d+$/.test(value) || value.length < 2) return false;
117
+ let sum = 0;
118
+ for (let i = value.length - 1; i >= 0; i--) {
119
+ const pos = value.length - 1 - i;
120
+ let d = Number(value[i]);
121
+ if (pos % 2 === 1) {
122
+ d *= 2;
123
+ if (d > 9) d -= 9;
124
+ }
125
+ sum += d;
126
+ }
127
+ return sum % 10 === 0;
128
+ }
129
+ var NHS_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
130
+ function modulus11CheckDigit(nineDigits) {
131
+ let sum = 0;
132
+ for (let i = 0; i < 9; i++) {
133
+ const w = NHS_WEIGHTS[i] ?? 0;
134
+ sum += Number(nineDigits[i]) * w;
135
+ }
136
+ const check = 11 - sum % 11;
137
+ if (check === 11) return "0";
138
+ if (check === 10) return null;
139
+ return check.toString();
140
+ }
141
+ function modulus11Validate(value) {
142
+ if (!/^\d{10}$/.test(value)) return false;
143
+ const check = modulus11CheckDigit(value.slice(0, 9));
144
+ return check !== null && check === value[9];
145
+ }
146
+ var VERHOEFF_D = [
147
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
148
+ [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
149
+ [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
150
+ [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
151
+ [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
152
+ [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
153
+ [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
154
+ [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
155
+ [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
156
+ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
157
+ ];
158
+ var VERHOEFF_P = [
159
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
160
+ [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
161
+ [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
162
+ [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
163
+ [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
164
+ [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
165
+ [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
166
+ [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
167
+ ];
168
+ var VERHOEFF_INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];
169
+ function verhoeffStep(c, digit, position) {
170
+ const pRow = VERHOEFF_P[position % 8];
171
+ if (pRow === void 0) throw new Error(`Verhoeff P table: row ${position % 8} missing`);
172
+ const pVal = pRow[digit];
173
+ if (pVal === void 0) throw new Error(`Verhoeff P table: col ${digit} missing`);
174
+ const dRow = VERHOEFF_D[c];
175
+ if (dRow === void 0) throw new Error(`Verhoeff D table: row ${c} missing`);
176
+ const result = dRow[pVal];
177
+ if (result === void 0) throw new Error(`Verhoeff D table: col ${pVal} missing`);
178
+ return result;
179
+ }
180
+ function verhoeffCheckDigit(digits) {
181
+ const withPlaceholder = digits + "0";
182
+ const reversed = withPlaceholder.split("").reverse();
183
+ let c = 0;
184
+ for (let i = 0; i < reversed.length; i++) {
185
+ c = verhoeffStep(c, Number(reversed[i]), i);
186
+ }
187
+ const inv = VERHOEFF_INV[c];
188
+ if (inv === void 0) throw new Error(`Verhoeff INV table: index ${c} missing`);
189
+ return inv.toString();
190
+ }
191
+ function verhoeffValidate(value) {
192
+ if (!/^\d+$/.test(value) || value.length < 2) return false;
193
+ const reversed = value.split("").reverse();
194
+ let c = 0;
195
+ for (let i = 0; i < reversed.length; i++) {
196
+ c = verhoeffStep(c, Number(reversed[i]), i);
197
+ }
198
+ return c === 0;
199
+ }
200
+ var BSN_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2];
201
+ var BSN_VALIDATE_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2, -1];
202
+ function elevenProefCheckDigit(eightDigits) {
203
+ let sum = 0;
204
+ for (let i = 0; i < 8; i++) {
205
+ const w = BSN_WEIGHTS[i] ?? 0;
206
+ sum += Number(eightDigits[i]) * w;
207
+ }
208
+ const d9 = sum % 11;
209
+ if (d9 > 9) return null;
210
+ if (sum - d9 === 0) return null;
211
+ return d9.toString();
212
+ }
213
+ function elevenProefValidate(value) {
214
+ if (!/^\d{9}$/.test(value)) return false;
215
+ let sum = 0;
216
+ for (let i = 0; i < 9; i++) {
217
+ const w = BSN_VALIDATE_WEIGHTS[i] ?? 0;
218
+ sum += Number(value[i]) * w;
219
+ }
220
+ return sum !== 0 && sum % 11 === 0;
221
+ }
222
+ function modulus97Key(thirteenDigits) {
223
+ const nir = BigInt(thirteenDigits);
224
+ const key = 97n - nir % 97n;
225
+ return key.toString().padStart(2, "0");
226
+ }
227
+ function modulus97Validate(value) {
228
+ if (!/^\d{15}$/.test(value)) return false;
229
+ return modulus97Key(value.slice(0, 13)) === value.slice(13, 15);
230
+ }
231
+ var LANR_WEIGHTS = [4, 9, 2, 1, 6, 5];
232
+ function modulus10CheckDigit(sixDigits) {
233
+ let sum = 0;
234
+ for (let i = 0; i < 6; i++) {
235
+ const w = LANR_WEIGHTS[i] ?? 0;
236
+ sum += Number(sixDigits[i]) * w;
237
+ }
238
+ return ((10 - sum % 10) % 10).toString();
239
+ }
240
+ var RRN_WEIGHTS = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
241
+ function rrnCheckDigit(twelveDigits) {
242
+ let sum = 0;
243
+ for (let i = 0; i < 12; i++) {
244
+ const w = RRN_WEIGHTS[i] ?? 0;
245
+ sum += Number(twelveDigits[i]) * w;
246
+ }
247
+ return ((11 - sum % 11) % 10).toString();
248
+ }
249
+ function rrnValidate(value) {
250
+ const digits = value.replace(/-/g, "");
251
+ if (!/^\d{13}$/.test(digits)) return false;
252
+ return rrnCheckDigit(digits.slice(0, 12)) === digits[12];
253
+ }
254
+ var NRIC_WEIGHTS = [2, 7, 6, 5, 4, 3, 2];
255
+ var NRIC_ST_CHECK_LETTERS = "JZIHGFEDCBA";
256
+ var NRIC_FG_CHECK_LETTERS = "XWUTRQPNMLK";
257
+ function nricCheckLetter(prefix, sevenDigits) {
258
+ let sum = 0;
259
+ for (let i = 0; i < 7; i++) {
260
+ const w = NRIC_WEIGHTS[i] ?? 0;
261
+ sum += Number(sevenDigits[i]) * w;
262
+ }
263
+ if (prefix === "T" || prefix === "G") sum += 4;
264
+ const checkLetters = prefix === "F" || prefix === "G" ? NRIC_FG_CHECK_LETTERS : NRIC_ST_CHECK_LETTERS;
265
+ return checkLetters[sum % 11] ?? "A";
266
+ }
267
+ function nricValidate(value) {
268
+ if (!/^[STFG]\d{7}[A-Z]$/.test(value)) return false;
269
+ const prefix = value[0] ?? "";
270
+ const digits = value.slice(1, 8);
271
+ const checkChar = value[8] ?? "";
272
+ return nricCheckLetter(prefix, digits) === checkChar;
273
+ }
274
+ function cpfCheckDigits(nineDigits) {
275
+ let sum1 = 0;
276
+ for (let i = 0; i < 9; i++) {
277
+ sum1 += Number(nineDigits[i]) * (10 - i);
278
+ }
279
+ const rem1 = sum1 % 11;
280
+ const d1 = rem1 < 2 ? 0 : 11 - rem1;
281
+ const tenDigits = nineDigits + d1.toString();
282
+ let sum2 = 0;
283
+ for (let i = 0; i < 10; i++) {
284
+ sum2 += Number(tenDigits[i]) * (11 - i);
285
+ }
286
+ const rem2 = sum2 % 11;
287
+ const d2 = rem2 < 2 ? 0 : 11 - rem2;
288
+ return d1.toString() + d2.toString();
289
+ }
290
+ function cpfValidate(value) {
291
+ const digits = value.replace(/[.\-]/g, "");
292
+ if (!/^\d{11}$/.test(digits)) return false;
293
+ if (/^(\d)\1{10}$/.test(digits)) return false;
294
+ const check = cpfCheckDigits(digits.slice(0, 9));
295
+ return check === digits.slice(9, 11);
296
+ }
297
+
298
+ // src/core/generators/identifiers.ts
299
+ var nhsNumberDefinition = {
300
+ system: "https://fhir.nhs.uk/Id/nhs-number",
301
+ name: "NHS Number",
302
+ algorithm: "Modulus 11",
303
+ generate(rng) {
304
+ for (; ; ) {
305
+ const nine = randomDigits(9, rng);
306
+ const check = modulus11CheckDigit(nine);
307
+ if (check !== null) return nine + check;
308
+ }
309
+ },
310
+ validate: modulus11Validate
311
+ };
312
+ var odsCodDefinition = {
313
+ system: "https://fhir.nhs.uk/Id/ods-organization-code",
314
+ name: "ODS Code",
315
+ generate(rng) {
316
+ const letters = "ABCDEFGHJKLMNPRSTUVWXY";
317
+ const letter = pickRandom([...letters], rng);
318
+ const digits = randomDigits(2, rng);
319
+ return letter + digits;
320
+ },
321
+ validate(value) {
322
+ return /^[A-Z]{1,3}\d{1,4}[A-Z0-9]?$/.test(value);
323
+ }
324
+ };
325
+ var gmpNumberDefinition = {
326
+ system: "https://fhir.nhs.uk/Id/gmp-number",
327
+ name: "GMP Number",
328
+ generate(rng) {
329
+ return "G" + randomDigits(7, rng);
330
+ },
331
+ validate(value) {
332
+ return /^G\d{7}$/.test(value);
333
+ }
334
+ };
335
+ var gmcNumberDefinition = {
336
+ system: "https://fhir.hl7.org.uk/Id/gmc-number",
337
+ name: "GMC Number",
338
+ generate(rng) {
339
+ return randomDigits(7, rng);
340
+ },
341
+ validate(value) {
342
+ return /^\d{7}$/.test(value);
343
+ }
344
+ };
345
+ var ihiDefinition = {
346
+ system: "http://ns.electronichealth.net.au/id/hi/ihi/1.0",
347
+ name: "Individual Healthcare Identifier (IHI)",
348
+ algorithm: "Luhn",
349
+ generate(rng) {
350
+ const prefix = "800360";
351
+ const body = randomDigits(9, rng);
352
+ const fifteen = prefix + body;
353
+ return fifteen + luhnCheckDigit(fifteen);
354
+ },
355
+ validate(value) {
356
+ return /^\d{16}$/.test(value) && value.startsWith("800360") && luhnValidate(value);
357
+ }
358
+ };
359
+ var medicareNumberDefinition = {
360
+ system: "http://ns.electronichealth.net.au/id/medicare-number",
361
+ name: "Medicare Number",
362
+ algorithm: "Weighted sum (mod 10)",
363
+ generate(rng) {
364
+ const MEDICARE_WEIGHTS = [1, 3, 7, 9, 1, 3, 7];
365
+ const base = randomDigits(7, rng);
366
+ let sum = 0;
367
+ for (let i = 0; i < 7; i++) {
368
+ const w = MEDICARE_WEIGHTS[i] ?? 0;
369
+ sum += Number(base[i]) * w;
370
+ }
371
+ const check = sum % 10;
372
+ const ref = randomDigits(1, rng);
373
+ const irn = randomInt(1, 9, rng).toString();
374
+ return base + check.toString() + ref + irn;
375
+ },
376
+ validate(value) {
377
+ if (!/^\d{10}$/.test(value)) return false;
378
+ const weights = [1, 3, 7, 9, 1, 3, 7];
379
+ let sum = 0;
380
+ for (let i = 0; i < 7; i++) {
381
+ const w = weights[i] ?? 0;
382
+ sum += Number(value[i]) * w;
383
+ }
384
+ return sum % 10 === Number(value[7]);
385
+ }
386
+ };
387
+ var hpiiDefinition = {
388
+ system: "http://ns.electronichealth.net.au/id/hi/hpii/1.0",
389
+ name: "Healthcare Provider Identifier \u2014 Individual (HPI-I)",
390
+ algorithm: "Luhn",
391
+ generate(rng) {
392
+ const prefix = "800361";
393
+ const body = randomDigits(9, rng);
394
+ const fifteen = prefix + body;
395
+ return fifteen + luhnCheckDigit(fifteen);
396
+ },
397
+ validate(value) {
398
+ return /^\d{16}$/.test(value) && value.startsWith("800361") && luhnValidate(value);
399
+ }
400
+ };
401
+ var hpioDefinition = {
402
+ system: "http://ns.electronichealth.net.au/id/hi/hpio/1.0",
403
+ name: "Healthcare Provider Identifier \u2014 Organisation (HPI-O)",
404
+ algorithm: "Luhn",
405
+ generate(rng) {
406
+ const prefix = "800362";
407
+ const body = randomDigits(9, rng);
408
+ const fifteen = prefix + body;
409
+ return fifteen + luhnCheckDigit(fifteen);
410
+ },
411
+ validate(value) {
412
+ return /^\d{16}$/.test(value) && value.startsWith("800362") && luhnValidate(value);
413
+ }
414
+ };
415
+ var aadhaarDefinition = {
416
+ system: "https://healthid.ndhm.gov.in/api/v1/auth/aadhaar",
417
+ name: "Aadhaar Number",
418
+ algorithm: "Verhoeff",
419
+ generate(rng) {
420
+ const eleven = randomDigits(11, rng);
421
+ return eleven + verhoeffCheckDigit(eleven);
422
+ },
423
+ validate: verhoeffValidate
424
+ };
425
+ var abhaNumberDefinition = {
426
+ system: "https://healthid.abdm.gov.in/api/v1/abha-number",
427
+ name: "ABHA Number",
428
+ generate(rng) {
429
+ const digits = randomDigits(14, rng);
430
+ return `${digits.slice(0, 2)}-${digits.slice(2, 6)}-${digits.slice(6, 10)}-${digits.slice(10, 14)}`;
431
+ },
432
+ validate(value) {
433
+ return /^\d{2}-\d{4}-\d{4}-\d{4}$/.test(value);
434
+ }
435
+ };
436
+ var ontarioHcnDefinition = {
437
+ system: "https://fhir.infoway-inforoute.ca/NamingSystem/ca-on-patient-hcn",
438
+ name: "Ontario Health Card Number",
439
+ generate(rng) {
440
+ const digits = randomDigits(10, rng);
441
+ const letters = "ABCDEFGHJKLMNPRSTUVWXY";
442
+ const v1 = pickRandom([...letters], rng);
443
+ const v2 = pickRandom([...letters], rng);
444
+ return digits + v1 + v2;
445
+ },
446
+ validate(value) {
447
+ return /^\d{10}[A-Z]{2}$/.test(value);
448
+ }
449
+ };
450
+ var kvidDefinition = {
451
+ system: "http://fhir.de/sid/gkv/kvid-10",
452
+ name: "KVID-10",
453
+ generate(rng) {
454
+ const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
455
+ const letter = pickRandom([...letters], rng);
456
+ return letter + randomDigits(9, rng);
457
+ },
458
+ validate(value) {
459
+ return /^[A-Z]\d{9}$/.test(value);
460
+ }
461
+ };
462
+ var iknrDefinition = {
463
+ system: "http://fhir.de/sid/arge-ik/iknr",
464
+ name: "Institutionskennzeichen (IKNR)",
465
+ generate(rng) {
466
+ return randomDigits(9, rng);
467
+ },
468
+ validate(value) {
469
+ return /^\d{9}$/.test(value);
470
+ }
471
+ };
472
+ var lanrDefinition = {
473
+ system: "http://fhir.de/sid/kbv/lanr",
474
+ name: "Lebenslange Arztnummer (LANR)",
475
+ algorithm: "Modulus 10",
476
+ generate(rng) {
477
+ const six = randomDigits(6, rng);
478
+ const check = modulus10CheckDigit(six);
479
+ const suffix = randomDigits(2, rng);
480
+ return six + check + suffix;
481
+ },
482
+ validate(value) {
483
+ if (!/^\d{9}$/.test(value)) return false;
484
+ return modulus10CheckDigit(value.slice(0, 6)) === value[6];
485
+ }
486
+ };
487
+ var bsnrDefinition = {
488
+ system: "http://fhir.de/sid/kbv/bsnr",
489
+ name: "Betriebsst\xE4ttennummer (BSNR)",
490
+ generate(rng) {
491
+ return randomDigits(9, rng);
492
+ },
493
+ validate(value) {
494
+ return /^\d{9}$/.test(value);
495
+ }
496
+ };
497
+ var nirDefinition = {
498
+ system: "https://annuaire.sante.fr",
499
+ name: "NIR (Num\xE9ro d'Inscription au R\xE9pertoire)",
500
+ algorithm: "Modulus 97",
501
+ generate(rng) {
502
+ const gender = pickRandom(["1", "2"], rng);
503
+ const year = randomDigits(2, rng);
504
+ const month = randomInt(1, 12, rng).toString().padStart(2, "0");
505
+ const dept = randomInt(1, 95, rng).toString().padStart(2, "0");
506
+ const commune = randomInt(1, 999, rng).toString().padStart(3, "0");
507
+ const order = randomInt(1, 999, rng).toString().padStart(3, "0");
508
+ const thirteen = gender + year + month + dept + commune + order;
509
+ return thirteen + modulus97Key(thirteen);
510
+ },
511
+ validate: modulus97Validate
512
+ };
513
+ var finessDefinition = {
514
+ system: "https://annuaire.sante.fr/finess",
515
+ name: "FINESS (Fichier national des \xE9tablissements sanitaires et sociaux)",
516
+ generate(rng) {
517
+ const dept = randomInt(1, 95, rng).toString().padStart(2, "0");
518
+ return dept + randomDigits(7, rng);
519
+ },
520
+ validate(value) {
521
+ return /^\d{9}$/.test(value);
522
+ }
523
+ };
524
+ var rppsDefinition = {
525
+ system: "https://annuaire.sante.fr",
526
+ name: "RPPS Number",
527
+ algorithm: "Luhn",
528
+ generate(rng) {
529
+ const ten = randomDigits(10, rng);
530
+ return ten + luhnCheckDigit(ten);
531
+ },
532
+ validate(value) {
533
+ return /^\d{11}$/.test(value) && luhnValidate(value);
534
+ }
535
+ };
536
+ var bsnDefinition = {
537
+ system: "http://fhir.nl/fhir/NamingSystem/bsn",
538
+ name: "Burgerservicenummer (BSN)",
539
+ algorithm: "11-proef",
540
+ generate(rng) {
541
+ for (; ; ) {
542
+ const eight = randomDigits(8, rng);
543
+ const check = elevenProefCheckDigit(eight);
544
+ if (check !== null) return eight + check;
545
+ }
546
+ },
547
+ validate: elevenProefValidate
548
+ };
549
+ var agbCodeDefinition = {
550
+ system: "http://fhir.nl/fhir/NamingSystem/agb-z",
551
+ name: "AGB-Z Code",
552
+ generate(rng) {
553
+ return randomDigits(8, rng);
554
+ },
555
+ validate(value) {
556
+ return /^\d{8}$/.test(value);
557
+ }
558
+ };
559
+ var uziNumberDefinition = {
560
+ system: "http://fhir.nl/fhir/NamingSystem/uzi-nr-pers",
561
+ name: "UZI Number",
562
+ generate(rng) {
563
+ return randomDigits(8, rng);
564
+ },
565
+ validate(value) {
566
+ return /^\d{6,9}$/.test(value);
567
+ }
568
+ };
569
+ var IRS_RESERVED_PREFIX = "987654320";
570
+ var ssnDefinition = {
571
+ system: "http://hl7.org/fhir/sid/us-ssn",
572
+ name: "Social Security Number (SSN)",
573
+ generate(rng) {
574
+ for (; ; ) {
575
+ const area = randomInt(900, 998, rng);
576
+ const group = randomInt(1, 99, rng);
577
+ const serial = randomInt(1, 9999, rng);
578
+ const candidate = area.toString().padStart(3, "0") + group.toString().padStart(2, "0") + serial.toString().padStart(4, "0");
579
+ if (candidate.startsWith(IRS_RESERVED_PREFIX)) continue;
580
+ const formatted = candidate.slice(0, 3) + "-" + candidate.slice(3, 5) + "-" + candidate.slice(5);
581
+ return formatted;
582
+ }
583
+ },
584
+ validate(value) {
585
+ if (!/^\d{3}-\d{2}-\d{4}$/.test(value)) return false;
586
+ const digits = value.replace(/-/g, "");
587
+ const area = Number(digits.slice(0, 3));
588
+ const group = Number(digits.slice(3, 5));
589
+ const serial = Number(digits.slice(5));
590
+ return area !== 0 && area !== 666 && group !== 0 && serial !== 0;
591
+ }
592
+ };
593
+ var npiDefinition = {
594
+ system: "http://hl7.org/fhir/sid/us-npi",
595
+ name: "National Provider Identifier (NPI)",
596
+ algorithm: "Luhn",
597
+ generate(rng) {
598
+ const nine = randomDigits(9, rng);
599
+ const forLuhn = "80840" + nine;
600
+ const check = luhnCheckDigit(forLuhn);
601
+ return nine + check;
602
+ },
603
+ validate(value) {
604
+ if (!/^\d{10}$/.test(value)) return false;
605
+ return luhnValidate("80840" + value);
606
+ }
607
+ };
608
+ var mrnDefinition = {
609
+ system: "http://hospital.example.org/fhir/mrn",
610
+ name: "Medical Record Number (MRN)",
611
+ generate(rng) {
612
+ const letters = "ABCDEFGHJKLMNPRSTUVWXYZ";
613
+ const prefix = pickRandom([...letters], rng) + pickRandom([...letters], rng);
614
+ return prefix + randomDigits(6, rng);
615
+ },
616
+ validate(value) {
617
+ return /^[A-Z]{2}\d{6}$/.test(value);
618
+ }
619
+ };
620
+ var jpHospitalMrnDefinition = {
621
+ system: "http://jpfhir.jp/fhir/core/NamingSystem/jp-hospitalPatientId",
622
+ name: "Japanese Hospital Patient ID",
623
+ generate(rng) {
624
+ return randomDigits(10, rng);
625
+ },
626
+ validate(value) {
627
+ return /^\d{10}$/.test(value);
628
+ }
629
+ };
630
+ var RRN_GENDER_DIGIT = {
631
+ "male-old": "1",
632
+ "female-old": "2",
633
+ "male-new": "3",
634
+ "female-new": "4"
635
+ };
636
+ var krRrnDefinition = {
637
+ system: "http://www.mohw.go.kr/fhir/NamingSystem/rrn",
638
+ name: "Resident Registration Number (RRN)",
639
+ algorithm: "RRN check digit (weighted sum mod 11)",
640
+ generate(rng, context) {
641
+ const hasContext = context?.birthYear !== void 0 && context.gender !== void 0;
642
+ const fullYear = hasContext ? context.birthYear : randomInt(70, 99, rng) + 1900;
643
+ const yy = (fullYear % 100).toString().padStart(2, "0");
644
+ const month = randomInt(1, 12, rng).toString().padStart(2, "0");
645
+ const day = randomInt(1, 28, rng).toString().padStart(2, "0");
646
+ let genderDigit;
647
+ if (hasContext) {
648
+ const century = fullYear >= 2e3 ? "new" : "old";
649
+ const gender = context.gender;
650
+ genderDigit = RRN_GENDER_DIGIT[`${gender}-${century}`] ?? "1";
651
+ } else {
652
+ genderDigit = pickRandom(["1", "2"], rng);
653
+ }
654
+ const seq = randomDigits(5, rng);
655
+ const twelve = yy + month + day + genderDigit + seq;
656
+ const check = rrnCheckDigit(twelve);
657
+ return `${yy}${month}${day}-${genderDigit}${seq}${check}`;
658
+ },
659
+ validate(value) {
660
+ if (!/^\d{6}-\d{7}$/.test(value)) return false;
661
+ return rrnValidate(value);
662
+ }
663
+ };
664
+ var NRIC_PREFIXES = ["S", "S", "S", "T", "T", "F", "G"];
665
+ var sgNricDefinition = {
666
+ system: "http://hl7.org.sg/fhir/NamingSystem/nric-fin",
667
+ name: "NRIC / FIN",
668
+ algorithm: "NRIC check letter",
669
+ generate(rng) {
670
+ const prefix = pickRandom([...NRIC_PREFIXES], rng);
671
+ const digits = randomDigits(7, rng);
672
+ const check = nricCheckLetter(prefix, digits);
673
+ return `${prefix}${digits}${check}`;
674
+ },
675
+ validate(value) {
676
+ return nricValidate(value);
677
+ }
678
+ };
679
+ var brCpfDefinition = {
680
+ system: "http://rnds.saude.gov.br/fhir/r4/NamingSystem/cpf",
681
+ name: "CPF (Cadastro de Pessoas F\xEDsicas)",
682
+ algorithm: "Modulus 11 (CPF two-digit check)",
683
+ generate(rng) {
684
+ for (; ; ) {
685
+ const nine = randomDigits(9, rng);
686
+ if (/^(\d)\1{8}$/.test(nine)) continue;
687
+ const check = cpfCheckDigits(nine);
688
+ const raw = nine + check;
689
+ return raw.slice(0, 3) + "." + raw.slice(3, 6) + "." + raw.slice(6, 9) + "-" + raw.slice(9, 11);
690
+ }
691
+ },
692
+ validate: cpfValidate
693
+ };
694
+ var mxCurpDefinition = {
695
+ system: "http://www.salud.gob.mx/fhir/NamingSystem/curp",
696
+ name: "CURP (Clave \xDAnica de Registro de Poblaci\xF3n)",
697
+ generate(rng) {
698
+ const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
699
+ const CONSONANTS = "BCDFGHJKLMNPQRSTVWXYZ";
700
+ const MX_STATES = ["AS", "BC", "BS", "CC", "CL", "CM", "CS", "CH", "DF", "DG", "GT", "GR", "HG", "JC", "MC", "MN", "MS", "NT", "NL", "OC", "PL", "QT", "QR", "SP", "SL", "SR", "TC", "TS", "TL", "VZ", "YN", "ZS"];
701
+ const ALPHANUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
702
+ const CURP_CHECK = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
703
+ const l1 = pickRandom([...LETTERS], rng);
704
+ const l2 = pickRandom([...LETTERS], rng);
705
+ const l3 = pickRandom([...LETTERS], rng);
706
+ const l4 = pickRandom([...LETTERS], rng);
707
+ const year = randomInt(50, 99, rng).toString().padStart(2, "0");
708
+ const month = randomInt(1, 12, rng).toString().padStart(2, "0");
709
+ const day = randomInt(1, 28, rng).toString().padStart(2, "0");
710
+ const gender = pickRandom(["H", "M"], rng);
711
+ const state = pickRandom(MX_STATES, rng);
712
+ const c1 = pickRandom([...CONSONANTS], rng);
713
+ const c2 = pickRandom([...CONSONANTS], rng);
714
+ const c3 = pickRandom([...CONSONANTS], rng);
715
+ const an = pickRandom([...ALPHANUM], rng);
716
+ const body = l1 + l2 + l3 + l4 + year + month + day + gender + state + c1 + c2 + c3 + an;
717
+ let sum = 0;
718
+ for (let i = 0; i < 17; i++) {
719
+ const idx = CURP_CHECK.indexOf(body[i] ?? "");
720
+ sum += (idx >= 0 ? idx : 0) * (18 - i);
721
+ }
722
+ const checkIdx = (10 - sum % 10) % 10;
723
+ return body + checkIdx.toString();
724
+ },
725
+ validate(value) {
726
+ return /^[A-Z]{4}\d{6}[HM][A-Z]{2}[BCDFGHJKLMNPQRSTVWXYZ]{3}[0-9A-Z]\d$/.test(value);
727
+ }
728
+ };
729
+ var zaIdDefinition = {
730
+ system: "http://www.rsaidentity.co.za/fhir/NamingSystem/said",
731
+ name: "South African ID Number",
732
+ algorithm: "Luhn",
733
+ generate(rng) {
734
+ const year = randomInt(50, 99, rng).toString().padStart(2, "0");
735
+ const month = randomInt(1, 12, rng).toString().padStart(2, "0");
736
+ const day = randomInt(1, 28, rng).toString().padStart(2, "0");
737
+ const genderDigit = pickRandom([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], rng).toString();
738
+ const seq = randomInt(0, 999, rng).toString().padStart(3, "0");
739
+ const citizenship = "0";
740
+ const race = "8";
741
+ const twelve = year + month + day + genderDigit + seq + citizenship + race;
742
+ const check = luhnCheckDigit(twelve);
743
+ return twelve + check;
744
+ },
745
+ validate(value) {
746
+ return /^\d{13}$/.test(value) && luhnValidate(value);
747
+ }
748
+ };
749
+ var cpsoPractitionerDefinition = {
750
+ system: "https://www.cpso.on.ca/",
751
+ name: "CPSO/Provincial Licence Number",
752
+ generate(rng) {
753
+ return randomDigits(6, rng);
754
+ },
755
+ validate(value) {
756
+ return /^\d{5,6}$/.test(value);
757
+ }
758
+ };
759
+ var nmcRegistrationDefinition = {
760
+ system: "https://www.nmc.org.in/",
761
+ name: "NMC Registration Number",
762
+ generate(rng) {
763
+ return randomDigits(6, rng);
764
+ },
765
+ validate(value) {
766
+ return /^\d{6}$/.test(value);
767
+ }
768
+ };
769
+ var jmpDoctorLicenseDefinition = {
770
+ system: "http://jpfhir.jp/fhir/core/NamingSystem/jp-doctor-license",
771
+ name: "JMPC Physician Registration Number",
772
+ generate(rng) {
773
+ return randomDigits(6, rng);
774
+ },
775
+ validate(value) {
776
+ return /^\d{6}$/.test(value);
777
+ }
778
+ };
779
+ var mohwDoctorLicenseDefinition = {
780
+ system: "http://www.mohw.go.kr/fhir/NamingSystem/doctor-license",
781
+ name: "Medical Licence Number (\uBCF4\uAC74\uBCF5\uC9C0\uBD80)",
782
+ generate(rng) {
783
+ return randomDigits(5, rng);
784
+ },
785
+ validate(value) {
786
+ return /^\d{5}$/.test(value);
787
+ }
788
+ };
789
+ var smcRegistrationDefinition = {
790
+ system: "http://www.smc.gov.sg/fhir/NamingSystem/smcr",
791
+ name: "Singapore Medical Council Registration",
792
+ generate(rng) {
793
+ return "M" + randomDigits(5, rng);
794
+ },
795
+ validate(value) {
796
+ return /^M\d{5}$/.test(value);
797
+ }
798
+ };
799
+ var BR_CRM_STATES = ["SP", "RJ", "MG", "RS", "BA", "PR", "PE", "CE", "GO", "MA"];
800
+ var crmPractitionerDefinition = {
801
+ system: "https://www.cfm.org.br/fhir/NamingSystem/crm",
802
+ name: "CRM (Conselho Regional de Medicina)",
803
+ generate(rng) {
804
+ const state = pickRandom([...BR_CRM_STATES], rng);
805
+ return `${state}-${randomDigits(5, rng)}`;
806
+ },
807
+ validate(value) {
808
+ return /^[A-Z]{2}-\d{5}$/.test(value);
809
+ }
810
+ };
811
+ var cedulaProfesionalDefinition = {
812
+ system: "http://www.sep.gob.mx/fhir/NamingSystem/cedula",
813
+ name: "C\xE9dula Profesional",
814
+ generate(rng) {
815
+ return randomDigits(7, rng);
816
+ },
817
+ validate(value) {
818
+ return /^\d{7}$/.test(value);
819
+ }
820
+ };
821
+ var hpcsaRegistrationDefinition = {
822
+ system: "https://www.hpcsa.co.za/fhir/NamingSystem/hpcsa",
823
+ name: "HPCSA Registration Number",
824
+ generate(rng) {
825
+ return "MP" + randomDigits(6, rng);
826
+ },
827
+ validate(value) {
828
+ return /^MP\d{6}$/.test(value);
829
+ }
830
+ };
831
+
832
+ // src/locales/us/addresses.ts
833
+ var usAddressTemplate = {
834
+ streets: [
835
+ "Oak Street",
836
+ "Maple Avenue",
837
+ "Cedar Lane",
838
+ "Pine Road",
839
+ "Elm Drive",
840
+ "Washington Boulevard",
841
+ "Lincoln Way",
842
+ "Jefferson Avenue",
843
+ "Madison Street",
844
+ "Franklin Road",
845
+ "Adams Lane",
846
+ "Monroe Drive",
847
+ "Harrison Court",
848
+ "Willow Creek Road",
849
+ "Sunset Boulevard",
850
+ "Riverside Drive",
851
+ "Hillcrest Avenue",
852
+ "Meadowbrook Lane",
853
+ "Lakeview Drive",
854
+ "Greenwood Place",
855
+ "Birchwood Circle",
856
+ "Foxglove Court",
857
+ "Stonebridge Road",
858
+ "Clearwater Lane"
859
+ ],
860
+ cities: [
861
+ { name: "Springfield", state: "IL" },
862
+ { name: "Portland", state: "OR" },
863
+ { name: "Columbus", state: "OH" },
864
+ { name: "Austin", state: "TX" },
865
+ { name: "Phoenix", state: "AZ" },
866
+ { name: "Charlotte", state: "NC" },
867
+ { name: "Indianapolis", state: "IN" },
868
+ { name: "Memphis", state: "TN" },
869
+ { name: "Louisville", state: "KY" },
870
+ { name: "Milwaukee", state: "WI" },
871
+ { name: "Albuquerque", state: "NM" },
872
+ { name: "Tucson", state: "AZ" },
873
+ { name: "Fresno", state: "CA" }
874
+ ],
875
+ generatePostalCode(rng, _state) {
876
+ const zip = randomInt(1e4, 99998, rng);
877
+ return zip.toString().padStart(5, "0");
878
+ },
879
+ country: "US"
880
+ };
881
+
882
+ // src/locales/us/names.ts
883
+ var usNamePool = {
884
+ given: {
885
+ male: [
886
+ "James",
887
+ "John",
888
+ "Robert",
889
+ "Michael",
890
+ "William",
891
+ "David",
892
+ "Richard",
893
+ "Joseph",
894
+ "Thomas",
895
+ "Charles",
896
+ "Christopher",
897
+ "Daniel",
898
+ "Matthew",
899
+ "Anthony",
900
+ "Donald",
901
+ "Mark",
902
+ "Paul",
903
+ "Steven",
904
+ "Andrew",
905
+ "Kenneth",
906
+ "Joshua",
907
+ "Kevin",
908
+ "Brian",
909
+ "George",
910
+ "Timothy",
911
+ "Ronald",
912
+ "Edward",
913
+ "Jason",
914
+ "Jeffrey",
915
+ "Ryan",
916
+ "Jacob",
917
+ "Gary",
918
+ "Nicholas",
919
+ "Eric"
920
+ ],
921
+ female: [
922
+ "Mary",
923
+ "Patricia",
924
+ "Jennifer",
925
+ "Linda",
926
+ "Barbara",
927
+ "Elizabeth",
928
+ "Susan",
929
+ "Jessica",
930
+ "Sarah",
931
+ "Karen",
932
+ "Lisa",
933
+ "Nancy",
934
+ "Betty",
935
+ "Margaret",
936
+ "Sandra",
937
+ "Ashley",
938
+ "Dorothy",
939
+ "Kimberly",
940
+ "Emily",
941
+ "Donna",
942
+ "Michelle",
943
+ "Carol",
944
+ "Amanda",
945
+ "Melissa",
946
+ "Deborah",
947
+ "Stephanie",
948
+ "Rebecca",
949
+ "Sharon",
950
+ "Laura",
951
+ "Cynthia",
952
+ "Kathleen",
953
+ "Amy",
954
+ "Angela",
955
+ "Shirley",
956
+ "Anna"
957
+ ]
958
+ },
959
+ family: [
960
+ "Smith",
961
+ "Johnson",
962
+ "Williams",
963
+ "Brown",
964
+ "Jones",
965
+ "Garcia",
966
+ "Miller",
967
+ "Davis",
968
+ "Rodriguez",
969
+ "Martinez",
970
+ "Hernandez",
971
+ "Lopez",
972
+ "Gonzalez",
973
+ "Wilson",
974
+ "Anderson",
975
+ "Thomas",
976
+ "Taylor",
977
+ "Moore",
978
+ "Jackson",
979
+ "Martin",
980
+ "Lee",
981
+ "Perez",
982
+ "Thompson",
983
+ "White",
984
+ "Harris",
985
+ "Sanchez",
986
+ "Clark",
987
+ "Ramirez",
988
+ "Lewis",
989
+ "Robinson",
990
+ "Walker",
991
+ "Young",
992
+ "Allen",
993
+ "King",
994
+ "Wright",
995
+ "Scott",
996
+ "Torres",
997
+ "Nguyen",
998
+ "Hill",
999
+ "Flores",
1000
+ "Green",
1001
+ "Adams",
1002
+ "Nelson",
1003
+ "Baker",
1004
+ "Hall",
1005
+ "Rivera",
1006
+ "Campbell",
1007
+ "Mitchell"
1008
+ ]
1009
+ };
1010
+
1011
+ // src/locales/us/index.ts
1012
+ var usLocale = {
1013
+ code: "us",
1014
+ name: "United States",
1015
+ patientIdentifiers: [ssnDefinition, mrnDefinition],
1016
+ practitionerIdentifiers: [npiDefinition],
1017
+ organizationIdentifiers: [npiDefinition],
1018
+ address: usAddressTemplate,
1019
+ names: usNamePool
1020
+ };
1021
+
1022
+ // src/locales/uk/addresses.ts
1023
+ var POSTCODE_AREA_LETTERS = [..."ABCDEFGHIJKLMNOPRSTUVWXY"];
1024
+ var POSTCODE_INWARD_LETTERS = [..."ABDEFGHJLNPQRSTUVWXYZ"];
1025
+ var ukAddressTemplate = {
1026
+ streets: [
1027
+ "High Street",
1028
+ "Church Lane",
1029
+ "Mill Road",
1030
+ "Station Road",
1031
+ "Park Avenue",
1032
+ "Victoria Road",
1033
+ "Albert Street",
1034
+ "George Street",
1035
+ "King Street",
1036
+ "Queen Street",
1037
+ "Market Place",
1038
+ "Bridge Street",
1039
+ "School Lane",
1040
+ "Manor Road",
1041
+ "Vicarage Lane",
1042
+ "The Green",
1043
+ "Chestnut Avenue",
1044
+ "Elm Close",
1045
+ "Beech Road",
1046
+ "Ash Grove",
1047
+ "Hollybrook Drive",
1048
+ "Primrose Hill",
1049
+ "Meadow Way",
1050
+ "Oakfield Road"
1051
+ ],
1052
+ cities: [
1053
+ { name: "London", district: "Greater London" },
1054
+ { name: "Manchester", district: "Greater Manchester" },
1055
+ { name: "Birmingham", district: "West Midlands" },
1056
+ { name: "Leeds", district: "West Yorkshire" },
1057
+ { name: "Glasgow", district: "City of Glasgow" },
1058
+ { name: "Edinburgh", district: "City of Edinburgh" },
1059
+ { name: "Bristol", district: "City of Bristol" },
1060
+ { name: "Leicester", district: "Leicestershire" },
1061
+ { name: "Coventry", district: "West Midlands" },
1062
+ { name: "Bradford", district: "West Yorkshire" },
1063
+ { name: "Cardiff", district: "Cardiff" },
1064
+ { name: "Nottingham", district: "Nottinghamshire" }
1065
+ ],
1066
+ generatePostalCode(rng, _state) {
1067
+ const area1 = pickRandom(POSTCODE_AREA_LETTERS, rng);
1068
+ const area2 = pickRandom(POSTCODE_AREA_LETTERS, rng);
1069
+ const district = randomInt(1, 99, rng);
1070
+ const sector = randomInt(0, 9, rng);
1071
+ const unit1 = pickRandom(POSTCODE_INWARD_LETTERS, rng);
1072
+ const unit2 = pickRandom(POSTCODE_INWARD_LETTERS, rng);
1073
+ return `${area1}${area2}${district} ${sector}${unit1}${unit2}`;
1074
+ },
1075
+ country: "GB"
1076
+ };
1077
+
1078
+ // src/locales/uk/names.ts
1079
+ var ukNamePool = {
1080
+ given: {
1081
+ male: [
1082
+ "Oliver",
1083
+ "George",
1084
+ "Harry",
1085
+ "Jack",
1086
+ "Jacob",
1087
+ "Noah",
1088
+ "Charlie",
1089
+ "Muhammad",
1090
+ "Thomas",
1091
+ "Oscar",
1092
+ "William",
1093
+ "James",
1094
+ "Henry",
1095
+ "Alfie",
1096
+ "Joshua",
1097
+ "Freddie",
1098
+ "Archie",
1099
+ "Ethan",
1100
+ "Isaac",
1101
+ "Alexander",
1102
+ "Edward",
1103
+ "Arthur",
1104
+ "Sebastian",
1105
+ "Daniel",
1106
+ "Samuel",
1107
+ "Leo",
1108
+ "Adam",
1109
+ "Benjamin",
1110
+ "Luca",
1111
+ "Elijah",
1112
+ "Harrison",
1113
+ "Mason"
1114
+ ],
1115
+ female: [
1116
+ "Olivia",
1117
+ "Amelia",
1118
+ "Isla",
1119
+ "Ava",
1120
+ "Emily",
1121
+ "Isabella",
1122
+ "Mia",
1123
+ "Poppy",
1124
+ "Ella",
1125
+ "Lily",
1126
+ "Sophia",
1127
+ "Evie",
1128
+ "Grace",
1129
+ "Freya",
1130
+ "Charlotte",
1131
+ "Emma",
1132
+ "Sophie",
1133
+ "Alice",
1134
+ "Ruby",
1135
+ "Florence",
1136
+ "Evelyn",
1137
+ "Daisy",
1138
+ "Millie",
1139
+ "Phoebe",
1140
+ "Harriet",
1141
+ "Imogen",
1142
+ "Ellie",
1143
+ "Jasmine",
1144
+ "Abigail",
1145
+ "Matilda",
1146
+ "Rosie",
1147
+ "Chloe"
1148
+ ]
1149
+ },
1150
+ family: [
1151
+ "Smith",
1152
+ "Jones",
1153
+ "Williams",
1154
+ "Taylor",
1155
+ "Brown",
1156
+ "Davies",
1157
+ "Evans",
1158
+ "Wilson",
1159
+ "Thomas",
1160
+ "Roberts",
1161
+ "Johnson",
1162
+ "Lewis",
1163
+ "Walker",
1164
+ "Robinson",
1165
+ "Wood",
1166
+ "Thompson",
1167
+ "White",
1168
+ "Watson",
1169
+ "Jackson",
1170
+ "Wright",
1171
+ "Green",
1172
+ "Harris",
1173
+ "Cooper",
1174
+ "King",
1175
+ "Lee",
1176
+ "Martin",
1177
+ "Clarke",
1178
+ "James",
1179
+ "Morgan",
1180
+ "Hughes",
1181
+ "Edwards",
1182
+ "Hill",
1183
+ "Moore",
1184
+ "Clark",
1185
+ "Harrison",
1186
+ "Scott",
1187
+ "Young",
1188
+ "Morris",
1189
+ "Hall",
1190
+ "Ward",
1191
+ "Turner",
1192
+ "Carter",
1193
+ "Phillips",
1194
+ "Mitchell",
1195
+ "Patel",
1196
+ "Adams",
1197
+ "Campbell",
1198
+ "Anderson",
1199
+ "Allen",
1200
+ "Cook"
1201
+ ]
1202
+ };
1203
+
1204
+ // src/locales/uk/index.ts
1205
+ var ukLocale = {
1206
+ code: "uk",
1207
+ name: "United Kingdom",
1208
+ patientIdentifiers: [nhsNumberDefinition],
1209
+ practitionerIdentifiers: [gmcNumberDefinition, gmpNumberDefinition],
1210
+ organizationIdentifiers: [odsCodDefinition],
1211
+ address: ukAddressTemplate,
1212
+ names: ukNamePool
1213
+ };
1214
+
1215
+ // src/locales/au/addresses.ts
1216
+ var STATE_POSTCODE_RANGES = {
1217
+ NSW: [2e3, 2999],
1218
+ VIC: [3e3, 3999],
1219
+ QLD: [4e3, 4999],
1220
+ SA: [5e3, 5999],
1221
+ WA: [6e3, 6999],
1222
+ TAS: [7e3, 7999],
1223
+ ACT: [2600, 2639],
1224
+ NT: [800, 999]
1225
+ };
1226
+ var AU_CITIES = [
1227
+ { name: "Sydney", state: "NSW" },
1228
+ { name: "Melbourne", state: "VIC" },
1229
+ { name: "Brisbane", state: "QLD" },
1230
+ { name: "Perth", state: "WA" },
1231
+ { name: "Adelaide", state: "SA" },
1232
+ { name: "Gold Coast", state: "QLD" },
1233
+ { name: "Canberra", state: "ACT" },
1234
+ { name: "Hobart", state: "TAS" },
1235
+ { name: "Darwin", state: "NT" },
1236
+ { name: "Newcastle", state: "NSW" },
1237
+ { name: "Geelong", state: "VIC" },
1238
+ { name: "Wollongong", state: "NSW" }
1239
+ ];
1240
+ var auAddressTemplate = {
1241
+ streets: [
1242
+ "George Street",
1243
+ "Pitt Street",
1244
+ "King Street",
1245
+ "Elizabeth Street",
1246
+ "William Street",
1247
+ "Market Street",
1248
+ "Hunter Street",
1249
+ "Macquarie Street",
1250
+ "Collins Street",
1251
+ "Bourke Street",
1252
+ "Swanston Street",
1253
+ "Flinders Street",
1254
+ "Queen Street",
1255
+ "Albert Street",
1256
+ "Ann Street",
1257
+ "Adelaide Street",
1258
+ "Hay Street",
1259
+ "Murray Street",
1260
+ "Barrack Street",
1261
+ "St Georges Terrace",
1262
+ "Rundle Mall",
1263
+ "Hindley Street",
1264
+ "Currie Street",
1265
+ "Grenfell Street"
1266
+ ],
1267
+ cities: AU_CITIES,
1268
+ generatePostalCode(rng, state) {
1269
+ const range = (state !== void 0 ? STATE_POSTCODE_RANGES[state] : void 0) ?? STATE_POSTCODE_RANGES["NSW"] ?? [2e3, 2999];
1270
+ return randomInt(range[0], range[1], rng).toString().padStart(4, "0");
1271
+ },
1272
+ country: "AU"
1273
+ };
1274
+
1275
+ // src/locales/au/names.ts
1276
+ var auNamePool = {
1277
+ given: {
1278
+ male: [
1279
+ "Oliver",
1280
+ "William",
1281
+ "Jack",
1282
+ "Noah",
1283
+ "Thomas",
1284
+ "James",
1285
+ "Lucas",
1286
+ "Henry",
1287
+ "Ethan",
1288
+ "Mason",
1289
+ "Alexander",
1290
+ "Charlie",
1291
+ "Liam",
1292
+ "Lachlan",
1293
+ "Joshua",
1294
+ "Benjamin",
1295
+ "Samuel",
1296
+ "Cooper",
1297
+ "Elijah",
1298
+ "Isaac",
1299
+ "Riley",
1300
+ "Hudson",
1301
+ "Angus",
1302
+ "Flynn",
1303
+ "Hamish",
1304
+ "Sebastian",
1305
+ "Harrison",
1306
+ "Finn",
1307
+ "Archie",
1308
+ "Max",
1309
+ "Leo",
1310
+ "Jake"
1311
+ ],
1312
+ female: [
1313
+ "Olivia",
1314
+ "Charlotte",
1315
+ "Ava",
1316
+ "Amelia",
1317
+ "Mia",
1318
+ "Isla",
1319
+ "Grace",
1320
+ "Sophie",
1321
+ "Ella",
1322
+ "Emma",
1323
+ "Chloe",
1324
+ "Isabella",
1325
+ "Ruby",
1326
+ "Zoe",
1327
+ "Lily",
1328
+ "Emily",
1329
+ "Harper",
1330
+ "Layla",
1331
+ "Aria",
1332
+ "Evie",
1333
+ "Madison",
1334
+ "Ellie",
1335
+ "Sofia",
1336
+ "Scarlett",
1337
+ "Sienna",
1338
+ "Freya",
1339
+ "Matilda",
1340
+ "Abigail",
1341
+ "Hannah",
1342
+ "Imogen",
1343
+ "Ivy",
1344
+ "Aurora"
1345
+ ]
1346
+ },
1347
+ family: [
1348
+ "Smith",
1349
+ "Jones",
1350
+ "Williams",
1351
+ "Brown",
1352
+ "Wilson",
1353
+ "Taylor",
1354
+ "Johnson",
1355
+ "White",
1356
+ "Martin",
1357
+ "Anderson",
1358
+ "Thompson",
1359
+ "Nguyen",
1360
+ "Thomas",
1361
+ "Walker",
1362
+ "Harris",
1363
+ "Lee",
1364
+ "Ryan",
1365
+ "Robinson",
1366
+ "Kelly",
1367
+ "King",
1368
+ "Davis",
1369
+ "Wright",
1370
+ "Evans",
1371
+ "Roberts",
1372
+ "Green",
1373
+ "Hall",
1374
+ "Young",
1375
+ "Clarke",
1376
+ "Mitchell",
1377
+ "Lewis",
1378
+ "Scott",
1379
+ "Watson",
1380
+ "Morrison",
1381
+ "O'Brien",
1382
+ "Sullivan",
1383
+ "Murphy",
1384
+ "Walsh",
1385
+ "Patel",
1386
+ "Singh",
1387
+ "Chen",
1388
+ "Miller",
1389
+ "Cooper",
1390
+ "Campbell",
1391
+ "Stewart",
1392
+ "Baker",
1393
+ "Turner",
1394
+ "Hill",
1395
+ "Collins",
1396
+ "Wood",
1397
+ "Parker"
1398
+ ]
1399
+ };
1400
+
1401
+ // src/locales/au/index.ts
1402
+ var auLocale = {
1403
+ code: "au",
1404
+ name: "Australia",
1405
+ patientIdentifiers: [ihiDefinition, medicareNumberDefinition],
1406
+ practitionerIdentifiers: [hpiiDefinition],
1407
+ organizationIdentifiers: [hpioDefinition],
1408
+ address: auAddressTemplate,
1409
+ names: auNamePool
1410
+ };
1411
+
1412
+ // src/locales/ca/addresses.ts
1413
+ var PROVINCE_FSA_LETTER = {
1414
+ NL: "A",
1415
+ NS: "B",
1416
+ PE: "C",
1417
+ NB: "E",
1418
+ QC: "G",
1419
+ ON: "M",
1420
+ MB: "R",
1421
+ SK: "S",
1422
+ AB: "T",
1423
+ BC: "V",
1424
+ NT: "X",
1425
+ YT: "Y"
1426
+ };
1427
+ var POSTAL_LETTERS = [..."ABCEGHJKLMNPRSTVY"];
1428
+ var CA_CITIES = [
1429
+ { name: "Toronto", state: "ON" },
1430
+ { name: "Montreal", state: "QC" },
1431
+ { name: "Vancouver", state: "BC" },
1432
+ { name: "Calgary", state: "AB" },
1433
+ { name: "Edmonton", state: "AB" },
1434
+ { name: "Ottawa", state: "ON" },
1435
+ { name: "Winnipeg", state: "MB" },
1436
+ { name: "Quebec City", state: "QC" },
1437
+ { name: "Halifax", state: "NS" },
1438
+ { name: "Saskatoon", state: "SK" },
1439
+ { name: "Regina", state: "SK" },
1440
+ { name: "Victoria", state: "BC" }
1441
+ ];
1442
+ var caAddressTemplate = {
1443
+ streets: [
1444
+ "Maple Street",
1445
+ "Oak Avenue",
1446
+ "Main Street",
1447
+ "Centre Street",
1448
+ "Queen Street",
1449
+ "King Street",
1450
+ "Wellington Street",
1451
+ "Dundas Street",
1452
+ "Bloor Street",
1453
+ "Yonge Street",
1454
+ "College Street",
1455
+ "Broadview Avenue",
1456
+ "Rue Saint-Laurent",
1457
+ "Rue Sainte-Catherine",
1458
+ "Avenue du Parc",
1459
+ "Boulevard Ren\xE9-L\xE9vesque",
1460
+ "Chemin de la C\xF4te-des-Neiges",
1461
+ "Granville Street",
1462
+ "Robson Street",
1463
+ "Burrard Street",
1464
+ "Jasper Avenue",
1465
+ "Portage Avenue",
1466
+ "Barrington Street",
1467
+ "Spring Garden Road"
1468
+ ],
1469
+ cities: CA_CITIES,
1470
+ generatePostalCode(rng, state) {
1471
+ const firstLetter = state !== void 0 ? PROVINCE_FSA_LETTER[state] ?? pickRandom(Object.values(PROVINCE_FSA_LETTER), rng) : pickRandom(Object.values(PROVINCE_FSA_LETTER), rng);
1472
+ const d1 = randomInt(0, 9, rng);
1473
+ const l1 = pickRandom(POSTAL_LETTERS, rng);
1474
+ const d2 = randomInt(0, 9, rng);
1475
+ const l2 = pickRandom(POSTAL_LETTERS, rng);
1476
+ const d3 = randomInt(0, 9, rng);
1477
+ return `${firstLetter}${d1}${l1} ${d2}${l2}${d3}`;
1478
+ },
1479
+ country: "CA"
1480
+ };
1481
+
1482
+ // src/locales/ca/names.ts
1483
+ var caNamePool = {
1484
+ given: {
1485
+ male: [
1486
+ // English names
1487
+ "Liam",
1488
+ "Noah",
1489
+ "Oliver",
1490
+ "William",
1491
+ "James",
1492
+ "Benjamin",
1493
+ "Lucas",
1494
+ "Henry",
1495
+ "Alexander",
1496
+ "Mason",
1497
+ "Ethan",
1498
+ "Daniel",
1499
+ "Matthew",
1500
+ "Logan",
1501
+ // French-Canadian names
1502
+ "Jean",
1503
+ "Pierre",
1504
+ "Fran\xE7ois",
1505
+ "Luc",
1506
+ "Marc",
1507
+ "Maxime",
1508
+ "Alexis",
1509
+ "Simon",
1510
+ "Mathieu",
1511
+ "Antoine",
1512
+ "Gabriel",
1513
+ "Samuel",
1514
+ "F\xE9lix",
1515
+ "Julien",
1516
+ "Etienne",
1517
+ "Philippe",
1518
+ "Nicolas",
1519
+ "Thomas",
1520
+ "David",
1521
+ "Charles"
1522
+ ],
1523
+ female: [
1524
+ // English names
1525
+ "Olivia",
1526
+ "Emma",
1527
+ "Charlotte",
1528
+ "Amelia",
1529
+ "Ava",
1530
+ "Sophia",
1531
+ "Isabella",
1532
+ "Mia",
1533
+ "Evelyn",
1534
+ "Harper",
1535
+ "Luna",
1536
+ "Camila",
1537
+ "Gianna",
1538
+ "Elizabeth",
1539
+ // French-Canadian names
1540
+ "Marie",
1541
+ "Sophie",
1542
+ "Chlo\xE9",
1543
+ "Emma",
1544
+ "L\xE9a",
1545
+ "Jade",
1546
+ "Laura",
1547
+ "Sarah",
1548
+ "Camille",
1549
+ "Manon",
1550
+ "Julie",
1551
+ "Isabelle",
1552
+ "Am\xE9lie",
1553
+ "Clara",
1554
+ "Ma\xEBlle",
1555
+ "Alice",
1556
+ "Lucie",
1557
+ "Margot",
1558
+ "Audrey",
1559
+ "Laurie"
1560
+ ]
1561
+ },
1562
+ family: [
1563
+ // English-Canadian surnames
1564
+ "Smith",
1565
+ "Brown",
1566
+ "Tremblay",
1567
+ "Martin",
1568
+ "Roy",
1569
+ "Wilson",
1570
+ "Macdonald",
1571
+ "Campbell",
1572
+ "Anderson",
1573
+ "Scott",
1574
+ "Jones",
1575
+ "Taylor",
1576
+ "Thompson",
1577
+ "White",
1578
+ "Moore",
1579
+ "Jackson",
1580
+ "Harris",
1581
+ "Clark",
1582
+ "Lewis",
1583
+ "Robinson",
1584
+ // French-Canadian surnames
1585
+ "Gagnon",
1586
+ "Bouchard",
1587
+ "C\xF4t\xE9",
1588
+ "B\xE9langer",
1589
+ "Gauthier",
1590
+ "Morin",
1591
+ "Lavoie",
1592
+ "Fortin",
1593
+ "Gagn\xE9",
1594
+ "Ouellet",
1595
+ "Pelletier",
1596
+ "Bergeron",
1597
+ "Leblanc",
1598
+ "Girard",
1599
+ "Savard",
1600
+ "Villeneuve",
1601
+ "Caron",
1602
+ "Beaulieu",
1603
+ "Thibault",
1604
+ "Dubois",
1605
+ "Poirier",
1606
+ "Lacroix",
1607
+ "Auger",
1608
+ "Denis",
1609
+ "Lefebvre",
1610
+ "Charbonneau",
1611
+ "Lapierre",
1612
+ "Bolduc"
1613
+ ]
1614
+ };
1615
+
1616
+ // src/locales/ca/index.ts
1617
+ var caLocale = {
1618
+ code: "ca",
1619
+ name: "Canada",
1620
+ patientIdentifiers: [ontarioHcnDefinition],
1621
+ practitionerIdentifiers: [cpsoPractitionerDefinition],
1622
+ organizationIdentifiers: [],
1623
+ address: caAddressTemplate,
1624
+ names: caNamePool
1625
+ };
1626
+
1627
+ // src/locales/de/addresses.ts
1628
+ var STATE_PLZ_PREFIXES = {
1629
+ "Berlin": [10, 11, 12, 13, 14],
1630
+ "Bayern": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97],
1631
+ "Nordrhein-Westfalen": [40, 41, 42, 44, 45, 46, 47, 48, 50, 51, 52, 53],
1632
+ "Baden-W\xFCrttemberg": [68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
1633
+ "Hamburg": [20, 21, 22],
1634
+ "Sachsen": [1, 2, 4]
1635
+ };
1636
+ var DE_STREET_SUFFIXES = [
1637
+ "strasse",
1638
+ "weg",
1639
+ "platz",
1640
+ "allee",
1641
+ "ring",
1642
+ "gasse",
1643
+ "damm",
1644
+ "ufer"
1645
+ ];
1646
+ var DE_STREET_ROOTS = [
1647
+ "Friedrich",
1648
+ "Haupt",
1649
+ "Bahnhof",
1650
+ "Garten",
1651
+ "Schloss",
1652
+ "Schul",
1653
+ "Kirch",
1654
+ "Markt",
1655
+ "Wald",
1656
+ "Berg",
1657
+ "See",
1658
+ "Wiesen",
1659
+ "Linden",
1660
+ "Kaiser",
1661
+ "K\xF6nig",
1662
+ "Bismarck",
1663
+ "Goethe",
1664
+ "Schiller",
1665
+ "Hegel",
1666
+ "Humboldt",
1667
+ "Kant",
1668
+ "Heine",
1669
+ "Brahms"
1670
+ ];
1671
+ var deAddressTemplate = {
1672
+ streets: DE_STREET_ROOTS.flatMap(
1673
+ (root) => DE_STREET_SUFFIXES.slice(0, 1).map((suffix) => `${root}${suffix}`)
1674
+ ).concat([
1675
+ "Friedrichstrasse",
1676
+ "Hauptstrasse",
1677
+ "Bahnhofstrasse",
1678
+ "Gartenweg",
1679
+ "Schlossallee",
1680
+ "Schulstrasse",
1681
+ "Kirchgasse",
1682
+ "Marktplatz",
1683
+ "Waldweg",
1684
+ "Bergstrasse",
1685
+ "Seestrasse",
1686
+ "Wiesenweg",
1687
+ "Lindenallee"
1688
+ ]),
1689
+ cities: [
1690
+ { name: "Berlin", state: "Berlin" },
1691
+ { name: "Hamburg", state: "Hamburg" },
1692
+ { name: "M\xFCnchen", state: "Bayern" },
1693
+ { name: "K\xF6ln", state: "Nordrhein-Westfalen" },
1694
+ { name: "Frankfurt am Main", state: "Hessen" },
1695
+ { name: "Stuttgart", state: "Baden-W\xFCrttemberg" },
1696
+ { name: "D\xFCsseldorf", state: "Nordrhein-Westfalen" },
1697
+ { name: "Leipzig", state: "Sachsen" },
1698
+ { name: "Dortmund", state: "Nordrhein-Westfalen" },
1699
+ { name: "Essen", state: "Nordrhein-Westfalen" },
1700
+ { name: "Dresden", state: "Sachsen" },
1701
+ { name: "Bremen", state: "Bremen" }
1702
+ ],
1703
+ generatePostalCode(rng, state) {
1704
+ const prefixes = (state !== void 0 ? STATE_PLZ_PREFIXES[state] : void 0) ?? [randomInt(1, 99, rng)];
1705
+ const prefix = pickRandom(prefixes, rng);
1706
+ const suffix = randomInt(0, 999, rng);
1707
+ return `${prefix.toString().padStart(2, "0")}${suffix.toString().padStart(3, "0")}`;
1708
+ },
1709
+ // German address format: "{street} {number}" (number comes after street name)
1710
+ formatLine: (number, street) => `${street} ${number}`,
1711
+ country: "DE"
1712
+ };
1713
+
1714
+ // src/locales/de/names.ts
1715
+ var deNamePool = {
1716
+ given: {
1717
+ male: [
1718
+ "Hans",
1719
+ "Klaus",
1720
+ "Dieter",
1721
+ "Werner",
1722
+ "Peter",
1723
+ "Michael",
1724
+ "Thomas",
1725
+ "Andreas",
1726
+ "Stefan",
1727
+ "Markus",
1728
+ "Christian",
1729
+ "Daniel",
1730
+ "Martin",
1731
+ "Frank",
1732
+ "Juergen",
1733
+ "Uwe",
1734
+ "Bernd",
1735
+ "Holger",
1736
+ "Rainer",
1737
+ "Guenter",
1738
+ "Wolfgang",
1739
+ "Matthias",
1740
+ "Alexander",
1741
+ "Tobias",
1742
+ "Sebastian",
1743
+ "Florian",
1744
+ "Jan",
1745
+ "Lukas",
1746
+ "Felix",
1747
+ "David",
1748
+ "Max",
1749
+ "Tim",
1750
+ "Nico",
1751
+ "Leon",
1752
+ "Jonas"
1753
+ ],
1754
+ female: [
1755
+ "Petra",
1756
+ "Sabine",
1757
+ "Claudia",
1758
+ "Karin",
1759
+ "Susanne",
1760
+ "Monika",
1761
+ "Helga",
1762
+ "Ingrid",
1763
+ "Ursula",
1764
+ "Renate",
1765
+ "Elisabeth",
1766
+ "Gisela",
1767
+ "Brigitte",
1768
+ "Margit",
1769
+ "Christina",
1770
+ "Andrea",
1771
+ "Nicole",
1772
+ "Sandra",
1773
+ "Stefanie",
1774
+ "Julia",
1775
+ "Lisa",
1776
+ "Laura",
1777
+ "Anna",
1778
+ "Sarah",
1779
+ "Katharina",
1780
+ "Lena",
1781
+ "Hannah",
1782
+ "Maria",
1783
+ "Sophie",
1784
+ "Emma",
1785
+ "Mia",
1786
+ "Lea",
1787
+ "Luisa",
1788
+ "Johanna",
1789
+ "Franziska"
1790
+ ]
1791
+ },
1792
+ family: [
1793
+ "Mueller",
1794
+ "Schmidt",
1795
+ "Schneider",
1796
+ "Fischer",
1797
+ "Weber",
1798
+ "Meyer",
1799
+ "Wagner",
1800
+ "Becker",
1801
+ "Schulz",
1802
+ "Hoffmann",
1803
+ "Schafer",
1804
+ "Koch",
1805
+ "Bauer",
1806
+ "Richter",
1807
+ "Klein",
1808
+ "Wolf",
1809
+ "Schroeder",
1810
+ "Neumann",
1811
+ "Schwarz",
1812
+ "Zimmermann",
1813
+ "Braun",
1814
+ "Krueger",
1815
+ "Hartmann",
1816
+ "Lange",
1817
+ "Werner",
1818
+ "Schmitz",
1819
+ "Krause",
1820
+ "Meier",
1821
+ "Lehmann",
1822
+ "Schmid",
1823
+ "Schulze",
1824
+ "Maier",
1825
+ "Koehler",
1826
+ "Herrmann",
1827
+ "Koenig",
1828
+ "Walter",
1829
+ "Mayer",
1830
+ "Huber",
1831
+ "Kaiser",
1832
+ "Fuchs",
1833
+ "Peters",
1834
+ "Lang",
1835
+ "Scholz",
1836
+ "Moeller",
1837
+ "Weiss",
1838
+ "Jung",
1839
+ "Hahn",
1840
+ "Schubert"
1841
+ ]
1842
+ };
1843
+
1844
+ // src/locales/de/index.ts
1845
+ var deLocale = {
1846
+ code: "de",
1847
+ name: "Germany",
1848
+ patientIdentifiers: [kvidDefinition],
1849
+ practitionerIdentifiers: [lanrDefinition],
1850
+ organizationIdentifiers: [bsnrDefinition, iknrDefinition],
1851
+ address: deAddressTemplate,
1852
+ names: deNamePool
1853
+ };
1854
+
1855
+ // src/locales/fr/addresses.ts
1856
+ var FR_STREET_TYPES = [
1857
+ "Rue",
1858
+ "Avenue",
1859
+ "Boulevard",
1860
+ "Place",
1861
+ "Impasse",
1862
+ "All\xE9e",
1863
+ "Chemin",
1864
+ "Route"
1865
+ ];
1866
+ var FR_STREET_NAMES = [
1867
+ "de la Paix",
1868
+ "du Commerce",
1869
+ "Victor Hugo",
1870
+ "Jean Jaur\xE8s",
1871
+ "de la R\xE9publique",
1872
+ "des Fleurs",
1873
+ "du Moulin",
1874
+ "de l'\xC9glise",
1875
+ "du Ch\xE2teau",
1876
+ "des Lilas",
1877
+ "Gambetta",
1878
+ "Pasteur",
1879
+ "Foch",
1880
+ "Clemenceau",
1881
+ "de Gaulle",
1882
+ "de la Libert\xE9",
1883
+ "du G\xE9n\xE9ral Leclerc",
1884
+ "de la For\xEAt",
1885
+ "de l'Abbaye"
1886
+ ];
1887
+ var frAddressTemplate = {
1888
+ streets: FR_STREET_TYPES.flatMap(
1889
+ (type) => FR_STREET_NAMES.slice(0, 3).map((name) => `${type} ${name}`)
1890
+ ),
1891
+ cities: [
1892
+ { name: "Paris" },
1893
+ { name: "Marseille" },
1894
+ { name: "Lyon" },
1895
+ { name: "Toulouse" },
1896
+ { name: "Nice" },
1897
+ { name: "Nantes" },
1898
+ { name: "Strasbourg" },
1899
+ { name: "Montpellier" },
1900
+ { name: "Bordeaux" },
1901
+ { name: "Lille" },
1902
+ { name: "Rennes" },
1903
+ { name: "Reims" }
1904
+ ],
1905
+ generatePostalCode(rng, _state) {
1906
+ const dept = randomInt(1, 95, rng);
1907
+ const suffix = randomInt(0, 999, rng);
1908
+ return `${dept.toString().padStart(2, "0")}${suffix.toString().padStart(3, "0")}`;
1909
+ },
1910
+ // French address format: "{number} {type} {name}" — number before street type+name
1911
+ // The streets array already includes the type+name (e.g., "Rue de la Paix"),
1912
+ // so the default "{number} {street}" format works correctly.
1913
+ country: "FR"
1914
+ };
1915
+
1916
+ // src/locales/fr/names.ts
1917
+ var frNamePool = {
1918
+ given: {
1919
+ male: [
1920
+ "Jean",
1921
+ "Pierre",
1922
+ "Michel",
1923
+ "Fran\xE7ois",
1924
+ "Andr\xE9",
1925
+ "Ren\xE9",
1926
+ "Jacques",
1927
+ "Alain",
1928
+ "Bernard",
1929
+ "Philippe",
1930
+ "Christian",
1931
+ "Patrick",
1932
+ "Gilles",
1933
+ "Nicolas",
1934
+ "Thomas",
1935
+ "Julien",
1936
+ "Alexandre",
1937
+ "Mathieu",
1938
+ "Antoine",
1939
+ "Maxime",
1940
+ "Hugo",
1941
+ "Th\xE9o",
1942
+ "Rapha\xEBl",
1943
+ "Gabriel",
1944
+ "Lucas",
1945
+ "Louis",
1946
+ "Arthur",
1947
+ "Nathan",
1948
+ "Tom",
1949
+ "Ethan",
1950
+ "Nolan",
1951
+ "Baptiste",
1952
+ "Romain",
1953
+ "Cl\xE9ment",
1954
+ "Samuel"
1955
+ ],
1956
+ female: [
1957
+ "Marie",
1958
+ "Martine",
1959
+ "Fran\xE7oise",
1960
+ "H\xE9l\xE8ne",
1961
+ "Sophie",
1962
+ "Isabelle",
1963
+ "Catherine",
1964
+ "Sylvie",
1965
+ "Brigitte",
1966
+ "Nicole",
1967
+ "Christine",
1968
+ "Mich\xE8le",
1969
+ "Nathalie",
1970
+ "Sandrine",
1971
+ "Val\xE9rie",
1972
+ "C\xE9line",
1973
+ "Aur\xE9lie",
1974
+ "St\xE9phanie",
1975
+ "Laura",
1976
+ "Camille",
1977
+ "Sarah",
1978
+ "Emma",
1979
+ "L\xE9a",
1980
+ "Chlo\xE9",
1981
+ "Manon",
1982
+ "In\xE8s",
1983
+ "Juliette",
1984
+ "Jade",
1985
+ "Clara",
1986
+ "Lucie",
1987
+ "Ana\xEFs",
1988
+ "Charlotte",
1989
+ "Mathilde",
1990
+ "Pauline",
1991
+ "Alice"
1992
+ ]
1993
+ },
1994
+ family: [
1995
+ "Martin",
1996
+ "Bernard",
1997
+ "Thomas",
1998
+ "Petit",
1999
+ "Robert",
2000
+ "Richard",
2001
+ "Durand",
2002
+ "Dubois",
2003
+ "Moreau",
2004
+ "Laurent",
2005
+ "Simon",
2006
+ "Michel",
2007
+ "Lefebvre",
2008
+ "Leroy",
2009
+ "Roux",
2010
+ "David",
2011
+ "Bertrand",
2012
+ "Morel",
2013
+ "Fournier",
2014
+ "Girard",
2015
+ "Bonnet",
2016
+ "Dupont",
2017
+ "Lambert",
2018
+ "Fontaine",
2019
+ "Rousseau",
2020
+ "Vincent",
2021
+ "Muller",
2022
+ "Lefevre",
2023
+ "Faure",
2024
+ "Andre",
2025
+ "Mercier",
2026
+ "Blanc",
2027
+ "Guerin",
2028
+ "Boyer",
2029
+ "Garnier",
2030
+ "Chevalier",
2031
+ "Francois",
2032
+ "Legrand",
2033
+ "Gauthier",
2034
+ "Garcia",
2035
+ "Perrin",
2036
+ "Robin",
2037
+ "Clement",
2038
+ "Morin",
2039
+ "Nicolas",
2040
+ "Henry",
2041
+ "Roussel",
2042
+ "Mathieu",
2043
+ "Gautier",
2044
+ "Masson"
2045
+ ]
2046
+ };
2047
+
2048
+ // src/locales/fr/index.ts
2049
+ var frLocale = {
2050
+ code: "fr",
2051
+ name: "France",
2052
+ patientIdentifiers: [nirDefinition],
2053
+ practitionerIdentifiers: [rppsDefinition],
2054
+ organizationIdentifiers: [finessDefinition],
2055
+ address: frAddressTemplate,
2056
+ names: frNamePool
2057
+ };
2058
+
2059
+ // src/locales/nl/addresses.ts
2060
+ var INVALID_NL_PAIRS = /* @__PURE__ */ new Set(["SA", "SD", "SS"]);
2061
+ var NL_LETTERS = [..."ABCDEFGHJKLMNPRSTUVWXYZ"];
2062
+ function generateNlPostalCode(rng) {
2063
+ const digits = randomInt(1e3, 9999, rng);
2064
+ for (; ; ) {
2065
+ const l1 = pickRandom(NL_LETTERS, rng);
2066
+ const l2 = pickRandom(NL_LETTERS, rng);
2067
+ const pair = l1 + l2;
2068
+ if (!INVALID_NL_PAIRS.has(pair)) {
2069
+ return `${digits} ${pair}`;
2070
+ }
2071
+ }
2072
+ }
2073
+ var nlAddressTemplate = {
2074
+ streets: [
2075
+ "Keizersgracht",
2076
+ "Prinsengracht",
2077
+ "Herengracht",
2078
+ "Singel",
2079
+ "Damrak",
2080
+ "Rokin",
2081
+ "Kalverstraat",
2082
+ "Leidsestraat",
2083
+ "Vondelstraat",
2084
+ "Overtoom",
2085
+ "Haarlemmerdijk",
2086
+ "Jordaan",
2087
+ "Binnenhof",
2088
+ "Lange Voorhout",
2089
+ "Grote Markt",
2090
+ "Hofweg",
2091
+ "Binnenweg",
2092
+ "Blaak",
2093
+ "Coolsingel",
2094
+ "Westersingel",
2095
+ "Stationsplein",
2096
+ "Catharijnesingel",
2097
+ "Oudegracht",
2098
+ "Vredenburg"
2099
+ ],
2100
+ cities: [
2101
+ { name: "Amsterdam", state: "Noord-Holland" },
2102
+ { name: "Rotterdam", state: "Zuid-Holland" },
2103
+ { name: "Den Haag", state: "Zuid-Holland" },
2104
+ { name: "Utrecht", state: "Utrecht" },
2105
+ { name: "Eindhoven", state: "Noord-Brabant" },
2106
+ { name: "Groningen", state: "Groningen" },
2107
+ { name: "Tilburg", state: "Noord-Brabant" },
2108
+ { name: "Almere", state: "Flevoland" },
2109
+ { name: "Breda", state: "Noord-Brabant" },
2110
+ { name: "Nijmegen", state: "Gelderland" },
2111
+ { name: "Arnhem", state: "Gelderland" },
2112
+ { name: "Haarlem", state: "Noord-Holland" }
2113
+ ],
2114
+ generatePostalCode(rng, _state) {
2115
+ return generateNlPostalCode(rng);
2116
+ },
2117
+ // Dutch: "{street} {number}" order
2118
+ formatLine: (number, street) => `${street} ${number}`,
2119
+ country: "NL"
2120
+ };
2121
+
2122
+ // src/locales/nl/names.ts
2123
+ var nlNamePool = {
2124
+ given: {
2125
+ male: [
2126
+ "Jan",
2127
+ "Pieter",
2128
+ "Hendrik",
2129
+ "Johannes",
2130
+ "Cornelis",
2131
+ "Willem",
2132
+ "Dirk",
2133
+ "Gerard",
2134
+ "Theodoor",
2135
+ "Adriaan",
2136
+ "Daan",
2137
+ "Sander",
2138
+ "Lars",
2139
+ "Tim",
2140
+ "Bas",
2141
+ "Robin",
2142
+ "Joris",
2143
+ "Thijs",
2144
+ "Bram",
2145
+ "Niels",
2146
+ "Wouter",
2147
+ "Jeroen",
2148
+ "Maarten",
2149
+ "Ruben",
2150
+ "Thomas",
2151
+ "Stefan",
2152
+ "Marc",
2153
+ "Luca",
2154
+ "Noah",
2155
+ "Finn",
2156
+ "Stef",
2157
+ "Luuk",
2158
+ "Milan",
2159
+ "Roel"
2160
+ ],
2161
+ female: [
2162
+ "Maria",
2163
+ "Anna",
2164
+ "Johanna",
2165
+ "Cornelia",
2166
+ "Wilhelmina",
2167
+ "Petronella",
2168
+ "Emma",
2169
+ "Sophia",
2170
+ "Laura",
2171
+ "Nathalie",
2172
+ "Linda",
2173
+ "Sandra",
2174
+ "Anita",
2175
+ "Monique",
2176
+ "Nicole",
2177
+ "Anouk",
2178
+ "Femke",
2179
+ "Lotte",
2180
+ "Iris",
2181
+ "Fleur",
2182
+ "Naomi",
2183
+ "Merel",
2184
+ "Lisanne",
2185
+ "Roos",
2186
+ "Lisa",
2187
+ "Julia",
2188
+ "Sanne",
2189
+ "Nora",
2190
+ "Sara",
2191
+ "Mila",
2192
+ "Zo\xEB",
2193
+ "Manon",
2194
+ "Lynn",
2195
+ "Tessa"
2196
+ ]
2197
+ },
2198
+ family: [
2199
+ "de Jong",
2200
+ "Jansen",
2201
+ "de Vries",
2202
+ "van den Berg",
2203
+ "van Dijk",
2204
+ "Bakker",
2205
+ "Janssen",
2206
+ "Visser",
2207
+ "Smit",
2208
+ "Meijer",
2209
+ "de Boer",
2210
+ "Mulder",
2211
+ "de Groot",
2212
+ "Bos",
2213
+ "Vos",
2214
+ "Peters",
2215
+ "Hendriks",
2216
+ "van Leeuwen",
2217
+ "Dekker",
2218
+ "Brouwer",
2219
+ "de Wit",
2220
+ "Dijkstra",
2221
+ "Smits",
2222
+ "de Graaf",
2223
+ "van der Berg",
2224
+ "van der Meer",
2225
+ "van der Linden",
2226
+ "Kok",
2227
+ "Jacobs",
2228
+ "de Haan",
2229
+ "Peeters",
2230
+ "Linden",
2231
+ "van den Bosch",
2232
+ "Groen",
2233
+ "Willems",
2234
+ "Schouten",
2235
+ "Prins",
2236
+ "Vermeer",
2237
+ "van Beek",
2238
+ "Lammers",
2239
+ "Kuiper",
2240
+ "Postma",
2241
+ "Huisman",
2242
+ "Jonker",
2243
+ "Bosman",
2244
+ "Nijs",
2245
+ "van der Heijden",
2246
+ "Broer"
2247
+ ],
2248
+ // Dutch surname prefixes (tussenvoegsel)
2249
+ prefixes: ["van", "de", "van de", "van der", "van den", "den", "ter"]
2250
+ };
2251
+
2252
+ // src/locales/nl/index.ts
2253
+ var nlLocale = {
2254
+ code: "nl",
2255
+ name: "Netherlands",
2256
+ patientIdentifiers: [bsnDefinition],
2257
+ practitionerIdentifiers: [uziNumberDefinition],
2258
+ organizationIdentifiers: [agbCodeDefinition],
2259
+ address: nlAddressTemplate,
2260
+ names: nlNamePool
2261
+ };
2262
+
2263
+ // src/locales/in/addresses.ts
2264
+ var STATE_PIN_RANGES = {
2265
+ "Delhi": [110001, 110096],
2266
+ "Maharashtra": [400001, 445001],
2267
+ "Karnataka": [560001, 591350],
2268
+ "Tamil Nadu": [600001, 643253],
2269
+ "Telangana": [500001, 509408],
2270
+ "West Bengal": [700001, 743513],
2271
+ "Uttar Pradesh": [201001, 285001],
2272
+ "Rajasthan": [301001, 345031],
2273
+ "Gujarat": [360001, 396450],
2274
+ "Kerala": [670001, 695615]
2275
+ };
2276
+ var IN_CITIES = [
2277
+ { name: "Mumbai", state: "Maharashtra", district: "Mumbai" },
2278
+ { name: "Delhi", state: "Delhi", district: "New Delhi" },
2279
+ { name: "Bengaluru", state: "Karnataka", district: "Bangalore Urban" },
2280
+ { name: "Chennai", state: "Tamil Nadu", district: "Chennai" },
2281
+ { name: "Hyderabad", state: "Telangana", district: "Hyderabad" },
2282
+ { name: "Kolkata", state: "West Bengal", district: "Kolkata" },
2283
+ { name: "Pune", state: "Maharashtra", district: "Pune" },
2284
+ { name: "Ahmedabad", state: "Gujarat", district: "Ahmedabad" },
2285
+ { name: "Jaipur", state: "Rajasthan", district: "Jaipur" },
2286
+ { name: "Lucknow", state: "Uttar Pradesh", district: "Lucknow" },
2287
+ { name: "Thiruvananthapuram", state: "Kerala", district: "Thiruvananthapuram" },
2288
+ { name: "Kochi", state: "Kerala", district: "Ernakulam" }
2289
+ ];
2290
+ var inAddressTemplate = {
2291
+ streets: [
2292
+ "MG Road",
2293
+ "Brigade Road",
2294
+ "Residency Road",
2295
+ "Church Street",
2296
+ "Linking Road",
2297
+ "Hill Road",
2298
+ "Bandra West",
2299
+ "Juhu Scheme",
2300
+ "Anna Salai",
2301
+ "Nungambakkam High Road",
2302
+ "Pondy Bazaar",
2303
+ "Rashbehari Avenue",
2304
+ "Park Street",
2305
+ "Elgin Road",
2306
+ "Salt Lake",
2307
+ "Mahatma Gandhi Road",
2308
+ "Nehru Street",
2309
+ "Gandhi Nagar",
2310
+ "Rajaji Salai",
2311
+ "NSC Bose Road",
2312
+ "Kamarajar Salai",
2313
+ "Indira Nagar",
2314
+ "Koramangala",
2315
+ "Jayanagar",
2316
+ "Malleshwaram"
2317
+ ],
2318
+ cities: IN_CITIES,
2319
+ generatePostalCode(rng, state) {
2320
+ const range = (state !== void 0 ? STATE_PIN_RANGES[state] : void 0) ?? [500001, 500100];
2321
+ return randomInt(range[0], range[1], rng).toString();
2322
+ },
2323
+ country: "IN"
2324
+ };
2325
+
2326
+ // src/locales/in/names.ts
2327
+ var inNamePool = {
2328
+ given: {
2329
+ male: [
2330
+ // Hindi/North Indian
2331
+ "Rahul",
2332
+ "Amit",
2333
+ "Vijay",
2334
+ "Suresh",
2335
+ "Ramesh",
2336
+ "Rajesh",
2337
+ "Arun",
2338
+ "Manoj",
2339
+ "Sanjay",
2340
+ "Deepak",
2341
+ "Rakesh",
2342
+ "Ajay",
2343
+ "Ankit",
2344
+ "Ravi",
2345
+ // South Indian
2346
+ "Karthik",
2347
+ "Arjun",
2348
+ "Venkatesh",
2349
+ "Subramaniam",
2350
+ "Balaji",
2351
+ "Rajan",
2352
+ "Pradeep",
2353
+ "Srinivas",
2354
+ "Mohan",
2355
+ "Ravi",
2356
+ "Ganesh",
2357
+ "Shankar",
2358
+ // Bengali/East Indian
2359
+ "Souvik",
2360
+ "Subhash",
2361
+ "Debashis",
2362
+ "Arnab",
2363
+ "Sougata",
2364
+ // Pan-Indian
2365
+ "Rohan",
2366
+ "Nikhil",
2367
+ "Varun",
2368
+ "Akash",
2369
+ "Vivek",
2370
+ "Abhishek",
2371
+ "Manish",
2372
+ "Ashish",
2373
+ "Gaurav",
2374
+ "Harish"
2375
+ ],
2376
+ female: [
2377
+ // Hindi/North Indian
2378
+ "Priya",
2379
+ "Sunita",
2380
+ "Anita",
2381
+ "Kavita",
2382
+ "Rekha",
2383
+ "Geeta",
2384
+ "Meena",
2385
+ "Pooja",
2386
+ "Neha",
2387
+ "Shweta",
2388
+ "Aarti",
2389
+ "Anjali",
2390
+ "Divya",
2391
+ "Nisha",
2392
+ // South Indian
2393
+ "Lakshmi",
2394
+ "Meenakshi",
2395
+ "Padmini",
2396
+ "Gayathri",
2397
+ "Kavitha",
2398
+ "Srividya",
2399
+ "Annapurna",
2400
+ "Savitha",
2401
+ "Revathi",
2402
+ "Nalini",
2403
+ "Radha",
2404
+ // Bengali/East Indian
2405
+ "Madhuri",
2406
+ "Suparna",
2407
+ "Mousumi",
2408
+ "Barnali",
2409
+ // Pan-Indian
2410
+ "Shreya",
2411
+ "Preeti",
2412
+ "Swati",
2413
+ "Ritu",
2414
+ "Isha",
2415
+ "Tanvi",
2416
+ "Pallavi",
2417
+ "Sonal",
2418
+ "Megha",
2419
+ "Aditi"
2420
+ ]
2421
+ },
2422
+ family: [
2423
+ "Sharma",
2424
+ "Patel",
2425
+ "Singh",
2426
+ "Kumar",
2427
+ "Reddy",
2428
+ "Nair",
2429
+ "Iyer",
2430
+ "Das",
2431
+ "Gupta",
2432
+ "Joshi",
2433
+ "Mishra",
2434
+ "Verma",
2435
+ "Mehta",
2436
+ "Shah",
2437
+ "Bose",
2438
+ "Chatterjee",
2439
+ "Mukherjee",
2440
+ "Banerjee",
2441
+ "Ghosh",
2442
+ "Sen",
2443
+ "Rao",
2444
+ "Naidu",
2445
+ "Krishnamurthy",
2446
+ "Pillai",
2447
+ "Menon",
2448
+ "Varma",
2449
+ "Chowdhury",
2450
+ "Dey",
2451
+ "Roy",
2452
+ "Mandal",
2453
+ "Biswas",
2454
+ "Saha",
2455
+ "Kulkarni",
2456
+ "Desai",
2457
+ "Jain",
2458
+ "Agarwal",
2459
+ "Srivastava",
2460
+ "Tiwari",
2461
+ "Pandey",
2462
+ "Yadav",
2463
+ "Chauhan",
2464
+ "Thakur",
2465
+ "Malhotra",
2466
+ "Kapoor",
2467
+ "Bhat",
2468
+ "Kaur",
2469
+ "Shetty",
2470
+ "Hegde"
2471
+ ]
2472
+ };
2473
+
2474
+ // src/locales/in/index.ts
2475
+ var inLocale = {
2476
+ code: "in",
2477
+ name: "India",
2478
+ patientIdentifiers: [aadhaarDefinition, abhaNumberDefinition],
2479
+ practitionerIdentifiers: [nmcRegistrationDefinition],
2480
+ organizationIdentifiers: [],
2481
+ address: inAddressTemplate,
2482
+ names: inNamePool
2483
+ };
2484
+
2485
+ // src/locales/jp/addresses.ts
2486
+ var JP_CITIES = [
2487
+ { name: "Tokyo", state: "Tokyo", district: "Shinjuku" },
2488
+ { name: "Osaka", state: "Osaka", district: "Namba" },
2489
+ { name: "Kyoto", state: "Kyoto", district: "Fushimi" },
2490
+ { name: "Yokohama", state: "Kanagawa", district: "Naka" },
2491
+ { name: "Nagoya", state: "Aichi", district: "Naka" },
2492
+ { name: "Sapporo", state: "Hokkaido", district: "Chuo" },
2493
+ { name: "Kobe", state: "Hyogo", district: "Chuo" },
2494
+ { name: "Fukuoka", state: "Fukuoka", district: "Hakata" },
2495
+ { name: "Hiroshima", state: "Hiroshima", district: "Naka" },
2496
+ { name: "Sendai", state: "Miyagi", district: "Aoba" }
2497
+ ];
2498
+ var JP_POSTAL_RANGES = {
2499
+ "Tokyo": [1000001, 1999999],
2500
+ "Osaka": [5300001, 5999999],
2501
+ "Kyoto": [6000001, 6199999],
2502
+ "Kanagawa": [2100001, 2599999],
2503
+ "Aichi": [4400001, 4999999],
2504
+ "Hokkaido": [600001, 999999],
2505
+ "Hyogo": [6500001, 6799999],
2506
+ "Fukuoka": [8100001, 8399999],
2507
+ "Hiroshima": [7300001, 7399999],
2508
+ "Miyagi": [9800001, 9899999]
2509
+ };
2510
+ var jpAddressTemplate = {
2511
+ streets: [
2512
+ "Shinjuku",
2513
+ "Shibuya",
2514
+ "Ginza",
2515
+ "Roppongi",
2516
+ "Akihabara",
2517
+ "Harajuku",
2518
+ "Asakusa",
2519
+ "Ueno",
2520
+ "Ikebukuro",
2521
+ "Shimokitazawa",
2522
+ "Namba",
2523
+ "Dotonbori",
2524
+ "Umeda",
2525
+ "Shinsaibashi",
2526
+ "Gion",
2527
+ "Arashiyama",
2528
+ "Kawaramachi",
2529
+ "Minatomachi",
2530
+ "Kitanagasa"
2531
+ ],
2532
+ cities: JP_CITIES,
2533
+ generatePostalCode(rng, state) {
2534
+ const range = (state !== void 0 ? JP_POSTAL_RANGES[state] : void 0) ?? [1000001, 1999999];
2535
+ const n = randomInt(range[0], range[1], rng);
2536
+ const s = n.toString().padStart(7, "0");
2537
+ return s.slice(0, 3) + "-" + s.slice(3);
2538
+ },
2539
+ formatLine(number, street) {
2540
+ return `${street} ${number}-chome`;
2541
+ },
2542
+ country: "JP"
2543
+ };
2544
+
2545
+ // src/locales/jp/names.ts
2546
+ var jpNamePool = {
2547
+ given: {
2548
+ male: ["Hiroshi", "Kenji", "Takashi", "Masaki", "Yusuke", "Daisuke", "Shota", "Kazuki", "Ryota", "Naoki", "Taro", "Jiro", "Akira", "Satoshi", "Tetsuya", "Makoto", "Shinji", "Koji", "Noboru", "Hideo"],
2549
+ female: ["Yuki", "Haruka", "Sakura", "Aoi", "Misaki", "Rina", "Nana", "Mika", "Yuko", "Ayaka", "Hanako", "Kimiko", "Noriko", "Keiko", "Fumiko", "Michiko", "Sumiko", "Yoshiko", "Tomoko", "Naoko"]
2550
+ },
2551
+ family: ["Tanaka", "Suzuki", "Sato", "Watanabe", "Ito", "Nakamura", "Kobayashi", "Kato", "Yamamoto", "Hayashi", "Inoue", "Kimura", "Matsumoto", "Fujiwara", "Ogawa", "Nishimura", "Mori", "Abe", "Ikeda", "Hashimoto", "Yamada", "Ishikawa", "Maeda", "Fujita", "Goto"]
2552
+ };
2553
+
2554
+ // src/locales/jp/index.ts
2555
+ var jpLocale = {
2556
+ code: "jp",
2557
+ name: "Japan",
2558
+ patientIdentifiers: [jpHospitalMrnDefinition],
2559
+ practitionerIdentifiers: [jmpDoctorLicenseDefinition],
2560
+ organizationIdentifiers: [],
2561
+ address: jpAddressTemplate,
2562
+ names: jpNamePool
2563
+ };
2564
+
2565
+ // src/locales/kr/addresses.ts
2566
+ var KR_CITIES = [
2567
+ { name: "Seoul", state: "Seoul", district: "Gangnam-gu" },
2568
+ { name: "Busan", state: "Busan", district: "Haeundae-gu" },
2569
+ { name: "Incheon", state: "Incheon", district: "Namdong-gu" },
2570
+ { name: "Daegu", state: "Daegu", district: "Dalseo-gu" },
2571
+ { name: "Daejeon", state: "Daejeon", district: "Yuseong-gu" },
2572
+ { name: "Gwangju", state: "Gwangju", district: "Nam-gu" },
2573
+ { name: "Suwon", state: "Gyeonggi", district: "Paldal-gu" },
2574
+ { name: "Changwon", state: "Gyeongnam", district: "Seongsan-gu" }
2575
+ ];
2576
+ var KR_POSTAL_RANGES = {
2577
+ "Seoul": [2e3, 9999],
2578
+ "Busan": [46e3, 49999],
2579
+ "Incheon": [21e3, 23999],
2580
+ "Daegu": [41e3, 43999],
2581
+ "Daejeon": [34e3, 35999],
2582
+ "Gwangju": [61e3, 62999],
2583
+ "Gyeonggi": [1e4, 18999],
2584
+ "Gyeongnam": [51e3, 53999]
2585
+ };
2586
+ var krAddressTemplate = {
2587
+ streets: [
2588
+ "Teheran-ro",
2589
+ "Gangnam-daero",
2590
+ "Sinchon-ro",
2591
+ "Hongdae-ro",
2592
+ "Itaewon-ro",
2593
+ "Jongno",
2594
+ "Eulji-ro",
2595
+ "Sejong-daero",
2596
+ "Hangang-ro",
2597
+ "Mapo-daero",
2598
+ "Haeundae-ro",
2599
+ "Gwangbok-ro",
2600
+ "Nampo-daero",
2601
+ "Dunsan-daero",
2602
+ "Expo-ro"
2603
+ ],
2604
+ cities: KR_CITIES,
2605
+ generatePostalCode(rng, state) {
2606
+ const range = (state !== void 0 ? KR_POSTAL_RANGES[state] : void 0) ?? [2e3, 9999];
2607
+ return randomInt(range[0], range[1], rng).toString().padStart(5, "0");
2608
+ },
2609
+ country: "KR"
2610
+ };
2611
+
2612
+ // src/locales/kr/names.ts
2613
+ var krNamePool = {
2614
+ given: {
2615
+ male: ["Minjun", "Hyunwoo", "Junho", "Seungwoo", "Jinhyun", "Donghyun", "Sanghoon", "Kyunghoon", "Taehyun", "Jaehoon", "Minseok", "Jongho", "Seokjin", "Byunghun", "Yongsu", "Hyungjun", "Sunghoon", "Woobin", "Jaeseon", "Chanwoo"],
2616
+ female: ["Jiyeon", "Eunji", "Soyeon", "Hyunji", "Minji", "Yuna", "Soyun", "Jiyu", "Hyerim", "Seoyeon", "Dahye", "Jisu", "Eunha", "Sumin", "Nayeon", "Hayeon", "Jiyoung", "Sojeong", "Haerin", "Chaeyeon"]
2617
+ },
2618
+ family: ["Kim", "Lee", "Park", "Choi", "Jung", "Kang", "Cho", "Yoon", "Jang", "Lim", "Han", "Oh", "Shin", "Kwon", "Hwang", "Ahn", "Song", "Ryu", "Hong", "Jeon"]
2619
+ };
2620
+
2621
+ // src/locales/kr/index.ts
2622
+ var krLocale = {
2623
+ code: "kr",
2624
+ name: "South Korea",
2625
+ patientIdentifiers: [krRrnDefinition],
2626
+ practitionerIdentifiers: [mohwDoctorLicenseDefinition],
2627
+ organizationIdentifiers: [],
2628
+ address: krAddressTemplate,
2629
+ names: krNamePool
2630
+ };
2631
+
2632
+ // src/locales/sg/addresses.ts
2633
+ var SG_CITIES = [
2634
+ { name: "Singapore", district: "Central" },
2635
+ { name: "Singapore", district: "Bedok" },
2636
+ { name: "Singapore", district: "Tampines" },
2637
+ { name: "Singapore", district: "Woodlands" },
2638
+ { name: "Singapore", district: "Jurong West" },
2639
+ { name: "Singapore", district: "Ang Mo Kio" },
2640
+ { name: "Singapore", district: "Toa Payoh" },
2641
+ { name: "Singapore", district: "Punggol" }
2642
+ ];
2643
+ var sgAddressTemplate = {
2644
+ streets: [
2645
+ "Orchard Road",
2646
+ "Raffles Place",
2647
+ "Marina Bay",
2648
+ "Buona Vista",
2649
+ "Jurong East",
2650
+ "Clementi Road",
2651
+ "Pasir Panjang Road",
2652
+ "Upper Changi Road",
2653
+ "Tampines Avenue",
2654
+ "Bishan Street",
2655
+ "Serangoon Road",
2656
+ "Little India",
2657
+ "Chinatown Street",
2658
+ "Tanjong Pagar Road",
2659
+ "Neil Road"
2660
+ ],
2661
+ cities: SG_CITIES,
2662
+ generatePostalCode(rng) {
2663
+ return randomInt(1e4, 829999, rng).toString().padStart(6, "0");
2664
+ },
2665
+ country: "SG"
2666
+ };
2667
+
2668
+ // src/locales/sg/names.ts
2669
+ var sgNamePool = {
2670
+ given: {
2671
+ male: ["Wei", "Jun", "Kai", "Ethan", "Aaron", "Marcus", "Ryan", "Dylan", "Sean", "Joshua", "Farhan", "Hafiz", "Rashid", "Arjun", "Vijay", "Rajan", "Kumar", "Raj", "Samuel", "Daniel"],
2672
+ female: ["Hui", "Ling", "Xin", "Sarah", "Rachel", "Priya", "Siti", "Nurul", "Aisha", "Jasmine", "Michelle", "Jessica", "Chloe", "Mei", "Yanling", "Kavitha", "Nisha", "Sunita", "Grace", "Faith"]
2673
+ },
2674
+ family: ["Tan", "Lim", "Lee", "Ng", "Wong", "Chan", "Koh", "Teo", "Chua", "Goh", "Ong", "Sim", "Foo", "Yeo", "Low", "Bte", "Bin", "Rajah", "Kumar", "Singh"]
2675
+ };
2676
+
2677
+ // src/locales/sg/index.ts
2678
+ var sgLocale = {
2679
+ code: "sg",
2680
+ name: "Singapore",
2681
+ patientIdentifiers: [sgNricDefinition],
2682
+ practitionerIdentifiers: [smcRegistrationDefinition],
2683
+ organizationIdentifiers: [],
2684
+ address: sgAddressTemplate,
2685
+ names: sgNamePool
2686
+ };
2687
+
2688
+ // src/locales/br/addresses.ts
2689
+ var BR_CITIES = [
2690
+ { name: "S\xE3o Paulo", state: "SP", district: "Jardins" },
2691
+ { name: "Rio de Janeiro", state: "RJ", district: "Copacabana" },
2692
+ { name: "Belo Horizonte", state: "MG", district: "Savassi" },
2693
+ { name: "Bras\xEDlia", state: "DF", district: "Asa Sul" },
2694
+ { name: "Salvador", state: "BA", district: "Barra" },
2695
+ { name: "Fortaleza", state: "CE", district: "Meireles" },
2696
+ { name: "Curitiba", state: "PR", district: "Batel" },
2697
+ { name: "Manaus", state: "AM", district: "Centro" },
2698
+ { name: "Recife", state: "PE", district: "Boa Viagem" },
2699
+ { name: "Porto Alegre", state: "RS", district: "Moinhos de Vento" }
2700
+ ];
2701
+ var BR_CEP_RANGES = {
2702
+ "SP": [1e6, 9999999],
2703
+ "RJ": [2e7, 28999999],
2704
+ "MG": [3e7, 39999999],
2705
+ "DF": [7e7, 73999999],
2706
+ "BA": [4e7, 48999999],
2707
+ "CE": [6e7, 63999999],
2708
+ "PR": [8e7, 87999999],
2709
+ "AM": [69e6, 69999999],
2710
+ "PE": [5e7, 56999999],
2711
+ "RS": [9e7, 99999999]
2712
+ };
2713
+ var brAddressTemplate = {
2714
+ streets: [
2715
+ "Avenida Paulista",
2716
+ "Rua Augusta",
2717
+ "Rua Oscar Freire",
2718
+ "Avenida Brigadeiro Faria Lima",
2719
+ "Rua das Flores",
2720
+ "Avenida Brasil",
2721
+ "Rua Direita",
2722
+ "Travessa das Palmeiras",
2723
+ "Avenida Atl\xE2ntica",
2724
+ "Rua Volunt\xE1rios da P\xE1tria",
2725
+ "Avenida Afonso Pena",
2726
+ "Rua da Bahia",
2727
+ "Avenida W3 Sul",
2728
+ "Avenida das Na\xE7\xF5es"
2729
+ ],
2730
+ cities: BR_CITIES,
2731
+ generatePostalCode(rng, state) {
2732
+ const range = (state !== void 0 ? BR_CEP_RANGES[state] : void 0) ?? [1e6, 9999999];
2733
+ const n = randomInt(range[0], range[1], rng);
2734
+ const s = n.toString().padStart(8, "0");
2735
+ return s.slice(0, 5) + "-" + s.slice(5);
2736
+ },
2737
+ country: "BR"
2738
+ };
2739
+
2740
+ // src/locales/br/names.ts
2741
+ var brNamePool = {
2742
+ given: {
2743
+ male: ["Lucas", "Gabriel", "Matheus", "Pedro", "Rafael", "Felipe", "Jo\xE3o", "Bruno", "Diego", "Carlos", "Marcelo", "Eduardo", "Roberto", "Fernando", "Henrique", "Andr\xE9", "Alexandre", "Ricardo", "Rodrigo", "Paulo"],
2744
+ female: ["Ana", "Maria", "Juliana", "Fernanda", "Camila", "Aline", "Amanda", "Beatriz", "Larissa", "Natalia", "Patricia", "Leticia", "Mariana", "Vanessa", "Carolina", "Viviane", "Priscila", "Cristiane", "Renata", "Daniela"]
2745
+ },
2746
+ family: ["Silva", "Santos", "Oliveira", "Souza", "Lima", "Pereira", "Ferreira", "Costa", "Carvalho", "Rodrigues", "Alves", "Nascimento", "Martins", "Rocha", "Ara\xFAjo", "Ribeiro", "Monteiro", "Cardoso", "Gomes", "Castro"]
2747
+ };
2748
+
2749
+ // src/locales/br/index.ts
2750
+ var brLocale = {
2751
+ code: "br",
2752
+ name: "Brazil",
2753
+ patientIdentifiers: [brCpfDefinition],
2754
+ practitionerIdentifiers: [crmPractitionerDefinition],
2755
+ organizationIdentifiers: [],
2756
+ address: brAddressTemplate,
2757
+ names: brNamePool
2758
+ };
2759
+
2760
+ // src/locales/mx/addresses.ts
2761
+ var MX_CITIES = [
2762
+ { name: "Ciudad de M\xE9xico", state: "CDMX", district: "Benito Ju\xE1rez" },
2763
+ { name: "Guadalajara", state: "JAL", district: "Zapopan" },
2764
+ { name: "Monterrey", state: "NL", district: "San Pedro" },
2765
+ { name: "Puebla", state: "PUE", district: "Centro" },
2766
+ { name: "Tijuana", state: "BC", district: "Zona Centro" },
2767
+ { name: "Le\xF3n", state: "GTO", district: "Centro" },
2768
+ { name: "M\xE9rida", state: "YUC", district: "Centro Hist\xF3rico" },
2769
+ { name: "Canc\xFAn", state: "QR", district: "Zona Hotelera" }
2770
+ ];
2771
+ var MX_POSTAL_RANGES = {
2772
+ "CDMX": [1e3, 16999],
2773
+ "JAL": [44e3, 49999],
2774
+ "NL": [64e3, 67999],
2775
+ "PUE": [72e3, 75999],
2776
+ "BC": [21e3, 22999],
2777
+ "GTO": [36e3, 38999],
2778
+ "YUC": [97e3, 97999],
2779
+ "QR": [77e3, 77999]
2780
+ };
2781
+ var mxAddressTemplate = {
2782
+ streets: [
2783
+ "Paseo de la Reforma",
2784
+ "Insurgentes Norte",
2785
+ "Insurgentes Sur",
2786
+ "Avenida Ju\xE1rez",
2787
+ "Calzada de los Leones",
2788
+ "Boulevard Miguel Hidalgo",
2789
+ "Avenida Chapultepec",
2790
+ "Calle Madero",
2791
+ "Avenida Universidad",
2792
+ "Calzada del Ej\xE9rcito",
2793
+ "Avenida Vallarta",
2794
+ "Avenida L\xF3pez Mateos"
2795
+ ],
2796
+ cities: MX_CITIES,
2797
+ generatePostalCode(rng, state) {
2798
+ const range = (state !== void 0 ? MX_POSTAL_RANGES[state] : void 0) ?? [1e3, 99999];
2799
+ return randomInt(range[0], range[1], rng).toString().padStart(5, "0");
2800
+ },
2801
+ country: "MX"
2802
+ };
2803
+
2804
+ // src/locales/mx/names.ts
2805
+ var mxNamePool = {
2806
+ given: {
2807
+ male: ["Jos\xE9", "Luis", "Carlos", "Juan", "Miguel", "Jorge", "Roberto", "Francisco", "Antonio", "Alejandro", "H\xE9ctor", "Arturo", "Mario", "Ricardo", "Ra\xFAl", "Eduardo", "Gabriel", "Hugo", "Fernando", "David"],
2808
+ female: ["Mar\xEDa", "Ana", "Laura", "Patricia", "Claudia", "Sandra", "Rosa", "Elena", "Daniela", "Gabriela", "Ver\xF3nica", "Alejandra", "Guadalupe", "Isabel", "Silvia", "Adriana", "Beatriz", "Carmen", "Alicia", "M\xF3nica"]
2809
+ },
2810
+ family: ["Garc\xEDa", "Mart\xEDnez", "L\xF3pez", "Gonz\xE1lez", "Hern\xE1ndez", "P\xE9rez", "S\xE1nchez", "Rodr\xEDguez", "Flores", "Torres", "Ram\xEDrez", "Morales", "D\xEDaz", "V\xE1squez", "Reyes", "Jim\xE9nez", "Guti\xE9rrez", "Ortiz", "Castillo", "Mendoza"]
2811
+ };
2812
+
2813
+ // src/locales/mx/index.ts
2814
+ var mxLocale = {
2815
+ code: "mx",
2816
+ name: "Mexico",
2817
+ patientIdentifiers: [mxCurpDefinition],
2818
+ practitionerIdentifiers: [cedulaProfesionalDefinition],
2819
+ organizationIdentifiers: [],
2820
+ address: mxAddressTemplate,
2821
+ names: mxNamePool
2822
+ };
2823
+
2824
+ // src/locales/za/addresses.ts
2825
+ var ZA_CITIES = [
2826
+ { name: "Johannesburg", state: "Gauteng", district: "Sandton" },
2827
+ { name: "Cape Town", state: "Western Cape", district: "City Bowl" },
2828
+ { name: "Durban", state: "KwaZulu-Natal", district: "Berea" },
2829
+ { name: "Pretoria", state: "Gauteng", district: "Arcadia" },
2830
+ { name: "Port Elizabeth", state: "Eastern Cape", district: "Newton Park" },
2831
+ { name: "Bloemfontein", state: "Free State", district: "Westdene" },
2832
+ { name: "East London", state: "Eastern Cape", district: "Beacon Bay" },
2833
+ { name: "Nelspruit", state: "Mpumalanga", district: "West Acres" }
2834
+ ];
2835
+ var ZA_POSTAL_RANGES = {
2836
+ "Gauteng": [1400, 2199],
2837
+ "Western Cape": [7400, 8099],
2838
+ "KwaZulu-Natal": [3200, 4699],
2839
+ "Eastern Cape": [5e3, 6299],
2840
+ "Free State": [9300, 9999],
2841
+ "Mpumalanga": [1200, 1399]
2842
+ };
2843
+ var zaAddressTemplate = {
2844
+ streets: [
2845
+ "Nelson Mandela Drive",
2846
+ "Jan Smuts Avenue",
2847
+ "Oxford Road",
2848
+ "Rivonia Road",
2849
+ "William Nicol Drive",
2850
+ "Sandton Drive",
2851
+ "Long Street",
2852
+ "Adderley Street",
2853
+ "Loop Street",
2854
+ "Bree Street",
2855
+ "Florida Road",
2856
+ "Marine Parade",
2857
+ "Church Street",
2858
+ "Paul Kruger Street"
2859
+ ],
2860
+ cities: ZA_CITIES,
2861
+ generatePostalCode(rng, state) {
2862
+ const range = (state !== void 0 ? ZA_POSTAL_RANGES[state] : void 0) ?? [1e3, 9999];
2863
+ return randomInt(range[0], range[1], rng).toString().padStart(4, "0");
2864
+ },
2865
+ country: "ZA"
2866
+ };
2867
+
2868
+ // src/locales/za/names.ts
2869
+ var zaNamePool = {
2870
+ given: {
2871
+ male: ["Sipho", "Thabo", "Mandla", "Bongani", "Siyanda", "Lethiwe", "Sandile", "Nhlanhla", "Muzi", "Musa", "Johan", "Pieter", "Christiaan", "Wilhelm", "Andries", "Michael", "David", "James", "John", "Robert"],
2872
+ female: ["Nomvula", "Zanele", "Thandi", "Lindiwe", "Ntombi", "Zodwa", "Nosipho", "Nandi", "Phindile", "Sithembile", "Annelie", "Marietjie", "Suzette", "Elsa", "Hanlie", "Mary", "Sarah", "Grace", "Faith", "Hope"]
2873
+ },
2874
+ family: ["Dlamini", "Nkosi", "Mthembu", "Zulu", "Ndlovu", "Khumalo", "Nxumalo", "Mahlangu", "Mazibuko", "Mkhize", "Van der Merwe", "Botha", "Pretorius", "Venter", "Du Plessis", "Nel", "Fourie", "Steyn", "Coetzee", "Naidoo"]
2875
+ };
2876
+
2877
+ // src/locales/za/index.ts
2878
+ var zaLocale = {
2879
+ code: "za",
2880
+ name: "South Africa",
2881
+ patientIdentifiers: [zaIdDefinition],
2882
+ practitionerIdentifiers: [hpcsaRegistrationDefinition],
2883
+ organizationIdentifiers: [],
2884
+ address: zaAddressTemplate,
2885
+ names: zaNamePool
2886
+ };
2887
+
2888
+ // src/locales/index.ts
2889
+ var LOCALE_MAP = {
2890
+ us: usLocale,
2891
+ uk: ukLocale,
2892
+ au: auLocale,
2893
+ ca: caLocale,
2894
+ de: deLocale,
2895
+ fr: frLocale,
2896
+ nl: nlLocale,
2897
+ in: inLocale,
2898
+ jp: jpLocale,
2899
+ kr: krLocale,
2900
+ sg: sgLocale,
2901
+ br: brLocale,
2902
+ mx: mxLocale,
2903
+ za: zaLocale
2904
+ };
2905
+ function getLocale(code) {
2906
+ return LOCALE_MAP[code];
2907
+ }
2908
+ function getAllLocales() {
2909
+ return Object.values(LOCALE_MAP);
2910
+ }
2911
+
2912
+ // src/core/builders/version-adapters.ts
2913
+ function adaptMedicationStatementToR5(r) {
2914
+ const medCodeable = r["medicationCodeableConcept"];
2915
+ const { medicationCodeableConcept: _dropped, ...rest } = r;
2916
+ return {
2917
+ ...rest,
2918
+ resourceType: "MedicationUsage",
2919
+ medication: medCodeable !== void 0 ? { concept: medCodeable } : void 0,
2920
+ status: "recorded"
2921
+ };
2922
+ }
2923
+ var ALLERGY_TYPE_SYSTEM = "http://hl7.org/fhir/allergy-intolerance-type";
2924
+ function adaptAllergyIntoleranceToR5(r) {
2925
+ const typeCode = r["type"];
2926
+ const patientRef = r["patient"];
2927
+ const { patient: _dropped, ...withoutPatient } = r;
2928
+ const adapted = { ...withoutPatient };
2929
+ if (patientRef !== void 0) {
2930
+ adapted["subject"] = patientRef;
2931
+ }
2932
+ if (typeCode !== void 0) {
2933
+ const display = typeCode.charAt(0).toUpperCase() + typeCode.slice(1);
2934
+ adapted["type"] = {
2935
+ coding: [{ system: ALLERGY_TYPE_SYSTEM, code: typeCode, display }]
2936
+ };
2937
+ }
2938
+ return adapted;
2939
+ }
2940
+ function adaptToR5(resource) {
2941
+ switch (resource.resourceType) {
2942
+ case "MedicationStatement":
2943
+ return adaptMedicationStatementToR5(resource);
2944
+ case "AllergyIntolerance":
2945
+ return adaptAllergyIntoleranceToR5(resource);
2946
+ default:
2947
+ return resource;
2948
+ }
2949
+ }
2950
+ function adaptToVersion(resource, version) {
2951
+ if (version === "R5") return adaptToR5(resource);
2952
+ return resource;
2953
+ }
2954
+
2955
+ // src/core/builders/patient.ts
2956
+ var GENDER_DISTRIBUTION = [
2957
+ ["male", 0.48],
2958
+ ["female", 0.48],
2959
+ ["other", 0.03],
2960
+ ["unknown", 0.01]
2961
+ ];
2962
+ function generateGender(rng) {
2963
+ const roll = rng();
2964
+ let cumulative = 0;
2965
+ for (const [gender, probability] of GENDER_DISTRIBUTION) {
2966
+ cumulative += probability;
2967
+ if (roll < cumulative) return gender;
2968
+ }
2969
+ return "unknown";
2970
+ }
2971
+ var PHONE_FORMATTERS = {
2972
+ us: (rng) => `(555) ${randomInt(100, 999, rng)}-${randomInt(1e3, 9999, rng)}`,
2973
+ ca: (rng) => `(555) ${randomInt(100, 999, rng)}-${randomInt(1e3, 9999, rng)}`,
2974
+ uk: (rng) => `07700 ${randomInt(1e5, 999999, rng)}`,
2975
+ au: (rng) => `0400 ${randomInt(100, 999, rng)} ${randomInt(100, 999, rng)}`,
2976
+ de: (rng) => `030 ${randomInt(1e7, 99999999, rng)}`,
2977
+ fr: (rng) => `06 ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)}`,
2978
+ nl: (rng) => `06 ${randomInt(1e7, 99999999, rng)}`,
2979
+ in: (rng) => `09${randomInt(10, 99, rng)} ${randomInt(1e6, 9999999, rng)}`,
2980
+ jp: (rng) => `0${randomInt(3, 9, rng)}-${randomInt(1e3, 9999, rng)}-${randomInt(1e3, 9999, rng)}`,
2981
+ kr: (rng) => `0${randomInt(10, 99, rng)}-${randomInt(1e3, 9999, rng)}-${randomInt(1e3, 9999, rng)}`,
2982
+ sg: (rng) => `${randomInt(6e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
2983
+ br: (rng) => `(${randomInt(11, 99, rng)}) ${randomInt(91e3, 99999, rng)}-${randomInt(1e3, 9999, rng)}`,
2984
+ mx: (rng) => `55 ${randomInt(1e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
2985
+ za: (rng) => `0${randomInt(10, 99, rng)} ${randomInt(100, 999, rng)} ${randomInt(1e3, 9999, rng)}`
2986
+ };
2987
+ var LOCALE_LANGUAGE = {
2988
+ us: "en-US",
2989
+ uk: "en-GB",
2990
+ au: "en-AU",
2991
+ ca: "en-CA",
2992
+ de: "de",
2993
+ fr: "fr",
2994
+ nl: "nl",
2995
+ in: "hi",
2996
+ jp: "ja",
2997
+ kr: "ko",
2998
+ sg: "en-SG",
2999
+ br: "pt-BR",
3000
+ mx: "es-MX",
3001
+ za: "en-ZA"
3002
+ };
3003
+ function buildPatient(locale, rng) {
3004
+ const localeDef = getLocale(locale);
3005
+ const gender = generateGender(rng);
3006
+ const nameGender = gender === "other" || gender === "unknown" ? pickRandom(["male", "female"], rng) : gender;
3007
+ const generatedName = generateName(localeDef.names, nameGender, rng);
3008
+ const generatedAddress = generateAddress(localeDef.address, rng);
3009
+ const givenName = generatedName.given[0] ?? "";
3010
+ const familyName = generatedName.family;
3011
+ const email = `${givenName.toLowerCase()}.${familyName.toLowerCase()}@example.com`;
3012
+ const birthDate = generateDate(1940, 2010, rng);
3013
+ const birthYear = Number.parseInt(birthDate.slice(0, 4), 10);
3014
+ const identifierDef = pickRandom(localeDef.patientIdentifiers, rng);
3015
+ const identifierValue = identifierDef.generate(rng, { gender, birthYear });
3016
+ const nameEntry = {
3017
+ use: "official",
3018
+ family: familyName,
3019
+ given: generatedName.given,
3020
+ ...generatedName.familyPrefix !== void 0 && {
3021
+ _family: {
3022
+ extension: [
3023
+ {
3024
+ url: "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix",
3025
+ valueString: generatedName.familyPrefix
3026
+ }
3027
+ ]
3028
+ }
3029
+ }
3030
+ };
3031
+ const addressEntry = {
3032
+ use: "home",
3033
+ line: generatedAddress.line,
3034
+ city: generatedAddress.city,
3035
+ postalCode: generatedAddress.postalCode,
3036
+ country: generatedAddress.country,
3037
+ ...generatedAddress.state !== void 0 && { state: generatedAddress.state },
3038
+ ...generatedAddress.district !== void 0 && { district: generatedAddress.district }
3039
+ };
3040
+ return {
3041
+ resourceType: "Patient",
3042
+ id: generateUuidV4(rng),
3043
+ identifier: [{ system: identifierDef.system, value: identifierValue }],
3044
+ name: [nameEntry],
3045
+ telecom: [
3046
+ { system: "phone", value: PHONE_FORMATTERS[locale](rng), use: "home" },
3047
+ { system: "email", value: email, use: "home" }
3048
+ ],
3049
+ gender,
3050
+ birthDate,
3051
+ address: [addressEntry],
3052
+ communication: [
3053
+ {
3054
+ language: {
3055
+ coding: [{ system: "urn:ietf:bcp:47", code: LOCALE_LANGUAGE[locale] }]
3056
+ }
3057
+ }
3058
+ ]
3059
+ };
3060
+ }
3061
+ function makeBuilder(state) {
3062
+ return {
3063
+ locale(loc) {
3064
+ return makeBuilder({ ...state, locale: loc });
3065
+ },
3066
+ count(n) {
3067
+ return makeBuilder({ ...state, count: n });
3068
+ },
3069
+ seed(s) {
3070
+ return makeBuilder({ ...state, seed: s });
3071
+ },
3072
+ fhirVersion(v) {
3073
+ return makeBuilder({ ...state, fhirVersion: v });
3074
+ },
3075
+ overrides(o) {
3076
+ return makeBuilder({ ...state, overrideMap: o });
3077
+ },
3078
+ build() {
3079
+ const rng = createRng(state.seed);
3080
+ const hasOverrides = Object.keys(state.overrideMap).length > 0;
3081
+ return Array.from({ length: state.count }, () => {
3082
+ const patient = adaptToVersion(buildPatient(state.locale, rng), state.fhirVersion);
3083
+ return hasOverrides ? deepMerge(patient, state.overrideMap) : patient;
3084
+ });
3085
+ }
3086
+ };
3087
+ }
3088
+ function createPatientBuilder() {
3089
+ return makeBuilder({ locale: "us", count: 1, seed: 0, fhirVersion: "R4", overrideMap: {} });
3090
+ }
3091
+
3092
+ // src/core/builders/practitioner.ts
3093
+ var TITLE_BY_LOCALE = {
3094
+ us: "Dr.",
3095
+ uk: "Dr.",
3096
+ au: "Dr.",
3097
+ ca: "Dr.",
3098
+ de: "Dr. med.",
3099
+ fr: "Dr",
3100
+ nl: "Dr.",
3101
+ in: "Dr.",
3102
+ jp: "Dr.",
3103
+ kr: "Dr.",
3104
+ sg: "Dr.",
3105
+ br: "Dr.",
3106
+ mx: "Dr.",
3107
+ za: "Dr."
3108
+ };
3109
+ function buildPractitioner(locale, rng) {
3110
+ const localeDef = getLocale(locale);
3111
+ const gender = pickRandom(["male", "female"], rng);
3112
+ const generatedName = generateName(localeDef.names, gender, rng);
3113
+ const givenName = generatedName.given[0] ?? "";
3114
+ const familyName = generatedName.family;
3115
+ const email = `${givenName.toLowerCase()}.${familyName.toLowerCase()}@example-practice.com`;
3116
+ const nameEntry = {
3117
+ use: "official",
3118
+ family: familyName,
3119
+ given: generatedName.given,
3120
+ prefix: [TITLE_BY_LOCALE[locale]],
3121
+ ...generatedName.familyPrefix !== void 0 && {
3122
+ _family: {
3123
+ extension: [
3124
+ {
3125
+ url: "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix",
3126
+ valueString: generatedName.familyPrefix
3127
+ }
3128
+ ]
3129
+ }
3130
+ }
3131
+ };
3132
+ const identifiers = [];
3133
+ if (localeDef.practitionerIdentifiers.length > 0) {
3134
+ const def = pickRandom(localeDef.practitionerIdentifiers, rng);
3135
+ identifiers.push({ system: def.system, value: def.generate(rng) });
3136
+ }
3137
+ return {
3138
+ resourceType: "Practitioner",
3139
+ id: generateUuidV4(rng),
3140
+ identifier: identifiers,
3141
+ name: [nameEntry],
3142
+ telecom: [{ system: "email", value: email, use: "work" }],
3143
+ gender,
3144
+ qualification: [
3145
+ {
3146
+ code: {
3147
+ coding: [
3148
+ {
3149
+ system: "http://terminology.hl7.org/CodeSystem/v2-0360",
3150
+ code: "MD",
3151
+ display: "Doctor of Medicine"
3152
+ }
3153
+ ]
3154
+ }
3155
+ }
3156
+ ]
3157
+ };
3158
+ }
3159
+ function makeBuilder2(state) {
3160
+ return {
3161
+ locale(loc) {
3162
+ return makeBuilder2({ ...state, locale: loc });
3163
+ },
3164
+ count(n) {
3165
+ return makeBuilder2({ ...state, count: n });
3166
+ },
3167
+ seed(s) {
3168
+ return makeBuilder2({ ...state, seed: s });
3169
+ },
3170
+ fhirVersion(v) {
3171
+ return makeBuilder2({ ...state, fhirVersion: v });
3172
+ },
3173
+ overrides(o) {
3174
+ return makeBuilder2({ ...state, overrideMap: o });
3175
+ },
3176
+ build() {
3177
+ const rng = createRng(state.seed);
3178
+ const hasOverrides = Object.keys(state.overrideMap).length > 0;
3179
+ return Array.from({ length: state.count }, () => {
3180
+ const practitioner = adaptToVersion(buildPractitioner(state.locale, rng), state.fhirVersion);
3181
+ return hasOverrides ? deepMerge(practitioner, state.overrideMap) : practitioner;
3182
+ });
3183
+ }
3184
+ };
3185
+ }
3186
+ function createPractitionerBuilder() {
3187
+ return makeBuilder2({ locale: "us", count: 1, seed: 0, fhirVersion: "R4", overrideMap: {} });
3188
+ }
3189
+
3190
+ // src/core/builders/practitioner-role.ts
3191
+ var ROLE_CODES = [
3192
+ { code: "doctor", display: "Doctor", system: "http://terminology.hl7.org/CodeSystem/practitioner-role" },
3193
+ { code: "nurse", display: "Nurse", system: "http://terminology.hl7.org/CodeSystem/practitioner-role" },
3194
+ { code: "pharmacist", display: "Pharmacist", system: "http://terminology.hl7.org/CodeSystem/practitioner-role" },
3195
+ { code: "researcher", display: "Researcher", system: "http://terminology.hl7.org/CodeSystem/practitioner-role" }
3196
+ ];
3197
+ var SPECIALTY_CODES = [
3198
+ { code: "394814009", display: "General practice", system: "http://snomed.info/sct" },
3199
+ { code: "394579002", display: "Cardiology", system: "http://snomed.info/sct" },
3200
+ { code: "394580004", display: "Clinical genetics", system: "http://snomed.info/sct" },
3201
+ { code: "394609007", display: "General surgery", system: "http://snomed.info/sct" },
3202
+ { code: "394591006", display: "Neurology", system: "http://snomed.info/sct" },
3203
+ { code: "394576009", display: "Accident and Emergency", system: "http://snomed.info/sct" }
3204
+ ];
3205
+ function buildPractitionerRole(locale, fhirVersion, rng, options = {}) {
3206
+ let practitionerId = options.practitionerId;
3207
+ if (practitionerId === void 0) {
3208
+ const practSeed = Math.floor(rng() * 2147483647);
3209
+ const [practitioner] = createPractitionerBuilder().locale(locale).seed(practSeed).fhirVersion(fhirVersion).build();
3210
+ if (!practitioner) throw new Error("PractitionerRole: failed to generate Practitioner");
3211
+ practitionerId = practitioner["id"];
3212
+ }
3213
+ const role = pickRandom(ROLE_CODES, rng);
3214
+ const specialty = pickRandom(SPECIALTY_CODES, rng);
3215
+ const resource = {
3216
+ resourceType: "PractitionerRole",
3217
+ id: generateUuidV4(rng),
3218
+ active: true,
3219
+ practitioner: { reference: `Practitioner/${practitionerId}` },
3220
+ ...options.organizationId !== void 0 && {
3221
+ organization: { reference: `Organization/${options.organizationId}` }
3222
+ },
3223
+ code: [
3224
+ {
3225
+ coding: [{ system: role.system, code: role.code, display: role.display }]
3226
+ }
3227
+ ],
3228
+ specialty: [
3229
+ {
3230
+ coding: [{ system: specialty.system, code: specialty.code, display: specialty.display }]
3231
+ }
3232
+ ]
3233
+ };
3234
+ return adaptToVersion(resource, fhirVersion);
3235
+ }
3236
+ function makeBuilder3(state) {
3237
+ return {
3238
+ locale(loc) {
3239
+ return makeBuilder3({ ...state, locale: loc });
3240
+ },
3241
+ count(n) {
3242
+ return makeBuilder3({ ...state, count: n });
3243
+ },
3244
+ seed(s) {
3245
+ return makeBuilder3({ ...state, seed: s });
3246
+ },
3247
+ fhirVersion(v) {
3248
+ return makeBuilder3({ ...state, fhirVersion: v });
3249
+ },
3250
+ practitionerId(id) {
3251
+ return makeBuilder3({ ...state, injectedPractitionerId: id });
3252
+ },
3253
+ organizationId(id) {
3254
+ return makeBuilder3({ ...state, injectedOrganizationId: id });
3255
+ },
3256
+ overrides(o) {
3257
+ return makeBuilder3({ ...state, overrideMap: o });
3258
+ },
3259
+ build() {
3260
+ const rng = createRng(state.seed);
3261
+ const hasOverrides = Object.keys(state.overrideMap).length > 0;
3262
+ const options = {
3263
+ ...state.injectedPractitionerId !== void 0 && { practitionerId: state.injectedPractitionerId },
3264
+ ...state.injectedOrganizationId !== void 0 && { organizationId: state.injectedOrganizationId }
3265
+ };
3266
+ return Array.from({ length: state.count }, () => {
3267
+ const role = buildPractitionerRole(state.locale, state.fhirVersion, rng, options);
3268
+ return hasOverrides ? deepMerge(role, state.overrideMap) : role;
3269
+ });
3270
+ }
3271
+ };
3272
+ }
3273
+ function createPractitionerRoleBuilder() {
3274
+ return makeBuilder3({
3275
+ locale: "us",
3276
+ count: 1,
3277
+ seed: 0,
3278
+ fhirVersion: "R4",
3279
+ injectedPractitionerId: void 0,
3280
+ injectedOrganizationId: void 0,
3281
+ overrideMap: {}
3282
+ });
3283
+ }
3284
+
3285
+ // src/core/builders/organization.ts
3286
+ var ORG_PREFIXES = ["St.", "Royal", "General", "University", "Community", "Memorial"];
3287
+ var ORG_SUFFIXES = [
3288
+ "Hospital",
3289
+ "Medical Center",
3290
+ "Health System",
3291
+ "Clinic",
3292
+ "Healthcare"
3293
+ ];
3294
+ function generateOrgName(locale, rng) {
3295
+ const localeDef = getLocale(locale);
3296
+ const city = pickRandom(localeDef.address.cities, rng);
3297
+ const prefix = pickRandom(ORG_PREFIXES, rng);
3298
+ const suffix = pickRandom(ORG_SUFFIXES, rng);
3299
+ return `${prefix} ${city.name} ${suffix}`;
3300
+ }
3301
+ var WORK_PHONE_FORMATTERS = {
3302
+ us: (rng) => `(${randomInt(200, 999, rng)}) ${randomInt(200, 999, rng)}-${randomInt(1e3, 9999, rng)}`,
3303
+ ca: (rng) => `(${randomInt(200, 999, rng)}) ${randomInt(200, 999, rng)}-${randomInt(1e3, 9999, rng)}`,
3304
+ uk: (rng) => `0${randomInt(100, 999, rng)} ${randomInt(1e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
3305
+ au: (rng) => `0${randomInt(2, 9, rng)} ${randomInt(1e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
3306
+ de: (rng) => `0${randomInt(30, 999, rng)} ${randomInt(1e7, 99999999, rng)}`,
3307
+ fr: (rng) => `0${randomInt(1, 9, rng)} ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)} ${randomInt(10, 99, rng)}`,
3308
+ nl: (rng) => `0${randomInt(10, 99, rng)} ${randomInt(1e6, 9999999, rng)}`,
3309
+ in: (rng) => `0${randomInt(11, 99, rng)}-${randomInt(1e7, 99999999, rng)}`,
3310
+ jp: (rng) => `0${randomInt(3, 9, rng)}-${randomInt(1e3, 9999, rng)}-${randomInt(1e3, 9999, rng)}`,
3311
+ kr: (rng) => `0${randomInt(10, 99, rng)}-${randomInt(1e3, 9999, rng)}-${randomInt(1e3, 9999, rng)}`,
3312
+ sg: (rng) => `${randomInt(6e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
3313
+ br: (rng) => `(${randomInt(11, 99, rng)}) ${randomInt(2e3, 9999, rng)}-${randomInt(1e3, 9999, rng)}`,
3314
+ mx: (rng) => `55 ${randomInt(1e3, 9999, rng)} ${randomInt(1e3, 9999, rng)}`,
3315
+ za: (rng) => `0${randomInt(10, 99, rng)} ${randomInt(100, 999, rng)} ${randomInt(1e3, 9999, rng)}`
3316
+ };
3317
+ function buildOrganization(locale, rng) {
3318
+ const localeDef = getLocale(locale);
3319
+ const generatedAddress = generateAddress(localeDef.address, rng);
3320
+ const identifiers = [];
3321
+ if (localeDef.organizationIdentifiers.length > 0) {
3322
+ const def = pickRandom(localeDef.organizationIdentifiers, rng);
3323
+ identifiers.push({ system: def.system, value: def.generate(rng) });
3324
+ }
3325
+ const addressEntry = {
3326
+ use: "work",
3327
+ line: generatedAddress.line,
3328
+ city: generatedAddress.city,
3329
+ postalCode: generatedAddress.postalCode,
3330
+ country: generatedAddress.country,
3331
+ ...generatedAddress.state !== void 0 && { state: generatedAddress.state },
3332
+ ...generatedAddress.district !== void 0 && { district: generatedAddress.district }
3333
+ };
3334
+ return {
3335
+ resourceType: "Organization",
3336
+ id: generateUuidV4(rng),
3337
+ identifier: identifiers,
3338
+ active: true,
3339
+ type: [
3340
+ {
3341
+ coding: [
3342
+ {
3343
+ system: "http://terminology.hl7.org/CodeSystem/organization-type",
3344
+ code: "prov",
3345
+ display: "Healthcare Provider"
3346
+ }
3347
+ ]
3348
+ }
3349
+ ],
3350
+ name: generateOrgName(locale, rng),
3351
+ telecom: [{ system: "phone", value: WORK_PHONE_FORMATTERS[locale](rng), use: "work" }],
3352
+ address: [addressEntry]
3353
+ };
3354
+ }
3355
+ function makeBuilder4(state) {
3356
+ return {
3357
+ locale(loc) {
3358
+ return makeBuilder4({ ...state, locale: loc });
3359
+ },
3360
+ count(n) {
3361
+ return makeBuilder4({ ...state, count: n });
3362
+ },
3363
+ seed(s) {
3364
+ return makeBuilder4({ ...state, seed: s });
3365
+ },
3366
+ fhirVersion(v) {
3367
+ return makeBuilder4({ ...state, fhirVersion: v });
3368
+ },
3369
+ overrides(o) {
3370
+ return makeBuilder4({ ...state, overrideMap: o });
3371
+ },
3372
+ build() {
3373
+ const rng = createRng(state.seed);
3374
+ const hasOverrides = Object.keys(state.overrideMap).length > 0;
3375
+ return Array.from({ length: state.count }, () => {
3376
+ const org = adaptToVersion(buildOrganization(state.locale, rng), state.fhirVersion);
3377
+ return hasOverrides ? deepMerge(org, state.overrideMap) : org;
3378
+ });
3379
+ }
3380
+ };
3381
+ }
3382
+ function createOrganizationBuilder() {
3383
+ return makeBuilder4({ locale: "us", count: 1, seed: 0, fhirVersion: "R4", overrideMap: {} });
3384
+ }
3385
+
3386
+ // src/core/data/loinc-codes.ts
3387
+ var COMMON_LOINC_CODES = [
3388
+ // Vital signs
3389
+ {
3390
+ code: "8867-4",
3391
+ display: "Heart rate",
3392
+ unit: "beats/minute",
3393
+ unitCode: "/min",
3394
+ category: "vital-signs",
3395
+ valueRange: { min: 50, max: 120 },
3396
+ decimals: 0
3397
+ },
3398
+ {
3399
+ code: "8310-5",
3400
+ display: "Body temperature",
3401
+ unit: "degrees Celsius",
3402
+ unitCode: "Cel",
3403
+ category: "vital-signs",
3404
+ valueRange: { min: 35.5, max: 39 },
3405
+ decimals: 1
3406
+ },
3407
+ {
3408
+ code: "8480-6",
3409
+ display: "Systolic blood pressure",
3410
+ unit: "mmHg",
3411
+ unitCode: "mm[Hg]",
3412
+ category: "vital-signs",
3413
+ valueRange: { min: 90, max: 180 },
3414
+ decimals: 0
3415
+ },
3416
+ {
3417
+ code: "8462-4",
3418
+ display: "Diastolic blood pressure",
3419
+ unit: "mmHg",
3420
+ unitCode: "mm[Hg]",
3421
+ category: "vital-signs",
3422
+ valueRange: { min: 50, max: 110 },
3423
+ decimals: 0
3424
+ },
3425
+ {
3426
+ code: "9279-1",
3427
+ display: "Respiratory rate",
3428
+ unit: "breaths/minute",
3429
+ unitCode: "/min",
3430
+ category: "vital-signs",
3431
+ valueRange: { min: 10, max: 30 },
3432
+ decimals: 0
3433
+ },
3434
+ {
3435
+ code: "2708-6",
3436
+ display: "Oxygen saturation",
3437
+ unit: "%",
3438
+ unitCode: "%",
3439
+ category: "vital-signs",
3440
+ valueRange: { min: 88, max: 100 },
3441
+ decimals: 0
3442
+ },
3443
+ {
3444
+ code: "29463-7",
3445
+ display: "Body weight",
3446
+ unit: "kg",
3447
+ unitCode: "kg",
3448
+ category: "vital-signs",
3449
+ valueRange: { min: 40, max: 150 },
3450
+ decimals: 1
3451
+ },
3452
+ {
3453
+ code: "8302-2",
3454
+ display: "Body height",
3455
+ unit: "cm",
3456
+ unitCode: "cm",
3457
+ category: "vital-signs",
3458
+ valueRange: { min: 140, max: 200 },
3459
+ decimals: 0
3460
+ },
3461
+ // Laboratory
3462
+ {
3463
+ code: "2339-0",
3464
+ display: "Glucose",
3465
+ unit: "mg/dL",
3466
+ unitCode: "mg/dL",
3467
+ category: "laboratory",
3468
+ valueRange: { min: 60, max: 200 },
3469
+ decimals: 0
3470
+ },
3471
+ {
3472
+ code: "718-7",
3473
+ display: "Hemoglobin",
3474
+ unit: "g/dL",
3475
+ unitCode: "g/dL",
3476
+ category: "laboratory",
3477
+ valueRange: { min: 8, max: 18 },
3478
+ decimals: 1
3479
+ },
3480
+ {
3481
+ code: "4548-4",
3482
+ display: "HbA1c",
3483
+ unit: "%",
3484
+ unitCode: "%",
3485
+ category: "laboratory",
3486
+ valueRange: { min: 4, max: 14 },
3487
+ decimals: 1
3488
+ },
3489
+ {
3490
+ code: "2160-0",
3491
+ display: "Creatinine",
3492
+ unit: "mg/dL",
3493
+ unitCode: "mg/dL",
3494
+ category: "laboratory",
3495
+ valueRange: { min: 0.5, max: 2.5 },
3496
+ decimals: 1
3497
+ },
3498
+ {
3499
+ code: "6690-2",
3500
+ display: "WBC count",
3501
+ unit: "10*3/uL",
3502
+ unitCode: "10*3/uL",
3503
+ category: "laboratory",
3504
+ valueRange: { min: 3, max: 15 },
3505
+ decimals: 1
3506
+ },
3507
+ // Additional laboratory codes
3508
+ {
3509
+ code: "2951-2",
3510
+ display: "Sodium",
3511
+ unit: "mmol/L",
3512
+ unitCode: "mmol/L",
3513
+ category: "laboratory",
3514
+ valueRange: { min: 130, max: 150 },
3515
+ decimals: 0
3516
+ },
3517
+ {
3518
+ code: "2823-3",
3519
+ display: "Potassium",
3520
+ unit: "mmol/L",
3521
+ unitCode: "mmol/L",
3522
+ category: "laboratory",
3523
+ valueRange: { min: 3, max: 5.5 },
3524
+ decimals: 1
3525
+ },
3526
+ {
3527
+ code: "17861-6",
3528
+ display: "Calcium",
3529
+ unit: "mg/dL",
3530
+ unitCode: "mg/dL",
3531
+ category: "laboratory",
3532
+ valueRange: { min: 8, max: 11 },
3533
+ decimals: 1
3534
+ },
3535
+ {
3536
+ code: "1751-7",
3537
+ display: "Albumin",
3538
+ unit: "g/dL",
3539
+ unitCode: "g/dL",
3540
+ category: "laboratory",
3541
+ valueRange: { min: 2.5, max: 5 },
3542
+ decimals: 1
3543
+ },
3544
+ {
3545
+ code: "2885-2",
3546
+ display: "Total protein",
3547
+ unit: "g/dL",
3548
+ unitCode: "g/dL",
3549
+ category: "laboratory",
3550
+ valueRange: { min: 5.5, max: 9 },
3551
+ decimals: 1
3552
+ },
3553
+ {
3554
+ code: "3016-3",
3555
+ display: "TSH",
3556
+ unit: "mIU/L",
3557
+ unitCode: "mIU/L",
3558
+ category: "laboratory",
3559
+ valueRange: { min: 0.3, max: 5 },
3560
+ decimals: 2
3561
+ },
3562
+ {
3563
+ code: "2093-3",
3564
+ display: "Total cholesterol",
3565
+ unit: "mg/dL",
3566
+ unitCode: "mg/dL",
3567
+ category: "laboratory",
3568
+ valueRange: { min: 100, max: 300 },
3569
+ decimals: 0
3570
+ },
3571
+ {
3572
+ code: "18262-6",
3573
+ display: "LDL cholesterol",
3574
+ unit: "mg/dL",
3575
+ unitCode: "mg/dL",
3576
+ category: "laboratory",
3577
+ valueRange: { min: 50, max: 200 },
3578
+ decimals: 0
3579
+ },
3580
+ {
3581
+ code: "2085-9",
3582
+ display: "HDL cholesterol",
3583
+ unit: "mg/dL",
3584
+ unitCode: "mg/dL",
3585
+ category: "laboratory",
3586
+ valueRange: { min: 20, max: 100 },
3587
+ decimals: 0
3588
+ },
3589
+ {
3590
+ code: "2571-8",
3591
+ display: "Triglycerides",
3592
+ unit: "mg/dL",
3593
+ unitCode: "mg/dL",
3594
+ category: "laboratory",
3595
+ valueRange: { min: 50, max: 400 },
3596
+ decimals: 0
3597
+ },
3598
+ {
3599
+ code: "1742-6",
3600
+ display: "ALT",
3601
+ unit: "U/L",
3602
+ unitCode: "U/L",
3603
+ category: "laboratory",
3604
+ valueRange: { min: 5, max: 100 },
3605
+ decimals: 0
3606
+ },
3607
+ {
3608
+ code: "1920-8",
3609
+ display: "AST",
3610
+ unit: "U/L",
3611
+ unitCode: "U/L",
3612
+ category: "laboratory",
3613
+ valueRange: { min: 5, max: 100 },
3614
+ decimals: 0
3615
+ },
3616
+ {
3617
+ code: "1975-2",
3618
+ display: "Bilirubin total",
3619
+ unit: "mg/dL",
3620
+ unitCode: "mg/dL",
3621
+ category: "laboratory",
3622
+ valueRange: { min: 0.1, max: 3 },
3623
+ decimals: 1
3624
+ },
3625
+ {
3626
+ code: "777-3",
3627
+ display: "Platelet count",
3628
+ unit: "10*3/uL",
3629
+ unitCode: "10*3/uL",
3630
+ category: "laboratory",
3631
+ valueRange: { min: 100, max: 500 },
3632
+ decimals: 0
3633
+ },
3634
+ {
3635
+ code: "62238-1",
3636
+ display: "eGFR",
3637
+ unit: "mL/min/1.73m2",
3638
+ unitCode: "mL/min/{1.73_m2}",
3639
+ category: "laboratory",
3640
+ valueRange: { min: 15, max: 120 },
3641
+ decimals: 0
3642
+ },
3643
+ // Additional vital-signs codes
3644
+ {
3645
+ code: "59408-5",
3646
+ display: "Oxygen saturation by pulse oximetry",
3647
+ unit: "%",
3648
+ unitCode: "%",
3649
+ category: "vital-signs",
3650
+ valueRange: { min: 88, max: 100 },
3651
+ decimals: 0
3652
+ },
3653
+ {
3654
+ code: "8287-5",
3655
+ display: "Head circumference",
3656
+ unit: "cm",
3657
+ unitCode: "cm",
3658
+ category: "vital-signs",
3659
+ valueRange: { min: 50, max: 62 },
3660
+ decimals: 0
3661
+ }
3662
+ ];
3663
+
3664
+ // src/core/builders/observation.ts
3665
+ function generateValue(loinc, rng) {
3666
+ const { min, max, decimals } = { ...loinc.valueRange, decimals: loinc.decimals };
3667
+ const scale = Math.pow(10, decimals);
3668
+ const raw = randomInt(Math.round(min * scale), Math.round(max * scale), rng);
3669
+ return raw / scale;
3670
+ }
3671
+ var CATEGORY_DISPLAY = {
3672
+ "vital-signs": "Vital Signs",
3673
+ laboratory: "Laboratory"
3674
+ };
3675
+ function buildObservation(category, subject, rng) {
3676
+ const codes = category ? COMMON_LOINC_CODES.filter((c) => c.category === category) : COMMON_LOINC_CODES;
3677
+ const loinc = pickRandom(codes, rng);
3678
+ const effectiveCategory = loinc.category;
3679
+ const value = generateValue(loinc, rng);
3680
+ return {
3681
+ resourceType: "Observation",
3682
+ id: generateUuidV4(rng),
3683
+ status: "final",
3684
+ category: [
3685
+ {
3686
+ coding: [
3687
+ {
3688
+ system: "http://terminology.hl7.org/CodeSystem/observation-category",
3689
+ code: effectiveCategory,
3690
+ display: CATEGORY_DISPLAY[effectiveCategory]
3691
+ }
3692
+ ]
3693
+ }
3694
+ ],
3695
+ code: {
3696
+ coding: [
3697
+ {
3698
+ system: "http://loinc.org",
3699
+ code: loinc.code,
3700
+ display: loinc.display
3701
+ }
3702
+ ]
3703
+ },
3704
+ subject: { reference: subject },
3705
+ effectiveDateTime: generateDateTime(2020, 2025, rng),
3706
+ valueQuantity: {
3707
+ value,
3708
+ unit: loinc.unit,
3709
+ system: "http://unitsofmeasure.org",
3710
+ code: loinc.unitCode
3711
+ }
3712
+ };
3713
+ }
3714
+ function makeBuilder5(state) {
3715
+ return {
3716
+ locale(loc) {
3717
+ return makeBuilder5({ ...state, locale: loc });
3718
+ },
3719
+ count(n) {
3720
+ return makeBuilder5({ ...state, count: n });
3721
+ },
3722
+ seed(s) {
3723
+ return makeBuilder5({ ...state, seed: s });
3724
+ },
3725
+ subject(ref) {
3726
+ return makeBuilder5({ ...state, subjectRef: ref });
3727
+ },
3728
+ category(cat) {
3729
+ return makeBuilder5({ ...state, categoryFilter: cat });
3730
+ },
3731
+ fhirVersion(v) {
3732
+ return makeBuilder5({ ...state, fhirVersion: v });
3733
+ },
3734
+ overrides(o) {
3735
+ return makeBuilder5({ ...state, overrideMap: o });
3736
+ },
3737
+ build() {
3738
+ const rng = createRng(state.seed);
3739
+ const results = [];
3740
+ for (let i = 0; i < state.count; i++) {
3741
+ const subjectRef = state.subjectRef ?? `Patient/${generateUuidV4(rng)}`;
3742
+ const obs = adaptToVersion(buildObservation(state.categoryFilter, subjectRef, rng), state.fhirVersion);
3743
+ if (Object.keys(state.overrideMap).length > 0) {
3744
+ results.push(deepMerge(obs, state.overrideMap));
3745
+ } else {
3746
+ results.push(obs);
3747
+ }
3748
+ }
3749
+ return results;
3750
+ }
3751
+ };
3752
+ }
3753
+ function createObservationBuilder() {
3754
+ return makeBuilder5({
3755
+ locale: "us",
3756
+ count: 1,
3757
+ seed: 0,
3758
+ fhirVersion: "R4",
3759
+ subjectRef: void 0,
3760
+ categoryFilter: void 0,
3761
+ overrideMap: {}
3762
+ });
3763
+ }
3764
+
3765
+ // src/core/data/snomed-codes.ts
3766
+ var COMMON_SNOMED_CONDITIONS = [
3767
+ { code: "73211009", display: "Diabetes mellitus" },
3768
+ { code: "38341003", display: "Hypertension" },
3769
+ { code: "195967001", display: "Asthma" },
3770
+ { code: "44054006", display: "Type 2 diabetes mellitus" },
3771
+ { code: "84114007", display: "Heart failure" },
3772
+ { code: "13645005", display: "COPD" },
3773
+ { code: "56265001", display: "Heart disease" },
3774
+ { code: "40055000", display: "Chronic kidney disease" },
3775
+ { code: "73430006", display: "Sleep apnea" },
3776
+ { code: "414545008", display: "Ischemic heart disease" },
3777
+ { code: "230690007", display: "Stroke" },
3778
+ { code: "35489007", display: "Depressive disorder" },
3779
+ { code: "197480006", display: "Anxiety disorder" },
3780
+ { code: "396275006", display: "Osteoarthritis" },
3781
+ { code: "69896004", display: "Rheumatoid arthritis" },
3782
+ { code: "40930008", display: "Hypothyroidism" },
3783
+ { code: "49436004", display: "Atrial fibrillation" },
3784
+ { code: "109819003", display: "Chronic liver disease" },
3785
+ { code: "37796009", display: "Migraine" },
3786
+ { code: "34000006", display: "Crohn's disease" },
3787
+ { code: "49049000", display: "Parkinson's disease" },
3788
+ { code: "271737000", display: "Anemia" },
3789
+ { code: "233604007", display: "Pneumonia" },
3790
+ { code: "68566005", display: "Urinary tract infection" },
3791
+ { code: "414916001", display: "Obesity" }
3792
+ ];
3793
+
3794
+ // src/core/builders/condition.ts
3795
+ function buildCondition(subject, rng) {
3796
+ const snomed = pickRandom(COMMON_SNOMED_CONDITIONS, rng);
3797
+ return {
3798
+ resourceType: "Condition",
3799
+ id: generateUuidV4(rng),
3800
+ clinicalStatus: {
3801
+ coding: [
3802
+ {
3803
+ system: "http://terminology.hl7.org/CodeSystem/condition-clinical",
3804
+ code: "active",
3805
+ display: "Active"
3806
+ }
3807
+ ]
3808
+ },
3809
+ verificationStatus: {
3810
+ coding: [
3811
+ {
3812
+ system: "http://terminology.hl7.org/CodeSystem/condition-ver-status",
3813
+ code: "confirmed",
3814
+ display: "Confirmed"
3815
+ }
3816
+ ]
3817
+ },
3818
+ code: {
3819
+ coding: [
3820
+ {
3821
+ system: "http://snomed.info/sct",
3822
+ code: snomed.code,
3823
+ display: snomed.display
3824
+ }
3825
+ ]
3826
+ },
3827
+ subject: { reference: subject },
3828
+ onsetDateTime: generateDate(2015, 2024, rng)
3829
+ };
3830
+ }
3831
+ function makeBuilder6(state) {
3832
+ return {
3833
+ locale(loc) {
3834
+ return makeBuilder6({ ...state, locale: loc });
3835
+ },
3836
+ count(n) {
3837
+ return makeBuilder6({ ...state, count: n });
3838
+ },
3839
+ seed(s) {
3840
+ return makeBuilder6({ ...state, seed: s });
3841
+ },
3842
+ subject(ref) {
3843
+ return makeBuilder6({ ...state, subjectRef: ref });
3844
+ },
3845
+ fhirVersion(v) {
3846
+ return makeBuilder6({ ...state, fhirVersion: v });
3847
+ },
3848
+ overrides(o) {
3849
+ return makeBuilder6({ ...state, overrideMap: o });
3850
+ },
3851
+ build() {
3852
+ const rng = createRng(state.seed);
3853
+ const results = [];
3854
+ for (let i = 0; i < state.count; i++) {
3855
+ const subjectRef = state.subjectRef ?? `Patient/${generateUuidV4(rng)}`;
3856
+ const condition = adaptToVersion(buildCondition(subjectRef, rng), state.fhirVersion);
3857
+ if (Object.keys(state.overrideMap).length > 0) {
3858
+ results.push(
3859
+ deepMerge(condition, state.overrideMap)
3860
+ );
3861
+ } else {
3862
+ results.push(condition);
3863
+ }
3864
+ }
3865
+ return results;
3866
+ }
3867
+ };
3868
+ }
3869
+ function createConditionBuilder() {
3870
+ return makeBuilder6({
3871
+ locale: "us",
3872
+ count: 1,
3873
+ seed: 0,
3874
+ fhirVersion: "R4",
3875
+ subjectRef: void 0,
3876
+ overrideMap: {}
3877
+ });
3878
+ }
3879
+
3880
+ // src/core/data/allergy-codes.ts
3881
+ var SNOMED = "http://snomed.info/sct";
3882
+ var COMMON_ALLERGY_CODES = [
3883
+ { system: SNOMED, code: "91936005", display: "Allergy to penicillin", type: "allergy", category: "medication" },
3884
+ { system: SNOMED, code: "91935009", display: "Allergy to peanuts", type: "allergy", category: "food" },
3885
+ { system: SNOMED, code: "294505008", display: "Allergy to amoxicillin", type: "allergy", category: "medication" },
3886
+ { system: SNOMED, code: "418689008", display: "Allergy to grass pollen", type: "allergy", category: "environment" },
3887
+ { system: SNOMED, code: "419474003", display: "Allergy to sulfonamide", type: "allergy", category: "medication" },
3888
+ { system: SNOMED, code: "416098002", display: "Allergy to drug", type: "allergy", category: "medication" },
3889
+ { system: SNOMED, code: "300916003", display: "Latex allergy", type: "allergy", category: "environment" },
3890
+ { system: SNOMED, code: "235719002", display: "Food intolerance", type: "intolerance", category: "food" },
3891
+ // Additional medication allergies
3892
+ { system: SNOMED, code: "372687004", display: "Allergy to aspirin", type: "allergy", category: "medication" },
3893
+ { system: SNOMED, code: "373270004", display: "Allergy to cephalosporin antibiotic", type: "allergy", category: "medication" },
3894
+ { system: SNOMED, code: "372720008", display: "Allergy to codeine", type: "allergy", category: "medication" },
3895
+ { system: SNOMED, code: "294506009", display: "Allergy to tetracycline", type: "allergy", category: "medication" },
3896
+ // Additional food allergies/intolerances
3897
+ { system: SNOMED, code: "782415009", display: "Intolerance to gluten", type: "intolerance", category: "food" },
3898
+ { system: SNOMED, code: "402383003", display: "Milk allergy", type: "allergy", category: "food" },
3899
+ { system: SNOMED, code: "414285001", display: "Allergy to nut", type: "allergy", category: "food" },
3900
+ { system: SNOMED, code: "73882009", display: "Shellfish allergy", type: "allergy", category: "food" },
3901
+ { system: SNOMED, code: "91930004", display: "Allergy to eggs", type: "allergy", category: "food" },
3902
+ { system: SNOMED, code: "267425008", display: "Allergy to strawberries", type: "allergy", category: "food" },
3903
+ { system: SNOMED, code: "6235009", display: "Allergy to seafood", type: "allergy", category: "food" },
3904
+ // Additional environmental allergies
3905
+ { system: SNOMED, code: "232350006", display: "Allergy to house dust mite", type: "allergy", category: "environment" },
3906
+ { system: SNOMED, code: "418290006", display: "Allergy to mold", type: "allergy", category: "environment" },
3907
+ { system: SNOMED, code: "419199007", display: "Allergy to cat dander", type: "allergy", category: "environment" },
3908
+ { system: SNOMED, code: "232347008", display: "Allergy to dog dander", type: "allergy", category: "environment" }
3909
+ ];
3910
+
3911
+ // src/core/builders/allergy-intolerance.ts
3912
+ var CRITICALITY_VALUES = ["low", "high", "unable-to-assess"];
3913
+ function buildAllergyIntolerance(patientRef, rng) {
3914
+ const allergy = pickRandom(COMMON_ALLERGY_CODES, rng);
3915
+ const criticality = pickRandom(CRITICALITY_VALUES, rng);
3916
+ return {
3917
+ resourceType: "AllergyIntolerance",
3918
+ id: generateUuidV4(rng),
3919
+ clinicalStatus: {
3920
+ coding: [
3921
+ {
3922
+ system: "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical",
3923
+ code: "active",
3924
+ display: "Active"
3925
+ }
3926
+ ]
3927
+ },
3928
+ verificationStatus: {
3929
+ coding: [
3930
+ {
3931
+ system: "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification",
3932
+ code: "confirmed",
3933
+ display: "Confirmed"
3934
+ }
3935
+ ]
3936
+ },
3937
+ type: allergy.type,
3938
+ category: [allergy.category],
3939
+ criticality,
3940
+ code: {
3941
+ coding: [
3942
+ {
3943
+ system: allergy.system,
3944
+ code: allergy.code,
3945
+ display: allergy.display
3946
+ }
3947
+ ]
3948
+ },
3949
+ patient: { reference: patientRef },
3950
+ recordedDate: generateDate(2015, 2024, rng)
3951
+ };
3952
+ }
3953
+ function makeBuilder7(state) {
3954
+ return {
3955
+ locale(loc) {
3956
+ return makeBuilder7({ ...state, locale: loc });
3957
+ },
3958
+ count(n) {
3959
+ return makeBuilder7({ ...state, count: n });
3960
+ },
3961
+ seed(s) {
3962
+ return makeBuilder7({ ...state, seed: s });
3963
+ },
3964
+ subject(ref) {
3965
+ return makeBuilder7({ ...state, patientRef: ref });
3966
+ },
3967
+ fhirVersion(v) {
3968
+ return makeBuilder7({ ...state, fhirVersion: v });
3969
+ },
3970
+ overrides(o) {
3971
+ return makeBuilder7({ ...state, overrideMap: o });
3972
+ },
3973
+ build() {
3974
+ const rng = createRng(state.seed);
3975
+ const results = [];
3976
+ for (let i = 0; i < state.count; i++) {
3977
+ const patientRef = state.patientRef ?? `Patient/${generateUuidV4(rng)}`;
3978
+ const allergy = adaptToVersion(buildAllergyIntolerance(patientRef, rng), state.fhirVersion);
3979
+ if (Object.keys(state.overrideMap).length > 0) {
3980
+ results.push(
3981
+ deepMerge(allergy, state.overrideMap)
3982
+ );
3983
+ } else {
3984
+ results.push(allergy);
3985
+ }
3986
+ }
3987
+ return results;
3988
+ }
3989
+ };
3990
+ }
3991
+ function createAllergyIntoleranceBuilder() {
3992
+ return makeBuilder7({
3993
+ locale: "us",
3994
+ count: 1,
3995
+ seed: 0,
3996
+ fhirVersion: "R4",
3997
+ patientRef: void 0,
3998
+ overrideMap: {}
3999
+ });
4000
+ }
4001
+
4002
+ // src/core/data/medication-codes.ts
4003
+ var SNOMED2 = "http://snomed.info/sct";
4004
+ var RXNORM = "http://www.nlm.nih.gov/research/umls/rxnorm";
4005
+ var COMMON_MEDICATION_CODES = [
4006
+ { system: SNOMED2, code: "27658006", display: "Amoxicillin", typicalDoseMg: 500, frequency: "three times daily" },
4007
+ { system: SNOMED2, code: "387207008", display: "Ibuprofen", typicalDoseMg: 400, frequency: "as needed" },
4008
+ { system: SNOMED2, code: "372756006", display: "Atorvastatin", typicalDoseMg: 40, frequency: "daily" },
4009
+ { system: SNOMED2, code: "386919002", display: "Metformin", typicalDoseMg: 500, frequency: "twice daily" },
4010
+ { system: SNOMED2, code: "387458008", display: "Aspirin", typicalDoseMg: 100, frequency: "daily" },
4011
+ { system: SNOMED2, code: "372567009", display: "Amlodipine", typicalDoseMg: 5, frequency: "daily" },
4012
+ { system: SNOMED2, code: "116602009", display: "Lisinopril", typicalDoseMg: 10, frequency: "daily" },
4013
+ { system: SNOMED2, code: "387471003", display: "Levothyroxine", typicalDoseMg: 50, frequency: "daily" },
4014
+ // Additional SNOMED medications
4015
+ { system: SNOMED2, code: "372525000", display: "Omeprazole", typicalDoseMg: 20, frequency: "daily" },
4016
+ { system: SNOMED2, code: "372594008", display: "Sertraline", typicalDoseMg: 50, frequency: "daily" },
4017
+ { system: SNOMED2, code: "373567009", display: "Losartan", typicalDoseMg: 50, frequency: "daily" },
4018
+ { system: SNOMED2, code: "387475002", display: "Furosemide", typicalDoseMg: 40, frequency: "daily" },
4019
+ { system: SNOMED2, code: "372768001", display: "Clopidogrel", typicalDoseMg: 75, frequency: "daily" },
4020
+ { system: SNOMED2, code: "395726003", display: "Pantoprazole", typicalDoseMg: 40, frequency: "daily" },
4021
+ { system: SNOMED2, code: "372694001", display: "Albuterol", typicalDoseMg: 2, frequency: "as needed" },
4022
+ { system: SNOMED2, code: "116601002", display: "Prednisone", typicalDoseMg: 5, frequency: "daily" },
4023
+ { system: SNOMED2, code: "386928009", display: "Gabapentin", typicalDoseMg: 300, frequency: "three times daily" }
4024
+ ];
4025
+ var US_RXNORM_MEDICATION_CODES = [
4026
+ { system: RXNORM, code: "866419", display: "Metoprolol", typicalDoseMg: 50, frequency: "twice daily" },
4027
+ { system: RXNORM, code: "5487", display: "Hydrochlorothiazide", typicalDoseMg: 25, frequency: "daily" },
4028
+ { system: RXNORM, code: "11289", display: "Warfarin", typicalDoseMg: 5, frequency: "daily" },
4029
+ { system: RXNORM, code: "41493", display: "Tramadol", typicalDoseMg: 50, frequency: "as needed" },
4030
+ { system: RXNORM, code: "203457", display: "Cetirizine", typicalDoseMg: 10, frequency: "daily" },
4031
+ { system: RXNORM, code: "18631", display: "Azithromycin", typicalDoseMg: 500, frequency: "daily" },
4032
+ { system: RXNORM, code: "301542", display: "Rosuvastatin", typicalDoseMg: 10, frequency: "daily" },
4033
+ { system: RXNORM, code: "723372", display: "Montelukast", typicalDoseMg: 10, frequency: "daily" }
4034
+ ];
4035
+
4036
+ // src/core/builders/medication-statement.ts
4037
+ function buildMedicationStatement(subject, locale, rng) {
4038
+ const pool = locale === "us" ? [...COMMON_MEDICATION_CODES, ...US_RXNORM_MEDICATION_CODES] : COMMON_MEDICATION_CODES;
4039
+ const med = pickRandom(pool, rng);
4040
+ const startDate = generateDate(2018, 2024, rng);
4041
+ return {
4042
+ resourceType: "MedicationStatement",
4043
+ id: generateUuidV4(rng),
4044
+ status: "active",
4045
+ medicationCodeableConcept: {
4046
+ coding: [
4047
+ {
4048
+ system: med.system,
4049
+ code: med.code,
4050
+ display: med.display
4051
+ }
4052
+ ]
4053
+ },
4054
+ subject: { reference: subject },
4055
+ effectivePeriod: {
4056
+ start: startDate
4057
+ },
4058
+ dosage: [
4059
+ {
4060
+ text: `${med.typicalDoseMg} mg ${med.frequency}`
4061
+ }
4062
+ ]
4063
+ };
4064
+ }
4065
+ function makeBuilder8(state) {
4066
+ return {
4067
+ locale(loc) {
4068
+ return makeBuilder8({ ...state, locale: loc });
4069
+ },
4070
+ count(n) {
4071
+ return makeBuilder8({ ...state, count: n });
4072
+ },
4073
+ seed(s) {
4074
+ return makeBuilder8({ ...state, seed: s });
4075
+ },
4076
+ subject(ref) {
4077
+ return makeBuilder8({ ...state, subjectRef: ref });
4078
+ },
4079
+ fhirVersion(v) {
4080
+ return makeBuilder8({ ...state, fhirVersion: v });
4081
+ },
4082
+ overrides(o) {
4083
+ return makeBuilder8({ ...state, overrideMap: o });
4084
+ },
4085
+ build() {
4086
+ const rng = createRng(state.seed);
4087
+ const results = [];
4088
+ for (let i = 0; i < state.count; i++) {
4089
+ const subjectRef = state.subjectRef ?? `Patient/${generateUuidV4(rng)}`;
4090
+ const medStatement = adaptToVersion(
4091
+ buildMedicationStatement(subjectRef, state.locale, rng),
4092
+ state.fhirVersion
4093
+ );
4094
+ if (Object.keys(state.overrideMap).length > 0) {
4095
+ results.push(
4096
+ deepMerge(
4097
+ medStatement,
4098
+ state.overrideMap
4099
+ )
4100
+ );
4101
+ } else {
4102
+ results.push(medStatement);
4103
+ }
4104
+ }
4105
+ return results;
4106
+ }
4107
+ };
4108
+ }
4109
+ function createMedicationStatementBuilder() {
4110
+ return makeBuilder8({
4111
+ locale: "us",
4112
+ count: 1,
4113
+ seed: 0,
4114
+ fhirVersion: "R4",
4115
+ subjectRef: void 0,
4116
+ overrideMap: {}
4117
+ });
4118
+ }
4119
+
4120
+ // src/core/builders/bundle.ts
4121
+ function makeEntry(resource, bundleType) {
4122
+ const id = resource["id"];
4123
+ const resourceType = resource["resourceType"];
4124
+ const fullUrl = `urn:uuid:${id}`;
4125
+ const entry = { fullUrl, resource };
4126
+ if (bundleType === "transaction") {
4127
+ entry["request"] = { method: "POST", url: resourceType };
4128
+ } else if (bundleType === "searchset") {
4129
+ entry["search"] = { mode: "match" };
4130
+ }
4131
+ return entry;
4132
+ }
4133
+ function nextSeed(rng) {
4134
+ return Math.floor(rng() * 2147483647);
4135
+ }
4136
+ var CATEGORIES = ["vital-signs", "laboratory"];
4137
+ function buildClinicalResources(count, patientRef, practRef, fhirVersion, rng) {
4138
+ const resources = [];
4139
+ if (count !== void 0) {
4140
+ const types = ["observation", "observation", "condition", "allergy", "medication"];
4141
+ for (let i = 0; i < count; i++) {
4142
+ const type = types[i % types.length];
4143
+ const seed = nextSeed(rng);
4144
+ if (type === "observation") {
4145
+ const cat = CATEGORIES[i % CATEGORIES.length];
4146
+ const [obs] = createObservationBuilder().subject(patientRef).category(cat ?? "vital-signs").seed(seed).fhirVersion(fhirVersion).build();
4147
+ if (obs) {
4148
+ resources.push({ ...obs, performer: [{ reference: practRef }] });
4149
+ }
4150
+ } else if (type === "condition") {
4151
+ const [cond] = createConditionBuilder().subject(patientRef).seed(seed).fhirVersion(fhirVersion).build();
4152
+ if (cond) resources.push(cond);
4153
+ } else if (type === "allergy") {
4154
+ const [ai] = createAllergyIntoleranceBuilder().subject(patientRef).seed(seed).fhirVersion(fhirVersion).build();
4155
+ if (ai) resources.push(ai);
4156
+ } else {
4157
+ const [ms] = createMedicationStatementBuilder().subject(patientRef).seed(seed).fhirVersion(fhirVersion).build();
4158
+ if (ms) resources.push(ms);
4159
+ }
4160
+ }
4161
+ return resources;
4162
+ }
4163
+ const numObs = randomInt(1, 2, rng);
4164
+ for (let i = 0; i < numObs; i++) {
4165
+ const cat = CATEGORIES[i % CATEGORIES.length] ?? "vital-signs";
4166
+ const [obs] = createObservationBuilder().subject(patientRef).category(cat).seed(nextSeed(rng)).fhirVersion(fhirVersion).build();
4167
+ if (obs) {
4168
+ resources.push({ ...obs, performer: [{ reference: practRef }] });
4169
+ }
4170
+ }
4171
+ if (rng() < 0.7) {
4172
+ const [cond] = createConditionBuilder().subject(patientRef).seed(nextSeed(rng)).fhirVersion(fhirVersion).build();
4173
+ if (cond) resources.push(cond);
4174
+ }
4175
+ if (rng() < 0.5) {
4176
+ const [ai] = createAllergyIntoleranceBuilder().subject(patientRef).seed(nextSeed(rng)).fhirVersion(fhirVersion).build();
4177
+ if (ai) resources.push(ai);
4178
+ }
4179
+ if (rng() < 0.6) {
4180
+ const [ms] = createMedicationStatementBuilder().subject(patientRef).seed(nextSeed(rng)).fhirVersion(fhirVersion).build();
4181
+ if (ms) resources.push(ms);
4182
+ }
4183
+ return resources;
4184
+ }
4185
+ function buildSingleBundle(locale, bundleType, clinicalCount, fhirVersion, overrideMap, rng) {
4186
+ const bundleIdSeed = nextSeed(rng);
4187
+ const patientSeed = nextSeed(rng);
4188
+ const orgSeed = nextSeed(rng);
4189
+ const practSeed = nextSeed(rng);
4190
+ const practRoleSeed = nextSeed(rng);
4191
+ const clinicalRng = createRng(nextSeed(rng));
4192
+ const [patient] = createPatientBuilder().locale(locale).seed(patientSeed).fhirVersion(fhirVersion).build();
4193
+ const [org] = createOrganizationBuilder().locale(locale).seed(orgSeed).fhirVersion(fhirVersion).build();
4194
+ const [pract] = createPractitionerBuilder().locale(locale).seed(practSeed).fhirVersion(fhirVersion).build();
4195
+ if (!patient || !org || !pract) {
4196
+ throw new Error("Bundle: failed to generate component resources");
4197
+ }
4198
+ const patientId = patient["id"];
4199
+ const orgId = org["id"];
4200
+ const practId = pract["id"];
4201
+ const patientRef = `urn:uuid:${patientId}`;
4202
+ const orgRef = `urn:uuid:${orgId}`;
4203
+ const practRef = `urn:uuid:${practId}`;
4204
+ const [practRole] = createPractitionerRoleBuilder().locale(locale).seed(practRoleSeed).fhirVersion(fhirVersion).practitionerId(practId).organizationId(orgId).build();
4205
+ const wiredPatient = {
4206
+ ...patient,
4207
+ managingOrganization: { reference: orgRef }
4208
+ };
4209
+ const clinicalResources = buildClinicalResources(clinicalCount, patientRef, practRef, fhirVersion, clinicalRng);
4210
+ const coreResources = practRole ? [wiredPatient, org, pract, practRole] : [wiredPatient, org, pract];
4211
+ const allResources = [...coreResources, ...clinicalResources];
4212
+ const entries = allResources.map((r) => makeEntry(r, bundleType));
4213
+ const bundleIdRng = createRng(bundleIdSeed);
4214
+ const bundle = {
4215
+ resourceType: "Bundle",
4216
+ id: generateUuidV4(bundleIdRng),
4217
+ type: bundleType,
4218
+ entry: entries
4219
+ };
4220
+ if (Object.keys(overrideMap).length > 0) {
4221
+ return { ...bundle, ...overrideMap };
4222
+ }
4223
+ return bundle;
4224
+ }
4225
+ function makeBuilder9(state) {
4226
+ return {
4227
+ locale(loc) {
4228
+ return makeBuilder9({ ...state, locale: loc });
4229
+ },
4230
+ count(n) {
4231
+ return makeBuilder9({ ...state, count: n });
4232
+ },
4233
+ seed(s) {
4234
+ return makeBuilder9({ ...state, seed: s });
4235
+ },
4236
+ type(t) {
4237
+ return makeBuilder9({ ...state, bundleType: t });
4238
+ },
4239
+ fhirVersion(v) {
4240
+ return makeBuilder9({ ...state, fhirVersion: v });
4241
+ },
4242
+ clinicalResourcesPerPatient(n) {
4243
+ return makeBuilder9({ ...state, clinicalCount: n });
4244
+ },
4245
+ overrides(o) {
4246
+ return makeBuilder9({ ...state, overrideMap: o });
4247
+ },
4248
+ build() {
4249
+ const masterRng = createRng(state.seed);
4250
+ const results = [];
4251
+ for (let i = 0; i < state.count; i++) {
4252
+ const bundleSeedRng = createRng(nextSeed(masterRng));
4253
+ results.push(
4254
+ buildSingleBundle(
4255
+ state.locale,
4256
+ state.bundleType,
4257
+ state.clinicalCount,
4258
+ state.fhirVersion,
4259
+ state.overrideMap,
4260
+ bundleSeedRng
4261
+ )
4262
+ );
4263
+ }
4264
+ return results;
4265
+ }
4266
+ };
4267
+ }
4268
+ function createBundleBuilder() {
4269
+ return makeBuilder9({
4270
+ locale: "us",
4271
+ count: 1,
4272
+ seed: 0,
4273
+ bundleType: "transaction",
4274
+ fhirVersion: "R4",
4275
+ clinicalCount: void 0,
4276
+ overrideMap: {}
4277
+ });
4278
+ }
4279
+
4280
+ export {
4281
+ SUPPORTED_RESOURCE_TYPES,
4282
+ SUPPORTED_FHIR_VERSIONS,
4283
+ SUPPORTED_LOCALES,
4284
+ deepMerge,
4285
+ getLocale,
4286
+ getAllLocales,
4287
+ createPatientBuilder,
4288
+ createPractitionerBuilder,
4289
+ createPractitionerRoleBuilder,
4290
+ createOrganizationBuilder,
4291
+ COMMON_LOINC_CODES,
4292
+ createObservationBuilder,
4293
+ COMMON_SNOMED_CONDITIONS,
4294
+ createConditionBuilder,
4295
+ COMMON_ALLERGY_CODES,
4296
+ createAllergyIntoleranceBuilder,
4297
+ COMMON_MEDICATION_CODES,
4298
+ US_RXNORM_MEDICATION_CODES,
4299
+ createMedicationStatementBuilder,
4300
+ createBundleBuilder
4301
+ };
4302
+ //# sourceMappingURL=chunk-T46LJ67Q.js.map