@the-cascade-protocol/cli 0.2.5 → 0.3.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 (74) hide show
  1. package/dist/commands/convert.d.ts +8 -5
  2. package/dist/commands/convert.d.ts.map +1 -1
  3. package/dist/commands/convert.js +51 -7
  4. package/dist/commands/convert.js.map +1 -1
  5. package/dist/commands/pod/helpers.d.ts +2 -0
  6. package/dist/commands/pod/helpers.d.ts.map +1 -1
  7. package/dist/commands/pod/helpers.js +62 -1
  8. package/dist/commands/pod/helpers.js.map +1 -1
  9. package/dist/commands/pod/import.d.ts +20 -0
  10. package/dist/commands/pod/import.d.ts.map +1 -0
  11. package/dist/commands/pod/import.js +382 -0
  12. package/dist/commands/pod/import.js.map +1 -0
  13. package/dist/commands/pod/index.d.ts.map +1 -1
  14. package/dist/commands/pod/index.js +2 -0
  15. package/dist/commands/pod/index.js.map +1 -1
  16. package/dist/commands/reconcile.d.ts.map +1 -1
  17. package/dist/commands/reconcile.js +22 -396
  18. package/dist/commands/reconcile.js.map +1 -1
  19. package/dist/lib/fhir-converter/cascade-to-fhir-admin.d.ts +13 -0
  20. package/dist/lib/fhir-converter/cascade-to-fhir-admin.d.ts.map +1 -0
  21. package/dist/lib/fhir-converter/cascade-to-fhir-admin.js +70 -0
  22. package/dist/lib/fhir-converter/cascade-to-fhir-admin.js.map +1 -0
  23. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.d.ts +36 -0
  24. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.d.ts.map +1 -0
  25. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.js +407 -0
  26. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.js.map +1 -0
  27. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.d.ts +15 -0
  28. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.d.ts.map +1 -0
  29. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.js +115 -0
  30. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.js.map +1 -0
  31. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts +9 -3
  32. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts.map +1 -1
  33. package/dist/lib/fhir-converter/cascade-to-fhir.js +69 -290
  34. package/dist/lib/fhir-converter/cascade-to-fhir.js.map +1 -1
  35. package/dist/lib/fhir-converter/converters-clinical-admin.d.ts +16 -0
  36. package/dist/lib/fhir-converter/converters-clinical-admin.d.ts.map +1 -0
  37. package/dist/lib/fhir-converter/converters-clinical-admin.js +166 -0
  38. package/dist/lib/fhir-converter/converters-clinical-admin.js.map +1 -0
  39. package/dist/lib/fhir-converter/converters-clinical.d.ts +28 -0
  40. package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -1
  41. package/dist/lib/fhir-converter/converters-clinical.js +436 -11
  42. package/dist/lib/fhir-converter/converters-clinical.js.map +1 -1
  43. package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -1
  44. package/dist/lib/fhir-converter/converters-demographics.js +4 -5
  45. package/dist/lib/fhir-converter/converters-demographics.js.map +1 -1
  46. package/dist/lib/fhir-converter/converters-passthrough.d.ts +29 -0
  47. package/dist/lib/fhir-converter/converters-passthrough.d.ts.map +1 -0
  48. package/dist/lib/fhir-converter/converters-passthrough.js +86 -0
  49. package/dist/lib/fhir-converter/converters-passthrough.js.map +1 -0
  50. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts +8 -4
  51. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts.map +1 -1
  52. package/dist/lib/fhir-converter/fhir-to-cascade.js +41 -10
  53. package/dist/lib/fhir-converter/fhir-to-cascade.js.map +1 -1
  54. package/dist/lib/fhir-converter/import-manifest.d.ts +40 -0
  55. package/dist/lib/fhir-converter/import-manifest.d.ts.map +1 -0
  56. package/dist/lib/fhir-converter/import-manifest.js +66 -0
  57. package/dist/lib/fhir-converter/import-manifest.js.map +1 -0
  58. package/dist/lib/fhir-converter/index.d.ts +33 -13
  59. package/dist/lib/fhir-converter/index.d.ts.map +1 -1
  60. package/dist/lib/fhir-converter/index.js +38 -17
  61. package/dist/lib/fhir-converter/index.js.map +1 -1
  62. package/dist/lib/fhir-converter/types.d.ts +12 -1
  63. package/dist/lib/fhir-converter/types.d.ts.map +1 -1
  64. package/dist/lib/fhir-converter/types.js +67 -2
  65. package/dist/lib/fhir-converter/types.js.map +1 -1
  66. package/dist/lib/output.d.ts +5 -0
  67. package/dist/lib/output.d.ts.map +1 -1
  68. package/dist/lib/output.js +6 -1
  69. package/dist/lib/output.js.map +1 -1
  70. package/dist/lib/reconciler.d.ts +45 -0
  71. package/dist/lib/reconciler.d.ts.map +1 -0
  72. package/dist/lib/reconciler.js +397 -0
  73. package/dist/lib/reconciler.js.map +1 -0
  74. package/package.json +1 -1
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for clinical record types.
3
+ *
4
+ * Each function receives a predicate-value map (pv) for a single RDF subject
5
+ * and returns a FHIR R4 resource object, or null if the type is not handled here.
6
+ *
7
+ * Handles:
8
+ * health:MedicationRecord -> MedicationStatement
9
+ * health:ConditionRecord -> Condition
10
+ * health:AllergyRecord -> AllergyIntolerance
11
+ * health:LabResultRecord -> Observation (lab)
12
+ * clinical:VitalSign -> Observation (vital-signs)
13
+ * clinical:Procedure -> Procedure
14
+ * clinical:ClinicalDocument -> DocumentReference
15
+ * clinical:Encounter -> Encounter
16
+ * clinical:LaboratoryReport -> DiagnosticReport
17
+ * clinical:MedicationAdministration -> MedicationAdministration
18
+ * clinical:ImplantedDevice -> Device
19
+ * clinical:ImagingStudy -> ImagingStudy
20
+ */
21
+ type PV = Map<string, string[]>;
22
+ type FhirResource = Record<string, any>;
23
+ export declare function restoreMedicationRecord(pv: PV, warnings: string[]): FhirResource;
24
+ export declare function restoreConditionRecord(pv: PV, _warnings: string[]): FhirResource;
25
+ export declare function restoreAllergyRecord(pv: PV, _warnings: string[]): FhirResource;
26
+ export declare function restoreLabResultRecord(pv: PV, _warnings: string[]): FhirResource;
27
+ export declare function restoreVitalSign(pv: PV, warnings: string[]): FhirResource;
28
+ export declare function restoreProcedure(pv: PV, _warnings: string[]): FhirResource;
29
+ export declare function restoreClinicalDocument(pv: PV, _warnings: string[]): FhirResource;
30
+ export declare function restoreEncounter(pv: PV, _warnings: string[]): FhirResource;
31
+ export declare function restoreLaboratoryReport(pv: PV, _warnings: string[]): FhirResource;
32
+ export declare function restoreMedicationAdministration(pv: PV, _warnings: string[]): FhirResource;
33
+ export declare function restoreImplantedDevice(pv: PV, _warnings: string[]): FhirResource;
34
+ export declare function restoreImagingStudy(pv: PV, _warnings: string[]): FhirResource;
35
+ export {};
36
+ //# sourceMappingURL=cascade-to-fhir-clinical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-clinical.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-clinical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAChC,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAMxC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CA8ChF;AAMD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA+BhF;AAMD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA2B9E;AAMD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAwChF;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAmCzE;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAwB1E;AAMD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA2BjF;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAgC1E;AAMD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAyBjF;AAMD,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAwBzF;AAMD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAwBhF;AAMD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAwB7E"}
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for clinical record types.
3
+ *
4
+ * Each function receives a predicate-value map (pv) for a single RDF subject
5
+ * and returns a FHIR R4 resource object, or null if the type is not handled here.
6
+ *
7
+ * Handles:
8
+ * health:MedicationRecord -> MedicationStatement
9
+ * health:ConditionRecord -> Condition
10
+ * health:AllergyRecord -> AllergyIntolerance
11
+ * health:LabResultRecord -> Observation (lab)
12
+ * clinical:VitalSign -> Observation (vital-signs)
13
+ * clinical:Procedure -> Procedure
14
+ * clinical:ClinicalDocument -> DocumentReference
15
+ * clinical:Encounter -> Encounter
16
+ * clinical:LaboratoryReport -> DiagnosticReport
17
+ * clinical:MedicationAdministration -> MedicationAdministration
18
+ * clinical:ImplantedDevice -> Device
19
+ * clinical:ImagingStudy -> ImagingStudy
20
+ */
21
+ import { NS } from './types.js';
22
+ // ---------------------------------------------------------------------------
23
+ // Medications
24
+ // ---------------------------------------------------------------------------
25
+ export function restoreMedicationRecord(pv, warnings) {
26
+ const getFirst = (pred) => pv.get(pred)?.[0];
27
+ const fhirResource = {
28
+ resourceType: 'MedicationStatement',
29
+ status: 'active',
30
+ medicationCodeableConcept: { text: getFirst(NS.health + 'medicationName') ?? '' },
31
+ };
32
+ const isActive = getFirst(NS.health + 'isActive');
33
+ if (isActive === 'false')
34
+ fhirResource.status = 'stopped';
35
+ const drugCodes = pv.get(NS.clinical + 'drugCode') ?? [];
36
+ const codingArr = [];
37
+ for (const uri of drugCodes) {
38
+ if (uri.startsWith(NS.rxnorm)) {
39
+ codingArr.push({ system: 'http://www.nlm.nih.gov/research/umls/rxnorm', code: uri.slice(NS.rxnorm.length) });
40
+ }
41
+ else if (uri.startsWith(NS.sct)) {
42
+ codingArr.push({ system: 'http://snomed.info/sct', code: uri.slice(NS.sct.length) });
43
+ }
44
+ }
45
+ if (codingArr.length > 0)
46
+ fhirResource.medicationCodeableConcept.coding = codingArr;
47
+ const doseText = getFirst(NS.health + 'dose');
48
+ if (doseText)
49
+ fhirResource.dosage = [{ text: doseText }];
50
+ const startDate = getFirst(NS.health + 'startDate');
51
+ const endDate = getFirst(NS.health + 'endDate');
52
+ if (startDate || endDate) {
53
+ fhirResource.effectivePeriod = {};
54
+ if (startDate)
55
+ fhirResource.effectivePeriod.start = startDate;
56
+ if (endDate)
57
+ fhirResource.effectivePeriod.end = endDate;
58
+ }
59
+ const srcId = getFirst(NS.health + 'sourceRecordId');
60
+ if (srcId)
61
+ fhirResource.id = srcId;
62
+ // Warn about Cascade-only fields with no FHIR equivalent
63
+ for (const field of [NS.clinical + 'provenanceClass', NS.clinical + 'clinicalIntent',
64
+ NS.cascade + 'schemaVersion', NS.health + 'medicationClass']) {
65
+ if (getFirst(field)) {
66
+ warnings.push(`Cascade field '${field.split('#')[1] ?? field}' has no FHIR equivalent and was not included in output`);
67
+ }
68
+ }
69
+ return fhirResource;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Conditions
73
+ // ---------------------------------------------------------------------------
74
+ export function restoreConditionRecord(pv, _warnings) {
75
+ const getFirst = (pred) => pv.get(pred)?.[0];
76
+ const fhirResource = {
77
+ resourceType: 'Condition',
78
+ code: { text: getFirst(NS.health + 'conditionName') ?? '' },
79
+ };
80
+ const status = getFirst(NS.health + 'status');
81
+ if (status) {
82
+ fhirResource.clinicalStatus = {
83
+ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/condition-clinical', code: status }],
84
+ };
85
+ }
86
+ const onset = getFirst(NS.health + 'onsetDate');
87
+ if (onset)
88
+ fhirResource.onsetDateTime = onset;
89
+ const codingArr = [];
90
+ for (const uri of pv.get(NS.health + 'icd10Code') ?? []) {
91
+ codingArr.push({ system: 'http://hl7.org/fhir/sid/icd-10-cm', code: uri.startsWith(NS.icd10) ? uri.slice(NS.icd10.length) : uri });
92
+ }
93
+ for (const uri of pv.get(NS.health + 'snomedCode') ?? []) {
94
+ codingArr.push({ system: 'http://snomed.info/sct', code: uri.startsWith(NS.sct) ? uri.slice(NS.sct.length) : uri });
95
+ }
96
+ if (codingArr.length > 0)
97
+ fhirResource.code.coding = codingArr;
98
+ const srcId = getFirst(NS.health + 'sourceRecordId');
99
+ if (srcId)
100
+ fhirResource.id = srcId;
101
+ return fhirResource;
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // Allergies
105
+ // ---------------------------------------------------------------------------
106
+ export function restoreAllergyRecord(pv, _warnings) {
107
+ const getFirst = (pred) => pv.get(pred)?.[0];
108
+ const fhirResource = {
109
+ resourceType: 'AllergyIntolerance',
110
+ code: { text: getFirst(NS.health + 'allergen') ?? '' },
111
+ };
112
+ const cat = getFirst(NS.health + 'allergyCategory');
113
+ if (cat)
114
+ fhirResource.category = [cat];
115
+ const severity = getFirst(NS.health + 'allergySeverity');
116
+ const reaction = getFirst(NS.health + 'reaction');
117
+ if (reaction || severity) {
118
+ const rxn = {};
119
+ if (reaction)
120
+ rxn.manifestation = [{ text: reaction }];
121
+ if (severity)
122
+ rxn.severity = severity;
123
+ fhirResource.reaction = [rxn];
124
+ }
125
+ const onset = getFirst(NS.health + 'onsetDate');
126
+ if (onset)
127
+ fhirResource.onsetDateTime = onset;
128
+ const srcId = getFirst(NS.health + 'sourceRecordId');
129
+ if (srcId)
130
+ fhirResource.id = srcId;
131
+ return fhirResource;
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Lab results (Observation)
135
+ // ---------------------------------------------------------------------------
136
+ export function restoreLabResultRecord(pv, _warnings) {
137
+ const getFirst = (pred) => pv.get(pred)?.[0];
138
+ const fhirResource = {
139
+ resourceType: 'Observation',
140
+ code: { text: getFirst(NS.health + 'testName') ?? '' },
141
+ category: [{ coding: [{ code: 'laboratory' }] }],
142
+ };
143
+ const codingArr = [];
144
+ for (const uri of pv.get(NS.health + 'testCode') ?? []) {
145
+ codingArr.push({ system: 'http://loinc.org', code: uri.startsWith(NS.loinc) ? uri.slice(NS.loinc.length) : uri });
146
+ }
147
+ if (codingArr.length > 0)
148
+ fhirResource.code.coding = codingArr;
149
+ const resultVal = getFirst(NS.health + 'resultValue');
150
+ const resultUnit = getFirst(NS.health + 'resultUnit');
151
+ if (resultVal) {
152
+ const numVal = parseFloat(resultVal);
153
+ if (!isNaN(numVal)) {
154
+ fhirResource.valueQuantity = { value: numVal };
155
+ if (resultUnit)
156
+ fhirResource.valueQuantity.unit = resultUnit;
157
+ }
158
+ else {
159
+ fhirResource.valueString = resultVal;
160
+ }
161
+ }
162
+ const perfDate = getFirst(NS.health + 'performedDate');
163
+ if (perfDate)
164
+ fhirResource.effectiveDateTime = perfDate;
165
+ const interp = getFirst(NS.health + 'interpretation');
166
+ if (interp) {
167
+ const revInterpMap = { normal: 'N', abnormal: 'A', critical: 'HH', unknown: 'UNK' };
168
+ fhirResource.interpretation = [{ coding: [{ code: revInterpMap[interp] ?? interp }] }];
169
+ }
170
+ const srcId = getFirst(NS.health + 'sourceRecordId');
171
+ if (srcId)
172
+ fhirResource.id = srcId;
173
+ return fhirResource;
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Vital signs (Observation)
177
+ // ---------------------------------------------------------------------------
178
+ export function restoreVitalSign(pv, warnings) {
179
+ const getFirst = (pred) => pv.get(pred)?.[0];
180
+ const fhirResource = {
181
+ resourceType: 'Observation',
182
+ code: {},
183
+ category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: 'vital-signs' }] }],
184
+ };
185
+ const loincUri = getFirst(NS.clinical + 'loincCode');
186
+ if (loincUri) {
187
+ const code = loincUri.startsWith(NS.loinc) ? loincUri.slice(NS.loinc.length) : loincUri;
188
+ fhirResource.code.coding = [{ system: 'http://loinc.org', code }];
189
+ }
190
+ const vitalName = getFirst(NS.clinical + 'vitalTypeName');
191
+ if (vitalName)
192
+ fhirResource.code.text = vitalName;
193
+ const value = getFirst(NS.clinical + 'value');
194
+ const unit = getFirst(NS.clinical + 'unit');
195
+ if (value) {
196
+ fhirResource.valueQuantity = { value: parseFloat(value) };
197
+ if (unit)
198
+ fhirResource.valueQuantity.unit = unit;
199
+ }
200
+ const effDate = getFirst(NS.clinical + 'effectiveDate');
201
+ if (effDate)
202
+ fhirResource.effectiveDateTime = effDate;
203
+ const srcId = getFirst(NS.health + 'sourceRecordId');
204
+ if (srcId)
205
+ fhirResource.id = srcId;
206
+ if (getFirst(NS.clinical + 'snomedCode')) {
207
+ warnings.push("Cascade field 'snomedCode' has no standard FHIR Observation field and was not included");
208
+ }
209
+ return fhirResource;
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Procedure
213
+ // ---------------------------------------------------------------------------
214
+ export function restoreProcedure(pv, _warnings) {
215
+ const getFirst = (pred) => pv.get(pred)?.[0];
216
+ const fhirResource = {
217
+ resourceType: 'Procedure',
218
+ code: { text: getFirst(NS.clinical + 'procedureName') ?? '' },
219
+ };
220
+ const status = getFirst(NS.clinical + 'procedureStatus');
221
+ if (status)
222
+ fhirResource.status = status;
223
+ const performedDate = getFirst(NS.clinical + 'performedDate');
224
+ if (performedDate)
225
+ fhirResource.performedDateTime = performedDate;
226
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
227
+ if (srcId)
228
+ fhirResource.id = srcId;
229
+ const snomedUri = pv.get(NS.clinical + 'procedureSnomedCode')?.[0];
230
+ if (snomedUri) {
231
+ const code = snomedUri.startsWith(NS.sct) ? snomedUri.slice(NS.sct.length) : snomedUri;
232
+ fhirResource.code.coding = [{ system: 'http://snomed.info/sct', code }];
233
+ }
234
+ return fhirResource;
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // Clinical document (DocumentReference)
238
+ // ---------------------------------------------------------------------------
239
+ export function restoreClinicalDocument(pv, _warnings) {
240
+ const getFirst = (pred) => pv.get(pred)?.[0];
241
+ const fhirResource = {
242
+ resourceType: 'DocumentReference',
243
+ status: 'current',
244
+ type: { text: getFirst(NS.clinical + 'documentType') ?? '' },
245
+ };
246
+ const docDate = getFirst(NS.clinical + 'documentDate');
247
+ if (docDate)
248
+ fhirResource.date = docDate;
249
+ const contentType = getFirst(NS.clinical + 'contentType');
250
+ const docUrl = getFirst(NS.clinical + 'documentUrl');
251
+ const docTitle = getFirst(NS.clinical + 'documentTitle');
252
+ if (contentType || docUrl || docTitle) {
253
+ const attachment = {};
254
+ if (contentType)
255
+ attachment.contentType = contentType;
256
+ if (docUrl)
257
+ attachment.url = docUrl;
258
+ if (docTitle)
259
+ attachment.title = docTitle;
260
+ fhirResource.content = [{ attachment }];
261
+ }
262
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
263
+ if (srcId)
264
+ fhirResource.id = srcId;
265
+ return fhirResource;
266
+ }
267
+ // ---------------------------------------------------------------------------
268
+ // Encounter
269
+ // ---------------------------------------------------------------------------
270
+ export function restoreEncounter(pv, _warnings) {
271
+ const getFirst = (pred) => pv.get(pred)?.[0];
272
+ const fhirResource = {
273
+ resourceType: 'Encounter',
274
+ status: getFirst(NS.clinical + 'encounterStatus') ?? 'finished',
275
+ };
276
+ const encClass = getFirst(NS.clinical + 'encounterClass');
277
+ if (encClass)
278
+ fhirResource.class = { code: encClass };
279
+ const encType = getFirst(NS.clinical + 'encounterType');
280
+ if (encType)
281
+ fhirResource.type = [{ text: encType }];
282
+ const start = getFirst(NS.clinical + 'encounterStart');
283
+ const end = getFirst(NS.clinical + 'encounterEnd');
284
+ if (start || end) {
285
+ fhirResource.period = {};
286
+ if (start)
287
+ fhirResource.period.start = start;
288
+ if (end)
289
+ fhirResource.period.end = end;
290
+ }
291
+ const provName = getFirst(NS.clinical + 'providerName');
292
+ if (provName)
293
+ fhirResource.participant = [{ individual: { display: provName } }];
294
+ const facility = getFirst(NS.clinical + 'facilityName');
295
+ if (facility)
296
+ fhirResource.serviceProvider = { display: facility };
297
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
298
+ if (srcId)
299
+ fhirResource.id = srcId;
300
+ return fhirResource;
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Laboratory report (DiagnosticReport)
304
+ // ---------------------------------------------------------------------------
305
+ export function restoreLaboratoryReport(pv, _warnings) {
306
+ const getFirst = (pred) => pv.get(pred)?.[0];
307
+ const fhirResource = {
308
+ resourceType: 'DiagnosticReport',
309
+ status: 'final',
310
+ code: { text: getFirst(NS.clinical + 'panelName') ?? '' },
311
+ };
312
+ const loincUri = getFirst(NS.clinical + 'loincCode');
313
+ if (loincUri) {
314
+ const code = loincUri.startsWith(NS.loinc) ? loincUri.slice(NS.loinc.length) : loincUri;
315
+ fhirResource.code.coding = [{ system: 'http://loinc.org', code }];
316
+ }
317
+ const category = getFirst(NS.clinical + 'reportCategory');
318
+ if (category)
319
+ fhirResource.category = [{ coding: [{ code: category }] }];
320
+ const effDate = getFirst(NS.clinical + 'performedDate');
321
+ if (effDate)
322
+ fhirResource.effectiveDateTime = effDate;
323
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
324
+ if (srcId)
325
+ fhirResource.id = srcId;
326
+ return fhirResource;
327
+ }
328
+ // ---------------------------------------------------------------------------
329
+ // Medication administration
330
+ // ---------------------------------------------------------------------------
331
+ export function restoreMedicationAdministration(pv, _warnings) {
332
+ const getFirst = (pred) => pv.get(pred)?.[0];
333
+ const fhirResource = {
334
+ resourceType: 'MedicationAdministration',
335
+ status: getFirst(NS.clinical + 'administrationStatus') ?? 'completed',
336
+ medicationCodeableConcept: { text: getFirst(NS.health + 'medicationName') ?? '' },
337
+ };
338
+ const adminDate = getFirst(NS.clinical + 'administeredDate');
339
+ if (adminDate)
340
+ fhirResource.effectiveDateTime = adminDate;
341
+ const dose = getFirst(NS.clinical + 'administeredDose');
342
+ const route = getFirst(NS.clinical + 'administeredRoute');
343
+ if (dose || route) {
344
+ fhirResource.dosage = {};
345
+ if (dose)
346
+ fhirResource.dosage.dose = { value: dose };
347
+ if (route)
348
+ fhirResource.dosage.route = { text: route };
349
+ }
350
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
351
+ if (srcId)
352
+ fhirResource.id = srcId;
353
+ return fhirResource;
354
+ }
355
+ // ---------------------------------------------------------------------------
356
+ // Implanted device
357
+ // ---------------------------------------------------------------------------
358
+ export function restoreImplantedDevice(pv, _warnings) {
359
+ const getFirst = (pred) => pv.get(pred)?.[0];
360
+ const fhirResource = {
361
+ resourceType: 'Device',
362
+ status: getFirst(NS.clinical + 'deviceStatus') ?? 'active',
363
+ };
364
+ const deviceType = getFirst(NS.clinical + 'deviceType');
365
+ if (deviceType)
366
+ fhirResource.type = { text: deviceType };
367
+ const manufacturer = getFirst(NS.clinical + 'deviceManufacturer');
368
+ if (manufacturer)
369
+ fhirResource.manufacturer = manufacturer;
370
+ const udi = getFirst(NS.clinical + 'udiCarrier');
371
+ if (udi)
372
+ fhirResource.udiCarrier = [{ deviceIdentifier: udi }];
373
+ const implantDate = getFirst(NS.clinical + 'implantDate');
374
+ if (implantDate)
375
+ fhirResource.manufactureDate = implantDate;
376
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
377
+ if (srcId)
378
+ fhirResource.id = srcId;
379
+ return fhirResource;
380
+ }
381
+ // ---------------------------------------------------------------------------
382
+ // Imaging study
383
+ // ---------------------------------------------------------------------------
384
+ export function restoreImagingStudy(pv, _warnings) {
385
+ const getFirst = (pred) => pv.get(pred)?.[0];
386
+ const fhirResource = {
387
+ resourceType: 'ImagingStudy',
388
+ status: 'available',
389
+ };
390
+ const modality = getFirst(NS.clinical + 'imagingModality');
391
+ const description = getFirst(NS.clinical + 'studyDescription');
392
+ if (description)
393
+ fhirResource.description = description;
394
+ const studyDate = getFirst(NS.clinical + 'studyDate');
395
+ if (studyDate)
396
+ fhirResource.started = studyDate;
397
+ const dicomUid = getFirst(NS.clinical + 'dicomStudyUid');
398
+ if (dicomUid)
399
+ fhirResource.identifier = [{ value: dicomUid }];
400
+ if (modality)
401
+ fhirResource.series = [{ modality: { code: modality } }];
402
+ const srcId = getFirst(NS.clinical + 'sourceRecordId');
403
+ if (srcId)
404
+ fhirResource.id = srcId;
405
+ return fhirResource;
406
+ }
407
+ //# sourceMappingURL=cascade-to-fhir-clinical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-clinical.js","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-clinical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for demographic and administrative types.
3
+ *
4
+ * Handles:
5
+ * cascade:PatientProfile -> Patient
6
+ * health:ImmunizationRecord -> Immunization
7
+ * coverage:InsurancePlan -> Coverage
8
+ */
9
+ type PV = Map<string, string[]>;
10
+ type FhirResource = Record<string, any>;
11
+ export declare function restorePatientProfile(pv: PV, warnings: string[]): FhirResource;
12
+ export declare function restoreImmunizationRecord(pv: PV, _warnings: string[]): FhirResource;
13
+ export declare function restoreInsurancePlan(pv: PV, _warnings: string[]): FhirResource;
14
+ export {};
15
+ //# sourceMappingURL=cascade-to-fhir-demographics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-demographics.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-demographics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAChC,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAMxC,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAoC9E;AAMD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA4BnF;AAMD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAoC9E"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for demographic and administrative types.
3
+ *
4
+ * Handles:
5
+ * cascade:PatientProfile -> Patient
6
+ * health:ImmunizationRecord -> Immunization
7
+ * coverage:InsurancePlan -> Coverage
8
+ */
9
+ import { NS } from './types.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Patient
12
+ // ---------------------------------------------------------------------------
13
+ export function restorePatientProfile(pv, warnings) {
14
+ const getFirst = (pred) => pv.get(pred)?.[0];
15
+ const fhirResource = { resourceType: 'Patient' };
16
+ const dob = getFirst(NS.cascade + 'dateOfBirth');
17
+ if (dob)
18
+ fhirResource.birthDate = dob;
19
+ const sex = getFirst(NS.cascade + 'biologicalSex');
20
+ if (sex) {
21
+ const sexMap = { male: 'male', female: 'female', intersex: 'other' };
22
+ fhirResource.gender = sexMap[sex] ?? 'unknown';
23
+ }
24
+ const marital = getFirst(NS.cascade + 'maritalStatus');
25
+ if (marital) {
26
+ const maritalMap = {
27
+ single: 'S', married: 'M', divorced: 'D', widowed: 'W',
28
+ separated: 'A', domestic_partnership: 'T',
29
+ };
30
+ fhirResource.maritalStatus = {
31
+ coding: [{ code: maritalMap[marital] ?? 'UNK' }],
32
+ text: marital,
33
+ };
34
+ }
35
+ const profileId = getFirst(NS.cascade + 'profileId');
36
+ if (profileId)
37
+ fhirResource.id = profileId;
38
+ for (const field of ['computedAge', 'ageGroup', 'genderIdentity']) {
39
+ if (getFirst(NS.cascade + field)) {
40
+ warnings.push(`Cascade field '${field}' has no FHIR Patient equivalent and was not included`);
41
+ }
42
+ }
43
+ return fhirResource;
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Immunization
47
+ // ---------------------------------------------------------------------------
48
+ export function restoreImmunizationRecord(pv, _warnings) {
49
+ const getFirst = (pred) => pv.get(pred)?.[0];
50
+ const fhirResource = {
51
+ resourceType: 'Immunization',
52
+ status: getFirst(NS.health + 'status') ?? 'completed',
53
+ vaccineCode: { text: getFirst(NS.health + 'vaccineName') ?? '' },
54
+ };
55
+ const adminDate = getFirst(NS.health + 'administrationDate');
56
+ if (adminDate)
57
+ fhirResource.occurrenceDateTime = adminDate;
58
+ const vaccineCode = getFirst(NS.health + 'vaccineCode');
59
+ if (vaccineCode) {
60
+ const code = vaccineCode.startsWith('CVX-') ? vaccineCode.slice(4) : vaccineCode;
61
+ fhirResource.vaccineCode.coding = [{ system: 'http://hl7.org/fhir/sid/cvx', code }];
62
+ }
63
+ const manufacturer = getFirst(NS.health + 'manufacturer');
64
+ if (manufacturer)
65
+ fhirResource.manufacturer = { display: manufacturer };
66
+ const lotNumber = getFirst(NS.health + 'lotNumber');
67
+ if (lotNumber)
68
+ fhirResource.lotNumber = lotNumber;
69
+ const srcId = getFirst(NS.health + 'sourceRecordId');
70
+ if (srcId)
71
+ fhirResource.id = srcId;
72
+ return fhirResource;
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Coverage (Insurance)
76
+ // ---------------------------------------------------------------------------
77
+ export function restoreInsurancePlan(pv, _warnings) {
78
+ const getFirst = (pred) => pv.get(pred)?.[0];
79
+ const fhirResource = {
80
+ resourceType: 'Coverage',
81
+ status: 'active',
82
+ };
83
+ const providerName = getFirst(NS.coverage + 'providerName');
84
+ if (providerName)
85
+ fhirResource.payor = [{ display: providerName }];
86
+ const memberId = getFirst(NS.coverage + 'memberId');
87
+ if (memberId)
88
+ fhirResource.subscriberId = memberId;
89
+ const groupNum = getFirst(NS.coverage + 'groupNumber');
90
+ const planName = getFirst(NS.coverage + 'planName');
91
+ const classArr = [];
92
+ if (groupNum)
93
+ classArr.push({ type: { coding: [{ code: 'group' }] }, value: groupNum, name: planName });
94
+ else if (planName)
95
+ classArr.push({ type: { coding: [{ code: 'plan' }] }, value: planName });
96
+ if (classArr.length > 0)
97
+ fhirResource.class = classArr;
98
+ const start = getFirst(NS.coverage + 'effectiveStart');
99
+ const end = getFirst(NS.coverage + 'effectiveEnd');
100
+ if (start || end) {
101
+ fhirResource.period = {};
102
+ if (start)
103
+ fhirResource.period.start = start;
104
+ if (end)
105
+ fhirResource.period.end = end;
106
+ }
107
+ const rel = getFirst(NS.coverage + 'subscriberRelationship');
108
+ if (rel)
109
+ fhirResource.relationship = { coding: [{ code: rel }] };
110
+ const srcId = getFirst(NS.health + 'sourceRecordId');
111
+ if (srcId)
112
+ fhirResource.id = srcId;
113
+ return fhirResource;
114
+ }
115
+ //# sourceMappingURL=cascade-to-fhir-demographics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-demographics.js","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-demographics.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,17 @@
1
1
  /**
2
- * Cascade -> FHIR (reverse conversion).
2
+ * Cascade -> FHIR (reverse conversion) dispatcher.
3
3
  *
4
4
  * Parses Cascade Protocol Turtle using n3, identifies the resource type from
5
- * rdf:type, and maps Cascade predicates back to FHIR R4 fields.
5
+ * rdf:type, and dispatches to per-type handler functions. Each handler maps
6
+ * Cascade predicates back to FHIR R4 fields.
6
7
  *
7
- * Not all Cascade fields have FHIR equivalents -- lost fields are reported
8
+ * Not all Cascade fields have FHIR equivalents lost fields are reported
8
9
  * as warnings.
10
+ *
11
+ * Handlers are organized by domain:
12
+ * cascade-to-fhir-clinical.ts Clinical record types (medications, conditions, etc.)
13
+ * cascade-to-fhir-demographics.ts Patient, immunization, coverage
14
+ * cascade-to-fhir-admin.ts Claim, ExplanationOfBenefit
9
15
  */
10
16
  /**
11
17
  * Convert Cascade Turtle to FHIR R4 JSON.
@@ -1 +1 @@
1
- {"version":3,"file":"cascade-to-fhir.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CA6VD"}
1
+ {"version":3,"file":"cascade-to-fhir.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA+BH;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAgGD"}