@cosyte/synth 0.1.5 → 0.1.7
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 +30 -0
- package/dist/astm/index.cjs +57 -19
- package/dist/astm/index.cjs.map +1 -1
- package/dist/astm/index.d.cts +7 -0
- package/dist/astm/index.d.ts +7 -0
- package/dist/astm/index.mjs +56 -19
- package/dist/astm/index.mjs.map +1 -1
- package/dist/ccda/index.cjs +76 -26
- package/dist/ccda/index.cjs.map +1 -1
- package/dist/ccda/index.d.cts +6 -0
- package/dist/ccda/index.d.ts +6 -0
- package/dist/ccda/index.mjs +63 -14
- package/dist/ccda/index.mjs.map +1 -1
- package/dist/deid/index.cjs +216 -125
- package/dist/deid/index.cjs.map +1 -1
- package/dist/deid/index.mjs +203 -113
- package/dist/deid/index.mjs.map +1 -1
- package/dist/fhir/index.cjs +146 -74
- package/dist/fhir/index.cjs.map +1 -1
- package/dist/fhir/index.d.cts +6 -0
- package/dist/fhir/index.d.ts +6 -0
- package/dist/fhir/index.mjs +145 -74
- package/dist/fhir/index.mjs.map +1 -1
- package/dist/hl7/index.cjs +53 -9
- package/dist/hl7/index.cjs.map +1 -1
- package/dist/hl7/index.d.cts +6 -0
- package/dist/hl7/index.d.ts +6 -0
- package/dist/hl7/index.mjs +52 -9
- package/dist/hl7/index.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -3
- package/dist/index.mjs.map +1 -1
- package/dist/ncpdp/index.cjs +76 -23
- package/dist/ncpdp/index.cjs.map +1 -1
- package/dist/ncpdp/index.d.cts +7 -0
- package/dist/ncpdp/index.d.ts +7 -0
- package/dist/ncpdp/index.mjs +75 -23
- package/dist/ncpdp/index.mjs.map +1 -1
- package/dist/x12/index.cjs +72 -23
- package/dist/x12/index.cjs.map +1 -1
- package/dist/x12/index.d.cts +8 -1
- package/dist/x12/index.d.ts +8 -1
- package/dist/x12/index.mjs +71 -23
- package/dist/x12/index.mjs.map +1 -1
- package/package.json +20 -15
package/dist/ncpdp/index.cjs
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
|
|
3
|
+
var module$1 = require('module');
|
|
4
|
+
var url = require('url');
|
|
5
|
+
|
|
6
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
6
13
|
|
|
7
14
|
// src/rng/splitmix32.ts
|
|
8
15
|
function splitmix32(seed) {
|
|
@@ -152,6 +159,7 @@ function createRng(seed) {
|
|
|
152
159
|
}
|
|
153
160
|
|
|
154
161
|
// src/corpus.ts
|
|
162
|
+
var UNCHECKED = Object.freeze([]);
|
|
155
163
|
function makeCorpus(seed, artifacts, quirks = []) {
|
|
156
164
|
const counts = {};
|
|
157
165
|
const formats = /* @__PURE__ */ new Set();
|
|
@@ -530,6 +538,30 @@ var EXAMPLE_SIG_TEXT = Object.freeze([
|
|
|
530
538
|
"Inhale 2 puffs by mouth every 4 to 6 hours as needed"
|
|
531
539
|
]);
|
|
532
540
|
var DAW_CODES = Object.freeze(["0", "1", "2"]);
|
|
541
|
+
function defaultHost() {
|
|
542
|
+
if (typeof undefined !== "function") return { require: __require, resolve: void 0 };
|
|
543
|
+
return { require: module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))), resolve: (s) => undefined(s) };
|
|
544
|
+
}
|
|
545
|
+
function isRequireEsmRefusal(error) {
|
|
546
|
+
return error?.code === "ERR_REQUIRE_ESM";
|
|
547
|
+
}
|
|
548
|
+
function loadPeer(specifier, host) {
|
|
549
|
+
if (host.resolve === void 0) return host.require(specifier);
|
|
550
|
+
const entry = url.fileURLToPath(host.resolve(specifier));
|
|
551
|
+
try {
|
|
552
|
+
return host.require(entry);
|
|
553
|
+
} catch (error) {
|
|
554
|
+
if (!isRequireEsmRefusal(error)) throw error;
|
|
555
|
+
return host.require(specifier);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
function lazyPeer(specifier, host) {
|
|
559
|
+
let loaded;
|
|
560
|
+
return () => loaded ??= loadPeer(specifier, defaultHost());
|
|
561
|
+
}
|
|
562
|
+
var ncpdpScriptPeer = lazyPeer("@cosyte/ncpdp/script");
|
|
563
|
+
var ncpdpTelecomPeer = lazyPeer("@cosyte/ncpdp/telecom");
|
|
564
|
+
var ncpdpCommonPeer = lazyPeer("@cosyte/ncpdp/common");
|
|
533
565
|
|
|
534
566
|
// src/ncpdp/script.ts
|
|
535
567
|
var SCRIPT_VERSION = "2017071";
|
|
@@ -560,13 +592,13 @@ function medicationModel(rng, routing) {
|
|
|
560
592
|
const written = `${routing.date.slice(0, 4)}-${routing.date.slice(4, 6)}-${routing.date.slice(6, 8)}`;
|
|
561
593
|
return {
|
|
562
594
|
description: drug.description,
|
|
563
|
-
coded: { productCode:
|
|
595
|
+
coded: { productCode: ncpdpCommonPeer().codedValue(drug.ndc, "ND") },
|
|
564
596
|
quantity: {
|
|
565
|
-
value:
|
|
597
|
+
value: ncpdpCommonPeer().decimalValue(String(rng.int(30, 90))),
|
|
566
598
|
unitOfMeasure: drug.form,
|
|
567
599
|
codeListQualifier: "38"
|
|
568
600
|
},
|
|
569
|
-
daysSupply:
|
|
601
|
+
daysSupply: ncpdpCommonPeer().decimalValue(String(rng.pick([30, 60, 90]))),
|
|
570
602
|
numberOfRefills: String(rng.int(0, 5)),
|
|
571
603
|
substitutions: rng.pick(["0", "1"]),
|
|
572
604
|
writtenDate: written,
|
|
@@ -590,14 +622,14 @@ function generateNewRx(options) {
|
|
|
590
622
|
const pharmacy = pharmacyModel(rng);
|
|
591
623
|
const prescriber = prescriberModel(rng);
|
|
592
624
|
const medication = medicationModel(rng, routing);
|
|
593
|
-
const message =
|
|
625
|
+
const message = ncpdpScriptPeer().buildNewRx({
|
|
594
626
|
header: headerModel(routing),
|
|
595
627
|
patient,
|
|
596
628
|
pharmacy,
|
|
597
629
|
prescriber,
|
|
598
630
|
medication
|
|
599
631
|
});
|
|
600
|
-
return
|
|
632
|
+
return ncpdpScriptPeer().serializeScript(message);
|
|
601
633
|
}
|
|
602
634
|
function lifecycleFields(rng) {
|
|
603
635
|
const routing = ncpdpScriptRouting(rng);
|
|
@@ -614,14 +646,20 @@ function generateRxRenewalRequest(options) {
|
|
|
614
646
|
const rng = createRng(options.seed);
|
|
615
647
|
const { header: header2, ...fields } = lifecycleFields(rng);
|
|
616
648
|
const body = { kind: "RxRenewalRequest", ...fields };
|
|
617
|
-
return
|
|
649
|
+
return ncpdpScriptPeer().serializeScript(
|
|
650
|
+
new (ncpdpScriptPeer()).ScriptMessage({ header: header2, body, warnings: [] })
|
|
651
|
+
);
|
|
618
652
|
}
|
|
619
653
|
function generateRxChangeRequest(options) {
|
|
620
654
|
const rng = createRng(options.seed);
|
|
621
655
|
const { header: header2, ...fields } = lifecycleFields(rng);
|
|
622
656
|
const body = { kind: "RxChangeRequest", ...fields };
|
|
623
|
-
return
|
|
657
|
+
return ncpdpScriptPeer().serializeScript(
|
|
658
|
+
new (ncpdpScriptPeer()).ScriptMessage({ header: header2, body, warnings: [] })
|
|
659
|
+
);
|
|
624
660
|
}
|
|
661
|
+
|
|
662
|
+
// src/ncpdp/telecom.ts
|
|
625
663
|
var SYNTHETIC_BIN = "999999";
|
|
626
664
|
function digitsOnly(value) {
|
|
627
665
|
return value.replace(/\D/g, "");
|
|
@@ -705,7 +743,8 @@ function claimSegment(rng, minimal) {
|
|
|
705
743
|
field("E1", "03"),
|
|
706
744
|
// 03 = NDC
|
|
707
745
|
field("D7", drug.ndc),
|
|
708
|
-
field("E7", String(rng.int(30, 90))),
|
|
746
|
+
field("E7", String(rng.int(30, 90) * 1e3)),
|
|
747
|
+
// 442-E7 carries three implied decimals
|
|
709
748
|
field("D5", String(rng.pick([30, 60, 90]))),
|
|
710
749
|
field("D8", rng.pick(DAW_CODES))
|
|
711
750
|
]
|
|
@@ -721,7 +760,9 @@ function generateTelecom(code, options) {
|
|
|
721
760
|
prescriberSegment(rng),
|
|
722
761
|
claimSegment(rng, false)
|
|
723
762
|
];
|
|
724
|
-
return
|
|
763
|
+
return ncpdpTelecomPeer().serializeTelecom(
|
|
764
|
+
ncpdpTelecomPeer().buildTelecomRequest({ header: head, segments })
|
|
765
|
+
);
|
|
725
766
|
}
|
|
726
767
|
function generateB1(options) {
|
|
727
768
|
return generateTelecom("B1", options);
|
|
@@ -732,18 +773,30 @@ function generateB2(options) {
|
|
|
732
773
|
function generateB3(options) {
|
|
733
774
|
return generateTelecom("B3", options);
|
|
734
775
|
}
|
|
776
|
+
|
|
777
|
+
// src/ncpdp/round-trip.ts
|
|
735
778
|
function scriptRoundTrip(xml) {
|
|
736
|
-
const message =
|
|
779
|
+
const message = ncpdpScriptPeer().parseScript(xml);
|
|
737
780
|
const warnings = message.warnings.map((w) => String(w.code));
|
|
738
|
-
const byteStable =
|
|
781
|
+
const byteStable = ncpdpScriptPeer().serializeScript(message) === xml;
|
|
739
782
|
return { content: xml, warnings, byteStable, specClean: warnings.length === 0 && byteStable };
|
|
740
783
|
}
|
|
741
784
|
function telecomRoundTrip(wire) {
|
|
742
|
-
const transaction =
|
|
785
|
+
const transaction = ncpdpTelecomPeer().parseTelecom(wire);
|
|
743
786
|
const warnings = transaction.warnings.map((w) => String(w.code));
|
|
744
|
-
const byteStable =
|
|
787
|
+
const byteStable = ncpdpTelecomPeer().serializeTelecom(transaction) === wire;
|
|
745
788
|
return { content: wire, warnings, byteStable, specClean: warnings.length === 0 && byteStable };
|
|
746
789
|
}
|
|
790
|
+
function scriptCorpusArtifact(xml, verify) {
|
|
791
|
+
if (!verify) return { content: xml, warnings: UNCHECKED };
|
|
792
|
+
const warnings = ncpdpScriptPeer().parseScript(xml).warnings.map((w) => String(w.code));
|
|
793
|
+
return { content: xml, warnings };
|
|
794
|
+
}
|
|
795
|
+
function telecomCorpusArtifact(wire, verify) {
|
|
796
|
+
if (!verify) return { content: wire, warnings: UNCHECKED };
|
|
797
|
+
const warnings = ncpdpTelecomPeer().parseTelecom(wire).warnings.map((w) => String(w.code));
|
|
798
|
+
return { content: wire, warnings };
|
|
799
|
+
}
|
|
747
800
|
|
|
748
801
|
// src/select.ts
|
|
749
802
|
function resolveKind(allowed, requested) {
|
|
@@ -766,29 +819,29 @@ var ALL_KINDS = Object.freeze([
|
|
|
766
819
|
"B3"
|
|
767
820
|
]);
|
|
768
821
|
var DEFAULT_MIX = ALL_KINDS;
|
|
769
|
-
function generateKind(kind, seed) {
|
|
822
|
+
function generateKind(kind, seed, verify) {
|
|
770
823
|
switch (kind) {
|
|
771
824
|
case "NewRx":
|
|
772
|
-
return
|
|
825
|
+
return scriptCorpusArtifact(generateNewRx({ seed }), verify);
|
|
773
826
|
case "RxRenewalRequest":
|
|
774
|
-
return
|
|
827
|
+
return scriptCorpusArtifact(generateRxRenewalRequest({ seed }), verify);
|
|
775
828
|
case "RxChangeRequest":
|
|
776
|
-
return
|
|
829
|
+
return scriptCorpusArtifact(generateRxChangeRequest({ seed }), verify);
|
|
777
830
|
case "B1":
|
|
778
831
|
case "B2":
|
|
779
832
|
case "B3":
|
|
780
|
-
return
|
|
833
|
+
return telecomCorpusArtifact(generateTelecom(kind, { seed }), verify);
|
|
781
834
|
}
|
|
782
835
|
}
|
|
783
836
|
function ncpdpCorpus(options) {
|
|
784
|
-
const { seed } = options;
|
|
837
|
+
const { seed, verify = true } = options;
|
|
785
838
|
const mix = resolveMix(ALL_KINDS, options.mix, DEFAULT_MIX);
|
|
786
839
|
const count = options.count ?? mix.length;
|
|
787
840
|
const seedStream = createRng(seed);
|
|
788
841
|
const artifacts = Array.from({ length: count }, (_unused, i) => {
|
|
789
842
|
const kind = mix[i % mix.length] ?? "NewRx";
|
|
790
843
|
const txSeed = seedStream.nextUint32();
|
|
791
|
-
const rt = generateKind(kind, txSeed);
|
|
844
|
+
const rt = generateKind(kind, txSeed, verify);
|
|
792
845
|
return {
|
|
793
846
|
format: "ncpdp",
|
|
794
847
|
kind,
|