@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.
Files changed (126) hide show
  1. package/dist/commands/capabilities.d.ts.map +1 -1
  2. package/dist/commands/capabilities.js +6 -5
  3. package/dist/commands/capabilities.js.map +1 -1
  4. package/dist/commands/pod/conflicts.d.ts +10 -0
  5. package/dist/commands/pod/conflicts.d.ts.map +1 -0
  6. package/dist/commands/pod/conflicts.js +45 -0
  7. package/dist/commands/pod/conflicts.js.map +1 -0
  8. package/dist/commands/pod/import.d.ts.map +1 -1
  9. package/dist/commands/pod/import.js +85 -6
  10. package/dist/commands/pod/import.js.map +1 -1
  11. package/dist/commands/pod/index.d.ts.map +1 -1
  12. package/dist/commands/pod/index.js +4 -0
  13. package/dist/commands/pod/index.js.map +1 -1
  14. package/dist/commands/pod/resolve.d.ts +10 -0
  15. package/dist/commands/pod/resolve.d.ts.map +1 -0
  16. package/dist/commands/pod/resolve.js +61 -0
  17. package/dist/commands/pod/resolve.js.map +1 -0
  18. package/dist/lib/ccda-converter/code-systems.d.ts +6 -0
  19. package/dist/lib/ccda-converter/code-systems.d.ts.map +1 -0
  20. package/dist/lib/ccda-converter/code-systems.js +27 -0
  21. package/dist/lib/ccda-converter/code-systems.js.map +1 -0
  22. package/dist/lib/ccda-converter/document-type.d.ts +6 -0
  23. package/dist/lib/ccda-converter/document-type.d.ts.map +1 -0
  24. package/dist/lib/ccda-converter/document-type.js +15 -0
  25. package/dist/lib/ccda-converter/document-type.js.map +1 -0
  26. package/dist/lib/ccda-converter/index.d.ts +30 -0
  27. package/dist/lib/ccda-converter/index.d.ts.map +1 -0
  28. package/dist/lib/ccda-converter/index.js +211 -0
  29. package/dist/lib/ccda-converter/index.js.map +1 -0
  30. package/dist/lib/ccda-converter/narrative.d.ts +6 -0
  31. package/dist/lib/ccda-converter/narrative.d.ts.map +1 -0
  32. package/dist/lib/ccda-converter/narrative.js +35 -0
  33. package/dist/lib/ccda-converter/narrative.js.map +1 -0
  34. package/dist/lib/ccda-converter/parser.d.ts +6 -0
  35. package/dist/lib/ccda-converter/parser.d.ts.map +1 -0
  36. package/dist/lib/ccda-converter/parser.js +23 -0
  37. package/dist/lib/ccda-converter/parser.js.map +1 -0
  38. package/dist/lib/ccda-converter/sections/allergies.d.ts +8 -0
  39. package/dist/lib/ccda-converter/sections/allergies.d.ts.map +1 -0
  40. package/dist/lib/ccda-converter/sections/allergies.js +57 -0
  41. package/dist/lib/ccda-converter/sections/allergies.js.map +1 -0
  42. package/dist/lib/ccda-converter/sections/devices.d.ts +9 -0
  43. package/dist/lib/ccda-converter/sections/devices.d.ts.map +1 -0
  44. package/dist/lib/ccda-converter/sections/devices.js +50 -0
  45. package/dist/lib/ccda-converter/sections/devices.js.map +1 -0
  46. package/dist/lib/ccda-converter/sections/encounters.d.ts +9 -0
  47. package/dist/lib/ccda-converter/sections/encounters.d.ts.map +1 -0
  48. package/dist/lib/ccda-converter/sections/encounters.js +44 -0
  49. package/dist/lib/ccda-converter/sections/encounters.js.map +1 -0
  50. package/dist/lib/ccda-converter/sections/family-history.d.ts +9 -0
  51. package/dist/lib/ccda-converter/sections/family-history.d.ts.map +1 -0
  52. package/dist/lib/ccda-converter/sections/family-history.js +60 -0
  53. package/dist/lib/ccda-converter/sections/family-history.js.map +1 -0
  54. package/dist/lib/ccda-converter/sections/immunizations.d.ts +8 -0
  55. package/dist/lib/ccda-converter/sections/immunizations.d.ts.map +1 -0
  56. package/dist/lib/ccda-converter/sections/immunizations.js +62 -0
  57. package/dist/lib/ccda-converter/sections/immunizations.js.map +1 -0
  58. package/dist/lib/ccda-converter/sections/labs.d.ts +8 -0
  59. package/dist/lib/ccda-converter/sections/labs.d.ts.map +1 -0
  60. package/dist/lib/ccda-converter/sections/labs.js +82 -0
  61. package/dist/lib/ccda-converter/sections/labs.js.map +1 -0
  62. package/dist/lib/ccda-converter/sections/medications.d.ts +8 -0
  63. package/dist/lib/ccda-converter/sections/medications.d.ts.map +1 -0
  64. package/dist/lib/ccda-converter/sections/medications.js +68 -0
  65. package/dist/lib/ccda-converter/sections/medications.js.map +1 -0
  66. package/dist/lib/ccda-converter/sections/patient.d.ts +9 -0
  67. package/dist/lib/ccda-converter/sections/patient.d.ts.map +1 -0
  68. package/dist/lib/ccda-converter/sections/patient.js +46 -0
  69. package/dist/lib/ccda-converter/sections/patient.js.map +1 -0
  70. package/dist/lib/ccda-converter/sections/problems.d.ts +8 -0
  71. package/dist/lib/ccda-converter/sections/problems.d.ts.map +1 -0
  72. package/dist/lib/ccda-converter/sections/problems.js +76 -0
  73. package/dist/lib/ccda-converter/sections/problems.js.map +1 -0
  74. package/dist/lib/ccda-converter/sections/procedures.d.ts +8 -0
  75. package/dist/lib/ccda-converter/sections/procedures.d.ts.map +1 -0
  76. package/dist/lib/ccda-converter/sections/procedures.js +57 -0
  77. package/dist/lib/ccda-converter/sections/procedures.js.map +1 -0
  78. package/dist/lib/ccda-converter/sections/social-history.d.ts +9 -0
  79. package/dist/lib/ccda-converter/sections/social-history.d.ts.map +1 -0
  80. package/dist/lib/ccda-converter/sections/social-history.js +11 -0
  81. package/dist/lib/ccda-converter/sections/social-history.js.map +1 -0
  82. package/dist/lib/ccda-converter/sections/vitals.d.ts +8 -0
  83. package/dist/lib/ccda-converter/sections/vitals.d.ts.map +1 -0
  84. package/dist/lib/ccda-converter/sections/vitals.js +75 -0
  85. package/dist/lib/ccda-converter/sections/vitals.js.map +1 -0
  86. package/dist/lib/ccda-converter/vendor/detect.d.ts +7 -0
  87. package/dist/lib/ccda-converter/vendor/detect.d.ts.map +1 -0
  88. package/dist/lib/ccda-converter/vendor/detect.js +30 -0
  89. package/dist/lib/ccda-converter/vendor/detect.js.map +1 -0
  90. package/dist/lib/ccda-converter/vendor/normalize.d.ts +6 -0
  91. package/dist/lib/ccda-converter/vendor/normalize.d.ts.map +1 -0
  92. package/dist/lib/ccda-converter/vendor/normalize.js +13 -0
  93. package/dist/lib/ccda-converter/vendor/normalize.js.map +1 -0
  94. package/dist/lib/ccda-converter/vendor/quirks/cerner.d.ts +7 -0
  95. package/dist/lib/ccda-converter/vendor/quirks/cerner.d.ts.map +1 -0
  96. package/dist/lib/ccda-converter/vendor/quirks/cerner.js +26 -0
  97. package/dist/lib/ccda-converter/vendor/quirks/cerner.js.map +1 -0
  98. package/dist/lib/ccda-converter/vendor/quirks/epic.d.ts +7 -0
  99. package/dist/lib/ccda-converter/vendor/quirks/epic.d.ts.map +1 -0
  100. package/dist/lib/ccda-converter/vendor/quirks/epic.js +29 -0
  101. package/dist/lib/ccda-converter/vendor/quirks/epic.js.map +1 -0
  102. package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -1
  103. package/dist/lib/fhir-converter/converters-clinical.js +26 -5
  104. package/dist/lib/fhir-converter/converters-clinical.js.map +1 -1
  105. package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -1
  106. package/dist/lib/fhir-converter/converters-demographics.js +13 -3
  107. package/dist/lib/fhir-converter/converters-demographics.js.map +1 -1
  108. package/dist/lib/fhir-converter/index.d.ts.map +1 -1
  109. package/dist/lib/fhir-converter/index.js +15 -4
  110. package/dist/lib/fhir-converter/index.js.map +1 -1
  111. package/dist/lib/fhir-converter/types.d.ts +24 -0
  112. package/dist/lib/fhir-converter/types.d.ts.map +1 -1
  113. package/dist/lib/fhir-converter/types.js +54 -1
  114. package/dist/lib/fhir-converter/types.js.map +1 -1
  115. package/dist/lib/reconciler.d.ts.map +1 -1
  116. package/dist/lib/reconciler.js +196 -27
  117. package/dist/lib/reconciler.js.map +1 -1
  118. package/dist/lib/user-resolutions.d.ts +54 -0
  119. package/dist/lib/user-resolutions.d.ts.map +1 -0
  120. package/dist/lib/user-resolutions.js +224 -0
  121. package/dist/lib/user-resolutions.js.map +1 -0
  122. package/dist/shapes/checkup.shapes.ttl +0 -10
  123. package/dist/shapes/core.shapes.ttl +43 -0
  124. package/dist/shapes/core.ttl +90 -2
  125. package/dist/shapes/health.shapes.ttl +27 -0
  126. 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,6 @@
1
+ /**
2
+ * XML parser for C-CDA documents.
3
+ * Uses fast-xml-parser with attribute support and array normalization.
4
+ */
5
+ export declare function parseCcdaXml(xml: string): any;
6
+ //# sourceMappingURL=parser.d.ts.map
@@ -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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"}