@fhirfly-io/shl 0.4.0 → 0.6.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/README.md +53 -0
- package/dist/{chunk-SK77O3SG.cjs → chunk-CN44QKWJ.cjs} +37 -4
- package/dist/chunk-CN44QKWJ.cjs.map +1 -0
- package/dist/{chunk-JOZ6XZPO.cjs → chunk-H37YQWF2.cjs} +33 -21
- package/dist/chunk-H37YQWF2.cjs.map +1 -0
- package/dist/{chunk-KGEFZQ6W.js → chunk-IYRQRY4A.js} +33 -22
- package/dist/chunk-IYRQRY4A.js.map +1 -0
- package/dist/{chunk-UU434UFQ.js → chunk-YUMCDN7I.js} +37 -4
- package/dist/chunk-YUMCDN7I.js.map +1 -0
- package/dist/cli.cjs +11 -11
- package/dist/cli.js +2 -2
- package/dist/express.cjs +2 -2
- package/dist/express.d.cts +2 -2
- package/dist/express.d.ts +2 -2
- package/dist/express.js +1 -1
- package/dist/fastify.cjs +2 -2
- package/dist/fastify.d.cts +2 -2
- package/dist/fastify.d.ts +2 -2
- package/dist/fastify.js +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1 -1
- package/dist/lambda.cjs +2 -2
- package/dist/lambda.d.cts +2 -2
- package/dist/lambda.d.ts +2 -2
- package/dist/lambda.js +1 -1
- package/dist/server.cjs +6 -2
- package/dist/server.d.cts +4 -4
- package/dist/server.d.ts +4 -4
- package/dist/server.js +1 -1
- package/dist/{storage-Cx7uXUl8.d.ts → storage-CvsOM1Eu.d.ts} +1 -1
- package/dist/{storage-BbzK-kFf.d.cts → storage-DggeMhOI.d.cts} +1 -1
- package/dist/{types-6Vw5fiat.d.ts → types--SjcaaWT.d.ts} +20 -2
- package/dist/{types-Cdi4IkC9.d.cts → types-BcfxBDTA.d.cts} +20 -2
- package/dist/{types-BLLJeWe_.d.ts → types-CmeXnyth.d.cts} +17 -3
- package/dist/{types-BLLJeWe_.d.cts → types-CmeXnyth.d.ts} +17 -3
- package/package.json +3 -3
- package/dist/chunk-JOZ6XZPO.cjs.map +0 -1
- package/dist/chunk-KGEFZQ6W.js.map +0 -1
- package/dist/chunk-SK77O3SG.cjs.map +0 -1
- package/dist/chunk-UU434UFQ.js.map +0 -1
package/README.md
CHANGED
|
@@ -90,6 +90,7 @@ const result = await SHL.create({
|
|
|
90
90
|
storage,
|
|
91
91
|
passcode: "1234",
|
|
92
92
|
label: "Maria's Health Summary",
|
|
93
|
+
expiresAt: "travel", // 90 days — or use "point-of-care" (15min), "appointment" (24h), "permanent"
|
|
93
94
|
});
|
|
94
95
|
|
|
95
96
|
console.log(result.url); // shlink:/eyJ1cmwiOiJodHRwczovL...
|
|
@@ -97,6 +98,35 @@ console.log(result.qrCode); // data:image/png;base64,...
|
|
|
97
98
|
console.log(result.passcode); // "1234"
|
|
98
99
|
```
|
|
99
100
|
|
|
101
|
+
### Expiration Presets
|
|
102
|
+
|
|
103
|
+
Instead of calculating `Date` objects, use named presets:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
await SHL.create({ bundle, storage, expiresAt: "point-of-care" }); // 15 minutes
|
|
107
|
+
await SHL.create({ bundle, storage, expiresAt: "appointment" }); // 24 hours
|
|
108
|
+
await SHL.create({ bundle, storage, expiresAt: "travel" }); // 90 days
|
|
109
|
+
await SHL.create({ bundle, storage, expiresAt: "permanent" }); // no expiration
|
|
110
|
+
await SHL.create({ bundle, storage, expiresAt: new Date(...) }); // raw Date still works
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### PSHD Compliance
|
|
114
|
+
|
|
115
|
+
For CMS-aligned patient-to-provider sharing at the point of care:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const fhirBundle = await bundle.build({ profile: "pshd" }); // strips meta.profile, uses collection bundle
|
|
119
|
+
|
|
120
|
+
const result = await SHL.create({
|
|
121
|
+
bundle: fhirBundle,
|
|
122
|
+
storage,
|
|
123
|
+
compliance: "pshd",
|
|
124
|
+
expiresAt: "point-of-care",
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
See the [PSHD Guide](https://fhirfly.io/docs/shl/pshd) for full details.
|
|
129
|
+
|
|
100
130
|
## Storage Adapters
|
|
101
131
|
|
|
102
132
|
```typescript
|
|
@@ -171,6 +201,29 @@ app.listen(3000);
|
|
|
171
201
|
|
|
172
202
|
Also available for Fastify (`@fhirfly-io/shl/fastify`) and Lambda (`@fhirfly-io/shl/lambda`).
|
|
173
203
|
|
|
204
|
+
### Audit Logging
|
|
205
|
+
|
|
206
|
+
Use `AuditableStorage` to capture access events at the storage level — plug in any logging backend:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { AuditableStorage, SHLServerStorage, AccessEvent } from "@fhirfly-io/shl/server";
|
|
210
|
+
|
|
211
|
+
class MyAuditStorage extends ServerLocalStorage implements AuditableStorage {
|
|
212
|
+
async onAccess(shlId: string, event: AccessEvent): Promise<void> {
|
|
213
|
+
await db.auditLog.insert({
|
|
214
|
+
shlId,
|
|
215
|
+
recipient: event.recipient,
|
|
216
|
+
ip: event.ip,
|
|
217
|
+
timestamp: event.timestamp,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
app.use("/shl", expressMiddleware({ storage: new MyAuditStorage({ ... }) }));
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The server handler detects `AuditableStorage` at runtime via `isAuditableStorage()` — existing storage implementations work unchanged.
|
|
226
|
+
|
|
174
227
|
## Live Exercise
|
|
175
228
|
|
|
176
229
|
Run the comprehensive integration test against the live API to exercise every SDK path:
|
|
@@ -1564,6 +1564,15 @@ var Bundle = class {
|
|
|
1564
1564
|
...resultEntries,
|
|
1565
1565
|
...docEntries
|
|
1566
1566
|
];
|
|
1567
|
+
for (const entry of entries) {
|
|
1568
|
+
const meta = entry.resource.meta;
|
|
1569
|
+
if (meta?.profile) {
|
|
1570
|
+
delete meta.profile;
|
|
1571
|
+
if (Object.keys(meta).length === 0) {
|
|
1572
|
+
delete entry.resource.meta;
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
}
|
|
1567
1576
|
return {
|
|
1568
1577
|
resourceType: "Bundle",
|
|
1569
1578
|
id: bundleId,
|
|
@@ -1704,6 +1713,7 @@ function generateUuid() {
|
|
|
1704
1713
|
var shl_exports = {};
|
|
1705
1714
|
chunkQ7SFCCGT_cjs.__export(shl_exports, {
|
|
1706
1715
|
AzureStorage: () => chunkUDS6UJAL_cjs.AzureStorage,
|
|
1716
|
+
EXPIRATION_PRESETS: () => EXPIRATION_PRESETS,
|
|
1707
1717
|
FhirflyStorage: () => chunkUDS6UJAL_cjs.FhirflyStorage,
|
|
1708
1718
|
GCSStorage: () => chunkUDS6UJAL_cjs.GCSStorage,
|
|
1709
1719
|
LocalStorage: () => chunkUDS6UJAL_cjs.LocalStorage,
|
|
@@ -1715,6 +1725,18 @@ chunkQ7SFCCGT_cjs.__export(shl_exports, {
|
|
|
1715
1725
|
getEntryContent: () => getEntryContent,
|
|
1716
1726
|
revoke: () => revoke
|
|
1717
1727
|
});
|
|
1728
|
+
|
|
1729
|
+
// src/shl/types.ts
|
|
1730
|
+
var EXPIRATION_PRESETS = {
|
|
1731
|
+
"point-of-care": 15 * 60 * 1e3,
|
|
1732
|
+
// 15 minutes
|
|
1733
|
+
"appointment": 24 * 60 * 60 * 1e3,
|
|
1734
|
+
// 24 hours
|
|
1735
|
+
"travel": 90 * 24 * 60 * 60 * 1e3,
|
|
1736
|
+
// 90 days
|
|
1737
|
+
"permanent": 0
|
|
1738
|
+
// no expiration
|
|
1739
|
+
};
|
|
1718
1740
|
function base64url(data) {
|
|
1719
1741
|
return data.toString("base64url");
|
|
1720
1742
|
}
|
|
@@ -1802,7 +1824,18 @@ async function generateQRCode(url) {
|
|
|
1802
1824
|
});
|
|
1803
1825
|
}
|
|
1804
1826
|
async function create(options) {
|
|
1805
|
-
const { bundle, passcode,
|
|
1827
|
+
const { bundle, passcode, maxAccesses, label, storage, debug } = options;
|
|
1828
|
+
let expiresAt;
|
|
1829
|
+
if (typeof options.expiresAt === "string") {
|
|
1830
|
+
const preset = options.expiresAt;
|
|
1831
|
+
const durationMs = EXPIRATION_PRESETS[preset];
|
|
1832
|
+
if (durationMs === void 0) {
|
|
1833
|
+
throw new chunkUDS6UJAL_cjs.ValidationError(`Unknown expiration preset: "${preset}"`);
|
|
1834
|
+
}
|
|
1835
|
+
expiresAt = durationMs > 0 ? new Date(Date.now() + durationMs) : void 0;
|
|
1836
|
+
} else {
|
|
1837
|
+
expiresAt = options.expiresAt;
|
|
1838
|
+
}
|
|
1806
1839
|
if (!bundle || typeof bundle !== "object") {
|
|
1807
1840
|
throw new chunkUDS6UJAL_cjs.ValidationError("bundle is required and must be an object");
|
|
1808
1841
|
}
|
|
@@ -1817,7 +1850,7 @@ async function create(options) {
|
|
|
1817
1850
|
"PSHD compliance forbids passcode (flag U is incompatible with flag P)"
|
|
1818
1851
|
);
|
|
1819
1852
|
}
|
|
1820
|
-
if (!expiresAt) {
|
|
1853
|
+
if (!expiresAt && options.expiresAt !== "permanent") {
|
|
1821
1854
|
throw new chunkUDS6UJAL_cjs.ValidationError(
|
|
1822
1855
|
"PSHD compliance requires expiresAt (short-lived links for point-of-care)"
|
|
1823
1856
|
);
|
|
@@ -2064,5 +2097,5 @@ async function revoke(shlId, storage) {
|
|
|
2064
2097
|
|
|
2065
2098
|
exports.ips_exports = ips_exports;
|
|
2066
2099
|
exports.shl_exports = shl_exports;
|
|
2067
|
-
//# sourceMappingURL=chunk-
|
|
2068
|
-
//# sourceMappingURL=chunk-
|
|
2100
|
+
//# sourceMappingURL=chunk-CN44QKWJ.cjs.map
|
|
2101
|
+
//# sourceMappingURL=chunk-CN44QKWJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ips/index.ts","../src/ips/narrative.ts","../src/ips/patient.ts","../src/ips/code-systems.ts","../src/ips/medication.ts","../src/ips/condition.ts","../src/ips/allergy.ts","../src/ips/immunization.ts","../src/ips/result.ts","../src/ips/document.ts","../src/ips/bundle.ts","../src/shl/index.ts","../src/shl/types.ts","../src/shl/crypto.ts","../src/shl/qrcode.ts","../src/shl/create.ts","../src/shl/decode.ts","../src/shl/revoke.ts"],"names":["__export","generateUuid","resolveSingle","resolveSNOMED","resolvePassthrough","resolveManual","enrichPassthroughWithSNOMED","AzureStorage","FhirflyStorage","GCSStorage","LocalStorage","S3Storage","decryptContent","randomBytes","deflateRawSync","createCipheriv","createDecipheriv","inflateRawSync","QRCode","ValidationError","EncryptionError","StorageError","createHash"],"mappings":"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","file":"chunk-CN44QKWJ.cjs","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport { Bundle } from \"./bundle.js\";\n\n// Code system constants\nexport { CODE_SYSTEMS } from \"./code-systems.js\";\n\n// Patient input types\nexport type {\n PatientDemographics,\n PatientShorthand,\n PatientFull,\n PatientCommunication,\n PatientContact,\n} from \"./types.js\";\n\n// Build & validation types\nexport type {\n BundleProfile,\n BuildOptions,\n ValidationResult,\n ValidationIssue,\n} from \"./types.js\";\n\n// Clinical entry option types\nexport type {\n MedicationOptions,\n MedicationByNDC,\n MedicationByRxNorm,\n MedicationBySNOMED,\n MedicationFromResource,\n MedicationManual,\n MedicationStatus,\n FhirflyClient,\n ConditionOptions,\n ConditionByICD10,\n ConditionBySNOMED,\n ConditionFromResource,\n ConditionManual,\n ConditionClinicalStatus,\n AllergyOptions,\n AllergyBySNOMED,\n AllergyFromResource,\n AllergyManual,\n AllergyClinicalStatus,\n ImmunizationOptions,\n ImmunizationByCVX,\n ImmunizationFromResource,\n ImmunizationManual,\n ResultOptions,\n ResultByLOINC,\n ResultFromResource,\n ResultManual,\n ObservationStatus,\n DocumentOptions,\n} from \"./types.js\";\n\n// FHIR R4 datatypes (re-exported for users building PatientFull input)\nexport type {\n HumanName,\n Address,\n ContactPoint,\n Identifier,\n CodeableConcept,\n Reference,\n Coding,\n Period,\n AdministrativeGender,\n} from \"./fhir-types.js\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nconst XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nfunction esc(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction wrap(lines: string[]): string {\n const body = lines.join(\"\");\n return `<div xmlns=\"${XHTML_NS}\">${body}</div>`;\n}\n\nexport function medicationNarrative(\n displayText: string | undefined,\n dosageText: string | undefined,\n effectiveDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Medication\")}</b></p>`);\n if (dosageText) lines.push(`<p>Dosage: ${esc(dosageText)}</p>`);\n if (effectiveDate) lines.push(`<p>Effective: ${esc(effectiveDate)}</p>`);\n return wrap(lines);\n}\n\nexport function conditionNarrative(\n displayText: string | undefined,\n clinicalStatus: string,\n onsetDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Condition\")}</b></p>`);\n lines.push(`<p>Clinical Status: ${esc(clinicalStatus)}</p>`);\n if (onsetDate) lines.push(`<p>Onset: ${esc(onsetDate)}</p>`);\n return wrap(lines);\n}\n\nexport function allergyNarrative(\n displayText: string | undefined,\n clinicalStatus: string,\n criticality: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Allergy\")}</b></p>`);\n lines.push(`<p>Clinical Status: ${esc(clinicalStatus)}</p>`);\n if (criticality) lines.push(`<p>Criticality: ${esc(criticality)}</p>`);\n return wrap(lines);\n}\n\nexport function immunizationNarrative(\n displayText: string | undefined,\n status: string,\n occurrenceDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Immunization\")}</b></p>`);\n lines.push(`<p>Status: ${esc(status)}</p>`);\n if (occurrenceDate) lines.push(`<p>Date: ${esc(occurrenceDate)}</p>`);\n return wrap(lines);\n}\n\nexport function resultNarrative(\n displayText: string | undefined,\n value: number | undefined,\n valueString: string | undefined,\n unit: string | undefined,\n effectiveDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Lab Result\")}</b></p>`);\n if (value !== undefined && unit) {\n lines.push(`<p>Value: ${esc(String(value))} ${esc(unit)}</p>`);\n } else if (value !== undefined) {\n lines.push(`<p>Value: ${esc(String(value))}</p>`);\n } else if (valueString !== undefined) {\n lines.push(`<p>Value: ${esc(valueString)}</p>`);\n }\n if (effectiveDate) lines.push(`<p>Date: ${esc(effectiveDate)}</p>`);\n return wrap(lines);\n}\n\nexport function documentNarrative(\n title: string,\n contentType: string,\n date: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(title)}</b></p>`);\n lines.push(`<p>Type: ${esc(contentType)}</p>`);\n if (date) lines.push(`<p>Date: ${esc(date)}</p>`);\n return wrap(lines);\n}\n\nexport function patientNarrative(\n name: string | undefined,\n birthDate: string,\n gender: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(name ?? \"Patient\")}</b></p>`);\n lines.push(`<p>DOB: ${esc(birthDate)}</p>`);\n if (gender) lines.push(`<p>Gender: ${esc(gender)}</p>`);\n return wrap(lines);\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal patient normalization — converts shorthand or full FHIR-shaped\n * patient input into a FHIR R4 Patient resource object.\n */\n\nimport type { PatientDemographics, PatientFull, PatientShorthand, BundleProfile } from \"./types.js\";\nimport type { HumanName, ContactPoint, Identifier } from \"./fhir-types.js\";\nimport { patientNarrative } from \"./narrative.js\";\n\n/**\n * Type guard: returns true if the input is a full FHIR-shaped patient.\n * Discriminant: `Array.isArray(input.name)`.\n */\nexport function isPatientFull(input: PatientDemographics): input is PatientFull {\n return Array.isArray((input as PatientFull).name);\n}\n\n/**\n * Convert either patient input form to a FHIR R4 Patient resource object.\n */\nexport function normalizePatient(\n input: PatientDemographics,\n id: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n if (isPatientFull(input)) {\n return buildFromFull(input, id, profile);\n }\n return buildFromShorthand(input, id, profile);\n}\n\nfunction buildFromShorthand(\n input: PatientShorthand,\n id: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const patient: Record<string, unknown> = {\n resourceType: \"Patient\",\n id,\n };\n\n if (profile === \"ips\") {\n patient.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Patient-uv-ips\"],\n };\n }\n\n // Name: given/family or text\n const name: HumanName = {};\n if (input.given) name.given = [input.given];\n if (input.family) name.family = input.family;\n if (input.name) name.text = input.name;\n if (name.given || name.family || name.text) {\n patient.name = [name];\n }\n\n patient.birthDate = input.birthDate;\n\n if (input.gender) {\n patient.gender = input.gender;\n }\n\n // Telecom: phone, email\n const telecom: ContactPoint[] = [];\n if (input.phone) {\n telecom.push({ system: \"phone\", value: input.phone });\n }\n if (input.email) {\n telecom.push({ system: \"email\", value: input.email });\n }\n if (telecom.length > 0) {\n patient.telecom = telecom;\n }\n\n // Identifier\n if (input.identifier) {\n const ident: Identifier = typeof input.identifier === \"string\"\n ? { value: input.identifier }\n : { system: input.identifier.system, value: input.identifier.value };\n patient.identifier = [ident];\n }\n\n const displayName = (input.name\n ?? [input.given, input.family].filter(Boolean).join(\" \"))\n || undefined;\n patient.text = {\n status: \"generated\",\n div: patientNarrative(displayName, input.birthDate, input.gender),\n };\n\n return patient;\n}\n\nfunction buildFromFull(\n input: PatientFull,\n id: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const patient: Record<string, unknown> = {\n resourceType: \"Patient\",\n id,\n };\n\n if (profile === \"ips\") {\n patient.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Patient-uv-ips\"],\n };\n }\n\n patient.name = input.name;\n patient.birthDate = input.birthDate;\n\n if (input.gender) patient.gender = input.gender;\n if (input.identifier) patient.identifier = input.identifier;\n if (input.telecom) patient.telecom = input.telecom;\n if (input.address) patient.address = input.address;\n if (input.active !== undefined) patient.active = input.active;\n if (input.maritalStatus) patient.maritalStatus = input.maritalStatus;\n if (input.generalPractitioner) patient.generalPractitioner = input.generalPractitioner;\n if (input.communication) patient.communication = input.communication;\n if (input.contact) patient.contact = input.contact;\n\n // Deceased polymorphism: boolean → deceasedBoolean, string → deceasedDateTime\n if (input.deceased !== undefined) {\n if (typeof input.deceased === \"boolean\") {\n patient.deceasedBoolean = input.deceased;\n } else {\n patient.deceasedDateTime = input.deceased;\n }\n }\n\n const first = input.name[0];\n const displayName = first\n ? (first.text ?? [first.given?.join(\" \"), first.family].filter(Boolean).join(\" \")) || undefined\n : undefined;\n patient.text = {\n status: \"generated\",\n div: patientNarrative(displayName, input.birthDate, input.gender),\n };\n\n return patient;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/** Well-known FHIR code system URIs used across IPS resource generation. */\nexport const CODE_SYSTEMS = {\n NDC: \"http://hl7.org/fhir/sid/ndc\",\n RXNORM: \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n SNOMED: \"http://snomed.info/sct\",\n LOINC: \"http://loinc.org\",\n CVX: \"http://hl7.org/fhir/sid/cvx\",\n ICD10CM: \"http://hl7.org/fhir/sid/icd-10-cm\",\n CONDITION_CLINICAL: \"http://terminology.hl7.org/CodeSystem/condition-clinical\",\n ALLERGY_CLINICAL: \"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical\",\n /** CMS Patient-Shared Health Document category code system */\n CMS_PATIENT_SHARED_CATEGORY: \"https://cms.gov/fhir/CodeSystem/patient-shared-category\",\n /** V3 ActCode security label for patient-asserted data */\n SECURITY_PATAST: \"PATAST\",\n} as const;\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal medication resolution — converts the 5 medication input variants\n * into resolved medications and then into FHIR MedicationStatement resources.\n */\n\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport { medicationNarrative } from \"./narrative.js\";\nimport type {\n MedicationOptions,\n MedicationByNDC,\n MedicationByRxNorm,\n MedicationBySNOMED,\n MedicationFromResource,\n MedicationManual,\n ResolvedMedication,\n ResolvedCoding,\n ValidationIssue,\n FhirflyClient,\n BundleProfile,\n} from \"./types.js\";\n\n/** Result of resolving all medications — includes build-time warnings. */\nexport interface MedicationResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n warnings: ValidationIssue[];\n}\n\n/**\n * Resolve all medication inputs into FHIR MedicationStatement Bundle entries.\n */\nexport async function resolveMedications(\n meds: MedicationOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): Promise<MedicationResolutionResult> {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n const warnings: ValidationIssue[] = [];\n\n for (const med of meds) {\n const resolved = await resolveSingle(med, warnings);\n\n if (resolved.originalResource) {\n // fromResource passthrough — rewrite subject and assign ID\n const id = generateUuid();\n const resource = { ...resolved.originalResource };\n resource.id = id;\n resource.subject = { reference: patientRef };\n\n if (profile === \"ips\" && resource.resourceType === \"MedicationStatement\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/MedicationStatement-uv-ips\"],\n };\n }\n\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n } else {\n const id = generateUuid();\n const resource = buildMedicationStatement(resolved, id, patientRef, profile);\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n }\n }\n\n return { entries, warnings };\n}\n\nasync function resolveSingle(\n med: MedicationOptions,\n warnings: ValidationIssue[],\n): Promise<ResolvedMedication> {\n if (\"byNDC\" in med && med.byNDC !== undefined) {\n return resolveNDC(med as MedicationByNDC, warnings);\n }\n if (\"byRxNorm\" in med && med.byRxNorm !== undefined) {\n return resolveRxNorm(med as MedicationByRxNorm, warnings);\n }\n if (\"bySNOMED\" in med && med.bySNOMED !== undefined) {\n return resolveSNOMED(med as MedicationBySNOMED, warnings);\n }\n if (\"fromResource\" in med && med.fromResource !== undefined) {\n return resolvePassthrough(med as MedicationFromResource, warnings);\n }\n return resolveManual(med as MedicationManual);\n}\n\nasync function resolveNDC(\n med: MedicationByNDC,\n warnings: ValidationIssue[],\n): Promise<ResolvedMedication> {\n const codings: ResolvedCoding[] = [{ system: CODE_SYSTEMS.NDC, code: med.byNDC }];\n let text: string | undefined;\n\n try {\n const result = await med.fhirfly.ndc.lookup(med.byNDC, { shape: \"full\" });\n const data = result.data;\n\n codings[0]!.display = data.product_name;\n text = data.product_name;\n\n // Add SNOMED codings if available (only equivalent mappings for IPS)\n if (data.snomed) {\n for (const s of data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n codings.push({\n system: CODE_SYSTEMS.SNOMED,\n code: s.concept_id,\n display: s.display,\n });\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `NDC lookup failed for \"${med.byNDC}\" — included with bare code`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n\n return {\n codings,\n text,\n status: med.status ?? \"active\",\n dosageText: med.dosageText,\n effectiveDate: med.effectiveDate,\n };\n}\n\nasync function resolveRxNorm(\n med: MedicationByRxNorm,\n warnings: ValidationIssue[],\n): Promise<ResolvedMedication> {\n const codings: ResolvedCoding[] = [{ system: CODE_SYSTEMS.RXNORM, code: med.byRxNorm }];\n let text: string | undefined;\n\n try {\n const result = await med.fhirfly.rxnorm.lookup(med.byRxNorm, { shape: \"full\" });\n const data = result.data;\n\n codings[0]!.display = data.name;\n text = data.name;\n\n // Add SNOMED codings if available (only equivalent mappings for IPS)\n if (data.snomed) {\n for (const s of data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n codings.push({\n system: CODE_SYSTEMS.SNOMED,\n code: s.concept_id,\n display: s.display,\n });\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `RxNorm lookup failed for \"${med.byRxNorm}\" — included with bare code`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n\n return {\n codings,\n text,\n status: med.status ?? \"active\",\n dosageText: med.dosageText,\n effectiveDate: med.effectiveDate,\n };\n}\n\nasync function resolveSNOMED(\n med: MedicationBySNOMED,\n warnings: ValidationIssue[],\n): Promise<ResolvedMedication> {\n let display = med.display;\n\n // If fhirfly provided, look up preferred_term\n if (med.fhirfly) {\n try {\n const result = await med.fhirfly.snomed.lookup(med.bySNOMED);\n if (result.data.preferred_term) {\n display = result.data.preferred_term;\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `SNOMED lookup failed for \"${med.bySNOMED}\" — using provided display`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n }\n\n if (!display) {\n warnings.push({\n severity: \"warning\",\n message: `No display name for SNOMED code \"${med.bySNOMED}\"`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n\n return {\n codings: [{ system: CODE_SYSTEMS.SNOMED, code: med.bySNOMED, display }],\n text: display,\n status: med.status ?? \"active\",\n dosageText: med.dosageText,\n effectiveDate: med.effectiveDate,\n };\n}\n\nfunction resolveManual(med: MedicationManual): ResolvedMedication {\n return {\n codings: [{ system: med.system, code: med.code, display: med.display }],\n text: med.display,\n status: med.status ?? \"active\",\n dosageText: med.dosageText,\n effectiveDate: med.effectiveDate,\n };\n}\n\nasync function resolvePassthrough(\n med: MedicationFromResource,\n warnings: ValidationIssue[],\n): Promise<ResolvedMedication> {\n const resource = med.fromResource;\n\n // Validate resourceType — error at resolve time\n validateFromResource(resource);\n\n // Warn on missing status\n if (!resource.status) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"active\"`,\n path: `${String(resource.resourceType)}.status`,\n });\n }\n\n // Warn on missing medicationCodeableConcept\n if (!resource.medicationCodeableConcept) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"medicationCodeableConcept\"`,\n path: `${String(resource.resourceType)}.medicationCodeableConcept`,\n });\n }\n\n // If fhirfly provided, try to add SNOMED codings from existing NDC/RxNorm codes\n if (med.fhirfly && resource.medicationCodeableConcept) {\n await enrichPassthroughWithSNOMED(resource, med.fhirfly, warnings);\n }\n\n return {\n codings: [],\n status: (resource.status as string as ResolvedMedication[\"status\"]) ?? \"active\",\n originalResource: resource,\n };\n}\n\n/** Throws if resourceType is not MedicationStatement or MedicationRequest. */\nexport function validateFromResource(resource: Record<string, unknown>): void {\n const rt = resource.resourceType;\n if (rt !== \"MedicationStatement\" && rt !== \"MedicationRequest\") {\n throw new Error(\n `fromResource requires resourceType \"MedicationStatement\" or \"MedicationRequest\", got \"${String(rt)}\"`,\n );\n }\n}\n\nasync function enrichPassthroughWithSNOMED(\n resource: Record<string, unknown>,\n fhirfly: FhirflyClient,\n warnings: ValidationIssue[],\n): Promise<void> {\n const medCC = resource.medicationCodeableConcept as\n | { coding?: Array<{ system?: string; code?: string; display?: string }>; text?: string }\n | undefined;\n if (!medCC?.coding) return;\n\n // Check if SNOMED coding already exists\n const hasSNOMED = medCC.coding.some((c) => c.system === CODE_SYSTEMS.SNOMED);\n if (hasSNOMED) return;\n\n // Find NDC or RxNorm codes to look up\n const ndcCoding = medCC.coding.find((c) => c.system === CODE_SYSTEMS.NDC);\n const rxnormCoding = medCC.coding.find((c) => c.system === CODE_SYSTEMS.RXNORM);\n\n const newCodings: Array<{ system: string; code: string; display?: string }> = [];\n\n if (ndcCoding?.code) {\n try {\n const result = await fhirfly.ndc.lookup(ndcCoding.code, { shape: \"full\" });\n if (result.data.snomed) {\n for (const s of result.data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n newCodings.push({ system: CODE_SYSTEMS.SNOMED, code: s.concept_id, display: s.display });\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `NDC→SNOMED enrichment failed for \"${ndcCoding.code}\" on fromResource`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n } else if (rxnormCoding?.code) {\n try {\n const result = await fhirfly.rxnorm.lookup(rxnormCoding.code, { shape: \"full\" });\n if (result.data.snomed) {\n for (const s of result.data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n newCodings.push({ system: CODE_SYSTEMS.SNOMED, code: s.concept_id, display: s.display });\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `RxNorm→SNOMED enrichment failed for \"${rxnormCoding.code}\" on fromResource`,\n path: \"MedicationStatement.medicationCodeableConcept\",\n });\n }\n }\n\n if (newCodings.length > 0) {\n medCC.coding.push(...newCodings);\n }\n}\n\n/** Assemble a FHIR MedicationStatement resource from a resolved medication. */\nfunction buildMedicationStatement(\n resolved: ResolvedMedication,\n id: string,\n patientRef: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const resource: Record<string, unknown> = {\n resourceType: \"MedicationStatement\",\n id,\n status: resolved.status,\n medicationCodeableConcept: {\n coding: resolved.codings.map((c) => {\n const coding: Record<string, string> = { system: c.system, code: c.code };\n if (c.display) coding.display = c.display;\n return coding;\n }),\n ...(resolved.text ? { text: resolved.text } : {}),\n },\n subject: { reference: patientRef },\n effectiveDateTime: resolved.effectiveDate ?? new Date().toISOString().split(\"T\")[0],\n };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/MedicationStatement-uv-ips\"],\n };\n }\n\n if (resolved.dosageText) {\n resource.dosage = [{ text: resolved.dosageText }];\n }\n\n resource.text = {\n status: \"generated\",\n div: medicationNarrative(resolved.text, resolved.dosageText, resolved.effectiveDate),\n };\n\n return resource;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal condition resolution — converts condition input variants\n * into resolved conditions and then into FHIR Condition resources.\n */\n\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport { conditionNarrative } from \"./narrative.js\";\nimport type {\n ConditionOptions,\n ConditionByICD10,\n ConditionBySNOMED,\n ConditionFromResource,\n ConditionManual,\n ResolvedCondition,\n ResolvedCoding,\n ValidationIssue,\n FhirflyClient,\n BundleProfile,\n} from \"./types.js\";\n\n/** Result of resolving all conditions — includes build-time warnings. */\nexport interface ConditionResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n warnings: ValidationIssue[];\n}\n\n/**\n * Resolve all condition inputs into FHIR Condition Bundle entries.\n */\nexport async function resolveConditions(\n conditions: ConditionOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): Promise<ConditionResolutionResult> {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n const warnings: ValidationIssue[] = [];\n\n for (const cond of conditions) {\n const resolved = await resolveSingle(cond, warnings);\n\n if (resolved.originalResource) {\n const id = generateUuid();\n const resource = { ...resolved.originalResource };\n resource.id = id;\n resource.subject = { reference: patientRef };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Condition-uv-ips\"],\n };\n }\n\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n } else {\n const id = generateUuid();\n const resource = buildCondition(resolved, id, patientRef, profile);\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n }\n }\n\n return { entries, warnings };\n}\n\nasync function resolveSingle(\n cond: ConditionOptions,\n warnings: ValidationIssue[],\n): Promise<ResolvedCondition> {\n if (\"byICD10\" in cond && cond.byICD10 !== undefined) {\n return resolveICD10(cond as ConditionByICD10, warnings);\n }\n if (\"bySNOMED\" in cond && cond.bySNOMED !== undefined) {\n return resolveSNOMED(cond as ConditionBySNOMED, warnings);\n }\n if (\"fromResource\" in cond && cond.fromResource !== undefined) {\n return resolvePassthrough(cond as ConditionFromResource, warnings);\n }\n return resolveManual(cond as ConditionManual);\n}\n\nasync function resolveICD10(\n cond: ConditionByICD10,\n warnings: ValidationIssue[],\n): Promise<ResolvedCondition> {\n const codings: ResolvedCoding[] = [{ system: CODE_SYSTEMS.ICD10CM, code: cond.byICD10 }];\n let text: string | undefined;\n\n try {\n const result = await cond.fhirfly.icd10.lookup(cond.byICD10, { shape: \"standard\" });\n const data = result.data;\n\n codings[0]!.display = data.display;\n text = data.display;\n\n if (data.snomed) {\n for (const s of data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n codings.push({\n system: CODE_SYSTEMS.SNOMED,\n code: s.concept_id,\n display: s.display,\n });\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `ICD-10 lookup failed for \"${cond.byICD10}\" — included with bare code`,\n path: \"Condition.code\",\n });\n }\n\n return {\n codings,\n text,\n clinicalStatus: cond.clinicalStatus ?? \"active\",\n onsetDate: cond.onsetDate,\n };\n}\n\nasync function resolveSNOMED(\n cond: ConditionBySNOMED,\n warnings: ValidationIssue[],\n): Promise<ResolvedCondition> {\n let display = cond.display;\n\n if (cond.fhirfly) {\n try {\n const result = await cond.fhirfly.snomed.lookup(cond.bySNOMED);\n if (result.data.preferred_term) {\n display = result.data.preferred_term;\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `SNOMED lookup failed for \"${cond.bySNOMED}\" — using provided display`,\n path: \"Condition.code\",\n });\n }\n }\n\n if (!display) {\n warnings.push({\n severity: \"warning\",\n message: `No display name for SNOMED code \"${cond.bySNOMED}\"`,\n path: \"Condition.code\",\n });\n }\n\n return {\n codings: [{ system: CODE_SYSTEMS.SNOMED, code: cond.bySNOMED, display }],\n text: display,\n clinicalStatus: cond.clinicalStatus ?? \"active\",\n onsetDate: cond.onsetDate,\n };\n}\n\nfunction resolveManual(cond: ConditionManual): ResolvedCondition {\n return {\n codings: [{ system: cond.system, code: cond.code, display: cond.display }],\n text: cond.display,\n clinicalStatus: cond.clinicalStatus ?? \"active\",\n onsetDate: cond.onsetDate,\n };\n}\n\nasync function resolvePassthrough(\n cond: ConditionFromResource,\n warnings: ValidationIssue[],\n): Promise<ResolvedCondition> {\n const resource = cond.fromResource;\n\n validateConditionFromResource(resource);\n\n if (!resource.clinicalStatus) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"clinicalStatus\" — will default to \"active\"`,\n path: \"Condition.clinicalStatus\",\n });\n }\n\n if (!resource.code) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"Condition.code\",\n });\n }\n\n // If fhirfly provided, try to enrich with SNOMED from existing ICD-10 codes\n if (cond.fhirfly && resource.code) {\n await enrichPassthroughWithSNOMED(resource, cond.fhirfly, warnings);\n }\n\n return {\n codings: [],\n clinicalStatus: \"active\",\n originalResource: resource,\n };\n}\n\n/** Throws if resourceType is not Condition. */\nexport function validateConditionFromResource(resource: Record<string, unknown>): void {\n const rt = resource.resourceType;\n if (rt !== \"Condition\") {\n throw new Error(\n `fromResource requires resourceType \"Condition\", got \"${String(rt)}\"`,\n );\n }\n}\n\nasync function enrichPassthroughWithSNOMED(\n resource: Record<string, unknown>,\n fhirfly: FhirflyClient,\n warnings: ValidationIssue[],\n): Promise<void> {\n const codeCC = resource.code as\n | { coding?: Array<{ system?: string; code?: string; display?: string }>; text?: string }\n | undefined;\n if (!codeCC?.coding) return;\n\n const hasSNOMED = codeCC.coding.some((c) => c.system === CODE_SYSTEMS.SNOMED);\n if (hasSNOMED) return;\n\n const icd10Coding = codeCC.coding.find((c) => c.system === CODE_SYSTEMS.ICD10CM);\n\n if (icd10Coding?.code) {\n try {\n const result = await fhirfly.icd10.lookup(icd10Coding.code, { shape: \"standard\" });\n if (result.data.snomed) {\n const newCodings: Array<{ system: string; code: string; display?: string }> = [];\n for (const s of result.data.snomed) {\n if (s.map_type && s.map_type.toLowerCase() !== \"equivalent\") continue;\n newCodings.push({ system: CODE_SYSTEMS.SNOMED, code: s.concept_id, display: s.display });\n }\n if (newCodings.length > 0) {\n codeCC.coding.push(...newCodings);\n }\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `ICD-10→SNOMED enrichment failed for \"${icd10Coding.code}\" on fromResource`,\n path: \"Condition.code\",\n });\n }\n }\n}\n\n/** Assemble a FHIR Condition resource from a resolved condition. */\nfunction buildCondition(\n resolved: ResolvedCondition,\n id: string,\n patientRef: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const resource: Record<string, unknown> = {\n resourceType: \"Condition\",\n id,\n clinicalStatus: {\n coding: [\n {\n system: CODE_SYSTEMS.CONDITION_CLINICAL,\n code: resolved.clinicalStatus,\n },\n ],\n },\n code: {\n coding: resolved.codings.map((c) => {\n const coding: Record<string, string> = { system: c.system, code: c.code };\n if (c.display) coding.display = c.display;\n return coding;\n }),\n ...(resolved.text ? { text: resolved.text } : {}),\n },\n subject: { reference: patientRef },\n };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Condition-uv-ips\"],\n };\n }\n\n if (resolved.onsetDate) {\n resource.onsetDateTime = resolved.onsetDate;\n }\n\n resource.text = {\n status: \"generated\",\n div: conditionNarrative(resolved.text, resolved.clinicalStatus, resolved.onsetDate),\n };\n\n return resource;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal allergy resolution — converts allergy input variants\n * into resolved allergies and then into FHIR AllergyIntolerance resources.\n */\n\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport { allergyNarrative } from \"./narrative.js\";\nimport type {\n AllergyOptions,\n AllergyBySNOMED,\n AllergyFromResource,\n AllergyManual,\n ResolvedAllergy,\n ValidationIssue,\n BundleProfile,\n} from \"./types.js\";\n\n/** Result of resolving all allergies — includes build-time warnings. */\nexport interface AllergyResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n warnings: ValidationIssue[];\n}\n\n/**\n * Resolve all allergy inputs into FHIR AllergyIntolerance Bundle entries.\n */\nexport async function resolveAllergies(\n allergies: AllergyOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): Promise<AllergyResolutionResult> {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n const warnings: ValidationIssue[] = [];\n\n for (const allergy of allergies) {\n const resolved = await resolveSingle(allergy, warnings);\n\n if (resolved.originalResource) {\n const id = generateUuid();\n const resource = { ...resolved.originalResource };\n resource.id = id;\n resource.patient = { reference: patientRef };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/AllergyIntolerance-uv-ips\"],\n };\n }\n\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n } else {\n const id = generateUuid();\n const resource = buildAllergyIntolerance(resolved, id, patientRef, profile);\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n }\n }\n\n return { entries, warnings };\n}\n\nasync function resolveSingle(\n allergy: AllergyOptions,\n warnings: ValidationIssue[],\n): Promise<ResolvedAllergy> {\n if (\"bySNOMED\" in allergy && allergy.bySNOMED !== undefined) {\n return resolveSNOMED(allergy as AllergyBySNOMED, warnings);\n }\n if (\"fromResource\" in allergy && allergy.fromResource !== undefined) {\n return resolvePassthrough(allergy as AllergyFromResource, warnings);\n }\n return resolveManual(allergy as AllergyManual);\n}\n\nasync function resolveSNOMED(\n allergy: AllergyBySNOMED,\n warnings: ValidationIssue[],\n): Promise<ResolvedAllergy> {\n let display = allergy.display;\n\n if (allergy.fhirfly) {\n try {\n const result = await allergy.fhirfly.snomed.lookup(allergy.bySNOMED);\n if (result.data.preferred_term) {\n display = result.data.preferred_term;\n }\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `SNOMED lookup failed for \"${allergy.bySNOMED}\" — using provided display`,\n path: \"AllergyIntolerance.code\",\n });\n }\n }\n\n if (!display) {\n warnings.push({\n severity: \"warning\",\n message: `No display name for SNOMED code \"${allergy.bySNOMED}\"`,\n path: \"AllergyIntolerance.code\",\n });\n }\n\n return {\n codings: [{ system: CODE_SYSTEMS.SNOMED, code: allergy.bySNOMED, display }],\n text: display,\n clinicalStatus: allergy.clinicalStatus ?? \"active\",\n criticality: allergy.criticality,\n };\n}\n\nfunction resolveManual(allergy: AllergyManual): ResolvedAllergy {\n return {\n codings: [{ system: allergy.system, code: allergy.code, display: allergy.display }],\n text: allergy.display,\n clinicalStatus: allergy.clinicalStatus ?? \"active\",\n criticality: allergy.criticality,\n };\n}\n\nasync function resolvePassthrough(\n allergy: AllergyFromResource,\n warnings: ValidationIssue[],\n): Promise<ResolvedAllergy> {\n const resource = allergy.fromResource;\n\n validateAllergyFromResource(resource);\n\n if (!resource.clinicalStatus) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"clinicalStatus\" — will default to \"active\"`,\n path: \"AllergyIntolerance.clinicalStatus\",\n });\n }\n\n if (!resource.code) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"AllergyIntolerance.code\",\n });\n }\n\n return {\n codings: [],\n clinicalStatus: \"active\",\n originalResource: resource,\n };\n}\n\n/** Throws if resourceType is not AllergyIntolerance. */\nexport function validateAllergyFromResource(resource: Record<string, unknown>): void {\n const rt = resource.resourceType;\n if (rt !== \"AllergyIntolerance\") {\n throw new Error(\n `fromResource requires resourceType \"AllergyIntolerance\", got \"${String(rt)}\"`,\n );\n }\n}\n\n/** Assemble a FHIR AllergyIntolerance resource from a resolved allergy. */\nfunction buildAllergyIntolerance(\n resolved: ResolvedAllergy,\n id: string,\n patientRef: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const resource: Record<string, unknown> = {\n resourceType: \"AllergyIntolerance\",\n id,\n clinicalStatus: {\n coding: [\n {\n system: CODE_SYSTEMS.ALLERGY_CLINICAL,\n code: resolved.clinicalStatus,\n },\n ],\n },\n code: {\n coding: resolved.codings.map((c) => {\n const coding: Record<string, string> = { system: c.system, code: c.code };\n if (c.display) coding.display = c.display;\n return coding;\n }),\n ...(resolved.text ? { text: resolved.text } : {}),\n },\n patient: { reference: patientRef },\n };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/AllergyIntolerance-uv-ips\"],\n };\n }\n\n if (resolved.criticality) {\n resource.criticality = resolved.criticality;\n }\n\n resource.text = {\n status: \"generated\",\n div: allergyNarrative(resolved.text, resolved.clinicalStatus, resolved.criticality),\n };\n\n return resource;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal immunization resolution — converts immunization input variants\n * into resolved immunizations and then into FHIR Immunization resources.\n */\n\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport { immunizationNarrative } from \"./narrative.js\";\nimport type {\n ImmunizationOptions,\n ImmunizationByCVX,\n ImmunizationFromResource,\n ImmunizationManual,\n ResolvedImmunization,\n ResolvedCoding,\n ValidationIssue,\n BundleProfile,\n} from \"./types.js\";\n\n/** Result of resolving all immunizations — includes build-time warnings. */\nexport interface ImmunizationResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n warnings: ValidationIssue[];\n}\n\n/**\n * Resolve all immunization inputs into FHIR Immunization Bundle entries.\n */\nexport async function resolveImmunizations(\n immunizations: ImmunizationOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): Promise<ImmunizationResolutionResult> {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n const warnings: ValidationIssue[] = [];\n\n for (const imm of immunizations) {\n const resolved = await resolveSingle(imm, warnings);\n\n if (resolved.originalResource) {\n const id = generateUuid();\n const resource = { ...resolved.originalResource };\n resource.id = id;\n resource.patient = { reference: patientRef };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Immunization-uv-ips\"],\n };\n }\n\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n } else {\n const id = generateUuid();\n const resource = buildImmunization(resolved, id, patientRef, profile);\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n }\n }\n\n return { entries, warnings };\n}\n\nasync function resolveSingle(\n imm: ImmunizationOptions,\n warnings: ValidationIssue[],\n): Promise<ResolvedImmunization> {\n if (\"byCVX\" in imm && imm.byCVX !== undefined) {\n return resolveCVX(imm as ImmunizationByCVX, warnings);\n }\n if (\"fromResource\" in imm && imm.fromResource !== undefined) {\n return resolvePassthrough(imm as ImmunizationFromResource, warnings);\n }\n return resolveManual(imm as ImmunizationManual);\n}\n\nasync function resolveCVX(\n imm: ImmunizationByCVX,\n warnings: ValidationIssue[],\n): Promise<ResolvedImmunization> {\n const codings: ResolvedCoding[] = [{ system: CODE_SYSTEMS.CVX, code: imm.byCVX }];\n let text: string | undefined;\n\n try {\n const result = await imm.fhirfly.cvx.lookup(imm.byCVX);\n const data = result.data;\n\n codings[0]!.display = data.display;\n text = data.display;\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `CVX lookup failed for \"${imm.byCVX}\" — included with bare code`,\n path: \"Immunization.vaccineCode\",\n });\n }\n\n return {\n codings,\n text,\n status: imm.status ?? \"completed\",\n occurrenceDate: imm.occurrenceDate,\n };\n}\n\nfunction resolveManual(imm: ImmunizationManual): ResolvedImmunization {\n return {\n codings: [{ system: imm.system, code: imm.code, display: imm.display }],\n text: imm.display,\n status: imm.status ?? \"completed\",\n occurrenceDate: imm.occurrenceDate,\n };\n}\n\nasync function resolvePassthrough(\n imm: ImmunizationFromResource,\n warnings: ValidationIssue[],\n): Promise<ResolvedImmunization> {\n const resource = imm.fromResource;\n\n validateImmunizationFromResource(resource);\n\n if (!resource.status) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"completed\"`,\n path: \"Immunization.status\",\n });\n }\n\n if (!resource.vaccineCode) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"vaccineCode\"`,\n path: \"Immunization.vaccineCode\",\n });\n }\n\n return {\n codings: [],\n status: \"completed\",\n originalResource: resource,\n };\n}\n\n/** Throws if resourceType is not Immunization. */\nexport function validateImmunizationFromResource(resource: Record<string, unknown>): void {\n const rt = resource.resourceType;\n if (rt !== \"Immunization\") {\n throw new Error(\n `fromResource requires resourceType \"Immunization\", got \"${String(rt)}\"`,\n );\n }\n}\n\n/** Assemble a FHIR Immunization resource from a resolved immunization. */\nfunction buildImmunization(\n resolved: ResolvedImmunization,\n id: string,\n patientRef: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const resource: Record<string, unknown> = {\n resourceType: \"Immunization\",\n id,\n status: resolved.status,\n vaccineCode: {\n coding: resolved.codings.map((c) => {\n const coding: Record<string, string> = { system: c.system, code: c.code };\n if (c.display) coding.display = c.display;\n return coding;\n }),\n ...(resolved.text ? { text: resolved.text } : {}),\n },\n patient: { reference: patientRef },\n };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Immunization-uv-ips\"],\n };\n }\n\n if (resolved.occurrenceDate) {\n resource.occurrenceDateTime = resolved.occurrenceDate;\n }\n\n resource.text = {\n status: \"generated\",\n div: immunizationNarrative(resolved.text, resolved.status, resolved.occurrenceDate),\n };\n\n return resource;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal result resolution — converts result input variants\n * into resolved results and then into FHIR Observation resources.\n */\n\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport { resultNarrative } from \"./narrative.js\";\nimport type {\n ResultOptions,\n ResultByLOINC,\n ResultFromResource,\n ResultManual,\n ResolvedResult,\n ResolvedCoding,\n ValidationIssue,\n BundleProfile,\n} from \"./types.js\";\n\n/** Result of resolving all results — includes build-time warnings. */\nexport interface ResultResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n warnings: ValidationIssue[];\n}\n\n/**\n * Resolve all result inputs into FHIR Observation Bundle entries.\n */\nexport async function resolveResults(\n results: ResultOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): Promise<ResultResolutionResult> {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n const warnings: ValidationIssue[] = [];\n\n for (const result of results) {\n const resolved = await resolveSingle(result, warnings);\n\n if (resolved.originalResource) {\n const id = generateUuid();\n const resource = { ...resolved.originalResource };\n resource.id = id;\n resource.subject = { reference: patientRef };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Observation-results-laboratory-uv-ips\"],\n };\n }\n\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n } else {\n const id = generateUuid();\n const resource = buildObservation(resolved, id, patientRef, profile);\n entries.push({ fullUrl: `urn:uuid:${id}`, resource });\n }\n }\n\n return { entries, warnings };\n}\n\nasync function resolveSingle(\n result: ResultOptions,\n warnings: ValidationIssue[],\n): Promise<ResolvedResult> {\n if (\"byLOINC\" in result && result.byLOINC !== undefined) {\n return resolveLOINC(result as ResultByLOINC, warnings);\n }\n if (\"fromResource\" in result && result.fromResource !== undefined) {\n return resolvePassthrough(result as ResultFromResource, warnings);\n }\n return resolveManual(result as ResultManual);\n}\n\nasync function resolveLOINC(\n result: ResultByLOINC,\n warnings: ValidationIssue[],\n): Promise<ResolvedResult> {\n const codings: ResolvedCoding[] = [{ system: CODE_SYSTEMS.LOINC, code: result.byLOINC }];\n let text: string | undefined;\n\n try {\n const apiResult = await result.fhirfly.loinc.lookup(result.byLOINC, { shape: \"standard\" });\n const data = apiResult.data;\n\n codings[0]!.display = data.long_common_name;\n text = data.long_common_name;\n } catch {\n warnings.push({\n severity: \"warning\",\n message: `LOINC lookup failed for \"${result.byLOINC}\" — included with bare code`,\n path: \"Observation.code\",\n });\n }\n\n return {\n codings,\n text,\n status: result.status ?? \"final\",\n value: result.value,\n valueString: result.valueString,\n unit: result.unit,\n unitCode: result.unitCode,\n referenceRange: result.referenceRange,\n effectiveDate: result.effectiveDate,\n };\n}\n\nfunction resolveManual(result: ResultManual): ResolvedResult {\n return {\n codings: [{ system: result.system, code: result.code, display: result.display }],\n text: result.display,\n status: result.status ?? \"final\",\n value: result.value,\n valueString: result.valueString,\n unit: result.unit,\n unitCode: result.unitCode,\n referenceRange: result.referenceRange,\n effectiveDate: result.effectiveDate,\n };\n}\n\nasync function resolvePassthrough(\n result: ResultFromResource,\n warnings: ValidationIssue[],\n): Promise<ResolvedResult> {\n const resource = result.fromResource;\n\n validateResultFromResource(resource);\n\n if (!resource.status) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"final\"`,\n path: \"Observation.status\",\n });\n }\n\n if (!resource.code) {\n warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"Observation.code\",\n });\n }\n\n return {\n codings: [],\n status: \"final\",\n originalResource: resource,\n };\n}\n\n/** Throws if resourceType is not Observation. */\nexport function validateResultFromResource(resource: Record<string, unknown>): void {\n const rt = resource.resourceType;\n if (rt !== \"Observation\") {\n throw new Error(\n `fromResource requires resourceType \"Observation\", got \"${String(rt)}\"`,\n );\n }\n}\n\n/** Assemble a FHIR Observation resource from a resolved result. */\nfunction buildObservation(\n resolved: ResolvedResult,\n id: string,\n patientRef: string,\n profile: BundleProfile,\n): Record<string, unknown> {\n const resource: Record<string, unknown> = {\n resourceType: \"Observation\",\n id,\n status: resolved.status,\n category: [\n {\n coding: [\n {\n system: \"http://terminology.hl7.org/CodeSystem/observation-category\",\n code: \"laboratory\",\n display: \"Laboratory\",\n },\n ],\n },\n ],\n code: {\n coding: resolved.codings.map((c) => {\n const coding: Record<string, string> = { system: c.system, code: c.code };\n if (c.display) coding.display = c.display;\n return coding;\n }),\n ...(resolved.text ? { text: resolved.text } : {}),\n },\n subject: { reference: patientRef },\n };\n\n if (profile === \"ips\") {\n resource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Observation-results-laboratory-uv-ips\"],\n };\n }\n\n // Value — numeric or string\n if (resolved.value !== undefined && resolved.unit) {\n resource.valueQuantity = {\n value: resolved.value,\n unit: resolved.unit,\n system: \"http://unitsofmeasure.org\",\n code: resolved.unitCode ?? resolved.unit,\n };\n } else if (resolved.valueString !== undefined) {\n resource.valueString = resolved.valueString;\n }\n\n // Reference range\n if (resolved.referenceRange) {\n const range: Record<string, unknown> = {};\n const rangeUnit = resolved.referenceRange.unit ?? resolved.unit;\n if (resolved.referenceRange.low !== undefined) {\n range.low = {\n value: resolved.referenceRange.low,\n ...(rangeUnit ? { unit: rangeUnit, system: \"http://unitsofmeasure.org\", code: rangeUnit } : {}),\n };\n }\n if (resolved.referenceRange.high !== undefined) {\n range.high = {\n value: resolved.referenceRange.high,\n ...(rangeUnit ? { unit: rangeUnit, system: \"http://unitsofmeasure.org\", code: rangeUnit } : {}),\n };\n }\n resource.referenceRange = [range];\n }\n\n // Effective date\n if (resolved.effectiveDate) {\n resource.effectiveDateTime = resolved.effectiveDate;\n }\n\n resource.text = {\n status: \"generated\",\n div: resultNarrative(\n resolved.text,\n resolved.value,\n resolved.valueString,\n resolved.unit,\n resolved.effectiveDate,\n ),\n };\n\n return resource;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Internal document resolution — wraps binary content (PDF, TIFF, JPG, etc.)\n * as FHIR DocumentReference + Binary resource pairs.\n */\n\nimport { documentNarrative } from \"./narrative.js\";\nimport { CODE_SYSTEMS } from \"./code-systems.js\";\nimport type { DocumentOptions, BundleProfile } from \"./types.js\";\n\n/** Result of resolving all documents. */\nexport interface DocumentResolutionResult {\n entries: Array<{ fullUrl: string; resource: Record<string, unknown> }>;\n}\n\n/**\n * Resolve all document inputs into FHIR DocumentReference + Binary Bundle entries.\n */\nexport function resolveDocuments(\n documents: DocumentOptions[],\n patientRef: string,\n profile: BundleProfile,\n generateUuid: () => string,\n): DocumentResolutionResult {\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [];\n\n for (const doc of documents) {\n const binaryId = generateUuid();\n const docRefId = generateUuid();\n const binaryFullUrl = `urn:uuid:${binaryId}`;\n const docRefFullUrl = `urn:uuid:${docRefId}`;\n\n const contentType = doc.contentType ?? \"application/pdf\";\n const date = doc.date ?? new Date().toISOString().split(\"T\")[0]!;\n\n // Build Binary resource\n const base64Content = bufferToBase64(doc.content);\n const binaryResource: Record<string, unknown> = {\n resourceType: \"Binary\",\n id: binaryId,\n contentType,\n data: base64Content,\n };\n\n // Build DocumentReference resource\n // PSHD overrides: type 60591-5, category patient-shared, author=Patient, security PATAST\n const isPshd = profile === \"pshd\";\n const typeCode = isPshd ? \"60591-5\" : (doc.typeCode ?? \"34133-9\");\n const typeDisplay = isPshd ? \"Patient summary Document\" : (doc.typeDisplay ?? \"Summarization of episode note\");\n\n const docRefResource: Record<string, unknown> = {\n resourceType: \"DocumentReference\",\n id: docRefId,\n status: \"current\",\n type: {\n coding: [\n {\n system: \"http://loinc.org\",\n code: typeCode,\n display: typeDisplay,\n },\n ],\n },\n subject: { reference: patientRef },\n date,\n content: [\n {\n attachment: {\n contentType,\n url: binaryFullUrl,\n title: doc.title,\n },\n },\n ],\n };\n\n if (isPshd) {\n // PSHD: no meta.profile, add category + security + author\n docRefResource.category = [\n {\n coding: [\n {\n system: CODE_SYSTEMS.CMS_PATIENT_SHARED_CATEGORY,\n code: \"patient-shared\",\n display: \"Patient Shared\",\n },\n ],\n },\n ];\n docRefResource.author = [{ reference: patientRef }];\n docRefResource.meta = {\n security: [\n {\n system: \"http://terminology.hl7.org/CodeSystem/v3-ActCode\",\n code: CODE_SYSTEMS.SECURITY_PATAST,\n display: \"patient asserted\",\n },\n ],\n };\n } else if (profile === \"ips\") {\n docRefResource.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/DocumentReference-uv-ips\"],\n };\n }\n\n docRefResource.text = {\n status: \"generated\",\n div: documentNarrative(doc.title, contentType, doc.date),\n };\n\n // DocumentReference first, then Binary\n entries.push({ fullUrl: docRefFullUrl, resource: docRefResource });\n entries.push({ fullUrl: binaryFullUrl, resource: binaryResource });\n }\n\n return { entries };\n}\n\n/** Convert Buffer or Uint8Array to base64 string. */\nfunction bufferToBase64(data: Buffer | Uint8Array): string {\n if (Buffer.isBuffer(data)) {\n return data.toString(\"base64\");\n }\n return Buffer.from(data).toString(\"base64\");\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport type {\n PatientDemographics,\n BuildOptions,\n BundleProfile,\n ValidationResult,\n ValidationIssue,\n MedicationOptions,\n AllergyOptions,\n ConditionOptions,\n ImmunizationOptions,\n ResultOptions,\n DocumentOptions,\n} from \"./types.js\";\nimport { normalizePatient, isPatientFull } from \"./patient.js\";\nimport { resolveMedications, validateFromResource } from \"./medication.js\";\nimport { resolveConditions, validateConditionFromResource } from \"./condition.js\";\nimport { resolveAllergies, validateAllergyFromResource } from \"./allergy.js\";\nimport { resolveImmunizations, validateImmunizationFromResource } from \"./immunization.js\";\nimport { resolveResults, validateResultFromResource } from \"./result.js\";\nimport { resolveDocuments } from \"./document.js\";\n\n/**\n * Builder for creating IPS (International Patient Summary) FHIR bundles.\n *\n * @example\n * ```ts\n * const bundle = new IPS.Bundle({\n * given: \"Jane\",\n * family: \"Doe\",\n * birthDate: \"1990-01-15\",\n * gender: \"female\",\n * });\n *\n * bundle.addMedication({\n * code: \"860975\",\n * system: \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n * display: \"Metformin 500 MG Oral Tablet\",\n * status: \"active\",\n * });\n *\n * const fhirBundle = await bundle.build({ profile: \"ips\" });\n * ```\n */\nexport class Bundle {\n private readonly _patient: PatientDemographics;\n private readonly _medications: MedicationOptions[] = [];\n private readonly _allergies: AllergyOptions[] = [];\n private readonly _conditions: ConditionOptions[] = [];\n private readonly _immunizations: ImmunizationOptions[] = [];\n private readonly _results: ResultOptions[] = [];\n private readonly _documents: DocumentOptions[] = [];\n private readonly _warnings: ValidationIssue[] = [];\n private _buildWarnings: ValidationIssue[] = [];\n\n constructor(patient: PatientDemographics) {\n this._patient = patient;\n }\n\n /** Returns the patient demographics for this bundle. */\n get patient(): PatientDemographics {\n return this._patient;\n }\n\n /** Returns all warnings collected from add-time and build-time. */\n get warnings(): readonly ValidationIssue[] {\n return [...this._warnings, ...this._buildWarnings];\n }\n\n /**\n * Add a medication statement to the IPS bundle.\n *\n * Throws immediately for `fromResource` with wrong resourceType.\n * All other validation happens at build time.\n */\n addMedication(medication: MedicationOptions): this {\n // Eagerly validate fromResource resourceType\n if (\"fromResource\" in medication && medication.fromResource !== undefined) {\n validateFromResource(medication.fromResource);\n\n // Warn on missing fields (collected, not thrown)\n const resource = medication.fromResource;\n if (!resource.status) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"active\"`,\n path: `${String(resource.resourceType)}.status`,\n });\n }\n if (!resource.medicationCodeableConcept) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"medicationCodeableConcept\"`,\n path: `${String(resource.resourceType)}.medicationCodeableConcept`,\n });\n }\n }\n\n this._medications.push(medication);\n return this;\n }\n\n /**\n * Add an allergy/intolerance to the IPS bundle.\n *\n * Throws immediately for `fromResource` with wrong resourceType.\n */\n addAllergy(allergy: AllergyOptions): this {\n if (\"fromResource\" in allergy && allergy.fromResource !== undefined) {\n validateAllergyFromResource(allergy.fromResource);\n\n const resource = allergy.fromResource;\n if (!resource.clinicalStatus) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"clinicalStatus\" — will default to \"active\"`,\n path: \"AllergyIntolerance.clinicalStatus\",\n });\n }\n if (!resource.code) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"AllergyIntolerance.code\",\n });\n }\n }\n\n this._allergies.push(allergy);\n return this;\n }\n\n /**\n * Add a condition/problem to the IPS bundle.\n *\n * Throws immediately for `fromResource` with wrong resourceType.\n */\n addCondition(condition: ConditionOptions): this {\n if (\"fromResource\" in condition && condition.fromResource !== undefined) {\n validateConditionFromResource(condition.fromResource);\n\n const resource = condition.fromResource;\n if (!resource.clinicalStatus) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"clinicalStatus\" — will default to \"active\"`,\n path: \"Condition.clinicalStatus\",\n });\n }\n if (!resource.code) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"Condition.code\",\n });\n }\n }\n\n this._conditions.push(condition);\n return this;\n }\n\n /**\n * Add an immunization to the IPS bundle.\n *\n * Throws immediately for `fromResource` with wrong resourceType.\n */\n addImmunization(immunization: ImmunizationOptions): this {\n if (\"fromResource\" in immunization && immunization.fromResource !== undefined) {\n validateImmunizationFromResource(immunization.fromResource);\n\n const resource = immunization.fromResource;\n if (!resource.status) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"completed\"`,\n path: \"Immunization.status\",\n });\n }\n if (!resource.vaccineCode) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"vaccineCode\"`,\n path: \"Immunization.vaccineCode\",\n });\n }\n }\n\n this._immunizations.push(immunization);\n return this;\n }\n\n /**\n * Add a lab result (Observation) to the IPS bundle.\n *\n * Throws immediately for `fromResource` with wrong resourceType.\n */\n addResult(result: ResultOptions): this {\n if (\"fromResource\" in result && result.fromResource !== undefined) {\n validateResultFromResource(result.fromResource);\n\n const resource = result.fromResource;\n if (!resource.status) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"status\" — will default to \"final\"`,\n path: \"Observation.status\",\n });\n }\n if (!resource.code) {\n this._warnings.push({\n severity: \"warning\",\n message: `fromResource missing \"code\"`,\n path: \"Observation.code\",\n });\n }\n }\n\n this._results.push(result);\n return this;\n }\n\n /**\n * Add a document (PDF, TIFF, etc.) to the IPS bundle.\n *\n * The document is wrapped as a DocumentReference + Binary resource pair.\n */\n addDocument(document: DocumentOptions): this {\n this._documents.push(document);\n return this;\n }\n\n /**\n * Build the IPS FHIR Bundle resource.\n *\n * Async because `byNDC`, `byRxNorm`, `byICD10`, and `byCVX` require API enrichment.\n * If no enrichment is needed, the Promise resolves immediately.\n *\n * @returns A FHIR Bundle resource object\n */\n async build(options?: BuildOptions): Promise<Record<string, unknown>> {\n const profile = options?.profile ?? \"ips\";\n const bundleId = options?.bundleId ?? generateUuid();\n const patientId = generateUuid();\n const timestamp = options?.compositionDate ?? new Date().toISOString();\n const patientFullUrl = `urn:uuid:${patientId}`;\n\n // Build Patient resource\n const patientResource = normalizePatient(this._patient, patientId, profile);\n\n // Resolve all resource types\n const [medResult, condResult, allergyResult, immResult, resultResult] = await Promise.all([\n resolveMedications(this._medications, patientFullUrl, profile, generateUuid),\n resolveConditions(this._conditions, patientFullUrl, profile, generateUuid),\n resolveAllergies(this._allergies, patientFullUrl, profile, generateUuid),\n resolveImmunizations(this._immunizations, patientFullUrl, profile, generateUuid),\n resolveResults(this._results, patientFullUrl, profile, generateUuid),\n ]);\n\n // Resolve documents (synchronous — no API calls)\n const docResult = resolveDocuments(this._documents, patientFullUrl, profile, generateUuid);\n\n this._buildWarnings = [\n ...medResult.warnings,\n ...condResult.warnings,\n ...allergyResult.warnings,\n ...immResult.warnings,\n ...resultResult.warnings,\n ];\n\n // PSHD profile: collection bundle, no Composition\n if (profile === \"pshd\") {\n return this.buildPshdBundle(\n bundleId,\n timestamp,\n patientFullUrl,\n patientResource,\n medResult.entries,\n condResult.entries,\n allergyResult.entries,\n immResult.entries,\n resultResult.entries,\n docResult.entries,\n );\n }\n\n // IPS / R4 profiles: document bundle with Composition\n const compositionId = generateUuid();\n const compositionFullUrl = `urn:uuid:${compositionId}`;\n\n // Build section references for the Composition\n const medRefs = medResult.entries.map((e) => ({ reference: e.fullUrl }));\n const condRefs = condResult.entries.map((e) => ({ reference: e.fullUrl }));\n const allergyRefs = allergyResult.entries.map((e) => ({ reference: e.fullUrl }));\n const immRefs = immResult.entries.map((e) => ({ reference: e.fullUrl }));\n const resultRefs = resultResult.entries.map((e) => ({ reference: e.fullUrl }));\n\n // Build Composition resource\n const composition = this.buildComposition(\n compositionId,\n patientFullUrl,\n timestamp,\n profile,\n medRefs,\n allergyRefs,\n condRefs,\n immRefs,\n resultRefs,\n );\n\n // Assemble Bundle: Composition, Patient, then clinical entries\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [\n { fullUrl: compositionFullUrl, resource: composition },\n { fullUrl: patientFullUrl, resource: patientResource },\n ...medResult.entries,\n ...condResult.entries,\n ...allergyResult.entries,\n ...immResult.entries,\n ...resultResult.entries,\n ...docResult.entries,\n ];\n\n const bundle: Record<string, unknown> = {\n resourceType: \"Bundle\",\n id: bundleId,\n identifier: {\n system: \"urn:ietf:rfc:3986\",\n value: `urn:uuid:${bundleId}`,\n },\n type: \"document\",\n timestamp,\n entry: entries,\n };\n\n return bundle;\n }\n\n /**\n * Validate the bundle against the specified profile.\n *\n * @returns Validation result with any issues found\n */\n validate(options?: BuildOptions): ValidationResult {\n const profile = options?.profile ?? \"ips\";\n const issues: ValidationIssue[] = [];\n\n // Check birthDate format (YYYY-MM-DD)\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(this._patient.birthDate)) {\n issues.push({\n severity: \"error\",\n message: \"birthDate must be in YYYY-MM-DD format\",\n path: \"Patient.birthDate\",\n });\n }\n\n // PSHD-specific checks\n if (profile === \"pshd\") {\n if (this._documents.length === 0) {\n issues.push({\n severity: \"error\",\n message: \"PSHD requires at least one DocumentReference (1..1)\",\n path: \"Bundle.entry:DocumentReference\",\n });\n } else {\n const hasPdf = this._documents.some(\n (d) => (d.contentType ?? \"application/pdf\") === \"application/pdf\",\n );\n if (!hasPdf) {\n issues.push({\n severity: \"error\",\n message: \"PSHD requires at least one PDF document (contentType application/pdf)\",\n path: \"DocumentReference.content.attachment.contentType\",\n });\n }\n }\n\n if (!this._patient.gender) {\n issues.push({\n severity: \"warning\",\n message: \"Patient.gender recommended for PSHD demographic matching\",\n path: \"Patient.gender\",\n });\n }\n\n return {\n valid: issues.filter((i) => i.severity === \"error\").length === 0,\n issues,\n };\n }\n\n // IPS-specific checks\n if (profile === \"ips\") {\n // ips-pat-1: name must have given, family, or text\n if (!this.hasValidName()) {\n issues.push({\n severity: \"error\",\n message: \"Patient.name must have at least a given, family, or text (ips-pat-1)\",\n path: \"Patient.name\",\n });\n }\n\n // Gender recommended by IPS\n if (!this._patient.gender) {\n issues.push({\n severity: \"warning\",\n message: \"Patient.gender is recommended by the IPS profile\",\n path: \"Patient.gender\",\n });\n }\n\n // Check medications for missing effectiveDate\n for (const med of this._medications) {\n if (\"fromResource\" in med && med.fromResource !== undefined) {\n const r = med.fromResource;\n if (!r.effectiveDateTime && !r.effectivePeriod) {\n issues.push({\n severity: \"warning\",\n message: \"fromResource MedicationStatement missing effective[x] — IPS requires effectiveDateTime or effectivePeriod\",\n path: \"MedicationStatement.effective[x]\",\n });\n }\n } else if (!(\"fromResource\" in med) && !(\"effectiveDate\" in med && med.effectiveDate)) {\n issues.push({\n severity: \"information\",\n message: \"Medication has no effectiveDate — the SDK will default to today's date\",\n path: \"MedicationStatement.effectiveDateTime\",\n });\n }\n }\n\n // Check conditions for missing onsetDate\n for (const cond of this._conditions) {\n if (!(\"fromResource\" in cond && cond.fromResource !== undefined) && !(\"onsetDate\" in cond && cond.onsetDate)) {\n issues.push({\n severity: \"information\",\n message: \"Condition has no onsetDate — recommended by IPS but not required\",\n path: \"Condition.onsetDateTime\",\n });\n }\n }\n\n // Check immunizations for missing occurrenceDate\n for (const imm of this._immunizations) {\n if (!(\"fromResource\" in imm && imm.fromResource !== undefined) && !(\"occurrenceDate\" in imm && imm.occurrenceDate)) {\n issues.push({\n severity: \"information\",\n message: \"Immunization has no occurrenceDate — recommended by IPS but not required\",\n path: \"Immunization.occurrenceDateTime\",\n });\n }\n }\n\n // Check results for missing effectiveDate\n for (const result of this._results) {\n if (!(\"fromResource\" in result && result.fromResource !== undefined) && !(\"effectiveDate\" in result && result.effectiveDate)) {\n issues.push({\n severity: \"information\",\n message: \"Result has no effectiveDate — recommended by IPS but not required\",\n path: \"Observation.effectiveDateTime\",\n });\n }\n }\n }\n\n return {\n valid: issues.filter((i) => i.severity === \"error\").length === 0,\n issues,\n };\n }\n\n private hasValidName(): boolean {\n if (isPatientFull(this._patient)) {\n // Full: at least one name entry with given, family, or text\n return this._patient.name.some(\n (n) => n.text || n.family || (n.given && n.given.length > 0),\n );\n }\n // Shorthand: has given, family, or name (text)\n const s = this._patient;\n return !!(s.given || s.family || s.name);\n }\n\n private buildPshdBundle(\n bundleId: string,\n timestamp: string,\n patientFullUrl: string,\n patientResource: Record<string, unknown>,\n medEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n condEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n allergyEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n immEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n resultEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n docEntries: Array<{ fullUrl: string; resource: Record<string, unknown> }>,\n ): Record<string, unknown> {\n // PSHD: collection bundle, no Composition, Patient first, then clinical, then documents\n const entries: Array<{ fullUrl: string; resource: Record<string, unknown> }> = [\n { fullUrl: patientFullUrl, resource: patientResource },\n ...medEntries,\n ...condEntries,\n ...allergyEntries,\n ...immEntries,\n ...resultEntries,\n ...docEntries,\n ];\n\n // PSHD spec: strip meta.profile from all resources — recipients must not require it\n for (const entry of entries) {\n const meta = entry.resource.meta as Record<string, unknown> | undefined;\n if (meta?.profile) {\n delete meta.profile;\n // Remove empty meta object to keep output clean\n if (Object.keys(meta).length === 0) {\n delete entry.resource.meta;\n }\n }\n }\n\n return {\n resourceType: \"Bundle\",\n id: bundleId,\n identifier: {\n system: \"urn:ietf:rfc:3986\",\n value: `urn:uuid:${bundleId}`,\n },\n type: \"collection\",\n timestamp,\n entry: entries,\n };\n }\n\n private buildComposition(\n id: string,\n patientRef: string,\n date: string,\n profile: BundleProfile,\n medRefs: Array<{ reference: string }>,\n allergyRefs: Array<{ reference: string }>,\n condRefs: Array<{ reference: string }>,\n immRefs: Array<{ reference: string }>,\n resultRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n const composition: Record<string, unknown> = {\n resourceType: \"Composition\",\n id,\n status: \"final\",\n type: {\n coding: [\n {\n system: \"http://loinc.org\",\n code: \"60591-5\",\n display: \"Patient summary Document\",\n },\n ],\n },\n subject: { reference: patientRef },\n date,\n author: [{ display: \"FHIRfly SHL SDK\" }],\n title: \"International Patient Summary\",\n };\n\n if (profile === \"ips\") {\n composition.meta = {\n profile: [\"http://hl7.org/fhir/uv/ips/StructureDefinition/Composition-uv-ips\"],\n };\n }\n\n // Required IPS sections\n if (profile === \"ips\") {\n const sections: Array<Record<string, unknown>> = [\n this.buildMedicationSection(medRefs),\n this.buildAllergySection(allergyRefs),\n this.buildConditionSection(condRefs),\n ];\n\n // Immunization section is only included when there are entries\n // (it's not one of the 3 required IPS sections)\n if (immRefs.length > 0) {\n sections.push(this.buildImmunizationSection(immRefs));\n }\n\n // Results section is only included when there are entries\n if (resultRefs.length > 0) {\n sections.push(this.buildResultSection(resultRefs));\n }\n\n composition.section = sections;\n }\n\n return composition;\n }\n\n private buildMedicationSection(\n medRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n return this.buildDynamicSection(\n \"Medication Summary\",\n \"http://loinc.org\",\n \"10160-0\",\n \"History of Medication use Narrative\",\n medRefs,\n \"medication\",\n );\n }\n\n private buildAllergySection(\n allergyRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n return this.buildDynamicSection(\n \"Allergies and Intolerances\",\n \"http://loinc.org\",\n \"48765-2\",\n \"Allergies and adverse reactions Document\",\n allergyRefs,\n \"allergy\",\n );\n }\n\n private buildConditionSection(\n condRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n return this.buildDynamicSection(\n \"Problem List\",\n \"http://loinc.org\",\n \"11450-4\",\n \"Problem list - Reported\",\n condRefs,\n \"condition\",\n );\n }\n\n private buildImmunizationSection(\n immRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n return this.buildDynamicSection(\n \"History of Immunizations\",\n \"http://loinc.org\",\n \"11369-6\",\n \"History of Immunization note\",\n immRefs,\n \"immunization\",\n );\n }\n\n private buildResultSection(\n resultRefs: Array<{ reference: string }>,\n ): Record<string, unknown> {\n return this.buildDynamicSection(\n \"Results\",\n \"http://loinc.org\",\n \"30954-2\",\n \"Relevant diagnostic tests/laboratory data Narrative\",\n resultRefs,\n \"result\",\n );\n }\n\n private buildDynamicSection(\n title: string,\n system: string,\n code: string,\n display: string,\n refs: Array<{ reference: string }>,\n resourceLabel: string,\n ): Record<string, unknown> {\n const section: Record<string, unknown> = {\n title,\n code: {\n coding: [{ system, code, display }],\n },\n };\n\n if (refs.length > 0) {\n section.text = {\n status: \"generated\",\n div: `<div xmlns=\"http://www.w3.org/1999/xhtml\"><p>${refs.length} ${resourceLabel}(s)</p></div>`,\n };\n section.entry = refs;\n } else {\n section.text = {\n status: \"empty\",\n div: '<div xmlns=\"http://www.w3.org/1999/xhtml\"><p>No information available</p></div>',\n };\n section.emptyReason = {\n coding: [\n {\n system: \"http://terminology.hl7.org/CodeSystem/list-empty-reason\",\n code: \"notasked\",\n },\n ],\n };\n }\n\n return section;\n }\n}\n\nfunction generateUuid(): string {\n return crypto.randomUUID();\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nexport { create } from \"./create.js\";\nexport { decode, decrypt, decryptContent, getEntryContent } from \"./decode.js\";\nexport { revoke } from \"./revoke.js\";\nexport type { DecodedSHL } from \"./decode.js\";\nexport { S3Storage, LocalStorage, AzureStorage, GCSStorage, FhirflyStorage } from \"./storage.js\";\nexport type { S3StorageConfig, LocalStorageConfig, AzureStorageConfig, GCSStorageConfig, FhirflyStorageConfig } from \"./storage.js\";\nexport type {\n SHLOptions,\n SHLResult,\n SHLStorage,\n SHLMetadata,\n SHLAttachment,\n ManifestEntry,\n Manifest,\n ExpirationPreset,\n} from \"./types.js\";\nexport { EXPIRATION_PRESETS } from \"./types.js\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\n/**\n * Named expiration presets for common SHL use cases.\n *\n * - `\"point-of-care\"` — 15 minutes (in-person sharing at a clinic or pharmacy)\n * - `\"appointment\"` — 24 hours (share before a scheduled visit)\n * - `\"travel\"` — 90 days (carry health records while traveling)\n * - `\"permanent\"` — no expiration (long-lived link)\n */\nexport type ExpirationPreset = \"point-of-care\" | \"appointment\" | \"travel\" | \"permanent\";\n\n/** Duration in milliseconds for each expiration preset. 0 = no expiration. */\nexport const EXPIRATION_PRESETS: Record<ExpirationPreset, number> = {\n \"point-of-care\": 15 * 60 * 1000, // 15 minutes\n \"appointment\": 24 * 60 * 60 * 1000, // 24 hours\n \"travel\": 90 * 24 * 60 * 60 * 1000, // 90 days\n \"permanent\": 0, // no expiration\n};\n\n/**\n * Options for creating a SMART Health Link.\n */\nexport interface SHLOptions {\n /** The FHIR Bundle to share (as a JSON object) */\n bundle: Record<string, unknown>;\n /** Additional files to include (e.g., PDF documents, SMART Health Cards) */\n attachments?: SHLAttachment[];\n /** Optional passcode to protect the link */\n passcode?: string;\n /**\n * Expiration for the link. Accepts a `Date` for an exact time,\n * or an `ExpirationPreset` string for a named duration from now.\n */\n expiresAt?: Date | ExpirationPreset;\n /** Maximum number of times the link can be accessed */\n maxAccesses?: number;\n /** Label for the SHL (shown in viewer apps, max 80 chars) */\n label?: string;\n /** Storage backend to use */\n storage: SHLStorage;\n /** Save unencrypted bundle alongside encrypted JWE (development only — do not use in production) */\n debug?: boolean;\n /**\n * High-level compliance preset. `\"pshd\"` enforces:\n * - Direct retrieval mode (flag U, no manifest)\n * - Expiration required\n * - Passcode forbidden (incompatible with flag U)\n */\n compliance?: \"pshd\";\n /**\n * Low-level retrieval mode. `\"direct\"` uses flag U (GET retrieval, no manifest).\n * `\"manifest\"` (default) uses flag L (POST to get manifest).\n */\n mode?: \"manifest\" | \"direct\";\n}\n\n/**\n * An additional file to include in the SHL manifest.\n */\nexport interface SHLAttachment {\n /** MIME content type (e.g., \"application/pdf\") */\n contentType: string;\n /** File content — string for text, Uint8Array for binary */\n content: string | Uint8Array;\n}\n\n/**\n * Result of creating a SMART Health Link.\n */\nexport interface SHLResult {\n /** The full SHL URL (shlink:/ protocol) */\n url: string;\n /** QR code as a PNG data URI (data:image/png;base64,...) */\n qrCode: string;\n /** The passcode (if one was set) */\n passcode?: string;\n /** Unique identifier for the SHL */\n id: string;\n /** When the link expires */\n expiresAt?: Date;\n /** Path to the unencrypted bundle (only set when debug mode is enabled) */\n debugBundlePath?: string;\n}\n\n/**\n * SHL manifest file entry.\n *\n * Entries may use `location` (URL to fetch content) or `embedded` (inline JWE).\n * Use `SHL.getEntryContent()` to handle both patterns transparently.\n */\nexport interface ManifestEntry {\n /** MIME type of the content (e.g., \"application/fhir+json\", \"application/pdf\") */\n contentType: string;\n /** URL to retrieve the content */\n location?: string;\n /** Embedded content (base64url-encoded if encrypted) */\n embedded?: string;\n}\n\n/**\n * SHL manifest file.\n */\nexport interface Manifest {\n /** Array of files available via this SHL */\n files: ManifestEntry[];\n /** Manifest status per SHL spec: \"finalized\", \"can-change\", or \"no-longer-valid\" */\n status?: \"finalized\" | \"can-change\" | \"no-longer-valid\";\n /** ISO 8601 timestamp of when the manifest was last updated */\n lastUpdated?: string;\n}\n\n/**\n * Metadata stored alongside an SHL for access control.\n */\nexport interface SHLMetadata {\n /** Passcode required to access the link */\n passcode?: string;\n /** Maximum number of times the link can be accessed */\n maxAccesses?: number;\n /** Number of times the link has been accessed */\n accessCount?: number;\n /** ISO 8601 expiration date */\n expiresAt?: string;\n /** ISO 8601 creation date */\n createdAt: string;\n /** Retrieval mode: \"direct\" (flag U) or \"manifest\" (flag L, default) */\n mode?: \"manifest\" | \"direct\";\n}\n\n/**\n * Interface for SHL storage backends.\n *\n * Storage backends write files to a location (filesystem, S3, etc.).\n * The user configures their own server to serve these files via `baseUrl`.\n */\nexport interface SHLStorage {\n /** Base URL of the user's SHL server. Used to compute manifest and content URLs. */\n readonly baseUrl: string;\n\n /** Store content at the given key path. */\n store(key: string, content: string | Uint8Array): Promise<void>;\n\n /** Delete all files for an SHL by prefix. */\n delete(prefix: string): Promise<void>;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport { randomBytes, createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { deflateRawSync, inflateRawSync } from \"node:zlib\";\n\n/** Encode a Buffer as base64url (RFC 4648). */\nexport function base64url(data: Buffer): string {\n return data.toString(\"base64url\");\n}\n\n/** Decode a base64url string to a Buffer. */\nexport function base64urlDecode(str: string): Buffer {\n return Buffer.from(str, \"base64url\");\n}\n\n/** Generate a 32-byte AES-256 key. */\nexport function generateKey(): Buffer {\n return randomBytes(32);\n}\n\n/** Generate an SHL ID: 32 random bytes encoded as base64url (43 chars). */\nexport function generateShlId(): string {\n return base64url(randomBytes(32));\n}\n\n/**\n * Encrypt a FHIR bundle as a JWE compact serialization.\n *\n * Uses `alg: \"dir\"`, `enc: \"A256GCM\"`, `zip: \"DEF\"` as specified by the\n * SMART Health Links specification. The key is used directly as the Content\n * Encryption Key (no key wrapping).\n *\n * Pipeline: JSON.stringify → deflateRaw → AES-256-GCM → JWE compact\n *\n * JWE compact format: `header..iv.ciphertext.tag`\n * (empty encrypted key segment for alg: \"dir\")\n */\nexport function encryptBundle(\n bundle: Record<string, unknown>,\n key: Buffer,\n): string {\n // 1. Serialize\n const json = JSON.stringify(bundle);\n\n // 2. Compress (raw DEFLATE, RFC 1951)\n const compressed = deflateRawSync(Buffer.from(json, \"utf8\"));\n\n // 3. Build JWE protected header\n const header = {\n alg: \"dir\",\n enc: \"A256GCM\",\n cty: \"application/fhir+json\",\n zip: \"DEF\",\n };\n const headerB64 = base64url(Buffer.from(JSON.stringify(header), \"utf8\"));\n\n // 4. Encrypt with AES-256-GCM\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n // AAD is the base64url-encoded protected header (ASCII bytes)\n cipher.setAAD(Buffer.from(headerB64, \"ascii\"));\n\n const ciphertext = Buffer.concat([cipher.update(compressed), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n // 5. JWE compact serialization: header..iv.ciphertext.tag\n // Empty segment for encrypted key (alg: \"dir\" — key is used directly)\n return `${headerB64}..${base64url(iv)}.${base64url(ciphertext)}.${base64url(tag)}`;\n}\n\n/**\n * Encrypt arbitrary content as a JWE compact serialization.\n *\n * Uses `alg: \"dir\"`, `enc: \"A256GCM\"`, `zip: \"DEF\"`.\n * The `contentType` is stored in the JWE `cty` header so the\n * recipient knows how to interpret the decrypted payload.\n *\n * Pipeline: content bytes → deflateRaw → AES-256-GCM → JWE compact\n */\nexport function encryptContent(\n data: Buffer,\n key: Buffer,\n contentType: string,\n): string {\n const compressed = deflateRawSync(data);\n const header = { alg: \"dir\", enc: \"A256GCM\", cty: contentType, zip: \"DEF\" };\n const headerB64 = base64url(Buffer.from(JSON.stringify(header), \"utf8\"));\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n cipher.setAAD(Buffer.from(headerB64, \"ascii\"));\n const ciphertext = Buffer.concat([cipher.update(compressed), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `${headerB64}..${base64url(iv)}.${base64url(ciphertext)}.${base64url(tag)}`;\n}\n\n/**\n * Decrypt a JWE compact serialization to raw bytes and content type.\n *\n * Pipeline: parse JWE → AES-256-GCM decrypt → inflateRaw → Buffer\n */\nexport function decryptContent(\n jwe: string,\n key: Buffer,\n): { contentType: string; data: Buffer } {\n const parts = jwe.split(\".\");\n if (parts.length !== 5) {\n throw new Error(`Invalid JWE compact serialization: expected 5 parts, got ${parts.length}`);\n }\n const [headerB64, , ivB64, ciphertextB64, tagB64] = parts as [string, string, string, string, string];\n const header = JSON.parse(base64urlDecode(headerB64!).toString(\"utf8\")) as Record<string, string>;\n if (header[\"alg\"] !== \"dir\" || header[\"enc\"] !== \"A256GCM\") {\n throw new Error(`Unsupported JWE: alg=${header[\"alg\"]}, enc=${header[\"enc\"]}`);\n }\n const iv = base64urlDecode(ivB64!);\n const ciphertext = base64urlDecode(ciphertextB64!);\n const tag = base64urlDecode(tagB64!);\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAAD(Buffer.from(headerB64!, \"ascii\"));\n decipher.setAuthTag(tag);\n const compressed = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n const data = header[\"zip\"] === \"DEF\" ? inflateRawSync(compressed) : compressed;\n return { contentType: header[\"cty\"] ?? \"application/octet-stream\", data: Buffer.from(data) };\n}\n\n/**\n * Decrypt a JWE compact serialization back to a FHIR bundle.\n *\n * Pipeline: parse JWE → AES-256-GCM decrypt → inflateRaw → JSON.parse\n */\nexport function decryptBundle(\n jwe: string,\n key: Buffer,\n): Record<string, unknown> {\n const parts = jwe.split(\".\");\n if (parts.length !== 5) {\n throw new Error(`Invalid JWE compact serialization: expected 5 parts, got ${parts.length}`);\n }\n\n const [headerB64, , ivB64, ciphertextB64, tagB64] = parts as [string, string, string, string, string];\n\n // Verify header\n const header = JSON.parse(base64urlDecode(headerB64!).toString(\"utf8\")) as Record<string, string>;\n if (header[\"alg\"] !== \"dir\" || header[\"enc\"] !== \"A256GCM\") {\n throw new Error(`Unsupported JWE: alg=${header[\"alg\"]}, enc=${header[\"enc\"]}`);\n }\n\n const iv = base64urlDecode(ivB64!);\n const ciphertext = base64urlDecode(ciphertextB64!);\n const tag = base64urlDecode(tagB64!);\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAAD(Buffer.from(headerB64!, \"ascii\"));\n decipher.setAuthTag(tag);\n\n const compressed = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n\n // Decompress if zip: \"DEF\"\n const json = header[\"zip\"] === \"DEF\"\n ? inflateRawSync(compressed).toString(\"utf8\")\n : compressed.toString(\"utf8\");\n\n return JSON.parse(json) as Record<string, unknown>;\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport QRCode from \"qrcode\";\n\n/**\n * Generate a QR code PNG as a data URI from a URL string.\n *\n * Uses error correction level L (7%) which is sufficient for\n * machine-scanned SHL URLs.\n */\nexport async function generateQRCode(url: string): Promise<string> {\n return QRCode.toDataURL(url, {\n errorCorrectionLevel: \"L\",\n margin: 2,\n });\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport type { SHLOptions, SHLResult, Manifest, SHLMetadata, ExpirationPreset } from \"./types.js\";\nimport { EXPIRATION_PRESETS } from \"./types.js\";\nimport { ValidationError, StorageError, EncryptionError } from \"../errors.js\";\nimport { generateKey, generateShlId, encryptBundle, encryptContent, base64url } from \"./crypto.js\";\nimport { generateQRCode } from \"./qrcode.js\";\nimport { createHash } from \"node:crypto\";\n\n/**\n * Create a SMART Health Link from a FHIR Bundle.\n *\n * Encrypts the bundle, stores it using the provided storage backend,\n * and returns a SHL URL with an embedded QR code.\n *\n * This implements manifest mode only (`L` flag always set).\n * The user's server is responsible for serving the manifest and content\n * files from the storage backend.\n *\n * @example\n * ```ts\n * const result = await SHL.create({\n * bundle: fhirBundle,\n * passcode: \"1234\",\n * expiresAt: new Date(\"2025-12-31\"),\n * storage: new SHL.LocalStorage({\n * directory: \"./shl-data\",\n * baseUrl: \"https://shl.example.com\",\n * }),\n * });\n *\n * console.log(result.url); // shlink:/...\n * console.log(result.qrCode); // data:image/png;base64,...\n * ```\n */\nexport async function create(options: SHLOptions): Promise<SHLResult> {\n const { bundle, passcode, maxAccesses, label, storage, debug } = options;\n\n // Resolve expiration preset to a Date\n let expiresAt: Date | undefined;\n if (typeof options.expiresAt === \"string\") {\n const preset = options.expiresAt as ExpirationPreset;\n const durationMs = EXPIRATION_PRESETS[preset];\n if (durationMs === undefined) {\n throw new ValidationError(`Unknown expiration preset: \"${preset}\"`);\n }\n expiresAt = durationMs > 0 ? new Date(Date.now() + durationMs) : undefined;\n } else {\n expiresAt = options.expiresAt;\n }\n\n // Validate inputs\n if (!bundle || typeof bundle !== \"object\") {\n throw new ValidationError(\"bundle is required and must be an object\");\n }\n if (!storage?.baseUrl) {\n throw new ValidationError(\"storage with baseUrl is required\");\n }\n\n // Resolve mode: compliance preset overrides explicit mode\n let mode = options.mode ?? \"manifest\";\n if (options.compliance === \"pshd\") {\n mode = \"direct\";\n if (passcode) {\n throw new ValidationError(\n \"PSHD compliance forbids passcode (flag U is incompatible with flag P)\",\n );\n }\n if (!expiresAt && options.expiresAt !== \"permanent\") {\n throw new ValidationError(\n \"PSHD compliance requires expiresAt (short-lived links for point-of-care)\",\n );\n }\n }\n\n // Direct mode validation (with or without compliance preset)\n if (mode === \"direct\" && passcode) {\n throw new ValidationError(\n \"Direct mode (flag U) is incompatible with passcode (flag P)\",\n );\n }\n\n // Generate key and ID\n const key = generateKey();\n const shlId = generateShlId();\n\n // Encrypt bundle → JWE compact\n let jwe: string;\n try {\n jwe = encryptBundle(bundle, key);\n } catch (err) {\n throw new EncryptionError(\n `Failed to encrypt bundle: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Strip trailing slashes from baseUrl\n const baseUrl = storage.baseUrl.replace(/\\/+$/, \"\");\n\n // Store content.jwe\n try {\n await storage.store(`${shlId}/content.jwe`, jwe);\n } catch (err) {\n throw new StorageError(\n `Failed to store content: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n\n // Store unencrypted bundle for debugging (development only)\n if (debug) {\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\") {\n throw new ValidationError(\n \"debug mode is not allowed when NODE_ENV=production — it stores unencrypted PHI\",\n );\n }\n const debugPath = `${shlId}/bundle.json`;\n try {\n await storage.store(debugPath, JSON.stringify(bundle, null, 2));\n } catch (err) {\n throw new StorageError(\n `Failed to store debug bundle: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n console.warn(\n `[SHL] Debug mode: unencrypted bundle saved to ${debugPath} — do not use in production`,\n );\n }\n\n // Encrypt and store attachments\n const attachments = options.attachments ?? [];\n for (let i = 0; i < attachments.length; i++) {\n const att = attachments[i]!;\n const attData = typeof att.content === \"string\"\n ? Buffer.from(att.content, \"utf8\")\n : Buffer.from(att.content);\n let attJwe: string;\n try {\n attJwe = encryptContent(attData, key, att.contentType);\n } catch (err) {\n throw new EncryptionError(\n `Failed to encrypt attachment ${i}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n try {\n await storage.store(`${shlId}/attachment-${i}.jwe`, attJwe);\n } catch (err) {\n throw new StorageError(\n `Failed to store attachment ${i}: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n }\n\n // Build and store manifest (skip for direct mode — no manifest needed)\n if (mode === \"manifest\") {\n const manifest: Manifest = {\n files: [\n {\n contentType: \"application/fhir+json;fhirVersion=4.0.1\",\n location: `${baseUrl}/${shlId}/content`,\n },\n ...attachments.map((att, i) => ({\n contentType: att.contentType,\n location: `${baseUrl}/${shlId}/attachment/${i}`,\n })),\n ],\n status: \"finalized\",\n lastUpdated: new Date().toISOString(),\n };\n\n try {\n await storage.store(`${shlId}/manifest.json`, JSON.stringify(manifest));\n } catch (err) {\n throw new StorageError(\n `Failed to store manifest: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n }\n\n // Build and store metadata\n const metadata: SHLMetadata = {\n createdAt: new Date().toISOString(),\n };\n if (mode === \"direct\") metadata.mode = \"direct\";\n if (passcode) {\n metadata.passcode = createHash(\"sha256\").update(passcode).digest(\"hex\");\n }\n if (maxAccesses !== undefined) metadata.maxAccesses = maxAccesses;\n if (expiresAt) metadata.expiresAt = expiresAt.toISOString();\n\n try {\n await storage.store(`${shlId}/metadata.json`, JSON.stringify(metadata));\n } catch (err) {\n throw new StorageError(\n `Failed to store metadata: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n\n // Build SHL payload\n const flags = buildFlags(mode, passcode);\n const shlPayload: Record<string, unknown> = {\n url: `${baseUrl}/${shlId}`,\n key: base64url(key),\n flag: flags,\n v: 1,\n };\n\n if (expiresAt) {\n shlPayload[\"exp\"] = Math.floor(expiresAt.getTime() / 1000);\n }\n\n if (label) {\n shlPayload[\"label\"] = label.length > 80 ? label.slice(0, 80) : label;\n }\n\n // Build shlink:/ URL\n const payloadJson = JSON.stringify(shlPayload);\n const payloadB64 = base64url(Buffer.from(payloadJson, \"utf8\"));\n const shlUrl = `shlink:/${payloadB64}`;\n\n // Generate QR code\n const qrCode = await generateQRCode(shlUrl);\n\n const result: SHLResult = {\n url: shlUrl,\n qrCode,\n id: shlId,\n };\n\n if (passcode) result.passcode = passcode;\n if (expiresAt) result.expiresAt = expiresAt;\n if (debug) result.debugBundlePath = `${shlId}/bundle.json`;\n\n return result;\n}\n\n/**\n * Build the SHL flags string. Flags are alphabetically sorted.\n * `U` for direct mode, `L` for manifest mode. `P` is set if a passcode is provided.\n */\nfunction buildFlags(mode: \"manifest\" | \"direct\", passcode?: string): string {\n const flags: string[] = [mode === \"direct\" ? \"U\" : \"L\"];\n if (passcode) flags.push(\"P\");\n return flags.sort().join(\"\");\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport { base64urlDecode, decryptBundle, decryptContent as rawDecryptContent } from \"./crypto.js\";\nimport { ValidationError, EncryptionError } from \"../errors.js\";\nimport type { ManifestEntry } from \"./types.js\";\n\n/**\n * A decoded SMART Health Link payload.\n *\n * Contains all fields from the shlink:/ URL payload,\n * parsed and ready for use.\n */\nexport interface DecodedSHL {\n /** Manifest URL — POST here to retrieve the manifest */\n url: string;\n /** Decryption key (32 bytes) */\n key: Buffer;\n /** SHL flags (e.g., \"L\", \"LP\") */\n flag: string;\n /** SHL version (currently always 1) */\n v: number;\n /** Expiration as epoch seconds (undefined if no expiration) */\n exp?: number;\n /** Human-readable label (max 80 chars) */\n label?: string;\n}\n\n/**\n * Decode a `shlink:/` URL into its constituent parts.\n *\n * Extracts the manifest URL, decryption key, flags, version,\n * optional expiration, and optional label from the SHL payload.\n *\n * @example\n * ```ts\n * const decoded = SHL.decode(\"shlink:/eyJ1cmw...\");\n * // decoded.url → \"https://shl.example.com/{shlId}\"\n * // decoded.key → Buffer (32 bytes)\n * // decoded.flag → \"LP\"\n * // decoded.exp → 1798761600 (or undefined)\n * // decoded.label → \"Jane's IPS\" (or undefined)\n * ```\n */\nexport function decode(url: string): DecodedSHL {\n if (!url || typeof url !== \"string\") {\n throw new ValidationError(\"url is required and must be a string\");\n }\n\n if (!url.startsWith(\"shlink:/\")) {\n throw new ValidationError(\n `Invalid SHL URL: must start with \"shlink:/\", got \"${url.slice(0, 20)}...\"`,\n );\n }\n\n const b64 = url.slice(\"shlink:/\".length);\n if (!b64) {\n throw new ValidationError(\"Invalid SHL URL: empty payload\");\n }\n\n let payload: Record<string, unknown>;\n try {\n const json = base64urlDecode(b64).toString(\"utf8\");\n payload = JSON.parse(json) as Record<string, unknown>;\n } catch {\n throw new ValidationError(\"Invalid SHL URL: could not decode payload\");\n }\n\n // Validate required fields\n if (!payload[\"url\"] || typeof payload[\"url\"] !== \"string\") {\n throw new ValidationError(\"Invalid SHL payload: missing or invalid 'url'\");\n }\n if (!payload[\"key\"] || typeof payload[\"key\"] !== \"string\") {\n throw new ValidationError(\"Invalid SHL payload: missing or invalid 'key'\");\n }\n if (!payload[\"flag\"] || typeof payload[\"flag\"] !== \"string\") {\n throw new ValidationError(\"Invalid SHL payload: missing or invalid 'flag'\");\n }\n\n const key = base64urlDecode(payload[\"key\"] as string);\n if (key.length !== 32) {\n throw new ValidationError(\n `Invalid SHL payload: key must be 32 bytes, got ${key.length}`,\n );\n }\n\n return {\n url: payload[\"url\"] as string,\n key,\n flag: payload[\"flag\"] as string,\n v: typeof payload[\"v\"] === \"number\" ? payload[\"v\"] : 1,\n exp: typeof payload[\"exp\"] === \"number\" ? payload[\"exp\"] : undefined,\n label: typeof payload[\"label\"] === \"string\" ? payload[\"label\"] : undefined,\n };\n}\n\n/**\n * Decrypt a JWE compact serialization back to a FHIR bundle.\n *\n * This is a convenience wrapper around the internal `decryptBundle` function,\n * exposed as a public API for consuming SHLs.\n *\n * @param jwe - JWE compact serialization string (5 dot-separated parts)\n * @param key - 32-byte AES-256 key (from `SHL.decode().key`)\n * @returns The decrypted FHIR bundle as a JSON object\n *\n * @example\n * ```ts\n * const decoded = SHL.decode(\"shlink:/eyJ1cmw...\");\n * const manifest = await fetch(decoded.url, {\n * method: \"POST\",\n * headers: { \"content-type\": \"application/json\" },\n * body: JSON.stringify({ passcode: \"1234\" }),\n * }).then(r => r.json());\n *\n * const jwe = await fetch(manifest.files[0].location).then(r => r.text());\n * const bundle = SHL.decrypt(jwe, decoded.key);\n * ```\n */\nexport function decrypt(\n jwe: string,\n key: Buffer,\n): Record<string, unknown> {\n if (!jwe || typeof jwe !== \"string\") {\n throw new EncryptionError(\"jwe is required and must be a string\");\n }\n if (!Buffer.isBuffer(key) || key.length !== 32) {\n throw new EncryptionError(\"key must be a 32-byte Buffer\");\n }\n\n try {\n return decryptBundle(jwe, key);\n } catch (err) {\n if (err instanceof EncryptionError) throw err;\n throw new EncryptionError(\n `Failed to decrypt: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Decrypt a JWE compact serialization to raw bytes and content type.\n *\n * Use this for non-FHIR content (PDFs, images, etc.) where the result\n * is binary data rather than a JSON object.\n *\n * @param jwe - JWE compact serialization string\n * @param key - 32-byte AES-256 key (from `SHL.decode().key`)\n * @returns Object with `contentType` (from JWE header) and `data` (Buffer)\n */\nexport function decryptContent(\n jwe: string,\n key: Buffer,\n): { contentType: string; data: Buffer } {\n if (!jwe || typeof jwe !== \"string\") {\n throw new EncryptionError(\"jwe is required and must be a string\");\n }\n if (!Buffer.isBuffer(key) || key.length !== 32) {\n throw new EncryptionError(\"key must be a 32-byte Buffer\");\n }\n try {\n return rawDecryptContent(jwe, key);\n } catch (err) {\n if (err instanceof EncryptionError) throw err;\n throw new EncryptionError(\n `Failed to decrypt content: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Retrieve the JWE string from a manifest entry.\n *\n * Handles both delivery modes defined by the SHL spec:\n * - **`location`** — fetches the JWE from the URL\n * - **`embedded`** — returns the inline JWE directly\n *\n * Combine with `decrypt()` or `decryptContent()` for a complete consumption flow.\n *\n * @example\n * ```ts\n * const decoded = SHL.decode(shlUrl);\n * const manifest = await fetch(decoded.url, {\n * method: \"POST\",\n * body: JSON.stringify({ passcode: \"1234\" }),\n * }).then(r => r.json());\n *\n * for (const entry of manifest.files) {\n * const jwe = await SHL.getEntryContent(entry);\n * const { contentType, data } = SHL.decryptContent(jwe, decoded.key);\n * }\n * ```\n */\nexport async function getEntryContent(entry: ManifestEntry): Promise<string> {\n if (entry.embedded) {\n return entry.embedded;\n }\n if (!entry.location) {\n throw new ValidationError(\n \"Manifest entry has neither location nor embedded content\",\n );\n }\n const res = await globalThis.fetch(entry.location);\n if (!res.ok) {\n throw new EncryptionError(`Failed to fetch content: HTTP ${res.status}`);\n }\n return res.text();\n}\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport type { SHLStorage } from \"./types.js\";\n\n/**\n * Revoke a SMART Health Link by deleting all stored files.\n *\n * Removes the encrypted content, manifest, and metadata from storage.\n * After revocation, the SHL URL and QR code will no longer work —\n * viewers will receive a 404 when attempting to access the manifest.\n *\n * @param shlId - The SHL identifier (from `SHLResult.id`)\n * @param storage - The storage backend where the SHL files are stored\n */\nexport async function revoke(\n shlId: string,\n storage: SHLStorage\n): Promise<void> {\n if (!shlId) {\n throw new Error(\"shlId is required\");\n }\n await storage.delete(shlId);\n}\n"]}
|