@the-cascade-protocol/cli 0.2.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/.dockerignore +7 -0
- package/.eslintrc.json +23 -0
- package/.prettierrc +7 -0
- package/DOCKER.md +36 -0
- package/Dockerfile +18 -0
- package/README.md +69 -0
- package/dist/commands/capabilities.d.ts +9 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +194 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/conformance.d.ts +15 -0
- package/dist/commands/conformance.d.ts.map +1 -0
- package/dist/commands/conformance.js +348 -0
- package/dist/commands/conformance.js.map +1 -0
- package/dist/commands/convert.d.ts +21 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +134 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/pod/export.d.ts +8 -0
- package/dist/commands/pod/export.d.ts.map +1 -0
- package/dist/commands/pod/export.js +72 -0
- package/dist/commands/pod/export.js.map +1 -0
- package/dist/commands/pod/helpers.d.ts +79 -0
- package/dist/commands/pod/helpers.d.ts.map +1 -0
- package/dist/commands/pod/helpers.js +369 -0
- package/dist/commands/pod/helpers.js.map +1 -0
- package/dist/commands/pod/index.d.ts +20 -0
- package/dist/commands/pod/index.d.ts.map +1 -0
- package/dist/commands/pod/index.js +29 -0
- package/dist/commands/pod/index.js.map +1 -0
- package/dist/commands/pod/info.d.ts +9 -0
- package/dist/commands/pod/info.d.ts.map +1 -0
- package/dist/commands/pod/info.js +196 -0
- package/dist/commands/pod/info.js.map +1 -0
- package/dist/commands/pod/init.d.ts +9 -0
- package/dist/commands/pod/init.d.ts.map +1 -0
- package/dist/commands/pod/init.js +251 -0
- package/dist/commands/pod/init.js.map +1 -0
- package/dist/commands/pod/query.d.ts +9 -0
- package/dist/commands/pod/query.d.ts.map +1 -0
- package/dist/commands/pod/query.js +169 -0
- package/dist/commands/pod/query.js.map +1 -0
- package/dist/commands/pod 2.js +1017 -0
- package/dist/commands/pod.d.ts +28 -0
- package/dist/commands/pod.d.ts 2.map +1 -0
- package/dist/commands/pod.d.ts.map +1 -0
- package/dist/commands/pod.js +1031 -0
- package/dist/commands/pod.js 2.map +1 -0
- package/dist/commands/pod.js.map +1 -0
- package/dist/commands/serve.d.ts +33 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +74 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/validate.d.ts +18 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +275 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/fhir-converter/cascade-to-fhir.d.ts +17 -0
- package/dist/lib/fhir-converter/cascade-to-fhir.d.ts.map +1 -0
- package/dist/lib/fhir-converter/cascade-to-fhir.js +358 -0
- package/dist/lib/fhir-converter/cascade-to-fhir.js.map +1 -0
- package/dist/lib/fhir-converter/converters-clinical.d.ts +29 -0
- package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -0
- package/dist/lib/fhir-converter/converters-clinical.js +391 -0
- package/dist/lib/fhir-converter/converters-clinical.js.map +1 -0
- package/dist/lib/fhir-converter/converters-demographics.d.ts +20 -0
- package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -0
- package/dist/lib/fhir-converter/converters-demographics.js +242 -0
- package/dist/lib/fhir-converter/converters-demographics.js.map +1 -0
- package/dist/lib/fhir-converter/fhir-to-cascade.d.ts +17 -0
- package/dist/lib/fhir-converter/fhir-to-cascade.d.ts.map +1 -0
- package/dist/lib/fhir-converter/fhir-to-cascade.js +63 -0
- package/dist/lib/fhir-converter/fhir-to-cascade.js.map +1 -0
- package/dist/lib/fhir-converter/index.d.ts +36 -0
- package/dist/lib/fhir-converter/index.d.ts.map +1 -0
- package/dist/lib/fhir-converter/index.js +187 -0
- package/dist/lib/fhir-converter/index.js.map +1 -0
- package/dist/lib/fhir-converter/types.d.ts +77 -0
- package/dist/lib/fhir-converter/types.d.ts.map +1 -0
- package/dist/lib/fhir-converter/types.js +236 -0
- package/dist/lib/fhir-converter/types.js.map +1 -0
- package/dist/lib/fhir-converter.d.ts +62 -0
- package/dist/lib/fhir-converter.d.ts.map +1 -0
- package/dist/lib/fhir-converter.js +1474 -0
- package/dist/lib/fhir-converter.js.map +1 -0
- package/dist/lib/mcp/audit.d.ts +24 -0
- package/dist/lib/mcp/audit.d.ts.map +1 -0
- package/dist/lib/mcp/audit.js +85 -0
- package/dist/lib/mcp/audit.js.map +1 -0
- package/dist/lib/mcp/server.d.ts +38 -0
- package/dist/lib/mcp/server.d.ts.map +1 -0
- package/dist/lib/mcp/server.js +172 -0
- package/dist/lib/mcp/server.js.map +1 -0
- package/dist/lib/mcp/tools.d.ts +47 -0
- package/dist/lib/mcp/tools.d.ts.map +1 -0
- package/dist/lib/mcp/tools.js +547 -0
- package/dist/lib/mcp/tools.js.map +1 -0
- package/dist/lib/output.d.ts +26 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +64 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/shacl-validator.d.ts +53 -0
- package/dist/lib/shacl-validator.d.ts.map +1 -0
- package/dist/lib/shacl-validator.js +245 -0
- package/dist/lib/shacl-validator.js.map +1 -0
- package/dist/lib/turtle-parser.d.ts +64 -0
- package/dist/lib/turtle-parser.d.ts.map +1 -0
- package/dist/lib/turtle-parser.js +236 -0
- package/dist/lib/turtle-parser.js.map +1 -0
- package/dist/shapes/checkup.shapes.ttl +1459 -0
- package/dist/shapes/clinical.shapes.ttl +1350 -0
- package/dist/shapes/clinical.ttl +1369 -0
- package/dist/shapes/core.shapes.ttl +450 -0
- package/dist/shapes/core.ttl +603 -0
- package/dist/shapes/coverage.shapes.ttl +214 -0
- package/dist/shapes/coverage.ttl +182 -0
- package/dist/shapes/health.shapes.ttl +697 -0
- package/dist/shapes/health.ttl +859 -0
- package/dist/shapes/pots.shapes.ttl +481 -0
- package/package.json +54 -0
- package/src/commands/capabilities.ts +235 -0
- package/src/commands/conformance.ts +447 -0
- package/src/commands/convert.ts +164 -0
- package/src/commands/pod/export.ts +85 -0
- package/src/commands/pod/helpers.ts +449 -0
- package/src/commands/pod/index.ts +32 -0
- package/src/commands/pod/info.ts +239 -0
- package/src/commands/pod/init.ts +273 -0
- package/src/commands/pod/query.ts +224 -0
- package/src/commands/serve.ts +92 -0
- package/src/commands/validate.ts +303 -0
- package/src/index.ts +58 -0
- package/src/lib/fhir-converter/cascade-to-fhir.ts +369 -0
- package/src/lib/fhir-converter/converters-clinical.ts +446 -0
- package/src/lib/fhir-converter/converters-demographics.ts +270 -0
- package/src/lib/fhir-converter/fhir-to-cascade.ts +82 -0
- package/src/lib/fhir-converter/index.ts +215 -0
- package/src/lib/fhir-converter/types.ts +318 -0
- package/src/lib/mcp/audit.ts +107 -0
- package/src/lib/mcp/server.ts +192 -0
- package/src/lib/mcp/tools.ts +668 -0
- package/src/lib/output.ts +76 -0
- package/src/lib/shacl-validator.ts +314 -0
- package/src/lib/turtle-parser.ts +277 -0
- package/src/shapes/checkup.shapes.ttl +1459 -0
- package/src/shapes/clinical.shapes.ttl +1350 -0
- package/src/shapes/clinical.ttl +1369 -0
- package/src/shapes/core.shapes.ttl +450 -0
- package/src/shapes/core.ttl +603 -0
- package/src/shapes/coverage.shapes.ttl +214 -0
- package/src/shapes/coverage.ttl +182 -0
- package/src/shapes/health.shapes.ttl +697 -0
- package/src/shapes/health.ttl +859 -0
- package/src/shapes/pots.shapes.ttl +481 -0
- package/test-fixtures/fhir-bundle-example.json +216 -0
- package/test-fixtures/fhir-medication-example.json +18 -0
- package/tests/cli.test.ts +126 -0
- package/tests/fhir-converter.test.ts +874 -0
- package/tests/mcp-server.test.ts +396 -0
- package/tests/pod.test.ts +400 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and namespace constants for FHIR conversion.
|
|
3
|
+
*
|
|
4
|
+
* Used by both fhir-to-cascade and cascade-to-fhir converters.
|
|
5
|
+
*/
|
|
6
|
+
import { type Quad } from 'n3';
|
|
7
|
+
export type InputFormat = 'fhir' | 'cascade' | 'c-cda';
|
|
8
|
+
export type OutputFormat = 'turtle' | 'jsonld' | 'fhir' | 'cascade';
|
|
9
|
+
export interface ConversionResult {
|
|
10
|
+
turtle: string;
|
|
11
|
+
jsonld?: object;
|
|
12
|
+
warnings: string[];
|
|
13
|
+
resourceType: string;
|
|
14
|
+
cascadeType: string;
|
|
15
|
+
}
|
|
16
|
+
export interface BatchConversionResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
output: string;
|
|
19
|
+
format: OutputFormat;
|
|
20
|
+
resourceCount: number;
|
|
21
|
+
warnings: string[];
|
|
22
|
+
errors: string[];
|
|
23
|
+
results: ConversionResult[];
|
|
24
|
+
}
|
|
25
|
+
export declare const NS: {
|
|
26
|
+
readonly cascade: "https://ns.cascadeprotocol.org/core/v1#";
|
|
27
|
+
readonly health: "https://ns.cascadeprotocol.org/health/v1#";
|
|
28
|
+
readonly clinical: "https://ns.cascadeprotocol.org/clinical/v1#";
|
|
29
|
+
readonly coverage: "https://ns.cascadeprotocol.org/coverage/v1#";
|
|
30
|
+
readonly fhir: "http://hl7.org/fhir/";
|
|
31
|
+
readonly sct: "http://snomed.info/sct/";
|
|
32
|
+
readonly loinc: "http://loinc.org/rdf#";
|
|
33
|
+
readonly rxnorm: "http://www.nlm.nih.gov/research/umls/rxnorm/";
|
|
34
|
+
readonly icd10: "http://hl7.org/fhir/sid/icd-10-cm/";
|
|
35
|
+
readonly xsd: "http://www.w3.org/2001/XMLSchema#";
|
|
36
|
+
readonly prov: "http://www.w3.org/ns/prov#";
|
|
37
|
+
readonly rdf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
|
38
|
+
};
|
|
39
|
+
/** Standard Turtle prefix block for all generated output. */
|
|
40
|
+
export declare const TURTLE_PREFIXES: Record<string, string>;
|
|
41
|
+
export declare const CODING_SYSTEM_MAP: Record<string, string>;
|
|
42
|
+
export declare const VITAL_LOINC_CODES: Record<string, {
|
|
43
|
+
type: string;
|
|
44
|
+
name: string;
|
|
45
|
+
unit: string;
|
|
46
|
+
snomedCode: string;
|
|
47
|
+
}>;
|
|
48
|
+
/** FHIR observation categories that indicate vital signs */
|
|
49
|
+
export declare const VITAL_CATEGORIES: string[];
|
|
50
|
+
/** Set of FHIR resource types supported for conversion */
|
|
51
|
+
export declare const SUPPORTED_TYPES: Set<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Ensure an ISO 8601 dateTime string with timezone.
|
|
54
|
+
* Bare dates (YYYY-MM-DD) get T00:00:00Z appended.
|
|
55
|
+
*/
|
|
56
|
+
export declare function ensureDateTimeWithTz(dateStr: string): string;
|
|
57
|
+
export interface CodingInfo {
|
|
58
|
+
system: string;
|
|
59
|
+
code: string;
|
|
60
|
+
display?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare function extractCodings(codeableConcept: any): CodingInfo[];
|
|
63
|
+
export declare function codeableConceptText(cc: any): string | undefined;
|
|
64
|
+
export declare function tripleStr(subject: string, predicate: string, value: string): Quad;
|
|
65
|
+
export declare function tripleTyped(subject: string, predicate: string, value: string, datatype: string): Quad;
|
|
66
|
+
export declare function tripleBool(subject: string, predicate: string, value: boolean): Quad;
|
|
67
|
+
export declare function tripleInt(subject: string, predicate: string, value: number): Quad;
|
|
68
|
+
export declare function tripleDouble(subject: string, predicate: string, value: number): Quad;
|
|
69
|
+
export declare function tripleRef(subject: string, predicate: string, object: string): Quad;
|
|
70
|
+
export declare function tripleType(subject: string, rdfType: string): Quad;
|
|
71
|
+
export declare function tripleDateTime(subject: string, predicate: string, dateStr: string): Quad;
|
|
72
|
+
export declare function tripleDate(subject: string, predicate: string, dateStr: string): Quad;
|
|
73
|
+
/** Common triples every Cascade resource gets */
|
|
74
|
+
export declare function commonTriples(subject: string): Quad[];
|
|
75
|
+
export declare function quadsToTurtle(quads: Quad[]): Promise<string>;
|
|
76
|
+
export declare function quadsToJsonLd(quads: Quad[], _cascadeType: string): object;
|
|
77
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and namespace constants for FHIR conversion.
|
|
3
|
+
*
|
|
4
|
+
* Used by both fhir-to-cascade and cascade-to-fhir converters.
|
|
5
|
+
*/
|
|
6
|
+
import { DataFactory, Writer } from 'n3';
|
|
7
|
+
const { namedNode, literal, quad: makeQuad } = DataFactory;
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Namespace constants
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export const NS = {
|
|
12
|
+
cascade: 'https://ns.cascadeprotocol.org/core/v1#',
|
|
13
|
+
health: 'https://ns.cascadeprotocol.org/health/v1#',
|
|
14
|
+
clinical: 'https://ns.cascadeprotocol.org/clinical/v1#',
|
|
15
|
+
coverage: 'https://ns.cascadeprotocol.org/coverage/v1#',
|
|
16
|
+
fhir: 'http://hl7.org/fhir/',
|
|
17
|
+
sct: 'http://snomed.info/sct/',
|
|
18
|
+
loinc: 'http://loinc.org/rdf#',
|
|
19
|
+
rxnorm: 'http://www.nlm.nih.gov/research/umls/rxnorm/',
|
|
20
|
+
icd10: 'http://hl7.org/fhir/sid/icd-10-cm/',
|
|
21
|
+
xsd: 'http://www.w3.org/2001/XMLSchema#',
|
|
22
|
+
prov: 'http://www.w3.org/ns/prov#',
|
|
23
|
+
rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
|
|
24
|
+
};
|
|
25
|
+
/** Standard Turtle prefix block for all generated output. */
|
|
26
|
+
export const TURTLE_PREFIXES = {
|
|
27
|
+
cascade: NS.cascade,
|
|
28
|
+
health: NS.health,
|
|
29
|
+
clinical: NS.clinical,
|
|
30
|
+
coverage: NS.coverage,
|
|
31
|
+
fhir: NS.fhir,
|
|
32
|
+
sct: NS.sct,
|
|
33
|
+
loinc: NS.loinc,
|
|
34
|
+
rxnorm: NS.rxnorm,
|
|
35
|
+
xsd: NS.xsd,
|
|
36
|
+
prov: NS.prov,
|
|
37
|
+
};
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// FHIR coding-system to Cascade namespace mapping
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
export const CODING_SYSTEM_MAP = {
|
|
42
|
+
'http://www.nlm.nih.gov/research/umls/rxnorm': NS.rxnorm,
|
|
43
|
+
'urn:oid:2.16.840.1.113883.6.88': NS.rxnorm,
|
|
44
|
+
'http://snomed.info/sct': NS.sct,
|
|
45
|
+
'http://loinc.org': NS.loinc,
|
|
46
|
+
'http://hl7.org/fhir/sid/icd-10-cm': NS.icd10,
|
|
47
|
+
'http://hl7.org/fhir/sid/icd-10': NS.icd10,
|
|
48
|
+
};
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// FHIR vital-sign LOINC code mapping
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
export const VITAL_LOINC_CODES = {
|
|
53
|
+
'8480-6': { type: 'bloodPressureSystolic', name: 'Systolic Blood Pressure', unit: 'mmHg', snomedCode: '271649006' },
|
|
54
|
+
'8462-4': { type: 'bloodPressureDiastolic', name: 'Diastolic Blood Pressure', unit: 'mmHg', snomedCode: '271650006' },
|
|
55
|
+
'8867-4': { type: 'heartRate', name: 'Heart Rate', unit: 'bpm', snomedCode: '364075005' },
|
|
56
|
+
'9279-1': { type: 'respiratoryRate', name: 'Respiratory Rate', unit: 'breaths/min', snomedCode: '86290005' },
|
|
57
|
+
'8310-5': { type: 'bodyTemperature', name: 'Body Temperature', unit: 'degC', snomedCode: '386725007' },
|
|
58
|
+
'2708-6': { type: 'oxygenSaturation', name: 'Oxygen Saturation', unit: '%', snomedCode: '431314004' },
|
|
59
|
+
'29463-7': { type: 'bodyWeight', name: 'Body Weight', unit: 'kg', snomedCode: '27113001' },
|
|
60
|
+
'8302-2': { type: 'bodyHeight', name: 'Body Height', unit: 'cm', snomedCode: '50373000' },
|
|
61
|
+
'39156-5': { type: 'bmi', name: 'Body Mass Index', unit: 'kg/m2', snomedCode: '60621009' },
|
|
62
|
+
};
|
|
63
|
+
/** FHIR observation categories that indicate vital signs */
|
|
64
|
+
export const VITAL_CATEGORIES = ['vital-signs', 'vital-sign'];
|
|
65
|
+
/** Set of FHIR resource types supported for conversion */
|
|
66
|
+
export const SUPPORTED_TYPES = new Set([
|
|
67
|
+
'MedicationStatement', 'MedicationRequest',
|
|
68
|
+
'Condition',
|
|
69
|
+
'AllergyIntolerance',
|
|
70
|
+
'Observation',
|
|
71
|
+
'Patient',
|
|
72
|
+
'Immunization',
|
|
73
|
+
'Coverage',
|
|
74
|
+
]);
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Helper: date formatting
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Ensure an ISO 8601 dateTime string with timezone.
|
|
80
|
+
* Bare dates (YYYY-MM-DD) get T00:00:00Z appended.
|
|
81
|
+
*/
|
|
82
|
+
export function ensureDateTimeWithTz(dateStr) {
|
|
83
|
+
if (!dateStr)
|
|
84
|
+
return '';
|
|
85
|
+
// Already has time component with timezone
|
|
86
|
+
if (/T.+Z$/.test(dateStr) || /T.+[+-]\d{2}:\d{2}$/.test(dateStr)) {
|
|
87
|
+
return dateStr;
|
|
88
|
+
}
|
|
89
|
+
// Has time component but no timezone -- append Z
|
|
90
|
+
if (/T/.test(dateStr)) {
|
|
91
|
+
return dateStr + 'Z';
|
|
92
|
+
}
|
|
93
|
+
// Date only -- append midnight UTC
|
|
94
|
+
return dateStr + 'T00:00:00Z';
|
|
95
|
+
}
|
|
96
|
+
export function extractCodings(codeableConcept) {
|
|
97
|
+
if (!codeableConcept)
|
|
98
|
+
return [];
|
|
99
|
+
const codings = [];
|
|
100
|
+
if (Array.isArray(codeableConcept.coding)) {
|
|
101
|
+
for (const c of codeableConcept.coding) {
|
|
102
|
+
if (c.system && c.code) {
|
|
103
|
+
codings.push({ system: c.system, code: c.code, display: c.display });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return codings;
|
|
108
|
+
}
|
|
109
|
+
export function codeableConceptText(cc) {
|
|
110
|
+
if (!cc)
|
|
111
|
+
return undefined;
|
|
112
|
+
if (cc.text)
|
|
113
|
+
return cc.text;
|
|
114
|
+
if (Array.isArray(cc.coding) && cc.coding.length > 0 && cc.coding[0].display) {
|
|
115
|
+
return cc.coding[0].display;
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Quad-building helpers
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
export function tripleStr(subject, predicate, value) {
|
|
123
|
+
return makeQuad(namedNode(subject), namedNode(predicate), literal(value));
|
|
124
|
+
}
|
|
125
|
+
export function tripleTyped(subject, predicate, value, datatype) {
|
|
126
|
+
return makeQuad(namedNode(subject), namedNode(predicate), literal(value, namedNode(datatype)));
|
|
127
|
+
}
|
|
128
|
+
export function tripleBool(subject, predicate, value) {
|
|
129
|
+
return makeQuad(namedNode(subject), namedNode(predicate), literal(String(value), namedNode(NS.xsd + 'boolean')));
|
|
130
|
+
}
|
|
131
|
+
export function tripleInt(subject, predicate, value) {
|
|
132
|
+
return makeQuad(namedNode(subject), namedNode(predicate), literal(String(value), namedNode(NS.xsd + 'integer')));
|
|
133
|
+
}
|
|
134
|
+
export function tripleDouble(subject, predicate, value) {
|
|
135
|
+
return makeQuad(namedNode(subject), namedNode(predicate), literal(String(value), namedNode(NS.xsd + 'double')));
|
|
136
|
+
}
|
|
137
|
+
export function tripleRef(subject, predicate, object) {
|
|
138
|
+
return makeQuad(namedNode(subject), namedNode(predicate), namedNode(object));
|
|
139
|
+
}
|
|
140
|
+
export function tripleType(subject, rdfType) {
|
|
141
|
+
return tripleRef(subject, NS.rdf + 'type', rdfType);
|
|
142
|
+
}
|
|
143
|
+
export function tripleDateTime(subject, predicate, dateStr) {
|
|
144
|
+
return tripleTyped(subject, predicate, ensureDateTimeWithTz(dateStr), NS.xsd + 'dateTime');
|
|
145
|
+
}
|
|
146
|
+
export function tripleDate(subject, predicate, dateStr) {
|
|
147
|
+
return tripleTyped(subject, predicate, dateStr, NS.xsd + 'date');
|
|
148
|
+
}
|
|
149
|
+
/** Common triples every Cascade resource gets */
|
|
150
|
+
export function commonTriples(subject) {
|
|
151
|
+
return [
|
|
152
|
+
tripleRef(subject, NS.cascade + 'dataProvenance', NS.cascade + 'ClinicalGenerated'),
|
|
153
|
+
tripleStr(subject, NS.cascade + 'schemaVersion', '1.3'),
|
|
154
|
+
];
|
|
155
|
+
}
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// Quads -> Turtle serialization
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
export function quadsToTurtle(quads) {
|
|
160
|
+
return new Promise((resolve, reject) => {
|
|
161
|
+
const writer = new Writer({ prefixes: TURTLE_PREFIXES });
|
|
162
|
+
for (const q of quads) {
|
|
163
|
+
writer.addQuad(q);
|
|
164
|
+
}
|
|
165
|
+
writer.end((error, result) => {
|
|
166
|
+
if (error)
|
|
167
|
+
reject(error);
|
|
168
|
+
else
|
|
169
|
+
resolve(result);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
// Quads -> JSON-LD object (lightweight, no @context resolution)
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
export function quadsToJsonLd(quads, _cascadeType) {
|
|
177
|
+
// Build a simple JSON-LD representation grouped by subject
|
|
178
|
+
const subjects = new Map();
|
|
179
|
+
for (const q of quads) {
|
|
180
|
+
const subj = q.subject.value;
|
|
181
|
+
if (!subjects.has(subj)) {
|
|
182
|
+
subjects.set(subj, {
|
|
183
|
+
'@context': 'https://ns.cascadeprotocol.org/context/v1/cascade.jsonld',
|
|
184
|
+
'@id': subj,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const obj = subjects.get(subj);
|
|
188
|
+
const pred = q.predicate.value;
|
|
189
|
+
if (pred === NS.rdf + 'type') {
|
|
190
|
+
obj['@type'] = q.object.value;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Compact the predicate using known prefixes
|
|
194
|
+
let key = pred;
|
|
195
|
+
for (const [prefix, uri] of Object.entries(TURTLE_PREFIXES)) {
|
|
196
|
+
if (pred.startsWith(uri)) {
|
|
197
|
+
key = `${prefix}:${pred.slice(uri.length)}`;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Handle object vs literal
|
|
202
|
+
if (q.object.termType === 'NamedNode') {
|
|
203
|
+
// Check if this is a provenance reference
|
|
204
|
+
let idVal = q.object.value;
|
|
205
|
+
for (const [prefix, uri] of Object.entries(TURTLE_PREFIXES)) {
|
|
206
|
+
if (idVal.startsWith(uri)) {
|
|
207
|
+
idVal = `${prefix}:${idVal.slice(uri.length)}`;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
obj[key] = { '@id': idVal };
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Literal
|
|
215
|
+
const dt = q.object.datatype?.value;
|
|
216
|
+
if (dt === NS.xsd + 'dateTime' || dt === NS.xsd + 'date') {
|
|
217
|
+
obj[key] = { '@value': q.object.value, '@type': dt === NS.xsd + 'dateTime' ? 'xsd:dateTime' : 'xsd:date' };
|
|
218
|
+
}
|
|
219
|
+
else if (dt === NS.xsd + 'boolean') {
|
|
220
|
+
obj[key] = q.object.value === 'true';
|
|
221
|
+
}
|
|
222
|
+
else if (dt === NS.xsd + 'integer') {
|
|
223
|
+
obj[key] = parseInt(q.object.value, 10);
|
|
224
|
+
}
|
|
225
|
+
else if (dt === NS.xsd + 'double' || dt === NS.xsd + 'decimal') {
|
|
226
|
+
obj[key] = parseFloat(q.object.value);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
obj[key] = q.object.value;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const entries = Array.from(subjects.values());
|
|
234
|
+
return entries.length === 1 ? entries[0] : entries;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/fhir-converter/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FHIR conversion utilities.
|
|
3
|
+
*
|
|
4
|
+
* Converts between FHIR R4 JSON and Cascade Protocol RDF (Turtle/JSON-LD).
|
|
5
|
+
*
|
|
6
|
+
* Supported FHIR R4 resource types:
|
|
7
|
+
* - MedicationStatement / MedicationRequest -> health:MedicationRecord
|
|
8
|
+
* - Condition -> health:ConditionRecord
|
|
9
|
+
* - AllergyIntolerance -> health:AllergyRecord
|
|
10
|
+
* - Observation (lab) -> health:LabResultRecord
|
|
11
|
+
* - Observation (vital) -> clinical:VitalSign
|
|
12
|
+
* - Patient -> cascade:PatientProfile
|
|
13
|
+
* - Immunization -> health:ImmunizationRecord
|
|
14
|
+
* - Coverage -> coverage:InsurancePlan
|
|
15
|
+
*
|
|
16
|
+
* Zero network calls. All conversion is local.
|
|
17
|
+
*/
|
|
18
|
+
import { type Quad } from 'n3';
|
|
19
|
+
export type InputFormat = 'fhir' | 'cascade' | 'c-cda';
|
|
20
|
+
export type OutputFormat = 'turtle' | 'jsonld' | 'fhir' | 'cascade';
|
|
21
|
+
export interface ConversionResult {
|
|
22
|
+
turtle: string;
|
|
23
|
+
jsonld?: object;
|
|
24
|
+
warnings: string[];
|
|
25
|
+
resourceType: string;
|
|
26
|
+
cascadeType: string;
|
|
27
|
+
}
|
|
28
|
+
export interface BatchConversionResult {
|
|
29
|
+
success: boolean;
|
|
30
|
+
output: string;
|
|
31
|
+
format: OutputFormat;
|
|
32
|
+
resourceCount: number;
|
|
33
|
+
warnings: string[];
|
|
34
|
+
errors: string[];
|
|
35
|
+
results: ConversionResult[];
|
|
36
|
+
}
|
|
37
|
+
export declare function convertFhirResourceToQuads(fhirResource: any): (ConversionResult & {
|
|
38
|
+
_quads: Quad[];
|
|
39
|
+
}) | null;
|
|
40
|
+
export declare function convertFhirToCascade(fhirResource: any): Promise<ConversionResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Convert Cascade Turtle to FHIR R4 JSON.
|
|
43
|
+
*
|
|
44
|
+
* Parses the Turtle using n3, identifies the resource type from rdf:type,
|
|
45
|
+
* and maps Cascade predicates back to FHIR fields.
|
|
46
|
+
*
|
|
47
|
+
* Not all Cascade fields have FHIR equivalents -- lost fields are reported
|
|
48
|
+
* as warnings.
|
|
49
|
+
*/
|
|
50
|
+
export declare function convertCascadeToFhir(turtle: string): Promise<{
|
|
51
|
+
resources: any[];
|
|
52
|
+
warnings: string[];
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Convert an entire FHIR input (single resource or Bundle) to Cascade format.
|
|
56
|
+
*/
|
|
57
|
+
export declare function convert(input: string, from: InputFormat, to: OutputFormat, outputSerialization?: 'turtle' | 'jsonld'): Promise<BatchConversionResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Detect the format of input data by inspecting its content.
|
|
60
|
+
*/
|
|
61
|
+
export declare function detectFormat(input: string): InputFormat | null;
|
|
62
|
+
//# sourceMappingURL=fhir-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fhir-converter.d.ts","sourceRoot":"","sources":["../../src/lib/fhir-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAA+B,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAQ5D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAo+BD,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,gBAAgB,GAAG;IAAE,MAAM,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,GAAG,IAAI,CA0B5G;AAED,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmBvF;AAMD;;;;;;;;GAQG;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;AAMD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,YAAY,EAChB,mBAAmB,GAAE,QAAQ,GAAG,QAAmB,GAClD,OAAO,CAAC,qBAAqB,CAAC,CAsHhC;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA6B9D"}
|