@cosyte/synth 0.0.9 → 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.
- package/CHANGELOG.md +73 -0
- package/README.md +21 -12
- package/dist/astm/index.cjs +18 -6
- package/dist/astm/index.cjs.map +1 -1
- package/dist/astm/index.d.cts +2 -2
- package/dist/astm/index.d.ts +2 -2
- package/dist/astm/index.mjs +18 -6
- package/dist/astm/index.mjs.map +1 -1
- package/dist/ccda/index.cjs +23 -7
- package/dist/ccda/index.cjs.map +1 -1
- package/dist/ccda/index.d.cts +2 -2
- package/dist/ccda/index.d.ts +2 -2
- package/dist/ccda/index.mjs +23 -7
- package/dist/ccda/index.mjs.map +1 -1
- package/dist/deid/index.cjs +26 -8
- package/dist/deid/index.cjs.map +1 -1
- package/dist/deid/index.d.cts +2 -2
- package/dist/deid/index.d.ts +2 -2
- package/dist/deid/index.mjs +26 -8
- package/dist/deid/index.mjs.map +1 -1
- package/dist/fhir/index.cjs +174 -7
- package/dist/fhir/index.cjs.map +1 -1
- package/dist/fhir/index.d.cts +163 -2
- package/dist/fhir/index.d.ts +163 -2
- package/dist/fhir/index.mjs +171 -9
- package/dist/fhir/index.mjs.map +1 -1
- package/dist/hl7/index.cjs +18 -6
- package/dist/hl7/index.cjs.map +1 -1
- package/dist/hl7/index.d.cts +2 -2
- package/dist/hl7/index.d.ts +2 -2
- package/dist/hl7/index.mjs +18 -6
- package/dist/hl7/index.mjs.map +1 -1
- package/dist/index.cjs +37 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +172 -38
- package/dist/index.d.ts +172 -38
- package/dist/index.mjs +36 -7
- package/dist/index.mjs.map +1 -1
- package/dist/ncpdp/index.cjs +18 -6
- package/dist/ncpdp/index.cjs.map +1 -1
- package/dist/ncpdp/index.d.cts +1 -1
- package/dist/ncpdp/index.d.ts +1 -1
- package/dist/ncpdp/index.mjs +18 -6
- package/dist/ncpdp/index.mjs.map +1 -1
- package/dist/{providers-B9uVinAe.d.cts → providers-BQtPk3PN.d.cts} +18 -4
- package/dist/{providers-B9uVinAe.d.ts → providers-BQtPk3PN.d.ts} +18 -4
- package/dist/{quirk-HZdznAkM.d.ts → quirk-Bzx9g8KG.d.ts} +1 -1
- package/dist/{quirk-IaHp4z7N.d.cts → quirk-C_lZrspq.d.cts} +1 -1
- package/dist/x12/index.cjs +18 -6
- package/dist/x12/index.cjs.map +1 -1
- package/dist/x12/index.d.cts +1 -1
- package/dist/x12/index.d.ts +1 -1
- package/dist/x12/index.mjs +18 -6
- package/dist/x12/index.mjs.map +1 -1
- package/package.json +54 -30
package/dist/fhir/index.cjs
CHANGED
|
@@ -45,7 +45,16 @@ var SYNTH_FATAL_CODES = {
|
|
|
45
45
|
* see `resolveKind`: a selector union is erased at run time, and a selector that falls through
|
|
46
46
|
* either mislabels the fixture or hands the value to a peer builder that quotes it back.
|
|
47
47
|
*/
|
|
48
|
-
SYNTH_UNSUPPORTED_KIND: "SYNTH_UNSUPPORTED_KIND"
|
|
48
|
+
SYNTH_UNSUPPORTED_KIND: "SYNTH_UNSUPPORTED_KIND",
|
|
49
|
+
/**
|
|
50
|
+
* A requested profile IS published by the adopted implementation guide, and this build does not
|
|
51
|
+
* generate it. Deliberately distinct from `SYNTH_UNSUPPORTED_KIND`, which says the name is not in
|
|
52
|
+
* the adopted set at all: "the guide does not publish this" and "we do not generate this yet" are
|
|
53
|
+
* different answers, and a caller building to a regulatory profile set has to be able to tell them
|
|
54
|
+
* apart without matching message text. Fatal, and raised **before** anything is generated: a
|
|
55
|
+
* mislabelled artifact is worse than no artifact.
|
|
56
|
+
*/
|
|
57
|
+
SYNTH_PROFILE_NOT_GENERATED: "SYNTH_PROFILE_NOT_GENERATED"
|
|
49
58
|
};
|
|
50
59
|
var SYNTH_FATAL_MESSAGES = Object.freeze({
|
|
51
60
|
SYNTH_UNSUPPORTED_FORMAT: "The requested format is not generable by this build. A generator has no byte fallback: it builds through a parser's own serializer or it refuses.",
|
|
@@ -57,7 +66,8 @@ var SYNTH_FATAL_MESSAGES = Object.freeze({
|
|
|
57
66
|
SYNTH_INVALID_RANGE: "An integer range was requested with its maximum below its minimum.",
|
|
58
67
|
SYNTH_EMPTY_POOL: "A value was drawn from an empty pool.",
|
|
59
68
|
SYNTH_INVALID_PROFILE: "defineSynthProfile requires a non-empty string name.",
|
|
60
|
-
SYNTH_UNSUPPORTED_KIND: "The requested kind, document type, corpus mix entry, variant or profile is not one this generator supports. The supported set is the exported union for that option."
|
|
69
|
+
SYNTH_UNSUPPORTED_KIND: "The requested kind, document type, corpus mix entry, variant or profile is not one this generator supports. The supported set is the exported union for that option.",
|
|
70
|
+
SYNTH_PROFILE_NOT_GENERATED: "The requested profile is published by the adopted implementation guide, and this build does not generate it. The coverage surface reports, per adopted profile, whether it is generated."
|
|
61
71
|
});
|
|
62
72
|
var SynthError = class extends Error {
|
|
63
73
|
/** The stable fatal code. */
|
|
@@ -114,7 +124,7 @@ function createRng(seed) {
|
|
|
114
124
|
var SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({
|
|
115
125
|
/** The human-readable assigning-authority namespace id (HL7 HD.1). */
|
|
116
126
|
namespaceId: "COSYTE-SYNTH",
|
|
117
|
-
/** The universal id, an OID under
|
|
127
|
+
/** The universal id, an OID this package chose under the root `2.16.840.1.113883.19` (HD.2). */
|
|
118
128
|
universalId: "2.16.840.1.113883.19.999",
|
|
119
129
|
/** The universal id type (HD.3). */
|
|
120
130
|
universalIdType: "ISO"
|
|
@@ -133,6 +143,18 @@ var TEST_NET_V4_PREFIXES = Object.freeze([
|
|
|
133
143
|
// TEST-NET-3
|
|
134
144
|
]);
|
|
135
145
|
var DOC_V6_PREFIX = "2001:db8";
|
|
146
|
+
var ITIN_GROUP_RANGES = Object.freeze([
|
|
147
|
+
Object.freeze({ min: 50, max: 65 }),
|
|
148
|
+
Object.freeze({ min: 70, max: 88 }),
|
|
149
|
+
Object.freeze({ min: 90, max: 92 }),
|
|
150
|
+
Object.freeze({ min: 94, max: 99 })
|
|
151
|
+
]);
|
|
152
|
+
var ITIN_EXCLUDED_GROUPS = Object.freeze([89, 93]);
|
|
153
|
+
var SSN_SYNTHETIC_GROUPS = Object.freeze(
|
|
154
|
+
Array.from({ length: 100 }, (_unused, group) => group).filter(
|
|
155
|
+
(group) => !ITIN_GROUP_RANGES.some((range) => group >= range.min && group <= range.max) && !ITIN_EXCLUDED_GROUPS.includes(group)
|
|
156
|
+
).map((group) => String(group).padStart(2, "0"))
|
|
157
|
+
);
|
|
136
158
|
var NPI_LUHN_PREFIX = "80840";
|
|
137
159
|
function luhnMod10(digits) {
|
|
138
160
|
let sum = 0;
|
|
@@ -241,10 +263,10 @@ var SYNTHETIC_CITY_NAMES = Object.freeze([
|
|
|
241
263
|
// src/safe/providers.ts
|
|
242
264
|
function ssn(rng, block = "never-issued") {
|
|
243
265
|
if (block === "advertising") {
|
|
244
|
-
return `987-
|
|
266
|
+
return `987-00-432${String(rng.int(0, 9))}`;
|
|
245
267
|
}
|
|
246
268
|
const area = rng.int(900, 999);
|
|
247
|
-
const group = rng.
|
|
269
|
+
const group = rng.pick(SSN_SYNTHETIC_GROUPS);
|
|
248
270
|
const serial = rng.digits(4);
|
|
249
271
|
return `${String(area)}-${group}-${serial}`;
|
|
250
272
|
}
|
|
@@ -403,8 +425,62 @@ var US_CORE_PROFILE = Object.freeze({
|
|
|
403
425
|
/** US Core AllergyIntolerance. */
|
|
404
426
|
ALLERGY_INTOLERANCE: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-allergyintolerance",
|
|
405
427
|
/** US Core Procedure. */
|
|
406
|
-
PROCEDURE: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-procedure"
|
|
428
|
+
PROCEDURE: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-procedure",
|
|
429
|
+
/** US Core Provenance. */
|
|
430
|
+
PROVENANCE: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-provenance"
|
|
407
431
|
});
|
|
432
|
+
var US_CORE_PROFILE_BASE = "http://hl7.org/fhir/us/core/StructureDefinition/";
|
|
433
|
+
var US_CORE_ADOPTED_PROFILES = Object.freeze([
|
|
434
|
+
"head-occipital-frontal-circumference-percentile",
|
|
435
|
+
"pediatric-bmi-for-age",
|
|
436
|
+
"pediatric-weight-for-height",
|
|
437
|
+
"us-core-allergyintolerance",
|
|
438
|
+
"us-core-blood-pressure",
|
|
439
|
+
"us-core-bmi",
|
|
440
|
+
"us-core-body-height",
|
|
441
|
+
"us-core-body-temperature",
|
|
442
|
+
"us-core-body-weight",
|
|
443
|
+
"us-core-careplan",
|
|
444
|
+
"us-core-careteam",
|
|
445
|
+
"us-core-condition-encounter-diagnosis",
|
|
446
|
+
"us-core-condition-problems-health-concerns",
|
|
447
|
+
"us-core-coverage",
|
|
448
|
+
"us-core-diagnosticreport-lab",
|
|
449
|
+
"us-core-diagnosticreport-note",
|
|
450
|
+
"us-core-documentreference",
|
|
451
|
+
"us-core-encounter",
|
|
452
|
+
"us-core-goal",
|
|
453
|
+
"us-core-head-circumference",
|
|
454
|
+
"us-core-heart-rate",
|
|
455
|
+
"us-core-immunization",
|
|
456
|
+
"us-core-implantable-device",
|
|
457
|
+
"us-core-location",
|
|
458
|
+
"us-core-medication",
|
|
459
|
+
"us-core-medicationdispense",
|
|
460
|
+
"us-core-medicationrequest",
|
|
461
|
+
"us-core-observation-clinical-result",
|
|
462
|
+
"us-core-observation-lab",
|
|
463
|
+
"us-core-observation-occupation",
|
|
464
|
+
"us-core-observation-pregnancyintent",
|
|
465
|
+
"us-core-observation-pregnancystatus",
|
|
466
|
+
"us-core-observation-screening-assessment",
|
|
467
|
+
"us-core-observation-sexual-orientation",
|
|
468
|
+
"us-core-organization",
|
|
469
|
+
"us-core-patient",
|
|
470
|
+
"us-core-practitioner",
|
|
471
|
+
"us-core-practitionerrole",
|
|
472
|
+
"us-core-procedure",
|
|
473
|
+
"us-core-provenance",
|
|
474
|
+
"us-core-pulse-oximetry",
|
|
475
|
+
"us-core-questionnaireresponse",
|
|
476
|
+
"us-core-relatedperson",
|
|
477
|
+
"us-core-respiratory-rate",
|
|
478
|
+
"us-core-servicerequest",
|
|
479
|
+
"us-core-simple-observation",
|
|
480
|
+
"us-core-smokingstatus",
|
|
481
|
+
"us-core-specimen",
|
|
482
|
+
"us-core-vital-signs"
|
|
483
|
+
]);
|
|
408
484
|
var US_CORE_RACE_EXTENSION = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race";
|
|
409
485
|
var US_CORE_ETHNICITY_EXTENSION = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity";
|
|
410
486
|
var US_CORE_BIRTHSEX_EXTENSION = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex";
|
|
@@ -440,7 +516,11 @@ var SYSTEM = Object.freeze({
|
|
|
440
516
|
/** HL7 Terminology `allergyintolerance-clinical`, `AllergyIntolerance.clinicalStatus`. */
|
|
441
517
|
ALLERGY_CLINICAL: "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical",
|
|
442
518
|
/** HL7 Terminology `allergyintolerance-verification`, `AllergyIntolerance.verificationStatus`. */
|
|
443
|
-
ALLERGY_VERIFICATION: "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
|
|
519
|
+
ALLERGY_VERIFICATION: "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification",
|
|
520
|
+
/** HL7 Terminology `provenance-participant-type`, `Provenance.agent.type` (`author`). */
|
|
521
|
+
PROVENANCE_PARTICIPANT_TYPE: "http://terminology.hl7.org/CodeSystem/provenance-participant-type",
|
|
522
|
+
/** US Core `us-core-provenance-participant-type`, `Provenance.agent.type` (`transmitter`). */
|
|
523
|
+
US_CORE_PROVENANCE_PARTICIPANT_TYPE: "http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type"
|
|
444
524
|
});
|
|
445
525
|
|
|
446
526
|
// src/fhir/builder.ts
|
|
@@ -1127,6 +1207,53 @@ function generateProcedure(options = {}) {
|
|
|
1127
1207
|
props.push(prop("performedDateTime", str(`${performed}T10:00:00Z`)));
|
|
1128
1208
|
return fhir.complex(props);
|
|
1129
1209
|
}
|
|
1210
|
+
function generateProvenance(options = {}) {
|
|
1211
|
+
const { seed = 0, target = "Patient/syn-patient-1", usCore = true } = options;
|
|
1212
|
+
const rng = createRng(seed);
|
|
1213
|
+
const recorded = toFhirDate(safe.dateYmd(rng, 2018, 2024));
|
|
1214
|
+
const practitioner = `Practitioner/syn-practitioner-${rng.digits(8)}`;
|
|
1215
|
+
const organization = `Organization/syn-org-${rng.digits(8)}`;
|
|
1216
|
+
const props = [
|
|
1217
|
+
prop("resourceType", str("Provenance")),
|
|
1218
|
+
prop("id", str(`syn-prov-${rng.digits(8)}`))
|
|
1219
|
+
];
|
|
1220
|
+
if (usCore) props.push(prop("meta", meta([US_CORE_PROFILE.PROVENANCE])));
|
|
1221
|
+
props.push(prop("text", narrative("Synthetic provenance for a generated fixture.")));
|
|
1222
|
+
props.push(prop("target", fhir.list([reference(target)])));
|
|
1223
|
+
props.push(prop("recorded", str(`${recorded}T10:00:00Z`)));
|
|
1224
|
+
props.push(
|
|
1225
|
+
prop(
|
|
1226
|
+
"agent",
|
|
1227
|
+
fhir.list([
|
|
1228
|
+
fhir.complex([
|
|
1229
|
+
prop(
|
|
1230
|
+
"type",
|
|
1231
|
+
fhir.complex([
|
|
1232
|
+
prop(
|
|
1233
|
+
"coding",
|
|
1234
|
+
fhir.list([
|
|
1235
|
+
coding({
|
|
1236
|
+
system: SYSTEM.PROVENANCE_PARTICIPANT_TYPE,
|
|
1237
|
+
code: "author",
|
|
1238
|
+
display: "Author"
|
|
1239
|
+
}),
|
|
1240
|
+
coding({
|
|
1241
|
+
system: SYSTEM.US_CORE_PROVENANCE_PARTICIPANT_TYPE,
|
|
1242
|
+
code: "transmitter",
|
|
1243
|
+
display: "Transmitter"
|
|
1244
|
+
})
|
|
1245
|
+
])
|
|
1246
|
+
)
|
|
1247
|
+
])
|
|
1248
|
+
),
|
|
1249
|
+
prop("who", reference(practitioner)),
|
|
1250
|
+
prop("onBehalfOf", reference(organization))
|
|
1251
|
+
])
|
|
1252
|
+
])
|
|
1253
|
+
)
|
|
1254
|
+
);
|
|
1255
|
+
return fhir.complex(props);
|
|
1256
|
+
}
|
|
1130
1257
|
function generateDiagnosticReport(options = {}) {
|
|
1131
1258
|
const { seed = 0, subject = "Patient/syn-patient-1", results = [], usCore = true } = options;
|
|
1132
1259
|
const rng = createRng(seed);
|
|
@@ -1454,6 +1581,41 @@ function fhirCorpus(options) {
|
|
|
1454
1581
|
return makeCorpus(seed, artifacts);
|
|
1455
1582
|
}
|
|
1456
1583
|
|
|
1584
|
+
// src/fhir/coverage.ts
|
|
1585
|
+
var GENERATORS = Object.freeze({
|
|
1586
|
+
"us-core-allergyintolerance": (seed) => generateAllergyIntolerance({ seed }),
|
|
1587
|
+
"us-core-condition-problems-health-concerns": (seed) => generateCondition({ seed }),
|
|
1588
|
+
"us-core-diagnosticreport-lab": (seed) => generateDiagnosticReport({ seed }),
|
|
1589
|
+
"us-core-encounter": (seed) => generateEncounter({ seed }),
|
|
1590
|
+
"us-core-immunization": (seed) => generateImmunization({ seed }),
|
|
1591
|
+
"us-core-medicationrequest": (seed) => generateMedicationRequest({ seed }),
|
|
1592
|
+
"us-core-observation-lab": (seed) => generateObservationLab({ seed }),
|
|
1593
|
+
"us-core-patient": (seed) => generatePatient({ seed, profile: "us-core" }),
|
|
1594
|
+
"us-core-procedure": (seed) => generateProcedure({ seed }),
|
|
1595
|
+
"us-core-provenance": (seed) => generateProvenance({ seed }),
|
|
1596
|
+
"us-core-vital-signs": (seed) => generateVitalSign({ seed })
|
|
1597
|
+
});
|
|
1598
|
+
var COVERAGE = Object.freeze(
|
|
1599
|
+
US_CORE_ADOPTED_PROFILES.map(
|
|
1600
|
+
(profile) => Object.freeze({
|
|
1601
|
+
profile,
|
|
1602
|
+
canonical: `${US_CORE_PROFILE_BASE}${profile}`,
|
|
1603
|
+
generated: GENERATORS[profile] !== void 0
|
|
1604
|
+
})
|
|
1605
|
+
)
|
|
1606
|
+
);
|
|
1607
|
+
function usCoreCoverage() {
|
|
1608
|
+
return COVERAGE;
|
|
1609
|
+
}
|
|
1610
|
+
function generateUsCoreProfile(options) {
|
|
1611
|
+
const profile = resolveKind(US_CORE_ADOPTED_PROFILES, options.profile);
|
|
1612
|
+
const generate = GENERATORS[profile];
|
|
1613
|
+
if (generate === void 0) {
|
|
1614
|
+
throw new SynthError(SYNTH_FATAL_CODES.SYNTH_PROFILE_NOT_GENERATED);
|
|
1615
|
+
}
|
|
1616
|
+
return generate(options.seed ?? 0);
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1457
1619
|
exports.EXAMPLE_ALLERGENS = EXAMPLE_ALLERGENS;
|
|
1458
1620
|
exports.EXAMPLE_ALLERGY_MANIFESTATIONS = EXAMPLE_ALLERGY_MANIFESTATIONS;
|
|
1459
1621
|
exports.EXAMPLE_CONDITIONS = EXAMPLE_CONDITIONS;
|
|
@@ -1468,9 +1630,11 @@ exports.EXAMPLE_RACE_CATEGORIES = EXAMPLE_RACE_CATEGORIES;
|
|
|
1468
1630
|
exports.EXAMPLE_VACCINES = EXAMPLE_VACCINES;
|
|
1469
1631
|
exports.EXAMPLE_VITAL_SIGNS = EXAMPLE_VITAL_SIGNS;
|
|
1470
1632
|
exports.SYSTEM = SYSTEM;
|
|
1633
|
+
exports.US_CORE_ADOPTED_PROFILES = US_CORE_ADOPTED_PROFILES;
|
|
1471
1634
|
exports.US_CORE_BIRTHSEX_EXTENSION = US_CORE_BIRTHSEX_EXTENSION;
|
|
1472
1635
|
exports.US_CORE_ETHNICITY_EXTENSION = US_CORE_ETHNICITY_EXTENSION;
|
|
1473
1636
|
exports.US_CORE_PROFILE = US_CORE_PROFILE;
|
|
1637
|
+
exports.US_CORE_PROFILE_BASE = US_CORE_PROFILE_BASE;
|
|
1474
1638
|
exports.US_CORE_RACE_EXTENSION = US_CORE_RACE_EXTENSION;
|
|
1475
1639
|
exports.bool = bool;
|
|
1476
1640
|
exports.buildComposition = buildComposition;
|
|
@@ -1489,6 +1653,8 @@ exports.generateMedicationRequest = generateMedicationRequest;
|
|
|
1489
1653
|
exports.generateObservationLab = generateObservationLab;
|
|
1490
1654
|
exports.generatePatient = generatePatient;
|
|
1491
1655
|
exports.generateProcedure = generateProcedure;
|
|
1656
|
+
exports.generateProvenance = generateProvenance;
|
|
1657
|
+
exports.generateUsCoreProfile = generateUsCoreProfile;
|
|
1492
1658
|
exports.generateVitalSign = generateVitalSign;
|
|
1493
1659
|
exports.meta = meta;
|
|
1494
1660
|
exports.mrnIdentifier = mrnIdentifier;
|
|
@@ -1498,5 +1664,6 @@ exports.reference = reference;
|
|
|
1498
1664
|
exports.roundTrip = roundTrip;
|
|
1499
1665
|
exports.str = str;
|
|
1500
1666
|
exports.toFhirDate = toFhirDate;
|
|
1667
|
+
exports.usCoreCoverage = usCoreCoverage;
|
|
1501
1668
|
//# sourceMappingURL=index.cjs.map
|
|
1502
1669
|
//# sourceMappingURL=index.cjs.map
|