@the-cascade-protocol/cli 0.3.5 → 0.4.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/dist/commands/capabilities.d.ts.map +1 -1
- package/dist/commands/capabilities.js +6 -5
- package/dist/commands/capabilities.js.map +1 -1
- package/dist/commands/pod/conflicts.d.ts +10 -0
- package/dist/commands/pod/conflicts.d.ts.map +1 -0
- package/dist/commands/pod/conflicts.js +45 -0
- package/dist/commands/pod/conflicts.js.map +1 -0
- package/dist/commands/pod/import.d.ts.map +1 -1
- package/dist/commands/pod/import.js +85 -6
- package/dist/commands/pod/import.js.map +1 -1
- package/dist/commands/pod/index.d.ts.map +1 -1
- package/dist/commands/pod/index.js +4 -0
- package/dist/commands/pod/index.js.map +1 -1
- package/dist/commands/pod/resolve.d.ts +10 -0
- package/dist/commands/pod/resolve.d.ts.map +1 -0
- package/dist/commands/pod/resolve.js +61 -0
- package/dist/commands/pod/resolve.js.map +1 -0
- package/dist/lib/ccda-converter/code-systems.d.ts +6 -0
- package/dist/lib/ccda-converter/code-systems.d.ts.map +1 -0
- package/dist/lib/ccda-converter/code-systems.js +27 -0
- package/dist/lib/ccda-converter/code-systems.js.map +1 -0
- package/dist/lib/ccda-converter/document-type.d.ts +6 -0
- package/dist/lib/ccda-converter/document-type.d.ts.map +1 -0
- package/dist/lib/ccda-converter/document-type.js +15 -0
- package/dist/lib/ccda-converter/document-type.js.map +1 -0
- package/dist/lib/ccda-converter/index.d.ts +30 -0
- package/dist/lib/ccda-converter/index.d.ts.map +1 -0
- package/dist/lib/ccda-converter/index.js +211 -0
- package/dist/lib/ccda-converter/index.js.map +1 -0
- package/dist/lib/ccda-converter/narrative.d.ts +6 -0
- package/dist/lib/ccda-converter/narrative.d.ts.map +1 -0
- package/dist/lib/ccda-converter/narrative.js +35 -0
- package/dist/lib/ccda-converter/narrative.js.map +1 -0
- package/dist/lib/ccda-converter/parser.d.ts +6 -0
- package/dist/lib/ccda-converter/parser.d.ts.map +1 -0
- package/dist/lib/ccda-converter/parser.js +23 -0
- package/dist/lib/ccda-converter/parser.js.map +1 -0
- package/dist/lib/ccda-converter/sections/allergies.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/allergies.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/allergies.js +57 -0
- package/dist/lib/ccda-converter/sections/allergies.js.map +1 -0
- package/dist/lib/ccda-converter/sections/devices.d.ts +9 -0
- package/dist/lib/ccda-converter/sections/devices.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/devices.js +50 -0
- package/dist/lib/ccda-converter/sections/devices.js.map +1 -0
- package/dist/lib/ccda-converter/sections/encounters.d.ts +9 -0
- package/dist/lib/ccda-converter/sections/encounters.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/encounters.js +44 -0
- package/dist/lib/ccda-converter/sections/encounters.js.map +1 -0
- package/dist/lib/ccda-converter/sections/family-history.d.ts +9 -0
- package/dist/lib/ccda-converter/sections/family-history.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/family-history.js +60 -0
- package/dist/lib/ccda-converter/sections/family-history.js.map +1 -0
- package/dist/lib/ccda-converter/sections/immunizations.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/immunizations.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/immunizations.js +62 -0
- package/dist/lib/ccda-converter/sections/immunizations.js.map +1 -0
- package/dist/lib/ccda-converter/sections/labs.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/labs.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/labs.js +82 -0
- package/dist/lib/ccda-converter/sections/labs.js.map +1 -0
- package/dist/lib/ccda-converter/sections/medications.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/medications.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/medications.js +68 -0
- package/dist/lib/ccda-converter/sections/medications.js.map +1 -0
- package/dist/lib/ccda-converter/sections/patient.d.ts +9 -0
- package/dist/lib/ccda-converter/sections/patient.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/patient.js +46 -0
- package/dist/lib/ccda-converter/sections/patient.js.map +1 -0
- package/dist/lib/ccda-converter/sections/problems.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/problems.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/problems.js +76 -0
- package/dist/lib/ccda-converter/sections/problems.js.map +1 -0
- package/dist/lib/ccda-converter/sections/procedures.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/procedures.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/procedures.js +57 -0
- package/dist/lib/ccda-converter/sections/procedures.js.map +1 -0
- package/dist/lib/ccda-converter/sections/social-history.d.ts +9 -0
- package/dist/lib/ccda-converter/sections/social-history.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/social-history.js +11 -0
- package/dist/lib/ccda-converter/sections/social-history.js.map +1 -0
- package/dist/lib/ccda-converter/sections/vitals.d.ts +8 -0
- package/dist/lib/ccda-converter/sections/vitals.d.ts.map +1 -0
- package/dist/lib/ccda-converter/sections/vitals.js +75 -0
- package/dist/lib/ccda-converter/sections/vitals.js.map +1 -0
- package/dist/lib/ccda-converter/vendor/detect.d.ts +7 -0
- package/dist/lib/ccda-converter/vendor/detect.d.ts.map +1 -0
- package/dist/lib/ccda-converter/vendor/detect.js +30 -0
- package/dist/lib/ccda-converter/vendor/detect.js.map +1 -0
- package/dist/lib/ccda-converter/vendor/normalize.d.ts +6 -0
- package/dist/lib/ccda-converter/vendor/normalize.d.ts.map +1 -0
- package/dist/lib/ccda-converter/vendor/normalize.js +13 -0
- package/dist/lib/ccda-converter/vendor/normalize.js.map +1 -0
- package/dist/lib/ccda-converter/vendor/quirks/cerner.d.ts +7 -0
- package/dist/lib/ccda-converter/vendor/quirks/cerner.d.ts.map +1 -0
- package/dist/lib/ccda-converter/vendor/quirks/cerner.js +26 -0
- package/dist/lib/ccda-converter/vendor/quirks/cerner.js.map +1 -0
- package/dist/lib/ccda-converter/vendor/quirks/epic.d.ts +7 -0
- package/dist/lib/ccda-converter/vendor/quirks/epic.d.ts.map +1 -0
- package/dist/lib/ccda-converter/vendor/quirks/epic.js +29 -0
- package/dist/lib/ccda-converter/vendor/quirks/epic.js.map +1 -0
- package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -1
- package/dist/lib/fhir-converter/converters-clinical.js +26 -5
- package/dist/lib/fhir-converter/converters-clinical.js.map +1 -1
- package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -1
- package/dist/lib/fhir-converter/converters-demographics.js +13 -3
- package/dist/lib/fhir-converter/converters-demographics.js.map +1 -1
- package/dist/lib/fhir-converter/index.d.ts.map +1 -1
- package/dist/lib/fhir-converter/index.js +15 -4
- package/dist/lib/fhir-converter/index.js.map +1 -1
- package/dist/lib/fhir-converter/types.d.ts +24 -0
- package/dist/lib/fhir-converter/types.d.ts.map +1 -1
- package/dist/lib/fhir-converter/types.js +54 -1
- package/dist/lib/fhir-converter/types.js.map +1 -1
- package/dist/lib/reconciler.d.ts.map +1 -1
- package/dist/lib/reconciler.js +196 -27
- package/dist/lib/reconciler.js.map +1 -1
- package/dist/lib/user-resolutions.d.ts +54 -0
- package/dist/lib/user-resolutions.d.ts.map +1 -0
- package/dist/lib/user-resolutions.js +224 -0
- package/dist/lib/user-resolutions.js.map +1 -0
- package/dist/shapes/checkup.shapes.ttl +0 -10
- package/dist/shapes/core.shapes.ttl +43 -0
- package/dist/shapes/core.ttl +90 -2
- package/dist/shapes/health.shapes.ttl +27 -0
- package/package.json +2 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native C-CDA R2.1 to Cascade Protocol Turtle converter.
|
|
3
|
+
*
|
|
4
|
+
* Converts HL7 Clinical Document Architecture R2.1 XML (as exported by Epic MyChart,
|
|
5
|
+
* Cerner PowerChart, Athena, and other EHR systems) directly to Cascade Protocol RDF.
|
|
6
|
+
*
|
|
7
|
+
* Converting natively (without going through FHIR as an intermediary) preserves:
|
|
8
|
+
* - CVX codes for immunizations
|
|
9
|
+
* - LOINC codes for labs and vitals
|
|
10
|
+
* - RxNorm codes for medications
|
|
11
|
+
* - SNOMED CT codes for problems and procedures
|
|
12
|
+
* - ICD-10 codes for diagnoses
|
|
13
|
+
* - Lab reference ranges (health:referenceRangeText)
|
|
14
|
+
*
|
|
15
|
+
* Supports both single C-CDA XML files and IHE XDM zip bundles
|
|
16
|
+
* (multiple C-CDA documents per zip).
|
|
17
|
+
*/
|
|
18
|
+
import AdmZip from 'adm-zip';
|
|
19
|
+
import { Writer, DataFactory } from 'n3';
|
|
20
|
+
import { NS, TURTLE_PREFIXES } from '../fhir-converter/types.js';
|
|
21
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
22
|
+
import { parseCcdaXml } from './parser.js';
|
|
23
|
+
import { detectVendor, getSourceSystemName } from './vendor/detect.js';
|
|
24
|
+
import { applyVendorNormalization } from './vendor/normalize.js';
|
|
25
|
+
import { detectDocumentType } from './document-type.js';
|
|
26
|
+
import { extractPatientQuads } from './sections/patient.js';
|
|
27
|
+
import { extractImmunizationQuads, IMMUNIZATIONS_TEMPLATE_ID } from './sections/immunizations.js';
|
|
28
|
+
import { extractLabQuads, LABS_TEMPLATE_ID } from './sections/labs.js';
|
|
29
|
+
import { extractProblemQuads, PROBLEMS_TEMPLATE_ID } from './sections/problems.js';
|
|
30
|
+
import { extractAllergyQuads, ALLERGIES_TEMPLATE_ID } from './sections/allergies.js';
|
|
31
|
+
import { extractMedicationQuads, MEDICATIONS_TEMPLATE_ID } from './sections/medications.js';
|
|
32
|
+
import { extractVitalQuads, VITALS_TEMPLATE_ID } from './sections/vitals.js';
|
|
33
|
+
import { extractProcedureQuads, PROCEDURES_TEMPLATE_ID } from './sections/procedures.js';
|
|
34
|
+
import { extractEncounterQuads, ENCOUNTERS_TEMPLATE_ID } from './sections/encounters.js';
|
|
35
|
+
import { extractFamilyHistoryQuads, FAMILY_HISTORY_TEMPLATE_ID } from './sections/family-history.js';
|
|
36
|
+
import { extractDeviceQuads, DEVICES_TEMPLATE_ID } from './sections/devices.js';
|
|
37
|
+
import { extractSocialHistoryQuads, SOCIAL_HISTORY_TEMPLATE_ID } from './sections/social-history.js';
|
|
38
|
+
import { extractNarrativeQuads } from './narrative.js';
|
|
39
|
+
// Map templateId → extractor function and LOINC code
|
|
40
|
+
const SECTION_HANDLERS = {
|
|
41
|
+
[IMMUNIZATIONS_TEMPLATE_ID]: { loinc: '11369-6', extract: extractImmunizationQuads },
|
|
42
|
+
[LABS_TEMPLATE_ID]: { loinc: '30954-2', extract: extractLabQuads },
|
|
43
|
+
[PROBLEMS_TEMPLATE_ID]: { loinc: '11450-4', extract: extractProblemQuads },
|
|
44
|
+
[ALLERGIES_TEMPLATE_ID]: { loinc: '48765-2', extract: extractAllergyQuads },
|
|
45
|
+
[MEDICATIONS_TEMPLATE_ID]: { loinc: '10160-0', extract: extractMedicationQuads },
|
|
46
|
+
[VITALS_TEMPLATE_ID]: { loinc: '8716-3', extract: extractVitalQuads },
|
|
47
|
+
[PROCEDURES_TEMPLATE_ID]: { loinc: '47519-4', extract: extractProcedureQuads },
|
|
48
|
+
[ENCOUNTERS_TEMPLATE_ID]: { loinc: '46240-8', extract: extractEncounterQuads },
|
|
49
|
+
[FAMILY_HISTORY_TEMPLATE_ID]: { loinc: '10157-6', extract: extractFamilyHistoryQuads },
|
|
50
|
+
[DEVICES_TEMPLATE_ID]: { loinc: '46264-8', extract: extractDeviceQuads },
|
|
51
|
+
[SOCIAL_HISTORY_TEMPLATE_ID]: { loinc: '29762-2', extract: extractSocialHistoryQuads },
|
|
52
|
+
};
|
|
53
|
+
// Template IDs known to be narrative-only (no structured extractor needed)
|
|
54
|
+
const NARRATIVE_ONLY_TEMPLATE_IDS = new Set([
|
|
55
|
+
'2.16.840.1.113883.10.20.22.2.10', // plan of care
|
|
56
|
+
]);
|
|
57
|
+
/**
|
|
58
|
+
* Convert a C-CDA XML document (or IHE XDM zip) to Cascade Protocol Turtle.
|
|
59
|
+
*
|
|
60
|
+
* @param xmlOrZip C-CDA XML string, or a Buffer containing an IHE XDM zip
|
|
61
|
+
* @param options Optional source system name and importedAt timestamp
|
|
62
|
+
*/
|
|
63
|
+
export async function convertCcda(xmlOrZip, options = {}) {
|
|
64
|
+
const warnings = [];
|
|
65
|
+
const allQuads = [];
|
|
66
|
+
let resourceCount = 0;
|
|
67
|
+
const importedAt = options.importedAt ?? new Date().toISOString();
|
|
68
|
+
// Handle IHE XDM zip vs single XML
|
|
69
|
+
const xmlFiles = [];
|
|
70
|
+
if (Buffer.isBuffer(xmlOrZip)) {
|
|
71
|
+
try {
|
|
72
|
+
const zip = new AdmZip(xmlOrZip);
|
|
73
|
+
for (const entry of zip.getEntries()) {
|
|
74
|
+
if (entry.entryName.toLowerCase().endsWith('.xml') && !entry.isDirectory) {
|
|
75
|
+
xmlFiles.push(entry.getData().toString('utf-8'));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Not a valid zip — treat as raw XML
|
|
81
|
+
xmlFiles.push(xmlOrZip.toString('utf-8'));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
xmlFiles.push(xmlOrZip);
|
|
86
|
+
}
|
|
87
|
+
for (const xml of xmlFiles) {
|
|
88
|
+
try {
|
|
89
|
+
const result = convertSingleCcda(xml, options, importedAt, warnings);
|
|
90
|
+
allQuads.push(...result.quads);
|
|
91
|
+
resourceCount += result.count;
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
warnings.push(`Failed to convert C-CDA document: ${err instanceof Error ? err.message : String(err)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Serialize all quads to Turtle
|
|
98
|
+
const output = await new Promise((resolve, reject) => {
|
|
99
|
+
const writer = new Writer({ prefixes: TURTLE_PREFIXES });
|
|
100
|
+
for (const q of allQuads)
|
|
101
|
+
writer.addQuad(q);
|
|
102
|
+
writer.end((err, result) => (err ? reject(err) : resolve(result)));
|
|
103
|
+
});
|
|
104
|
+
const errors = [];
|
|
105
|
+
if (allQuads.length === 0) {
|
|
106
|
+
errors.push('C-CDA conversion produced no output — document may be invalid or unsupported');
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
success: allQuads.length > 0,
|
|
110
|
+
output,
|
|
111
|
+
format: 'turtle',
|
|
112
|
+
resourceCount,
|
|
113
|
+
skippedCount: 0,
|
|
114
|
+
warnings,
|
|
115
|
+
errors,
|
|
116
|
+
results: [],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function convertSingleCcda(xml, options, importedAt, warnings) {
|
|
120
|
+
const parsed = parseCcdaXml(xml);
|
|
121
|
+
// Detect vendor and apply normalization
|
|
122
|
+
const vendor = detectVendor(parsed);
|
|
123
|
+
const normalizedDoc = applyVendorNormalization(parsed, vendor);
|
|
124
|
+
if (vendor !== 'unknown') {
|
|
125
|
+
warnings.push(`Detected EHR vendor: ${vendor}`);
|
|
126
|
+
}
|
|
127
|
+
const ccdaDoc = normalizedDoc?.ClinicalDocument ?? normalizedDoc;
|
|
128
|
+
const sourceSystem = options.sourceSystem ?? getSourceSystemName(normalizedDoc);
|
|
129
|
+
const documentType = detectDocumentType(normalizedDoc);
|
|
130
|
+
// Document ID for narrative linking
|
|
131
|
+
const docIdEl = Array.isArray(ccdaDoc?.id) ? ccdaDoc.id[0] : ccdaDoc?.id;
|
|
132
|
+
const documentId = docIdEl?.['@_extension']
|
|
133
|
+
? `${docIdEl['@_root'] ?? ''}:${docIdEl['@_extension']}`
|
|
134
|
+
: docIdEl?.extension
|
|
135
|
+
? `${docIdEl.root ?? ''}:${docIdEl.extension}`
|
|
136
|
+
: `doc:${importedAt}`;
|
|
137
|
+
const allQuads = [];
|
|
138
|
+
let count = 0;
|
|
139
|
+
// Extract patient demographics
|
|
140
|
+
const recordTarget = ccdaDoc?.recordTarget;
|
|
141
|
+
if (!recordTarget) {
|
|
142
|
+
warnings.push('C-CDA document has no recordTarget — patient demographics not extracted');
|
|
143
|
+
return { quads: allQuads, count };
|
|
144
|
+
}
|
|
145
|
+
const { quads: patientQuads, patientUri } = extractPatientQuads(Array.isArray(recordTarget) ? recordTarget : [recordTarget], sourceSystem);
|
|
146
|
+
allQuads.push(...patientQuads);
|
|
147
|
+
count++;
|
|
148
|
+
// Process each section
|
|
149
|
+
// ccdaDoc.component is always an array (fast-xml-parser isArray config), so we must
|
|
150
|
+
// search through the array for the element that contains structuredBody rather than
|
|
151
|
+
// accessing .structuredBody directly on the array.
|
|
152
|
+
const componentTopLevel = ccdaDoc?.component;
|
|
153
|
+
const componentTopArr = Array.isArray(componentTopLevel)
|
|
154
|
+
? componentTopLevel
|
|
155
|
+
: componentTopLevel ? [componentTopLevel] : [];
|
|
156
|
+
const body = componentTopArr.find((c) => c?.structuredBody)?.structuredBody
|
|
157
|
+
?? ccdaDoc?.structuredBody;
|
|
158
|
+
const components = body?.component ?? [];
|
|
159
|
+
const componentArr = Array.isArray(components) ? components : [components];
|
|
160
|
+
for (const comp of componentArr) {
|
|
161
|
+
const section = comp?.section ?? comp;
|
|
162
|
+
if (!section)
|
|
163
|
+
continue;
|
|
164
|
+
// Find template ID
|
|
165
|
+
const templateIdRaw = Array.isArray(section?.templateId)
|
|
166
|
+
? section.templateId
|
|
167
|
+
: section?.templateId ? [section.templateId] : [];
|
|
168
|
+
const templateIds = templateIdRaw.map((t) => t?.['@_root'] ?? t?.root ?? '').filter(Boolean);
|
|
169
|
+
const matchedTemplateId = templateIds.find((id) => SECTION_HANDLERS[id]);
|
|
170
|
+
// Get LOINC from section code
|
|
171
|
+
const sectionCode = section?.code?.['@_code'] ?? section?.code?.code ?? '';
|
|
172
|
+
// Extract narrative
|
|
173
|
+
const sectionText = section?.text;
|
|
174
|
+
if (sectionText) {
|
|
175
|
+
const effectiveLoinc = sectionCode || (matchedTemplateId ? (SECTION_HANDLERS[matchedTemplateId]?.loinc ?? '') : '');
|
|
176
|
+
const narrativeQuads = extractNarrativeQuads(sectionText, effectiveLoinc, documentType, documentId, sourceSystem, importedAt);
|
|
177
|
+
allQuads.push(...narrativeQuads);
|
|
178
|
+
}
|
|
179
|
+
// Extract structured entries
|
|
180
|
+
if (matchedTemplateId && SECTION_HANDLERS[matchedTemplateId]) {
|
|
181
|
+
const handler = SECTION_HANDLERS[matchedTemplateId];
|
|
182
|
+
const entries = Array.isArray(section?.entry)
|
|
183
|
+
? section.entry
|
|
184
|
+
: section?.entry ? [section.entry] : [];
|
|
185
|
+
const quads = handler.extract(entries, patientUri, sourceSystem);
|
|
186
|
+
// Tag each structured record from a summarization document so the
|
|
187
|
+
// reconciler can apply a lower confidence threshold for deduplication.
|
|
188
|
+
// Summarization documents (LOINC 34133-9) contain the patient's full
|
|
189
|
+
// history snapshot — the same record appearing in two such documents is
|
|
190
|
+
// almost certainly a duplicate.
|
|
191
|
+
if (documentType === 'summarization') {
|
|
192
|
+
const subjects = new Set(quads
|
|
193
|
+
.filter((q) => q.predicate.value === NS.rdf + 'type')
|
|
194
|
+
.map((q) => q.subject.value));
|
|
195
|
+
for (const subjectUri of subjects) {
|
|
196
|
+
quads.push(makeQuad(namedNode(subjectUri), namedNode(NS.cascade + 'documentType'), literal(documentType)));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
allQuads.push(...quads);
|
|
200
|
+
count += entries.length;
|
|
201
|
+
}
|
|
202
|
+
else if (templateIds.length > 0) {
|
|
203
|
+
const isKnownNarrativeOnly = templateIds.some((id) => NARRATIVE_ONLY_TEMPLATE_IDS.has(id));
|
|
204
|
+
if (!isKnownNarrativeOnly) {
|
|
205
|
+
warnings.push(`Unknown section templateId: ${templateIds[0]} — narrative preserved if present`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { quads: allQuads, count };
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/ccda-converter/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract C-CDA section narrative <text> blocks as clinical:ClinicalDocument nodes.
|
|
3
|
+
*/
|
|
4
|
+
import type { Quad } from 'n3';
|
|
5
|
+
export declare function extractNarrativeQuads(sectionText: any, sectionLoincCode: string, documentType: string, documentId: string, sourceSystem: string, importedAt: string): Quad[];
|
|
6
|
+
//# sourceMappingURL=narrative.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative.d.ts","sourceRoot":"","sources":["../../../src/lib/ccda-converter/narrative.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI/B,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,GAAG,EAChB,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,IAAI,EAAE,CA2BR"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract C-CDA section narrative <text> blocks as clinical:ClinicalDocument nodes.
|
|
3
|
+
*/
|
|
4
|
+
import { NS, contentHashedUri } from '../fhir-converter/types.js';
|
|
5
|
+
import { DataFactory } from 'n3';
|
|
6
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
7
|
+
export function extractNarrativeQuads(sectionText, sectionLoincCode, documentType, documentId, sourceSystem, importedAt) {
|
|
8
|
+
if (!sectionText)
|
|
9
|
+
return [];
|
|
10
|
+
// Convert the narrative to a string
|
|
11
|
+
let narrativeStr = '';
|
|
12
|
+
if (typeof sectionText === 'string') {
|
|
13
|
+
narrativeStr = sectionText;
|
|
14
|
+
}
|
|
15
|
+
else if (typeof sectionText === 'object') {
|
|
16
|
+
narrativeStr = JSON.stringify(sectionText);
|
|
17
|
+
}
|
|
18
|
+
if (!narrativeStr.trim())
|
|
19
|
+
return [];
|
|
20
|
+
const uri = contentHashedUri('ClinicalDocument', {
|
|
21
|
+
section: sectionLoincCode,
|
|
22
|
+
document: documentId,
|
|
23
|
+
source: sourceSystem,
|
|
24
|
+
});
|
|
25
|
+
const subj = namedNode(uri);
|
|
26
|
+
return [
|
|
27
|
+
makeQuad(subj, namedNode(NS.rdf + 'type'), namedNode(NS.clinical + 'ClinicalDocument')),
|
|
28
|
+
makeQuad(subj, namedNode(NS.clinical + 'documentType'), literal(documentType)),
|
|
29
|
+
makeQuad(subj, namedNode(NS.cascade + 'sectionCode'), literal(sectionLoincCode)),
|
|
30
|
+
makeQuad(subj, namedNode(NS.clinical + 'content'), literal(narrativeStr)),
|
|
31
|
+
makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(sourceSystem)),
|
|
32
|
+
makeQuad(subj, namedNode(NS.prov + 'generatedAtTime'), literal(importedAt, namedNode(NS.xsd + 'dateTime'))),
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=narrative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative.js","sourceRoot":"","sources":["../../../src/lib/ccda-converter/narrative.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGjC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;AAE3D,MAAM,UAAU,qBAAqB,CACnC,WAAgB,EAChB,gBAAwB,EACxB,YAAoB,EACpB,UAAkB,EAClB,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,oCAAoC;IACpC,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,YAAY,GAAG,WAAW,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC3C,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,GAAG,GAAG,gBAAgB,CAAC,kBAAkB,EAAE;QAC/C,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO;QACL,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,GAAG,kBAAkB,CAAC,CAAC;QACvF,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9E,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChF,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACzE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7E,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,GAAG,iBAAiB,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;KAC5G,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/ccda-converter/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAE7C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XML parser for C-CDA documents.
|
|
3
|
+
* Uses fast-xml-parser with attribute support and array normalization.
|
|
4
|
+
*/
|
|
5
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
6
|
+
const xmlParser = new XMLParser({
|
|
7
|
+
ignoreAttributes: false,
|
|
8
|
+
attributeNamePrefix: '@_',
|
|
9
|
+
textNodeName: '#text',
|
|
10
|
+
isArray: (name) => {
|
|
11
|
+
// These elements should always be arrays
|
|
12
|
+
return [
|
|
13
|
+
'entry', 'component', 'observation', 'substanceAdministration',
|
|
14
|
+
'act', 'encounter', 'procedure', 'id', 'name', 'telecom', 'addr',
|
|
15
|
+
'entryRelationship', 'participant',
|
|
16
|
+
].includes(name);
|
|
17
|
+
},
|
|
18
|
+
allowBooleanAttributes: true,
|
|
19
|
+
});
|
|
20
|
+
export function parseCcdaXml(xml) {
|
|
21
|
+
return xmlParser.parse(xml);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/ccda-converter/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;IAC9B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,OAAO;IACrB,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;QACxB,yCAAyC;QACzC,OAAO;YACL,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,yBAAyB;YAC9D,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;YAChE,mBAAmB,EAAE,aAAa;SACnC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,sBAAsB,EAAE,IAAI;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract allergies from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.6.1)
|
|
3
|
+
*/
|
|
4
|
+
import type { Quad } from 'n3';
|
|
5
|
+
export declare const ALLERGIES_TEMPLATE_ID = "2.16.840.1.113883.10.20.22.2.6.1";
|
|
6
|
+
export declare const ALLERGIES_LOINC = "48765-2";
|
|
7
|
+
export declare function extractAllergyQuads(entries: any[], patientUri: string, sourceSystem: string): Quad[];
|
|
8
|
+
//# sourceMappingURL=allergies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allergies.d.ts","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/allergies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI/B,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AACxE,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,GAAG,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,EAAE,CAyDR"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract allergies from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.6.1)
|
|
3
|
+
*/
|
|
4
|
+
import { NS, contentHashedUri } from '../../fhir-converter/types.js';
|
|
5
|
+
import { DataFactory } from 'n3';
|
|
6
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
7
|
+
export const ALLERGIES_TEMPLATE_ID = '2.16.840.1.113883.10.20.22.2.6.1';
|
|
8
|
+
export const ALLERGIES_LOINC = '48765-2';
|
|
9
|
+
export function extractAllergyQuads(entries, patientUri, sourceSystem) {
|
|
10
|
+
const quads = [];
|
|
11
|
+
for (const entry of entries) {
|
|
12
|
+
// entry.act is always an array from fast-xml-parser's isArray config — unwrap first element
|
|
13
|
+
const actRaw = entry?.act;
|
|
14
|
+
const act = Array.isArray(actRaw) ? actRaw[0] : (actRaw ?? entry);
|
|
15
|
+
const obs = act?.entryRelationship?.observation ?? act?.observation ?? act;
|
|
16
|
+
const obsArr = Array.isArray(obs) ? obs : [obs];
|
|
17
|
+
for (const observation of obsArr) {
|
|
18
|
+
// Allergen is typically in participant/playingEntity
|
|
19
|
+
const participant = Array.isArray(observation?.participant)
|
|
20
|
+
? observation.participant[0]
|
|
21
|
+
: observation?.participant;
|
|
22
|
+
const playingEntity = participant?.participantRole?.playingEntity ?? {};
|
|
23
|
+
const allergenCode = playingEntity?.code ?? {};
|
|
24
|
+
const allergenName = typeof playingEntity?.name === 'string'
|
|
25
|
+
? playingEntity.name
|
|
26
|
+
: playingEntity?.name?.['#text'] ??
|
|
27
|
+
allergenCode?.['@_displayName'] ??
|
|
28
|
+
allergenCode?.displayName ?? '';
|
|
29
|
+
// Reaction/severity from entryRelationship
|
|
30
|
+
const reactions = Array.isArray(observation?.entryRelationship)
|
|
31
|
+
? observation.entryRelationship
|
|
32
|
+
: observation?.entryRelationship ? [observation.entryRelationship] : [];
|
|
33
|
+
const severityObs = reactions.find((r) => r?.observation?.code?.['@_code'] === 'SEV' || r?.typeCode === 'SUBJ')?.observation;
|
|
34
|
+
const severityCode = severityObs?.value?.['@_displayName'] ?? severityObs?.value?.displayName ?? '';
|
|
35
|
+
if (!allergenName)
|
|
36
|
+
continue;
|
|
37
|
+
const sourceId = (() => {
|
|
38
|
+
const idEl = Array.isArray(act?.id) ? act.id[0] : act?.id;
|
|
39
|
+
return idEl?.['@_extension'] ? `${idEl['@_root'] ?? ''}:${idEl['@_extension']}` : '';
|
|
40
|
+
})();
|
|
41
|
+
const uri = contentHashedUri('Allergy', {
|
|
42
|
+
patient: patientUri,
|
|
43
|
+
allergenName: allergenName.toLowerCase(),
|
|
44
|
+
}, sourceId || undefined);
|
|
45
|
+
const subj = namedNode(uri);
|
|
46
|
+
quads.push(makeQuad(subj, namedNode(NS.rdf + 'type'), namedNode(NS.health + 'AllergyRecord')));
|
|
47
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(sourceSystem)));
|
|
48
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'allergen'), literal(allergenName)));
|
|
49
|
+
if (severityCode)
|
|
50
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'allergySeverity'), literal(severityCode.toLowerCase())));
|
|
51
|
+
if (sourceId)
|
|
52
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceRecordId'), literal(sourceId)));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return quads;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=allergies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allergies.js","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/allergies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract implanted devices from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.23)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import type { Quad } from 'n3';
|
|
6
|
+
export declare const DEVICES_TEMPLATE_ID = "2.16.840.1.113883.10.20.22.2.23";
|
|
7
|
+
export declare const DEVICES_LOINC = "46264-8";
|
|
8
|
+
export declare function extractDeviceQuads(entries: any[], patientUri: string, sourceSystem: string): Quad[];
|
|
9
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/devices.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI/B,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,GAAG,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,EAAE,CA2CR"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract implanted devices from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.23)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import { NS, contentHashedUri } from '../../fhir-converter/types.js';
|
|
6
|
+
import { DataFactory } from 'n3';
|
|
7
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
8
|
+
export const DEVICES_TEMPLATE_ID = '2.16.840.1.113883.10.20.22.2.23';
|
|
9
|
+
export const DEVICES_LOINC = '46264-8';
|
|
10
|
+
export function extractDeviceQuads(entries, patientUri, sourceSystem) {
|
|
11
|
+
const quads = [];
|
|
12
|
+
for (const entry of entries) {
|
|
13
|
+
const supply = entry?.supply ?? entry;
|
|
14
|
+
if (!supply)
|
|
15
|
+
continue;
|
|
16
|
+
const participant = Array.isArray(supply?.participant)
|
|
17
|
+
? supply.participant[0]
|
|
18
|
+
: supply?.participant;
|
|
19
|
+
const device = participant?.participantRole?.playingDevice ?? {};
|
|
20
|
+
const codeEl = device?.code ?? {};
|
|
21
|
+
const displayName = codeEl?.['@_displayName'] ?? codeEl?.displayName ??
|
|
22
|
+
(typeof device?.manufacturerModelName === 'string' ? device.manufacturerModelName : '');
|
|
23
|
+
if (!displayName)
|
|
24
|
+
continue;
|
|
25
|
+
const effTime = supply?.effectiveTime ?? {};
|
|
26
|
+
const dateVal = effTime?.['@_value'] ?? effTime?.value ?? effTime?.low?.['@_value'] ?? '';
|
|
27
|
+
const dateStr = dateVal.length >= 8
|
|
28
|
+
? `${dateVal.slice(0, 4)}-${dateVal.slice(4, 6)}-${dateVal.slice(6, 8)}`
|
|
29
|
+
: dateVal;
|
|
30
|
+
const sourceId = (() => {
|
|
31
|
+
const idEl = Array.isArray(supply?.id) ? supply.id[0] : supply?.id;
|
|
32
|
+
return idEl?.['@_extension'] ? `${idEl['@_root'] ?? ''}:${idEl['@_extension']}` : '';
|
|
33
|
+
})();
|
|
34
|
+
const uri = contentHashedUri('Device', {
|
|
35
|
+
patient: patientUri,
|
|
36
|
+
displayName: displayName.toLowerCase(),
|
|
37
|
+
date: dateStr || undefined,
|
|
38
|
+
}, sourceId || undefined);
|
|
39
|
+
const subj = namedNode(uri);
|
|
40
|
+
quads.push(makeQuad(subj, namedNode(NS.rdf + 'type'), namedNode(NS.clinical + 'ImplantedDevice')));
|
|
41
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(sourceSystem)));
|
|
42
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'deviceName'), literal(displayName)));
|
|
43
|
+
if (dateStr)
|
|
44
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'effectiveDate'), literal(dateStr)));
|
|
45
|
+
if (sourceId)
|
|
46
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceRecordId'), literal(sourceId)));
|
|
47
|
+
}
|
|
48
|
+
return quads;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=devices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/devices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract encounters from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.22)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import type { Quad } from 'n3';
|
|
6
|
+
export declare const ENCOUNTERS_TEMPLATE_ID = "2.16.840.1.113883.10.20.22.2.22";
|
|
7
|
+
export declare const ENCOUNTERS_LOINC = "46240-8";
|
|
8
|
+
export declare function extractEncounterQuads(entries: any[], patientUri: string, sourceSystem: string): Quad[];
|
|
9
|
+
//# sourceMappingURL=encounters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encounters.d.ts","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/encounters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI/B,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,EAAE,CAqCR"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract encounters from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.22)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import { NS, contentHashedUri } from '../../fhir-converter/types.js';
|
|
6
|
+
import { DataFactory } from 'n3';
|
|
7
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
8
|
+
export const ENCOUNTERS_TEMPLATE_ID = '2.16.840.1.113883.10.20.22.2.22';
|
|
9
|
+
export const ENCOUNTERS_LOINC = '46240-8';
|
|
10
|
+
export function extractEncounterQuads(entries, patientUri, sourceSystem) {
|
|
11
|
+
const quads = [];
|
|
12
|
+
for (const entry of entries) {
|
|
13
|
+
const enc = entry?.encounter ?? entry;
|
|
14
|
+
if (!enc)
|
|
15
|
+
continue;
|
|
16
|
+
const codeEl = enc?.code ?? {};
|
|
17
|
+
const displayName = codeEl?.['@_displayName'] ?? codeEl?.displayName ?? '';
|
|
18
|
+
const effTime = enc?.effectiveTime ?? {};
|
|
19
|
+
const dateVal = effTime?.['@_value'] ?? effTime?.value ?? effTime?.low?.['@_value'] ?? '';
|
|
20
|
+
const dateStr = dateVal.length >= 8
|
|
21
|
+
? `${dateVal.slice(0, 4)}-${dateVal.slice(4, 6)}-${dateVal.slice(6, 8)}`
|
|
22
|
+
: dateVal;
|
|
23
|
+
const sourceId = (() => {
|
|
24
|
+
const idEl = Array.isArray(enc?.id) ? enc.id[0] : enc?.id;
|
|
25
|
+
return idEl?.['@_extension'] ? `${idEl['@_root'] ?? ''}:${idEl['@_extension']}` : '';
|
|
26
|
+
})();
|
|
27
|
+
const uri = contentHashedUri('Encounter', {
|
|
28
|
+
patient: patientUri,
|
|
29
|
+
displayName: displayName || undefined,
|
|
30
|
+
date: dateStr || undefined,
|
|
31
|
+
}, sourceId || undefined);
|
|
32
|
+
const subj = namedNode(uri);
|
|
33
|
+
quads.push(makeQuad(subj, namedNode(NS.rdf + 'type'), namedNode(NS.clinical + 'Encounter')));
|
|
34
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(sourceSystem)));
|
|
35
|
+
if (displayName)
|
|
36
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'encounterType'), literal(displayName)));
|
|
37
|
+
if (dateStr)
|
|
38
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'effectiveDate'), literal(dateStr)));
|
|
39
|
+
if (sourceId)
|
|
40
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceRecordId'), literal(sourceId)));
|
|
41
|
+
}
|
|
42
|
+
return quads;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=encounters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encounters.js","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/encounters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract family history from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.15)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import type { Quad } from 'n3';
|
|
6
|
+
export declare const FAMILY_HISTORY_TEMPLATE_ID = "2.16.840.1.113883.10.20.22.2.15";
|
|
7
|
+
export declare const FAMILY_HISTORY_LOINC = "10157-6";
|
|
8
|
+
export declare function extractFamilyHistoryQuads(entries: any[], patientUri: string, sourceSystem: string): Quad[];
|
|
9
|
+
//# sourceMappingURL=family-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"family-history.d.ts","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/family-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI/B,eAAO,MAAM,0BAA0B,oCAAoC,CAAC;AAC5E,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,GAAG,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,EAAE,CAkDR"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract family history from C-CDA section (templateId 2.16.840.1.113883.10.20.22.2.15)
|
|
3
|
+
* Minimal implementation — narrative is preserved by the main converter.
|
|
4
|
+
*/
|
|
5
|
+
import { NS, contentHashedUri } from '../../fhir-converter/types.js';
|
|
6
|
+
import { resolveCodeUri } from '../code-systems.js';
|
|
7
|
+
import { DataFactory } from 'n3';
|
|
8
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
9
|
+
export const FAMILY_HISTORY_TEMPLATE_ID = '2.16.840.1.113883.10.20.22.2.15';
|
|
10
|
+
export const FAMILY_HISTORY_LOINC = '10157-6';
|
|
11
|
+
export function extractFamilyHistoryQuads(entries, patientUri, sourceSystem) {
|
|
12
|
+
const quads = [];
|
|
13
|
+
const snomedOid = '2.16.840.1.113883.6.96';
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
const organizer = entry?.organizer ?? entry;
|
|
16
|
+
if (!organizer)
|
|
17
|
+
continue;
|
|
18
|
+
// Family member relationship
|
|
19
|
+
const subject = organizer?.subject?.relatedSubject;
|
|
20
|
+
const relationCode = subject?.code ?? {};
|
|
21
|
+
const relation = relationCode?.['@_displayName'] ?? relationCode?.displayName ?? '';
|
|
22
|
+
// Observations within the organizer
|
|
23
|
+
const components = Array.isArray(organizer?.component) ? organizer.component : [];
|
|
24
|
+
for (const comp of components) {
|
|
25
|
+
const obs = comp?.observation;
|
|
26
|
+
if (!obs)
|
|
27
|
+
continue;
|
|
28
|
+
const valueEl = obs?.value ?? {};
|
|
29
|
+
const code = valueEl?.['@_code'] ?? valueEl?.code ?? '';
|
|
30
|
+
const codeSystem = valueEl?.['@_codeSystem'] ?? valueEl?.codeSystem ?? '';
|
|
31
|
+
const displayName = valueEl?.['@_displayName'] ?? valueEl?.displayName ?? '';
|
|
32
|
+
const isSnomed = codeSystem.includes('6.96') || codeSystem === snomedOid;
|
|
33
|
+
if (!displayName && !code)
|
|
34
|
+
continue;
|
|
35
|
+
const sourceId = (() => {
|
|
36
|
+
const idEl = Array.isArray(obs?.id) ? obs.id[0] : obs?.id;
|
|
37
|
+
return idEl?.['@_extension'] ? `${idEl['@_root'] ?? ''}:${idEl['@_extension']}` : '';
|
|
38
|
+
})();
|
|
39
|
+
const uri = contentHashedUri('FamilyHistory', {
|
|
40
|
+
patient: patientUri,
|
|
41
|
+
relation: relation || undefined,
|
|
42
|
+
condition: displayName || undefined,
|
|
43
|
+
code: code || undefined,
|
|
44
|
+
}, sourceId || undefined);
|
|
45
|
+
const subj = namedNode(uri);
|
|
46
|
+
quads.push(makeQuad(subj, namedNode(NS.rdf + 'type'), namedNode(NS.health + 'FamilyHistoryRecord')));
|
|
47
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(sourceSystem)));
|
|
48
|
+
if (relation)
|
|
49
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'familyMember'), literal(relation)));
|
|
50
|
+
if (displayName)
|
|
51
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'conditionName'), literal(displayName)));
|
|
52
|
+
if (isSnomed && code)
|
|
53
|
+
quads.push(makeQuad(subj, namedNode(NS.health + 'snomedCode'), namedNode(resolveCodeUri(snomedOid, code))));
|
|
54
|
+
if (sourceId)
|
|
55
|
+
quads.push(makeQuad(subj, namedNode(NS.cascade + 'sourceRecordId'), literal(sourceId)));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return quads;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=family-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"family-history.js","sourceRoot":"","sources":["../../../../src/lib/ccda-converter/sections/family-history.ts"],"names":[],"mappings":"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"}
|