@the-cascade-protocol/sdk 1.0.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/LICENSE +190 -0
- package/README.md +164 -0
- package/dist/consent/consent-filter.d.ts +21 -0
- package/dist/consent/consent-filter.d.ts.map +1 -0
- package/dist/consent/consent-filter.js +71 -0
- package/dist/consent/consent-filter.js.map +1 -0
- package/dist/consent/index.d.ts +2 -0
- package/dist/consent/index.d.ts.map +1 -0
- package/dist/consent/index.js +2 -0
- package/dist/consent/index.js.map +1 -0
- package/dist/deserializer/index.d.ts +7 -0
- package/dist/deserializer/index.d.ts.map +1 -0
- package/dist/deserializer/index.js +7 -0
- package/dist/deserializer/index.js.map +1 -0
- package/dist/deserializer/turtle-parser.d.ts +47 -0
- package/dist/deserializer/turtle-parser.d.ts.map +1 -0
- package/dist/deserializer/turtle-parser.js +840 -0
- package/dist/deserializer/turtle-parser.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonld/context.d.ts +29 -0
- package/dist/jsonld/context.d.ts.map +1 -0
- package/dist/jsonld/context.js +95 -0
- package/dist/jsonld/context.js.map +1 -0
- package/dist/jsonld/converter.d.ts +50 -0
- package/dist/jsonld/converter.d.ts.map +1 -0
- package/dist/jsonld/converter.js +139 -0
- package/dist/jsonld/converter.js.map +1 -0
- package/dist/jsonld/index.d.ts +8 -0
- package/dist/jsonld/index.d.ts.map +1 -0
- package/dist/jsonld/index.js +8 -0
- package/dist/jsonld/index.js.map +1 -0
- package/dist/models/activity-snapshot.d.ts +49 -0
- package/dist/models/activity-snapshot.d.ts.map +1 -0
- package/dist/models/activity-snapshot.js +13 -0
- package/dist/models/activity-snapshot.js.map +1 -0
- package/dist/models/allergy.d.ts +49 -0
- package/dist/models/allergy.d.ts.map +1 -0
- package/dist/models/allergy.js +13 -0
- package/dist/models/allergy.js.map +1 -0
- package/dist/models/common.d.ts +174 -0
- package/dist/models/common.d.ts.map +1 -0
- package/dist/models/common.js +12 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/condition.d.ts +59 -0
- package/dist/models/condition.d.ts.map +1 -0
- package/dist/models/condition.js +13 -0
- package/dist/models/condition.js.map +1 -0
- package/dist/models/coverage.d.ts +117 -0
- package/dist/models/coverage.d.ts.map +1 -0
- package/dist/models/coverage.js +16 -0
- package/dist/models/coverage.js.map +1 -0
- package/dist/models/family-history.d.ts +38 -0
- package/dist/models/family-history.d.ts.map +1 -0
- package/dist/models/family-history.js +13 -0
- package/dist/models/family-history.js.map +1 -0
- package/dist/models/health-profile.d.ts +54 -0
- package/dist/models/health-profile.d.ts.map +1 -0
- package/dist/models/health-profile.js +11 -0
- package/dist/models/health-profile.js.map +1 -0
- package/dist/models/immunization.d.ts +78 -0
- package/dist/models/immunization.d.ts.map +1 -0
- package/dist/models/immunization.js +12 -0
- package/dist/models/immunization.js.map +1 -0
- package/dist/models/index.d.ts +20 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +7 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/lab-result.d.ts +83 -0
- package/dist/models/lab-result.d.ts.map +1 -0
- package/dist/models/lab-result.js +12 -0
- package/dist/models/lab-result.js.map +1 -0
- package/dist/models/medication.d.ts +144 -0
- package/dist/models/medication.d.ts.map +1 -0
- package/dist/models/medication.js +13 -0
- package/dist/models/medication.js.map +1 -0
- package/dist/models/patient-profile.d.ts +171 -0
- package/dist/models/patient-profile.d.ts.map +1 -0
- package/dist/models/patient-profile.js +14 -0
- package/dist/models/patient-profile.js.map +1 -0
- package/dist/models/procedure.d.ts +53 -0
- package/dist/models/procedure.d.ts.map +1 -0
- package/dist/models/procedure.js +12 -0
- package/dist/models/procedure.js.map +1 -0
- package/dist/models/sleep-snapshot.d.ts +54 -0
- package/dist/models/sleep-snapshot.d.ts.map +1 -0
- package/dist/models/sleep-snapshot.js +13 -0
- package/dist/models/sleep-snapshot.js.map +1 -0
- package/dist/models/vital-sign.d.ts +74 -0
- package/dist/models/vital-sign.d.ts.map +1 -0
- package/dist/models/vital-sign.js +13 -0
- package/dist/models/vital-sign.js.map +1 -0
- package/dist/pod/index.d.ts +2 -0
- package/dist/pod/index.d.ts.map +1 -0
- package/dist/pod/index.js +2 -0
- package/dist/pod/index.js.map +1 -0
- package/dist/pod/pod-builder.d.ts +63 -0
- package/dist/pod/pod-builder.d.ts.map +1 -0
- package/dist/pod/pod-builder.js +245 -0
- package/dist/pod/pod-builder.js.map +1 -0
- package/dist/serializer/index.d.ts +8 -0
- package/dist/serializer/index.d.ts.map +1 -0
- package/dist/serializer/index.js +8 -0
- package/dist/serializer/index.js.map +1 -0
- package/dist/serializer/turtle-builder.d.ts +93 -0
- package/dist/serializer/turtle-builder.d.ts.map +1 -0
- package/dist/serializer/turtle-builder.js +204 -0
- package/dist/serializer/turtle-builder.js.map +1 -0
- package/dist/serializer/turtle-serializer.d.ts +66 -0
- package/dist/serializer/turtle-serializer.d.ts.map +1 -0
- package/dist/serializer/turtle-serializer.js +404 -0
- package/dist/serializer/turtle-serializer.js.map +1 -0
- package/dist/validator/index.d.ts +2 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +2 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/validator.d.ts +16 -0
- package/dist/validator/validator.d.ts.map +1 -0
- package/dist/validator/validator.js +295 -0
- package/dist/validator/validator.js.map +1 -0
- package/dist/vocabularies/index.d.ts +8 -0
- package/dist/vocabularies/index.d.ts.map +1 -0
- package/dist/vocabularies/index.js +7 -0
- package/dist/vocabularies/index.js.map +1 -0
- package/dist/vocabularies/namespaces.d.ts +125 -0
- package/dist/vocabularies/namespaces.d.ts.map +1 -0
- package/dist/vocabularies/namespaces.js +361 -0
- package/dist/vocabularies/namespaces.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep-snapshot.js","sourceRoot":"","sources":["../../src/models/sleep-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vital sign data model for the Cascade Protocol.
|
|
3
|
+
*
|
|
4
|
+
* Represents a single vital sign measurement from clinical encounters
|
|
5
|
+
* or device-generated readings.
|
|
6
|
+
*
|
|
7
|
+
* RDF type: `clinical:VitalSign`
|
|
8
|
+
* Vocabulary: `https://ns.cascadeprotocol.org/clinical/v1#`
|
|
9
|
+
*
|
|
10
|
+
* @see https://cascadeprotocol.org/docs/cascade-protocol-schemas
|
|
11
|
+
*/
|
|
12
|
+
import type { CascadeRecord, VitalType, VitalInterpretation } from './common.js';
|
|
13
|
+
/**
|
|
14
|
+
* A vital sign record in the Cascade Protocol.
|
|
15
|
+
*
|
|
16
|
+
* Required fields: `vitalType`, `value`, `unit`, `dataProvenance`, `schemaVersion`.
|
|
17
|
+
* All date fields use ISO 8601 string format.
|
|
18
|
+
*
|
|
19
|
+
* Serializes as `clinical:VitalSign` in Turtle.
|
|
20
|
+
*/
|
|
21
|
+
export interface VitalSign extends CascadeRecord {
|
|
22
|
+
type: 'VitalSign';
|
|
23
|
+
/**
|
|
24
|
+
* Enumerated vital sign type identifier.
|
|
25
|
+
* Maps to `clinical:vitalType` in Turtle serialization.
|
|
26
|
+
*/
|
|
27
|
+
vitalType: VitalType | string;
|
|
28
|
+
/**
|
|
29
|
+
* Human-readable name for the vital sign type (e.g., `"Systolic Blood Pressure"`).
|
|
30
|
+
* Maps to `clinical:vitalTypeName` in Turtle serialization.
|
|
31
|
+
*/
|
|
32
|
+
vitalTypeName?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Numeric value of the measurement.
|
|
35
|
+
* Maps to `clinical:value` in Turtle serialization.
|
|
36
|
+
*/
|
|
37
|
+
value: number;
|
|
38
|
+
/**
|
|
39
|
+
* Unit of measurement (e.g., `"mmHg"`, `"bpm"`, `"degF"`, `"%"`).
|
|
40
|
+
* Maps to `clinical:unit` in Turtle serialization.
|
|
41
|
+
*/
|
|
42
|
+
unit: string;
|
|
43
|
+
/**
|
|
44
|
+
* Date and time when the measurement was taken (ISO 8601).
|
|
45
|
+
* Maps to `clinical:effectiveDate` in Turtle serialization.
|
|
46
|
+
*/
|
|
47
|
+
effectiveDate?: string;
|
|
48
|
+
/**
|
|
49
|
+
* LOINC code URI for this vital sign type.
|
|
50
|
+
* Maps to `clinical:loincCode` in Turtle serialization as a URI reference.
|
|
51
|
+
*/
|
|
52
|
+
loincCode?: string;
|
|
53
|
+
/**
|
|
54
|
+
* SNOMED CT code URI for this vital sign type.
|
|
55
|
+
* Maps to `clinical:snomedCode` in Turtle serialization as a URI reference.
|
|
56
|
+
*/
|
|
57
|
+
snomedCode?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Lower bound of the normal reference range.
|
|
60
|
+
* Maps to `clinical:referenceRangeLow` in Turtle serialization.
|
|
61
|
+
*/
|
|
62
|
+
referenceRangeLow?: number;
|
|
63
|
+
/**
|
|
64
|
+
* Upper bound of the normal reference range.
|
|
65
|
+
* Maps to `clinical:referenceRangeHigh` in Turtle serialization.
|
|
66
|
+
*/
|
|
67
|
+
referenceRangeHigh?: number;
|
|
68
|
+
/**
|
|
69
|
+
* Clinical interpretation of the vital sign value.
|
|
70
|
+
* Maps to `clinical:interpretation` in Turtle serialization.
|
|
71
|
+
*/
|
|
72
|
+
interpretation?: VitalInterpretation;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=vital-sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vital-sign.d.ts","sourceRoot":"","sources":["../../src/models/vital-sign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC;IAE9B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;CACtC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vital sign data model for the Cascade Protocol.
|
|
3
|
+
*
|
|
4
|
+
* Represents a single vital sign measurement from clinical encounters
|
|
5
|
+
* or device-generated readings.
|
|
6
|
+
*
|
|
7
|
+
* RDF type: `clinical:VitalSign`
|
|
8
|
+
* Vocabulary: `https://ns.cascadeprotocol.org/clinical/v1#`
|
|
9
|
+
*
|
|
10
|
+
* @see https://cascadeprotocol.org/docs/cascade-protocol-schemas
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=vital-sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vital-sign.js","sourceRoot":"","sources":["../../src/models/vital-sign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pod/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pod/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAIX,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Medication } from '../models/medication.js';
|
|
2
|
+
import type { Condition } from '../models/condition.js';
|
|
3
|
+
import type { Allergy } from '../models/allergy.js';
|
|
4
|
+
import type { LabResult } from '../models/lab-result.js';
|
|
5
|
+
import type { VitalSign } from '../models/vital-sign.js';
|
|
6
|
+
import type { Immunization } from '../models/immunization.js';
|
|
7
|
+
import type { Procedure } from '../models/procedure.js';
|
|
8
|
+
import type { FamilyHistory } from '../models/family-history.js';
|
|
9
|
+
import type { Coverage } from '../models/coverage.js';
|
|
10
|
+
import type { PatientProfile } from '../models/patient-profile.js';
|
|
11
|
+
import type { ActivitySnapshot } from '../models/activity-snapshot.js';
|
|
12
|
+
import type { SleepSnapshot } from '../models/sleep-snapshot.js';
|
|
13
|
+
import type { HealthProfile } from '../models/health-profile.js';
|
|
14
|
+
export interface PodFile {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
readonly content: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PodManifest {
|
|
19
|
+
readonly title: string;
|
|
20
|
+
readonly description?: string;
|
|
21
|
+
readonly created: string;
|
|
22
|
+
readonly schemaVersion: string;
|
|
23
|
+
readonly files: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
export interface PodOptions {
|
|
26
|
+
readonly title: string;
|
|
27
|
+
readonly description?: string;
|
|
28
|
+
readonly schemaVersion?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class PodBuilder {
|
|
31
|
+
private readonly _options;
|
|
32
|
+
private readonly _medications;
|
|
33
|
+
private readonly _conditions;
|
|
34
|
+
private readonly _allergies;
|
|
35
|
+
private readonly _labResults;
|
|
36
|
+
private readonly _clinicalVitalSigns;
|
|
37
|
+
private readonly _deviceVitalSigns;
|
|
38
|
+
private readonly _immunizations;
|
|
39
|
+
private readonly _procedures;
|
|
40
|
+
private readonly _familyHistory;
|
|
41
|
+
private readonly _coverage;
|
|
42
|
+
private readonly _patientProfiles;
|
|
43
|
+
private readonly _activitySnapshots;
|
|
44
|
+
private readonly _sleepSnapshots;
|
|
45
|
+
constructor(options: PodOptions);
|
|
46
|
+
addMedication(med: Medication): this;
|
|
47
|
+
addCondition(cond: Condition): this;
|
|
48
|
+
addAllergy(allergy: Allergy): this;
|
|
49
|
+
addLabResult(lab: LabResult): this;
|
|
50
|
+
addVitalSign(vital: VitalSign): this;
|
|
51
|
+
addImmunization(imm: Immunization): this;
|
|
52
|
+
addProcedure(proc: Procedure): this;
|
|
53
|
+
addFamilyHistory(fam: FamilyHistory): this;
|
|
54
|
+
addCoverage(cov: Coverage): this;
|
|
55
|
+
addPatientProfile(profile: PatientProfile): this;
|
|
56
|
+
addActivitySnapshot(activity: ActivitySnapshot): this;
|
|
57
|
+
addSleepSnapshot(sleep: SleepSnapshot): this;
|
|
58
|
+
addHealthProfile(profile: HealthProfile): this;
|
|
59
|
+
build(): PodFile[];
|
|
60
|
+
buildManifest(): PodManifest;
|
|
61
|
+
private _buildIndex;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=pod-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-builder.d.ts","sourceRoot":"","sources":["../../src/pod/pod-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { serialize } from '../serializer/turtle-serializer.js';
|
|
2
|
+
import { CURRENT_SCHEMA_VERSION, NAMESPACES } from '../vocabularies/namespaces.js';
|
|
3
|
+
// ─── Internal Helpers ───────────────────────────────────────────────────────
|
|
4
|
+
const PREFIX_LINE_RE = /^@prefix\s+\S+\s+<[^>]+>\s*\.\s*$/;
|
|
5
|
+
function parseTurtle(turtle) {
|
|
6
|
+
const lines = turtle.split('\n');
|
|
7
|
+
const prefixes = new Map();
|
|
8
|
+
const bodyLines = [];
|
|
9
|
+
let pastPrefixes = false;
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
if (!pastPrefixes && PREFIX_LINE_RE.test(line.trim())) {
|
|
12
|
+
const match = line.match(/@prefix\s+(\S+):\s+<([^>]+)>/);
|
|
13
|
+
if (match) {
|
|
14
|
+
prefixes.set(match[1], match[2]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
pastPrefixes = true;
|
|
19
|
+
bodyLines.push(line);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Trim leading blank lines from body
|
|
23
|
+
while (bodyLines.length > 0 && bodyLines[0].trim() === '') {
|
|
24
|
+
bodyLines.shift();
|
|
25
|
+
}
|
|
26
|
+
return { prefixes, body: bodyLines.join('\n') };
|
|
27
|
+
}
|
|
28
|
+
const PREFIX_ORDER = [
|
|
29
|
+
'cascade', 'health', 'clinical', 'coverage', 'checkup', 'pots',
|
|
30
|
+
'fhir', 'rxnorm', 'sct', 'loinc', 'icd10', 'ucum',
|
|
31
|
+
'prov', 'foaf', 'ldp', 'dcterms', 'xsd',
|
|
32
|
+
];
|
|
33
|
+
function sortedPrefixEntries(prefixes) {
|
|
34
|
+
const entries = Array.from(prefixes.entries());
|
|
35
|
+
entries.sort((a, b) => {
|
|
36
|
+
const ai = PREFIX_ORDER.indexOf(a[0]);
|
|
37
|
+
const bi = PREFIX_ORDER.indexOf(b[0]);
|
|
38
|
+
const aIdx = ai >= 0 ? ai : PREFIX_ORDER.length;
|
|
39
|
+
const bIdx = bi >= 0 ? bi : PREFIX_ORDER.length;
|
|
40
|
+
return aIdx - bIdx;
|
|
41
|
+
});
|
|
42
|
+
return entries;
|
|
43
|
+
}
|
|
44
|
+
function mergeTurtleDocuments(turtles) {
|
|
45
|
+
const mergedPrefixes = new Map();
|
|
46
|
+
const bodies = [];
|
|
47
|
+
for (const ttl of turtles) {
|
|
48
|
+
const parsed = parseTurtle(ttl);
|
|
49
|
+
for (const [k, v] of parsed.prefixes) {
|
|
50
|
+
mergedPrefixes.set(k, v);
|
|
51
|
+
}
|
|
52
|
+
if (parsed.body.trim().length > 0) {
|
|
53
|
+
bodies.push(parsed.body.trimEnd());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const prefixLines = sortedPrefixEntries(mergedPrefixes)
|
|
57
|
+
.map(([name, uri]) => `@prefix ${name}: <${uri}> .`);
|
|
58
|
+
const parts = [...prefixLines];
|
|
59
|
+
if (prefixLines.length > 0 && bodies.length > 0) {
|
|
60
|
+
parts.push('');
|
|
61
|
+
}
|
|
62
|
+
parts.push(...bodies);
|
|
63
|
+
return parts.join('\n') + '\n';
|
|
64
|
+
}
|
|
65
|
+
function isClinicalProvenance(record) {
|
|
66
|
+
return record.dataProvenance !== 'DeviceGenerated';
|
|
67
|
+
}
|
|
68
|
+
// ─── Pod Builder ────────────────────────────────────────────────────────────
|
|
69
|
+
export class PodBuilder {
|
|
70
|
+
_options;
|
|
71
|
+
_medications = [];
|
|
72
|
+
_conditions = [];
|
|
73
|
+
_allergies = [];
|
|
74
|
+
_labResults = [];
|
|
75
|
+
_clinicalVitalSigns = [];
|
|
76
|
+
_deviceVitalSigns = [];
|
|
77
|
+
_immunizations = [];
|
|
78
|
+
_procedures = [];
|
|
79
|
+
_familyHistory = [];
|
|
80
|
+
_coverage = [];
|
|
81
|
+
_patientProfiles = [];
|
|
82
|
+
_activitySnapshots = [];
|
|
83
|
+
_sleepSnapshots = [];
|
|
84
|
+
constructor(options) {
|
|
85
|
+
this._options = options;
|
|
86
|
+
}
|
|
87
|
+
addMedication(med) {
|
|
88
|
+
this._medications.push(med);
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
addCondition(cond) {
|
|
92
|
+
this._conditions.push(cond);
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
addAllergy(allergy) {
|
|
96
|
+
this._allergies.push(allergy);
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
addLabResult(lab) {
|
|
100
|
+
this._labResults.push(lab);
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
addVitalSign(vital) {
|
|
104
|
+
if (isClinicalProvenance(vital)) {
|
|
105
|
+
this._clinicalVitalSigns.push(vital);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this._deviceVitalSigns.push(vital);
|
|
109
|
+
}
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
addImmunization(imm) {
|
|
113
|
+
this._immunizations.push(imm);
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
addProcedure(proc) {
|
|
117
|
+
this._procedures.push(proc);
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
addFamilyHistory(fam) {
|
|
121
|
+
this._familyHistory.push(fam);
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
addCoverage(cov) {
|
|
125
|
+
this._coverage.push(cov);
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
addPatientProfile(profile) {
|
|
129
|
+
this._patientProfiles.push(profile);
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
addActivitySnapshot(activity) {
|
|
133
|
+
this._activitySnapshots.push(activity);
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
addSleepSnapshot(sleep) {
|
|
137
|
+
this._sleepSnapshots.push(sleep);
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
addHealthProfile(profile) {
|
|
141
|
+
if (profile.patientProfile) {
|
|
142
|
+
this.addPatientProfile(profile.patientProfile);
|
|
143
|
+
}
|
|
144
|
+
for (const med of profile.medications)
|
|
145
|
+
this.addMedication(med);
|
|
146
|
+
for (const cond of profile.conditions)
|
|
147
|
+
this.addCondition(cond);
|
|
148
|
+
for (const allergy of profile.allergies)
|
|
149
|
+
this.addAllergy(allergy);
|
|
150
|
+
for (const lab of profile.labResults)
|
|
151
|
+
this.addLabResult(lab);
|
|
152
|
+
for (const vital of profile.vitalSigns)
|
|
153
|
+
this.addVitalSign(vital);
|
|
154
|
+
for (const imm of profile.immunizations)
|
|
155
|
+
this.addImmunization(imm);
|
|
156
|
+
for (const proc of profile.procedures)
|
|
157
|
+
this.addProcedure(proc);
|
|
158
|
+
for (const fam of profile.familyHistory)
|
|
159
|
+
this.addFamilyHistory(fam);
|
|
160
|
+
for (const cov of profile.coverage)
|
|
161
|
+
this.addCoverage(cov);
|
|
162
|
+
for (const activity of profile.activitySnapshots)
|
|
163
|
+
this.addActivitySnapshot(activity);
|
|
164
|
+
for (const sleep of profile.sleepSnapshots)
|
|
165
|
+
this.addSleepSnapshot(sleep);
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
build() {
|
|
169
|
+
const files = [];
|
|
170
|
+
const addFile = (path, records) => {
|
|
171
|
+
if (records.length === 0)
|
|
172
|
+
return;
|
|
173
|
+
const turtles = records.map((r) => serialize(r));
|
|
174
|
+
files.push({ path, content: mergeTurtleDocuments(turtles) });
|
|
175
|
+
};
|
|
176
|
+
// Clinical files
|
|
177
|
+
addFile('clinical/medications.ttl', this._medications);
|
|
178
|
+
addFile('clinical/conditions.ttl', this._conditions);
|
|
179
|
+
addFile('clinical/allergies.ttl', this._allergies);
|
|
180
|
+
addFile('clinical/lab-results.ttl', this._labResults);
|
|
181
|
+
addFile('clinical/vital-signs.ttl', this._clinicalVitalSigns);
|
|
182
|
+
addFile('clinical/immunizations.ttl', this._immunizations);
|
|
183
|
+
addFile('clinical/procedures.ttl', this._procedures);
|
|
184
|
+
addFile('clinical/family-history.ttl', this._familyHistory);
|
|
185
|
+
addFile('clinical/insurance.ttl', this._coverage);
|
|
186
|
+
addFile('clinical/patient-profile.ttl', this._patientProfiles);
|
|
187
|
+
// Wellness files
|
|
188
|
+
addFile('wellness/vital-signs.ttl', this._deviceVitalSigns);
|
|
189
|
+
addFile('wellness/activity.ttl', this._activitySnapshots);
|
|
190
|
+
addFile('wellness/sleep.ttl', this._sleepSnapshots);
|
|
191
|
+
// Index file
|
|
192
|
+
files.push({ path: 'index.ttl', content: this._buildIndex(files) });
|
|
193
|
+
return files;
|
|
194
|
+
}
|
|
195
|
+
buildManifest() {
|
|
196
|
+
const files = this.build();
|
|
197
|
+
const filePaths = files.map((f) => f.path).filter((p) => p !== 'index.ttl');
|
|
198
|
+
return {
|
|
199
|
+
title: this._options.title,
|
|
200
|
+
description: this._options.description,
|
|
201
|
+
created: new Date().toISOString(),
|
|
202
|
+
schemaVersion: this._options.schemaVersion ?? CURRENT_SCHEMA_VERSION,
|
|
203
|
+
files: filePaths,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
_buildIndex(files) {
|
|
207
|
+
const schemaVersion = this._options.schemaVersion ?? CURRENT_SCHEMA_VERSION;
|
|
208
|
+
const created = new Date().toISOString();
|
|
209
|
+
const dataPaths = files
|
|
210
|
+
.map((f) => f.path)
|
|
211
|
+
.filter((p) => p !== 'index.ttl');
|
|
212
|
+
const lines = [
|
|
213
|
+
`@prefix ldp: <${NAMESPACES.ldp}> .`,
|
|
214
|
+
`@prefix dcterms: <${NAMESPACES.dcterms}> .`,
|
|
215
|
+
`@prefix cascade: <${NAMESPACES.cascade}> .`,
|
|
216
|
+
`@prefix xsd: <${NAMESPACES.xsd}> .`,
|
|
217
|
+
'',
|
|
218
|
+
'<> a ldp:BasicContainer ;',
|
|
219
|
+
` dcterms:title "${escapeTitleString(this._options.title)}" ;`,
|
|
220
|
+
` dcterms:created "${created}"^^xsd:dateTime ;`,
|
|
221
|
+
` cascade:schemaVersion "${schemaVersion}" ;`,
|
|
222
|
+
];
|
|
223
|
+
if (dataPaths.length === 0) {
|
|
224
|
+
// Remove trailing semicolon from schemaVersion line and close
|
|
225
|
+
lines[lines.length - 1] = lines[lines.length - 1].replace(/ ;$/, ' .');
|
|
226
|
+
}
|
|
227
|
+
else if (dataPaths.length === 1) {
|
|
228
|
+
lines.push(` ldp:contains <${dataPaths[0]}> .`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
lines.push(' ldp:contains');
|
|
232
|
+
for (let i = 0; i < dataPaths.length; i++) {
|
|
233
|
+
const isLast = i === dataPaths.length - 1;
|
|
234
|
+
lines.push(` <${dataPaths[i]}>${isLast ? ' .' : ' ,'}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return lines.join('\n') + '\n';
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function escapeTitleString(value) {
|
|
241
|
+
return value
|
|
242
|
+
.replace(/\\/g, '\\\\')
|
|
243
|
+
.replace(/"/g, '\\"');
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=pod-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-builder.js","sourceRoot":"","sources":["../../src/pod/pod-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-exports for the Turtle serializer module.
|
|
3
|
+
*
|
|
4
|
+
* @module serializer
|
|
5
|
+
*/
|
|
6
|
+
export { TurtleBuilder, SubjectBuilder, escapeTurtleString } from './turtle-builder.js';
|
|
7
|
+
export { serialize, serializeMedication, serializeCondition, serializeAllergy, serializeLabResult, serializeVitalSign, serializeImmunization, serializeProcedure, serializeFamilyHistory, serializeCoverage, serializePatientProfile, serializeActivitySnapshot, serializeSleepSnapshot, } from './turtle-serializer.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serializer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-exports for the Turtle serializer module.
|
|
3
|
+
*
|
|
4
|
+
* @module serializer
|
|
5
|
+
*/
|
|
6
|
+
export { TurtleBuilder, SubjectBuilder, escapeTurtleString } from './turtle-builder.js';
|
|
7
|
+
export { serialize, serializeMedication, serializeCondition, serializeAllergy, serializeLabResult, serializeVitalSign, serializeImmunization, serializeProcedure, serializeFamilyHistory, serializeCoverage, serializePatientProfile, serializeActivitySnapshot, serializeSleepSnapshot, } from './turtle-serializer.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serializer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder API for constructing Turtle (Terse RDF Triple Language) documents.
|
|
3
|
+
*
|
|
4
|
+
* Provides a class-based API for building well-formed Turtle output with
|
|
5
|
+
* proper prefix declarations, typed literals, URI references, blank nodes,
|
|
6
|
+
* and RDF lists.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { TurtleBuilder } from '@the-cascade-protocol/sdk';
|
|
11
|
+
*
|
|
12
|
+
* const turtle = new TurtleBuilder()
|
|
13
|
+
* .prefix('cascade', 'https://ns.cascadeprotocol.org/core/v1#')
|
|
14
|
+
* .prefix('health', 'https://ns.cascadeprotocol.org/health/v1#')
|
|
15
|
+
* .subject('<urn:uuid:abc>')
|
|
16
|
+
* .type('health:MedicationRecord')
|
|
17
|
+
* .literal('health:medicationName', 'Lisinopril')
|
|
18
|
+
* .boolean('health:isActive', true)
|
|
19
|
+
* .done()
|
|
20
|
+
* .build();
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module serializer
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Escape a string value for use in a Turtle literal.
|
|
27
|
+
*
|
|
28
|
+
* Handles backslashes, double quotes, newlines, carriage returns, and tabs.
|
|
29
|
+
* For very long strings (> 200 chars) or strings containing embedded newlines,
|
|
30
|
+
* uses triple-quoted long literals.
|
|
31
|
+
*/
|
|
32
|
+
export declare function escapeTurtleString(value: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Builder for adding predicate-object pairs to a single RDF subject.
|
|
35
|
+
*
|
|
36
|
+
* Obtained via `TurtleBuilder.subject()`. Call `.done()` to return to the
|
|
37
|
+
* parent `TurtleBuilder`.
|
|
38
|
+
*/
|
|
39
|
+
export declare class SubjectBuilder {
|
|
40
|
+
private readonly _parent;
|
|
41
|
+
private readonly _subject;
|
|
42
|
+
private readonly _predicates;
|
|
43
|
+
/** @internal */
|
|
44
|
+
constructor(parent: TurtleBuilder, subject: string);
|
|
45
|
+
/** Add an `rdf:type` declaration. */
|
|
46
|
+
type(rdfType: string): this;
|
|
47
|
+
/** Add a plain string literal. Optionally with a datatype IRI. */
|
|
48
|
+
literal(predicate: string, value: string, datatype?: string): this;
|
|
49
|
+
/** Add a URI reference (angle-bracket enclosed). */
|
|
50
|
+
uri(predicate: string, uriValue: string): this;
|
|
51
|
+
/** Add a boolean literal (unquoted `true` or `false`). */
|
|
52
|
+
boolean(predicate: string, value: boolean): this;
|
|
53
|
+
/** Add an integer literal with `^^xsd:integer` datatype. */
|
|
54
|
+
integer(predicate: string, value: number): this;
|
|
55
|
+
/** Add a double/decimal literal with `^^xsd:double` datatype. */
|
|
56
|
+
double(predicate: string, value: number): this;
|
|
57
|
+
/** Add a plain numeric value (no datatype annotation, for integers). */
|
|
58
|
+
number(predicate: string, value: number): this;
|
|
59
|
+
/** Add a `^^xsd:dateTime` typed literal. */
|
|
60
|
+
dateTime(predicate: string, value: string): this;
|
|
61
|
+
/** Add a `^^xsd:date` typed literal. */
|
|
62
|
+
date(predicate: string, value: string): this;
|
|
63
|
+
/** Add an RDF list (Turtle shorthand `( item1 item2 ... )`). Items are treated as string literals. */
|
|
64
|
+
list(predicate: string, items: string[]): this;
|
|
65
|
+
/** Add a blank node with nested predicate-object pairs. */
|
|
66
|
+
blankNode(predicate: string, callback: (b: SubjectBuilder) => void): this;
|
|
67
|
+
/** Finalize this subject block and return to the parent TurtleBuilder. */
|
|
68
|
+
done(): TurtleBuilder;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fluent builder for constructing complete Turtle documents.
|
|
72
|
+
*
|
|
73
|
+
* Usage:
|
|
74
|
+
* 1. Add prefix declarations with `.prefix()`
|
|
75
|
+
* 2. Add subject blocks with `.subject()` -> `SubjectBuilder` -> `.done()`
|
|
76
|
+
* 3. Call `.build()` to produce the final Turtle string
|
|
77
|
+
*/
|
|
78
|
+
export declare class TurtleBuilder {
|
|
79
|
+
private readonly _prefixes;
|
|
80
|
+
private readonly _blocks;
|
|
81
|
+
/** Declare a namespace prefix. */
|
|
82
|
+
prefix(prefixName: string, uri: string): this;
|
|
83
|
+
/** Begin a new subject block. Returns a SubjectBuilder for adding predicates. */
|
|
84
|
+
subject(uri: string): SubjectBuilder;
|
|
85
|
+
/**
|
|
86
|
+
* @internal
|
|
87
|
+
* Called by SubjectBuilder.done() to register a completed subject block.
|
|
88
|
+
*/
|
|
89
|
+
_addSubjectBlock(subject: string, predicates: string[]): void;
|
|
90
|
+
/** Build the complete Turtle document string. */
|
|
91
|
+
build(): string;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=turtle-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turtle-builder.d.ts","sourceRoot":"","sources":["../../src/serializer/turtle-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAexD;AAID;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAE5C,gBAAgB;gBACJ,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;IAKlD,qCAAqC;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B,kEAAkE;IAClE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IASlE,oDAAoD;IACpD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU9C,0DAA0D;IAC1D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKhD,4DAA4D;IAC5D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/C,iEAAiE;IACjE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9C,wEAAwE;IACxE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9C,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhD,wCAAwC;IACxC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5C,sGAAsG;IACtG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAM9C,2DAA2D;IAC3D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAWzE,0EAA0E;IAC1E,IAAI,IAAI,aAAa;CAItB;AAID;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC,kCAAkC;IAClC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAK7C,iFAAiF;IACjF,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc;IAIpC;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAqB7D,iDAAiD;IACjD,KAAK,IAAI,MAAM;CAkBhB"}
|