@cosyte/synth 0.0.1

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +414 -0
  2. package/LICENSE +21 -0
  3. package/README.md +325 -0
  4. package/dist/astm/index.cjs +847 -0
  5. package/dist/astm/index.cjs.map +1 -0
  6. package/dist/astm/index.d.cts +418 -0
  7. package/dist/astm/index.d.ts +418 -0
  8. package/dist/astm/index.mjs +828 -0
  9. package/dist/astm/index.mjs.map +1 -0
  10. package/dist/ccda/index.cjs +1103 -0
  11. package/dist/ccda/index.cjs.map +1 -0
  12. package/dist/ccda/index.d.cts +380 -0
  13. package/dist/ccda/index.d.ts +380 -0
  14. package/dist/ccda/index.mjs +1077 -0
  15. package/dist/ccda/index.mjs.map +1 -0
  16. package/dist/deid/index.cjs +2809 -0
  17. package/dist/deid/index.cjs.map +1 -0
  18. package/dist/deid/index.d.cts +464 -0
  19. package/dist/deid/index.d.ts +464 -0
  20. package/dist/deid/index.mjs +2793 -0
  21. package/dist/deid/index.mjs.map +1 -0
  22. package/dist/example-codes-DeXcnCSK.d.cts +105 -0
  23. package/dist/example-codes-DeXcnCSK.d.ts +105 -0
  24. package/dist/fhir/index.cjs +1429 -0
  25. package/dist/fhir/index.cjs.map +1 -0
  26. package/dist/fhir/index.d.cts +772 -0
  27. package/dist/fhir/index.d.ts +772 -0
  28. package/dist/fhir/index.mjs +1384 -0
  29. package/dist/fhir/index.mjs.map +1 -0
  30. package/dist/hl7/index.cjs +1012 -0
  31. package/dist/hl7/index.cjs.map +1 -0
  32. package/dist/hl7/index.d.cts +548 -0
  33. package/dist/hl7/index.d.ts +548 -0
  34. package/dist/hl7/index.mjs +990 -0
  35. package/dist/hl7/index.mjs.map +1 -0
  36. package/dist/index.cjs +535 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +407 -0
  39. package/dist/index.d.ts +407 -0
  40. package/dist/index.mjs +488 -0
  41. package/dist/index.mjs.map +1 -0
  42. package/dist/ncpdp/index.cjs +714 -0
  43. package/dist/ncpdp/index.cjs.map +1 -0
  44. package/dist/ncpdp/index.d.cts +432 -0
  45. package/dist/ncpdp/index.d.ts +432 -0
  46. package/dist/ncpdp/index.mjs +695 -0
  47. package/dist/ncpdp/index.mjs.map +1 -0
  48. package/dist/providers-OLz3zAc-.d.cts +343 -0
  49. package/dist/providers-OLz3zAc-.d.ts +343 -0
  50. package/dist/quirk-DmkgoZdh.d.cts +239 -0
  51. package/dist/quirk-JLyO1Ncj.d.ts +239 -0
  52. package/dist/x12/index.cjs +920 -0
  53. package/dist/x12/index.cjs.map +1 -0
  54. package/dist/x12/index.d.cts +484 -0
  55. package/dist/x12/index.d.ts +484 -0
  56. package/dist/x12/index.mjs +892 -0
  57. package/dist/x12/index.mjs.map +1 -0
  58. package/package.json +210 -0
@@ -0,0 +1,1103 @@
1
+ 'use strict';
2
+
3
+ var ccda = require('@cosyte/ccda');
4
+
5
+ // src/rng/splitmix32.ts
6
+ function splitmix32(seed) {
7
+ let a = seed | 0;
8
+ return function next() {
9
+ a = a + 2654435769 | 0;
10
+ let t = a ^ a >>> 16;
11
+ t = Math.imul(t, 569420461);
12
+ t = t ^ t >>> 15;
13
+ t = Math.imul(t, 1935289751);
14
+ t = t ^ t >>> 15;
15
+ return t >>> 0;
16
+ };
17
+ }
18
+
19
+ // src/rng/sfc32.ts
20
+ function sfc32Next(s) {
21
+ s.a |= 0;
22
+ s.b |= 0;
23
+ s.c |= 0;
24
+ s.d |= 0;
25
+ const t = (s.a + s.b | 0) + s.d | 0;
26
+ s.d = s.d + 1 | 0;
27
+ s.a = s.b ^ s.b >>> 9;
28
+ s.b = s.c + (s.c << 3) | 0;
29
+ s.c = s.c << 21 | s.c >>> 11;
30
+ s.c = s.c + t | 0;
31
+ return t >>> 0;
32
+ }
33
+
34
+ // src/rng/rng.ts
35
+ var Sfc32Rng = class {
36
+ seed;
37
+ #state;
38
+ constructor(seed) {
39
+ this.seed = seed | 0;
40
+ const mix = splitmix32(this.seed);
41
+ this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };
42
+ for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);
43
+ }
44
+ nextUint32() {
45
+ return sfc32Next(this.#state);
46
+ }
47
+ float() {
48
+ return this.nextUint32() / 4294967296;
49
+ }
50
+ int(min, max) {
51
+ if (max < min) throw new RangeError(`Rng.int: max (${String(max)}) < min (${String(min)})`);
52
+ const span = max - min + 1;
53
+ return min + Math.floor(this.float() * span);
54
+ }
55
+ bool(p = 0.5) {
56
+ return this.float() < p;
57
+ }
58
+ pick(items) {
59
+ if (items.length === 0) throw new RangeError("Rng.pick: empty array");
60
+ return items[this.int(0, items.length - 1)];
61
+ }
62
+ digits(n) {
63
+ let out = "";
64
+ for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));
65
+ return out;
66
+ }
67
+ };
68
+ function createRng(seed) {
69
+ return new Sfc32Rng(seed);
70
+ }
71
+
72
+ // src/corpus.ts
73
+ function makeCorpus(seed, artifacts, quirks = []) {
74
+ const counts = {};
75
+ const formats = /* @__PURE__ */ new Set();
76
+ const frozenArtifacts = artifacts.map((a) => {
77
+ counts[a.kind] = (counts[a.kind] ?? 0) + 1;
78
+ formats.add(a.format);
79
+ return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });
80
+ });
81
+ const manifest = Object.freeze({
82
+ formats: Object.freeze([...formats]),
83
+ counts: Object.freeze(counts),
84
+ quirks: Object.freeze([...quirks])
85
+ });
86
+ return Object.freeze({
87
+ seed,
88
+ manifest,
89
+ artifacts: Object.freeze(frozenArtifacts)
90
+ });
91
+ }
92
+
93
+ // src/safe/reserved.ts
94
+ var SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({
95
+ /** The human-readable assigning-authority namespace id (HL7 HD.1). */
96
+ namespaceId: "COSYTE-SYNTH",
97
+ /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */
98
+ universalId: "2.16.840.1.113883.19.999",
99
+ /** The universal id type (HD.3). */
100
+ universalIdType: "ISO"
101
+ });
102
+ var RESERVED_EMAIL_DOMAINS = Object.freeze([
103
+ "example.com",
104
+ "example.org",
105
+ "example.net"
106
+ ]);
107
+ var TEST_NET_V4_PREFIXES = Object.freeze([
108
+ "192.0.2",
109
+ // TEST-NET-1
110
+ "198.51.100",
111
+ // TEST-NET-2
112
+ "203.0.113"
113
+ // TEST-NET-3
114
+ ]);
115
+ var DOC_V6_PREFIX = "2001:db8";
116
+ var NPI_LUHN_PREFIX = "80840";
117
+ function luhnMod10(digits) {
118
+ let sum = 0;
119
+ let double = false;
120
+ for (let i = digits.length - 1; i >= 0; i -= 1) {
121
+ let d = digits.charCodeAt(i) - 48;
122
+ if (d < 0 || d > 9) continue;
123
+ if (double) {
124
+ d *= 2;
125
+ if (d > 9) d -= 9;
126
+ }
127
+ sum += d;
128
+ double = !double;
129
+ }
130
+ return sum % 10;
131
+ }
132
+ function npiCheckDigit(base9) {
133
+ const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);
134
+ return (10 - partial) % 10;
135
+ }
136
+ var DEA_REGISTRANT_TYPES = Object.freeze([
137
+ "A",
138
+ "B",
139
+ "F",
140
+ "G",
141
+ "M",
142
+ "P",
143
+ "R",
144
+ "X"
145
+ ]);
146
+ function deaCheckDigit(base6) {
147
+ let odd = 0;
148
+ let even = 0;
149
+ for (let i = 0; i < 6; i += 1) {
150
+ const digit = base6.charCodeAt(i) - 48;
151
+ if (i % 2 === 0) odd += digit;
152
+ else even += digit;
153
+ }
154
+ return (odd + 2 * even) % 10;
155
+ }
156
+
157
+ // src/safe/names-pool.ts
158
+ var SYNTHETIC_GIVEN_NAMES = Object.freeze([
159
+ "Testina",
160
+ "Fixtura",
161
+ "Synthos",
162
+ "Placeholda",
163
+ "Sampleton",
164
+ "Prototius",
165
+ "Stubbina",
166
+ "Exampla",
167
+ "Quilliam",
168
+ "Fabrica",
169
+ "Simula",
170
+ "Testry",
171
+ "Seedwin",
172
+ "Corpora",
173
+ "Reprodo",
174
+ "Mocktavia",
175
+ "Dummett",
176
+ "Voidwin",
177
+ "Deteria",
178
+ "Randomir"
179
+ ]);
180
+ var SYNTHETIC_FAMILY_NAMES = Object.freeze([
181
+ "Testerson",
182
+ "Fauxman",
183
+ "Placeholt",
184
+ "Mockridge",
185
+ "Fixtingham",
186
+ "Synthwell",
187
+ "Dummerton",
188
+ "Examplewood",
189
+ "Fabricant",
190
+ "Simulacre",
191
+ "Nonesuch",
192
+ "Seedman",
193
+ "Corpusworth",
194
+ "Reprodus",
195
+ "Voidmark",
196
+ "Deterwood",
197
+ "Randomson",
198
+ "Quillfeather",
199
+ "Notreal",
200
+ "Genfield"
201
+ ]);
202
+ var SYNTHETIC_STREET_NAMES = Object.freeze([
203
+ "Fixture Lane",
204
+ "Sample Street",
205
+ "Placeholder Avenue",
206
+ "Synthetic Way",
207
+ "Example Boulevard",
208
+ "Testing Terrace",
209
+ "Mock Road",
210
+ "Prototype Court"
211
+ ]);
212
+ var SYNTHETIC_CITY_NAMES = Object.freeze([
213
+ "Faketon",
214
+ "Synthville",
215
+ "Exampleburg",
216
+ "Testford",
217
+ "Mockhaven",
218
+ "Fixtureton"
219
+ ]);
220
+
221
+ // src/safe/providers.ts
222
+ function ssn(rng, block = "never-issued") {
223
+ if (block === "advertising") {
224
+ return `987-65-432${String(rng.int(0, 9))}`;
225
+ }
226
+ const area = rng.int(900, 999);
227
+ const group = rng.digits(2);
228
+ const serial = rng.digits(4);
229
+ return `${String(area)}-${group}-${serial}`;
230
+ }
231
+ function phone(rng) {
232
+ const area = `${String(rng.int(2, 9))}${rng.digits(2)}`;
233
+ const line = `01${rng.digits(2)}`;
234
+ return `(${area}) 555-${line}`;
235
+ }
236
+ function name(rng) {
237
+ return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };
238
+ }
239
+ function email(rng, person) {
240
+ const domain = rng.pick(RESERVED_EMAIL_DOMAINS);
241
+ const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;
242
+ return `${slug}@${domain}`;
243
+ }
244
+ function ipv4(rng) {
245
+ return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;
246
+ }
247
+ function ipv6(rng) {
248
+ const tail = rng.nextUint32().toString(16).padStart(4, "0").slice(-4);
249
+ return `${DOC_V6_PREFIX}::${tail}`;
250
+ }
251
+ function uuid(rng) {
252
+ const bytes = new Uint8Array(16);
253
+ for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);
254
+ bytes[6] = (bytes[6] ?? 0) & 15 | 64;
255
+ bytes[8] = (bytes[8] ?? 0) & 63 | 128;
256
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0"));
257
+ return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10, 16).join("")}`;
258
+ }
259
+ function npi(rng) {
260
+ const base9 = rng.digits(9);
261
+ const wrongCheck = (npiCheckDigit(base9) + 1) % 10;
262
+ return `${base9}${String(wrongCheck)}`;
263
+ }
264
+ function dea(rng, person) {
265
+ const type = rng.pick(DEA_REGISTRANT_TYPES);
266
+ const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);
267
+ const initial = initialSource.slice(0, 1).toUpperCase();
268
+ const base6 = rng.digits(6);
269
+ const wrongCheck = (deaCheckDigit(base6) + 1) % 10;
270
+ return `${type}${initial}${base6}${String(wrongCheck)}`;
271
+ }
272
+ function identifier(rng, typeCode = "MR") {
273
+ return {
274
+ value: rng.digits(8),
275
+ typeCode,
276
+ assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,
277
+ assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId
278
+ };
279
+ }
280
+ function address(rng) {
281
+ const number = rng.int(1, 9999);
282
+ return {
283
+ street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,
284
+ city: rng.pick(SYNTHETIC_CITY_NAMES),
285
+ state: rng.pick(US_STATES),
286
+ zip: "00000"
287
+ };
288
+ }
289
+ function dateYmd(rng, minYear = 1930, maxYear = 2010) {
290
+ const year = rng.int(minYear, maxYear);
291
+ const month = rng.int(1, 12);
292
+ const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();
293
+ const day = rng.int(1, daysInMonth);
294
+ return `${String(year).padStart(4, "0")}${String(month).padStart(2, "0")}${String(day).padStart(2, "0")}`;
295
+ }
296
+ var US_STATES = Object.freeze([
297
+ "AL",
298
+ "AK",
299
+ "AZ",
300
+ "AR",
301
+ "CA",
302
+ "CO",
303
+ "CT",
304
+ "DE",
305
+ "FL",
306
+ "GA",
307
+ "HI",
308
+ "ID",
309
+ "IL",
310
+ "IN",
311
+ "IA",
312
+ "KS",
313
+ "KY",
314
+ "LA",
315
+ "ME",
316
+ "MD",
317
+ "MA",
318
+ "MI",
319
+ "MN",
320
+ "MS",
321
+ "MO",
322
+ "MT",
323
+ "NE",
324
+ "NV",
325
+ "NH",
326
+ "NJ",
327
+ "NM",
328
+ "NY",
329
+ "NC",
330
+ "ND",
331
+ "OH",
332
+ "OK",
333
+ "OR",
334
+ "PA",
335
+ "RI",
336
+ "SC",
337
+ "SD",
338
+ "TN",
339
+ "TX",
340
+ "UT",
341
+ "VT",
342
+ "VA",
343
+ "WA",
344
+ "WV",
345
+ "WI",
346
+ "WY"
347
+ ]);
348
+
349
+ // src/safe/index.ts
350
+ var safe = Object.freeze({
351
+ ssn,
352
+ phone,
353
+ name,
354
+ email,
355
+ ipv4,
356
+ ipv6,
357
+ uuid,
358
+ identifier,
359
+ address,
360
+ dateYmd,
361
+ npi,
362
+ dea
363
+ });
364
+ var SYSTEM = Object.freeze({
365
+ /** FHIR `administrative-gender` (`Patient.gender`). */
366
+ ADMINISTRATIVE_GENDER: "http://hl7.org/fhir/administrative-gender",
367
+ /** HL7 Terminology `observation-category`. */
368
+ OBSERVATION_CATEGORY: "http://terminology.hl7.org/CodeSystem/observation-category",
369
+ /** HL7 Terminology `condition-category`. */
370
+ CONDITION_CATEGORY: "http://terminology.hl7.org/CodeSystem/condition-category",
371
+ /** HL7 Terminology `condition-clinical`. */
372
+ CONDITION_CLINICAL: "http://terminology.hl7.org/CodeSystem/condition-clinical",
373
+ /** HL7 Terminology `condition-ver-status`. */
374
+ CONDITION_VER_STATUS: "http://terminology.hl7.org/CodeSystem/condition-ver-status",
375
+ /** HL7 v2 `0203` identifier-type (`Identifier.type.coding.code` = `MR`). */
376
+ IDENTIFIER_TYPE: "http://terminology.hl7.org/CodeSystem/v2-0203",
377
+ /** OMB race & ethnicity category system (US Core race/ethnicity `ombCategory`). */
378
+ OMB_RACE_ETHNICITY: "urn:oid:2.16.840.1.113883.6.238",
379
+ /** LOINC — `Observation.code` (lab + vital-signs). */
380
+ LOINC: "http://loinc.org",
381
+ /** SNOMED CT — `Condition.code`. */
382
+ SNOMED: "http://snomed.info/sct",
383
+ /** RxNorm — `MedicationRequest.medicationCodeableConcept` + an allergen substance. */
384
+ RXNORM: "http://www.nlm.nih.gov/research/umls/rxnorm",
385
+ /** UCUM — `Quantity.system` for units of measure. */
386
+ UCUM: "http://unitsofmeasure.org",
387
+ /** CVX (CDC vaccine administered) — `Immunization.vaccineCode`. */
388
+ CVX: "http://hl7.org/fhir/sid/cvx",
389
+ /** HL7 v3 `ActCode` — `Encounter.class`. */
390
+ V3_ACT_CODE: "http://terminology.hl7.org/CodeSystem/v3-ActCode",
391
+ /** HL7 v2 `0074` diagnostic-service-section — `DiagnosticReport.category` (`LAB`). */
392
+ DIAGNOSTIC_SERVICE_SECTION: "http://terminology.hl7.org/CodeSystem/v2-0074",
393
+ /** HL7 Terminology `allergyintolerance-clinical` — `AllergyIntolerance.clinicalStatus`. */
394
+ ALLERGY_CLINICAL: "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical",
395
+ /** HL7 Terminology `allergyintolerance-verification` — `AllergyIntolerance.verificationStatus`. */
396
+ ALLERGY_VERIFICATION: "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
397
+ });
398
+
399
+ // src/fhir/example-codes.ts
400
+ var EXAMPLE_LAB_OBSERVATIONS = Object.freeze([
401
+ Object.freeze({
402
+ system: SYSTEM.LOINC,
403
+ code: "2345-7",
404
+ display: "Glucose [Mass/volume] in Serum or Plasma",
405
+ unit: "mg/dL",
406
+ low: 70,
407
+ high: 140,
408
+ decimals: 0
409
+ }),
410
+ Object.freeze({
411
+ system: SYSTEM.LOINC,
412
+ code: "718-7",
413
+ display: "Hemoglobin [Mass/volume] in Blood",
414
+ unit: "g/dL",
415
+ low: 12,
416
+ high: 17,
417
+ decimals: 1
418
+ }),
419
+ Object.freeze({
420
+ system: SYSTEM.LOINC,
421
+ code: "2951-2",
422
+ display: "Sodium [Moles/volume] in Serum or Plasma",
423
+ unit: "mmol/L",
424
+ low: 135,
425
+ high: 145,
426
+ decimals: 0
427
+ }),
428
+ Object.freeze({
429
+ system: SYSTEM.LOINC,
430
+ code: "2823-3",
431
+ display: "Potassium [Moles/volume] in Serum or Plasma",
432
+ unit: "mmol/L",
433
+ low: 4,
434
+ high: 5,
435
+ decimals: 1
436
+ }),
437
+ Object.freeze({
438
+ system: SYSTEM.LOINC,
439
+ code: "4548-4",
440
+ display: "Hemoglobin A1c/Hemoglobin.total in Blood",
441
+ unit: "%",
442
+ low: 4,
443
+ high: 9,
444
+ decimals: 1
445
+ })
446
+ ]);
447
+ var EXAMPLE_VITAL_SIGNS = Object.freeze([
448
+ Object.freeze({
449
+ system: SYSTEM.LOINC,
450
+ code: "8867-4",
451
+ display: "Heart rate",
452
+ unit: "/min",
453
+ low: 55,
454
+ high: 100,
455
+ decimals: 0
456
+ }),
457
+ Object.freeze({
458
+ system: SYSTEM.LOINC,
459
+ code: "9279-1",
460
+ display: "Respiratory rate",
461
+ unit: "/min",
462
+ low: 12,
463
+ high: 20,
464
+ decimals: 0
465
+ }),
466
+ Object.freeze({
467
+ system: SYSTEM.LOINC,
468
+ code: "8310-5",
469
+ display: "Body temperature",
470
+ unit: "Cel",
471
+ low: 36,
472
+ high: 38,
473
+ decimals: 1
474
+ }),
475
+ Object.freeze({
476
+ system: SYSTEM.LOINC,
477
+ code: "29463-7",
478
+ display: "Body weight",
479
+ unit: "kg",
480
+ low: 50,
481
+ high: 100,
482
+ decimals: 1
483
+ }),
484
+ Object.freeze({
485
+ system: SYSTEM.LOINC,
486
+ code: "8302-2",
487
+ display: "Body height",
488
+ unit: "cm",
489
+ low: 150,
490
+ high: 190,
491
+ decimals: 0
492
+ })
493
+ ]);
494
+ var EXAMPLE_CONDITIONS = Object.freeze([
495
+ Object.freeze({ system: SYSTEM.SNOMED, code: "59621000", display: "Essential hypertension" }),
496
+ Object.freeze({ system: SYSTEM.SNOMED, code: "44054006", display: "Type 2 diabetes mellitus" }),
497
+ Object.freeze({ system: SYSTEM.SNOMED, code: "195967001", display: "Asthma" }),
498
+ Object.freeze({
499
+ system: SYSTEM.SNOMED,
500
+ code: "13645005",
501
+ display: "Chronic obstructive lung disease"
502
+ }),
503
+ Object.freeze({ system: SYSTEM.SNOMED, code: "38341003", display: "Hypertensive disorder" })
504
+ ]);
505
+ var EXAMPLE_MEDICATIONS = Object.freeze([
506
+ Object.freeze({
507
+ system: SYSTEM.RXNORM,
508
+ code: "1049221",
509
+ display: "Acetaminophen 325 MG Oral Tablet"
510
+ }),
511
+ Object.freeze({ system: SYSTEM.RXNORM, code: "197361", display: "Amlodipine 5 MG Oral Tablet" }),
512
+ Object.freeze({
513
+ system: SYSTEM.RXNORM,
514
+ code: "860975",
515
+ display: "24 HR Metformin hydrochloride 500 MG Extended Release Oral Tablet"
516
+ }),
517
+ Object.freeze({
518
+ system: SYSTEM.RXNORM,
519
+ code: "308136",
520
+ display: "Amoxicillin 250 MG Oral Capsule"
521
+ }),
522
+ Object.freeze({
523
+ system: SYSTEM.RXNORM,
524
+ code: "617314",
525
+ display: "Atorvastatin 40 MG Oral Tablet"
526
+ })
527
+ ]);
528
+ Object.freeze([
529
+ Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: "2106-3", display: "White" }),
530
+ Object.freeze({
531
+ system: SYSTEM.OMB_RACE_ETHNICITY,
532
+ code: "2054-5",
533
+ display: "Black or African American"
534
+ }),
535
+ Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: "2028-9", display: "Asian" }),
536
+ Object.freeze({
537
+ system: SYSTEM.OMB_RACE_ETHNICITY,
538
+ code: "1002-5",
539
+ display: "American Indian or Alaska Native"
540
+ }),
541
+ Object.freeze({
542
+ system: SYSTEM.OMB_RACE_ETHNICITY,
543
+ code: "2076-8",
544
+ display: "Native Hawaiian or Other Pacific Islander"
545
+ })
546
+ ]);
547
+ Object.freeze([
548
+ Object.freeze({
549
+ system: SYSTEM.OMB_RACE_ETHNICITY,
550
+ code: "2135-2",
551
+ display: "Hispanic or Latino"
552
+ }),
553
+ Object.freeze({
554
+ system: SYSTEM.OMB_RACE_ETHNICITY,
555
+ code: "2186-5",
556
+ display: "Not Hispanic or Latino"
557
+ })
558
+ ]);
559
+ var EXAMPLE_VACCINES = Object.freeze([
560
+ Object.freeze({
561
+ system: SYSTEM.CVX,
562
+ code: "140",
563
+ display: "Influenza, seasonal, injectable, preservative free"
564
+ }),
565
+ Object.freeze({ system: SYSTEM.CVX, code: "03", display: "MMR" }),
566
+ Object.freeze({ system: SYSTEM.CVX, code: "20", display: "DTaP" }),
567
+ Object.freeze({ system: SYSTEM.CVX, code: "133", display: "Pneumococcal conjugate PCV 13" }),
568
+ Object.freeze({
569
+ system: SYSTEM.CVX,
570
+ code: "208",
571
+ display: "COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose"
572
+ })
573
+ ]);
574
+ var EXAMPLE_ALLERGENS = Object.freeze([
575
+ Object.freeze({ system: SYSTEM.RXNORM, code: "7980", display: "Penicillin G" }),
576
+ Object.freeze({ system: SYSTEM.RXNORM, code: "2670", display: "Codeine" }),
577
+ Object.freeze({ system: SYSTEM.SNOMED, code: "762952008", display: "Peanut (substance)" }),
578
+ Object.freeze({ system: SYSTEM.SNOMED, code: "227493005", display: "Cashew nuts (substance)" }),
579
+ Object.freeze({ system: SYSTEM.SNOMED, code: "3718001", display: "Cow's milk (substance)" })
580
+ ]);
581
+ var EXAMPLE_ALLERGY_MANIFESTATIONS = Object.freeze([
582
+ Object.freeze({ system: SYSTEM.SNOMED, code: "247472004", display: "Wheal (finding)" }),
583
+ Object.freeze({ system: SYSTEM.SNOMED, code: "126485001", display: "Urticaria (disorder)" }),
584
+ Object.freeze({
585
+ system: SYSTEM.SNOMED,
586
+ code: "271807003",
587
+ display: "Eruption of skin (disorder)"
588
+ }),
589
+ Object.freeze({ system: SYSTEM.SNOMED, code: "267036007", display: "Dyspnea (finding)" }),
590
+ Object.freeze({ system: SYSTEM.SNOMED, code: "422587007", display: "Nausea (finding)" })
591
+ ]);
592
+ var EXAMPLE_PROCEDURES = Object.freeze([
593
+ Object.freeze({
594
+ system: SYSTEM.SNOMED,
595
+ code: "80146002",
596
+ display: "Excision of appendix (procedure)"
597
+ }),
598
+ Object.freeze({ system: SYSTEM.SNOMED, code: "73761001", display: "Colonoscopy (procedure)" }),
599
+ Object.freeze({
600
+ system: SYSTEM.SNOMED,
601
+ code: "5880005",
602
+ display: "Physical examination procedure (procedure)"
603
+ }),
604
+ Object.freeze({
605
+ system: SYSTEM.SNOMED,
606
+ code: "108252007",
607
+ display: "Laboratory procedure (procedure)"
608
+ }),
609
+ Object.freeze({ system: SYSTEM.SNOMED, code: "71651007", display: "Mammography (procedure)" })
610
+ ]);
611
+ var EXAMPLE_DIAGNOSTIC_REPORTS = Object.freeze([
612
+ Object.freeze({
613
+ system: SYSTEM.LOINC,
614
+ code: "24323-8",
615
+ display: "Comprehensive metabolic 2000 panel - Serum or Plasma"
616
+ }),
617
+ Object.freeze({
618
+ system: SYSTEM.LOINC,
619
+ code: "58410-2",
620
+ display: "CBC panel - Blood by Automated count"
621
+ }),
622
+ Object.freeze({
623
+ system: SYSTEM.LOINC,
624
+ code: "24357-6",
625
+ display: "Urinalysis complete panel - Urine"
626
+ }),
627
+ Object.freeze({
628
+ system: SYSTEM.LOINC,
629
+ code: "24331-1",
630
+ display: "Lipid 1996 panel - Serum or Plasma"
631
+ }),
632
+ Object.freeze({
633
+ system: SYSTEM.LOINC,
634
+ code: "24321-2",
635
+ display: "Basic metabolic 1998 panel - Serum or Plasma"
636
+ })
637
+ ]);
638
+ Object.freeze([
639
+ Object.freeze({
640
+ system: SYSTEM.SNOMED,
641
+ code: "308335008",
642
+ display: "Patient encounter procedure (procedure)"
643
+ }),
644
+ Object.freeze({
645
+ system: SYSTEM.SNOMED,
646
+ code: "185349003",
647
+ display: "Encounter for check up (procedure)"
648
+ }),
649
+ Object.freeze({
650
+ system: SYSTEM.SNOMED,
651
+ code: "185347001",
652
+ display: "Encounter for problem (procedure)"
653
+ }),
654
+ Object.freeze({
655
+ system: SYSTEM.SNOMED,
656
+ code: "390906007",
657
+ display: "Follow-up encounter (procedure)"
658
+ })
659
+ ]);
660
+ Object.freeze([
661
+ Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: "AMB", display: "ambulatory" }),
662
+ Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: "EMER", display: "emergency" }),
663
+ Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: "IMP", display: "inpatient encounter" })
664
+ ]);
665
+
666
+ // src/ccda/example-codes.ts
667
+ var URI_TO_OID = Object.freeze({
668
+ "http://loinc.org": ccda.LOINC,
669
+ "http://snomed.info/sct": ccda.SNOMED_CT,
670
+ "http://www.nlm.nih.gov/research/umls/rxnorm": ccda.RXNORM,
671
+ "http://hl7.org/fhir/sid/cvx": ccda.CVX
672
+ });
673
+ function toBuildCode(concept) {
674
+ const codeSystem = URI_TO_OID[concept.system];
675
+ if (codeSystem === void 0) {
676
+ throw new Error(`ccda example-codes: no OID mapping for code system "${concept.system}"`);
677
+ }
678
+ return { code: concept.code, codeSystem, displayName: concept.display };
679
+ }
680
+ function quantityFor(rng, concept) {
681
+ const scale = 10 ** concept.decimals;
682
+ const value = rng.int(concept.low * scale, concept.high * scale) / scale;
683
+ return { value, unit: concept.unit };
684
+ }
685
+ var PROBLEMS = EXAMPLE_CONDITIONS;
686
+ var ALLERGENS = EXAMPLE_ALLERGENS;
687
+ var ALLERGY_REACTIONS = EXAMPLE_ALLERGY_MANIFESTATIONS;
688
+ var MEDICATIONS = EXAMPLE_MEDICATIONS;
689
+ var LAB_RESULTS = EXAMPLE_LAB_OBSERVATIONS;
690
+ var RESULT_PANELS = EXAMPLE_DIAGNOSTIC_REPORTS;
691
+ var VITAL_SIGNS = EXAMPLE_VITAL_SIGNS;
692
+ var VACCINES = EXAMPLE_VACCINES;
693
+ var PROCEDURES = EXAMPLE_PROCEDURES;
694
+ var SMOKING_STATUSES = Object.freeze([
695
+ Object.freeze({ code: "266919005", codeSystem: ccda.SNOMED_CT, displayName: "Never smoker" }),
696
+ Object.freeze({ code: "8517006", codeSystem: ccda.SNOMED_CT, displayName: "Former smoker" }),
697
+ Object.freeze({
698
+ code: "449868002",
699
+ codeSystem: ccda.SNOMED_CT,
700
+ displayName: "Current every day smoker"
701
+ }),
702
+ Object.freeze({
703
+ code: "428041000124106",
704
+ codeSystem: ccda.SNOMED_CT,
705
+ displayName: "Current some day smoker"
706
+ })
707
+ ]);
708
+ var ROUTES = Object.freeze([
709
+ Object.freeze({ code: "C38288", codeSystem: ccda.NCI_ROUTE, displayName: "Oral" }),
710
+ Object.freeze({ code: "C28161", codeSystem: ccda.NCI_ROUTE, displayName: "Intramuscular" }),
711
+ Object.freeze({ code: "C38276", codeSystem: ccda.NCI_ROUTE, displayName: "Intravenous" }),
712
+ Object.freeze({ code: "C38299", codeSystem: ccda.NCI_ROUTE, displayName: "Subcutaneous" })
713
+ ]);
714
+
715
+ // src/ccda/identity.ts
716
+ function ccdaPatientIdentity(rng) {
717
+ const person = safe.name(rng);
718
+ const mrn = safe.identifier(rng, "MR");
719
+ const birthTime = safe.dateYmd(rng, 1930, 2010);
720
+ const gender = rng.pick(["M", "F"]);
721
+ const patient = {
722
+ mrn: mrn.value,
723
+ mrnRoot: mrn.assigningAuthorityOid,
724
+ mrnAssigningAuthority: mrn.assigningAuthority,
725
+ given: [person.given],
726
+ family: person.family,
727
+ gender,
728
+ birthTime
729
+ };
730
+ return { patient, person, mrn };
731
+ }
732
+
733
+ // src/ccda/ccd.ts
734
+ function pickN(rng, pool, n) {
735
+ const take = Math.min(n, pool.length);
736
+ const indices = pool.map((_v, i) => i);
737
+ const out = [];
738
+ for (let i = 0; i < take; i += 1) {
739
+ const j = rng.int(0, indices.length - 1);
740
+ const idx = indices[j];
741
+ indices.splice(j, 1);
742
+ out.push(pool[idx]);
743
+ }
744
+ return out;
745
+ }
746
+ function buildInit(rng, documentType) {
747
+ const effectiveTime = safe.dateYmd(rng, 2020, 2025);
748
+ const { patient, person } = ccdaPatientIdentity(rng);
749
+ const problems = pickN(rng, PROBLEMS, rng.int(1, 3)).map((c) => ({
750
+ problem: toBuildCode(c),
751
+ status: "active",
752
+ onset: safe.dateYmd(rng, 2010, 2019)
753
+ }));
754
+ const allergen = rng.pick(ALLERGENS);
755
+ const reaction = rng.pick(ALLERGY_REACTIONS);
756
+ const allergies = [{ allergen: toBuildCode(allergen), reaction: toBuildCode(reaction) }];
757
+ const medications = pickN(rng, MEDICATIONS, rng.int(1, 2)).map((c) => ({
758
+ drug: toBuildCode(c),
759
+ dose: { value: 1, unit: "{tablet}" },
760
+ route: rng.pick(ROUTES),
761
+ frequency: { value: rng.pick([8, 12, 24]), unit: "h" }
762
+ }));
763
+ const panel = rng.pick(RESULT_PANELS);
764
+ const resultMembers = pickN(rng, LAB_RESULTS, 2).map((q) => ({
765
+ test: toBuildCode(q),
766
+ quantity: quantityFor(rng, q),
767
+ effectiveTime
768
+ }));
769
+ const results = [{ code: toBuildCode(panel), effectiveTime, results: resultMembers }];
770
+ const vitalMembers = pickN(rng, VITAL_SIGNS, 2).map((q) => ({
771
+ code: toBuildCode(q),
772
+ quantity: quantityFor(rng, q)
773
+ }));
774
+ const vitalSigns = [{ effectiveTime, vitals: vitalMembers }];
775
+ const vaccine = rng.pick(VACCINES);
776
+ const immunizations = [
777
+ {
778
+ vaccine: toBuildCode(vaccine),
779
+ dose: { value: 0.5, unit: "mL" },
780
+ route: rng.pick(ROUTES),
781
+ effectiveTime: safe.dateYmd(rng, 2018, 2024)
782
+ }
783
+ ];
784
+ const procedure = rng.pick(PROCEDURES);
785
+ const procedures = [
786
+ {
787
+ code: toBuildCode(procedure),
788
+ disposition: "performed",
789
+ effectiveTime: safe.dateYmd(rng, 2015, 2023)
790
+ }
791
+ ];
792
+ const smokingStatus = [{ value: rng.pick(SMOKING_STATUSES), effectiveTime }];
793
+ const base = {
794
+ documentType,
795
+ effectiveTime,
796
+ patient,
797
+ problems,
798
+ allergies,
799
+ medications,
800
+ results,
801
+ vitalSigns,
802
+ immunizations,
803
+ procedures,
804
+ smokingStatus
805
+ };
806
+ if (documentType === "referralNote") {
807
+ return {
808
+ ...base,
809
+ reasonForReferral: `Synthetic referral for evaluation of ${person.given} ${person.family}.`,
810
+ assessment: "Synthetic assessment narrative. Not a real clinical assessment."
811
+ };
812
+ }
813
+ return base;
814
+ }
815
+ function generateCcda(options = {}) {
816
+ const { seed = 0, documentType = "ccd" } = options;
817
+ const rng = createRng(seed);
818
+ return ccda.buildCcda(buildInit(rng, documentType));
819
+ }
820
+ function generateCcd(options = {}) {
821
+ return generateCcda({ ...options, documentType: "ccd" });
822
+ }
823
+ function generateReferralNote(options = {}) {
824
+ return generateCcda({ ...options, documentType: "referralNote" });
825
+ }
826
+ function roundTrip(doc) {
827
+ const content = ccda.serializeCcda(doc);
828
+ const reparsed = ccda.parseCcda(content);
829
+ const warnings = reparsed.warnings.map((w) => String(w.code));
830
+ const byteStable = ccda.serializeCcda(reparsed) === content;
831
+ return {
832
+ content,
833
+ warnings,
834
+ byteStable,
835
+ specClean: warnings.length === 0 && byteStable
836
+ };
837
+ }
838
+
839
+ // src/profile.ts
840
+ function defineSynthProfile(spec) {
841
+ if (typeof spec.name !== "string" || spec.name.trim().length === 0) {
842
+ throw new TypeError("defineSynthProfile: `name` is required and must be a non-empty string.");
843
+ }
844
+ return Object.freeze({
845
+ name: spec.name,
846
+ ...spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {},
847
+ ...spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {},
848
+ quirks: Object.freeze([...spec.quirks ?? []])
849
+ });
850
+ }
851
+
852
+ // src/codes.ts
853
+ var SYNTH_FATAL_CODES = {
854
+ /**
855
+ * A vendor quirk was requested that the target format's profile system does not support. Fatal —
856
+ * never a silent no-op and never a fabricated quirk.
857
+ */
858
+ SYNTH_UNSUPPORTED_QUIRK: "SYNTH_UNSUPPORTED_QUIRK"
859
+ };
860
+ var SynthError = class extends Error {
861
+ /** The stable fatal code. */
862
+ code;
863
+ /**
864
+ * @param code - The stable {@link SynthFatalCode}.
865
+ * @param message - A human-readable detail (never contains PHI — there is none).
866
+ */
867
+ constructor(code, message) {
868
+ super(message);
869
+ this.name = "SynthError";
870
+ this.code = code;
871
+ }
872
+ };
873
+
874
+ // src/quirk.ts
875
+ var PROFILE_QUIRK_APPLIED = "PROFILE_QUIRK_APPLIED";
876
+ function sameCodeSet(a, b) {
877
+ if (a.length !== b.length) return false;
878
+ const counts = /* @__PURE__ */ new Map();
879
+ for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);
880
+ for (const c of b) {
881
+ const n = counts.get(c);
882
+ if (n === void 0) return false;
883
+ if (n === 1) counts.delete(c);
884
+ else counts.set(c, n - 1);
885
+ }
886
+ return counts.size === 0;
887
+ }
888
+ function resolveQuirk(registry, format, name2) {
889
+ const descriptor = registry[name2];
890
+ if (descriptor === void 0) {
891
+ const supported = Object.keys(registry).sort().join(", ");
892
+ throw new SynthError(
893
+ SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK,
894
+ `${format}: unsupported quirk "${name2}". The ${format} profile system supports: ${supported}.`
895
+ );
896
+ }
897
+ return descriptor;
898
+ }
899
+ function profileTolerated(disposition, intendedWarnings, warningsUnderProfile) {
900
+ const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));
901
+ switch (disposition) {
902
+ case "suppressed":
903
+ return !stillHasIntended;
904
+ case "rebadged":
905
+ return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);
906
+ case "bare":
907
+ return false;
908
+ }
909
+ }
910
+ function assertIntendedWarnings(quirk, intendedWarnings, bareWarnings) {
911
+ if (!sameCodeSet(bareWarnings, intendedWarnings)) {
912
+ throw new Error(
913
+ `quirk "${quirk}": the intended-warning contract does not hold \u2014 expected exactly [${intendedWarnings.join(", ")}] but a bare parse produced [${bareWarnings.join(", ")}]. Refusing to emit a mislabeled fixture.`
914
+ );
915
+ }
916
+ }
917
+ function validateProfileQuirks(profile, registry, format) {
918
+ for (const name2 of profile.quirks) resolveQuirk(registry, format, name2);
919
+ return profile.quirks;
920
+ }
921
+
922
+ // src/ccda/quirk.ts
923
+ var CCDA_QUIRKS = Object.freeze({
924
+ "template-extension-absent": Object.freeze({
925
+ name: "template-extension-absent",
926
+ format: "ccda",
927
+ intendedWarnings: Object.freeze(["TEMPLATE_EXTENSION_ABSENT"]),
928
+ grounding: "ONC 2015 Edition \xA7170.315(b)(1) + HL7/C-CDA-Examples (CC0): legacy R1.1-era documents omit the R2.1 @extension=2015-08-01 version stamp. Re-badged by @cosyte/ccda's public `legacyR11` profile.",
929
+ toleratingProfile: "legacyR11",
930
+ disposition: "rebadged"
931
+ }),
932
+ "deprecated-loinc": Object.freeze({
933
+ name: "deprecated-loinc",
934
+ format: "ccda",
935
+ intendedWarnings: Object.freeze(["DEPRECATED_LOINC"]),
936
+ grounding: "SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: real documents carry deprecated LOINC codes (e.g. 41909-3). Re-badged by @cosyte/ccda's public `smartScorecard` profile.",
937
+ toleratingProfile: "smartScorecard",
938
+ disposition: "rebadged"
939
+ }),
940
+ "deprecated-code-system": Object.freeze({
941
+ name: "deprecated-code-system",
942
+ format: "ccda",
943
+ intendedWarnings: Object.freeze(["DEPRECATED_CODE_SYSTEM"]),
944
+ grounding: "SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: legacy problem lists code diagnoses in ICD-9-CM (2.16.840.1.113883.6.103). Re-badged by @cosyte/ccda's public `smartScorecard` profile.",
945
+ toleratingProfile: "smartScorecard",
946
+ disposition: "rebadged"
947
+ })
948
+ });
949
+ function toleratingProfile(quirk) {
950
+ return quirk === "template-extension-absent" ? ccda.ccdaProfiles.legacyR11 : ccda.ccdaProfiles.smartScorecard;
951
+ }
952
+ var DOC_TEMPLATE_ROOTS = [
953
+ "2.16.840.1.113883.10.20.22.1.1",
954
+ "2.16.840.1.113883.10.20.22.1.2",
955
+ "2.16.840.1.113883.10.20.22.1.14"
956
+ ];
957
+ var RESULT_OR_VITAL_LOINC = /(<templateId root="2\.16\.840\.1\.113883\.10\.20\.22\.4\.(?:2|27)"[^>]*\/>(?:(?!<templateId)[\s\S])*?<code code=")[^"]+(" codeSystem="2\.16\.840\.1\.113883\.6\.1")/;
958
+ var PROBLEM_VALUE_SNOMED = /(<templateId root="2\.16\.840\.1\.113883\.10\.20\.22\.4\.4"[\s\S]*?<value code=")[^"]+(" codeSystem=")2\.16\.840\.1\.113883\.6\.96("[^>]*xsi:type="CD"\/>)/;
959
+ var DEPRECATED_LOINC_CODE = "41909-3";
960
+ function applyQuirk(quirk, xml) {
961
+ switch (quirk) {
962
+ case "template-extension-absent": {
963
+ let out = xml;
964
+ for (const root of DOC_TEMPLATE_ROOTS) {
965
+ out = out.replace(
966
+ `<templateId root="${root}" extension="2015-08-01"/>`,
967
+ `<templateId root="${root}"/>`
968
+ );
969
+ }
970
+ return out;
971
+ }
972
+ case "deprecated-loinc":
973
+ return xml.replace(RESULT_OR_VITAL_LOINC, `$1${DEPRECATED_LOINC_CODE}$2`);
974
+ case "deprecated-code-system":
975
+ return xml.replace(PROBLEM_VALUE_SNOMED, `$1401.9$22.16.840.1.113883.6.103$3`);
976
+ }
977
+ }
978
+ function injectCcdaQuirk(quirk, cleanXml) {
979
+ const content = applyQuirk(quirk, cleanXml);
980
+ if (content === cleanXml) {
981
+ throw new Error(
982
+ `injectCcdaQuirk: quirk "${quirk}" found no structural anchor to mutate \u2014 refusing to emit a fixture that does not carry the intended deviation.`
983
+ );
984
+ }
985
+ return content;
986
+ }
987
+ function generateCcdaQuirk(options) {
988
+ const seed = options.seed ?? 0;
989
+ const documentType = options.documentType ?? "ccd";
990
+ const descriptor = resolveQuirk(CCDA_QUIRKS, "ccda", options.quirk);
991
+ const clean = ccda.serializeCcda(generateCcda({ seed, documentType }));
992
+ const content = injectCcdaQuirk(options.quirk, clean);
993
+ assertIntendedWarnings(
994
+ descriptor.name,
995
+ descriptor.intendedWarnings,
996
+ ccda.parseCcda(content).warnings.map((w) => String(w.code))
997
+ );
998
+ return Object.freeze({
999
+ format: "ccda",
1000
+ quirk: descriptor.name,
1001
+ kind: documentType,
1002
+ content,
1003
+ intendedWarnings: descriptor.intendedWarnings
1004
+ });
1005
+ }
1006
+ function ccdaQuirkRoundTrip(artifact) {
1007
+ const quirk = artifact.quirk;
1008
+ const descriptor = resolveQuirk(CCDA_QUIRKS, "ccda", quirk);
1009
+ const bare = ccda.parseCcda(artifact.content).warnings.map((w) => String(w.code));
1010
+ const profile = toleratingProfile(quirk);
1011
+ const profiledWarnings = ccda.parseCcda(artifact.content, { profile }).warnings.map(
1012
+ (w) => String(w.code)
1013
+ );
1014
+ return {
1015
+ content: artifact.content,
1016
+ warnings: bare,
1017
+ intendedWarnings: artifact.intendedWarnings,
1018
+ intendedWarningHeld: sameCodeSet(bare, artifact.intendedWarnings),
1019
+ withProfile: {
1020
+ profileName: descriptor.toleratingProfile ?? profile.name,
1021
+ disposition: descriptor.disposition,
1022
+ warnings: profiledWarnings,
1023
+ tolerated: profileTolerated(
1024
+ descriptor.disposition,
1025
+ artifact.intendedWarnings,
1026
+ profiledWarnings
1027
+ )
1028
+ }
1029
+ };
1030
+ }
1031
+ var ALL_CCDA_QUIRKS = Object.freeze(
1032
+ Object.keys(CCDA_QUIRKS)
1033
+ );
1034
+ function ccdaQuirkCorpus(options) {
1035
+ const quirks = options.profile ? validateProfileQuirks(options.profile, CCDA_QUIRKS, "ccda") : options.quirks ?? ALL_CCDA_QUIRKS;
1036
+ const names = quirks.length > 0 ? quirks : ALL_CCDA_QUIRKS;
1037
+ const documentType = options.documentType ?? "ccd";
1038
+ const count = options.count ?? names.length;
1039
+ const seedStream = createRng(options.seed);
1040
+ const artifacts = Array.from({ length: count }, (_unused, i) => {
1041
+ const quirk = names[i % names.length];
1042
+ const artifactSeed = seedStream.nextUint32();
1043
+ const artifact = generateCcdaQuirk({ seed: artifactSeed, quirk, documentType });
1044
+ return {
1045
+ format: "ccda",
1046
+ kind: `${documentType}~${quirk}`,
1047
+ content: artifact.content,
1048
+ warnings: artifact.intendedWarnings
1049
+ };
1050
+ });
1051
+ return makeCorpus(options.seed, artifacts, [...new Set(names)]);
1052
+ }
1053
+ var ccdaQuirkProfile = defineSynthProfile({
1054
+ name: "cosyte-ccda-quirks",
1055
+ quirks: [...ALL_CCDA_QUIRKS]
1056
+ });
1057
+
1058
+ // src/ccda/index.ts
1059
+ var DEFAULT_MIX = Object.freeze(["ccd", "referralNote"]);
1060
+ function ccdaCorpus(options) {
1061
+ const { seed, count = 1, mix = DEFAULT_MIX } = options;
1062
+ const seedStream = createRng(seed);
1063
+ const artifacts = Array.from({ length: count }, (_unused, i) => {
1064
+ const documentType = mix[i % mix.length] ?? "ccd";
1065
+ const docSeed = seedStream.nextUint32();
1066
+ const rt = roundTrip(generateCcda({ seed: docSeed, documentType }));
1067
+ return {
1068
+ format: "ccda",
1069
+ kind: documentType,
1070
+ content: rt.content,
1071
+ warnings: rt.warnings
1072
+ };
1073
+ });
1074
+ return makeCorpus(seed, artifacts);
1075
+ }
1076
+
1077
+ exports.ALLERGENS = ALLERGENS;
1078
+ exports.ALLERGY_REACTIONS = ALLERGY_REACTIONS;
1079
+ exports.CCDA_QUIRKS = CCDA_QUIRKS;
1080
+ exports.LAB_RESULTS = LAB_RESULTS;
1081
+ exports.MEDICATIONS = MEDICATIONS;
1082
+ exports.PROBLEMS = PROBLEMS;
1083
+ exports.PROCEDURES = PROCEDURES;
1084
+ exports.RESULT_PANELS = RESULT_PANELS;
1085
+ exports.ROUTES = ROUTES;
1086
+ exports.SMOKING_STATUSES = SMOKING_STATUSES;
1087
+ exports.VACCINES = VACCINES;
1088
+ exports.VITAL_SIGNS = VITAL_SIGNS;
1089
+ exports.ccdaCorpus = ccdaCorpus;
1090
+ exports.ccdaPatientIdentity = ccdaPatientIdentity;
1091
+ exports.ccdaQuirkCorpus = ccdaQuirkCorpus;
1092
+ exports.ccdaQuirkProfile = ccdaQuirkProfile;
1093
+ exports.ccdaQuirkRoundTrip = ccdaQuirkRoundTrip;
1094
+ exports.generateCcd = generateCcd;
1095
+ exports.generateCcda = generateCcda;
1096
+ exports.generateCcdaQuirk = generateCcdaQuirk;
1097
+ exports.generateReferralNote = generateReferralNote;
1098
+ exports.injectCcdaQuirk = injectCcdaQuirk;
1099
+ exports.quantityFor = quantityFor;
1100
+ exports.roundTrip = roundTrip;
1101
+ exports.toBuildCode = toBuildCode;
1102
+ //# sourceMappingURL=index.cjs.map
1103
+ //# sourceMappingURL=index.cjs.map