@fhirfly-io/shl 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chunk-IDS43FSS.cjs → chunk-63Q54EKN.cjs} +13 -17
  2. package/dist/chunk-63Q54EKN.cjs.map +1 -0
  3. package/dist/{chunk-5I5H3SLO.cjs → chunk-LXJB46WB.cjs} +2 -2
  4. package/dist/chunk-LXJB46WB.cjs.map +1 -0
  5. package/dist/{chunk-M4HWBUJW.cjs → chunk-QXSWM5QV.cjs} +35 -20
  6. package/dist/chunk-QXSWM5QV.cjs.map +1 -0
  7. package/dist/{chunk-NCMJCDJQ.js → chunk-YBDRWUQU.js} +3 -7
  8. package/dist/chunk-YBDRWUQU.js.map +1 -0
  9. package/dist/{chunk-NEBFJSJW.js → chunk-YV7ZD6OM.js} +2 -2
  10. package/dist/chunk-YV7ZD6OM.js.map +1 -0
  11. package/dist/{chunk-7SVQ24UF.js → chunk-ZEE5RXIS.js} +35 -20
  12. package/dist/chunk-ZEE5RXIS.js.map +1 -0
  13. package/dist/cli.cjs +14 -14
  14. package/dist/cli.js +3 -3
  15. package/dist/express.cjs +2 -2
  16. package/dist/express.d.cts +1 -1
  17. package/dist/express.d.ts +1 -1
  18. package/dist/express.js +1 -1
  19. package/dist/fastify.cjs +16 -2
  20. package/dist/fastify.cjs.map +1 -1
  21. package/dist/fastify.d.cts +2 -2
  22. package/dist/fastify.d.ts +2 -2
  23. package/dist/fastify.js +15 -1
  24. package/dist/fastify.js.map +1 -1
  25. package/dist/index.cjs +3 -3
  26. package/dist/index.js +1 -1
  27. package/dist/lambda.cjs +2 -2
  28. package/dist/lambda.d.cts +1 -1
  29. package/dist/lambda.d.ts +1 -1
  30. package/dist/lambda.js +1 -1
  31. package/dist/server.cjs +7 -7
  32. package/dist/server.d.cts +11 -4
  33. package/dist/server.d.ts +11 -4
  34. package/dist/server.js +2 -2
  35. package/dist/{types-D_oopfOL.d.ts → types-BegxU0wQ.d.ts} +21 -1
  36. package/dist/{types-B6RKj_xO.d.cts → types-hHf-a3hH.d.cts} +21 -1
  37. package/package.json +3 -3
  38. package/dist/chunk-5I5H3SLO.cjs.map +0 -1
  39. package/dist/chunk-7SVQ24UF.js.map +0 -1
  40. package/dist/chunk-IDS43FSS.cjs.map +0 -1
  41. package/dist/chunk-M4HWBUJW.cjs.map +0 -1
  42. package/dist/chunk-NCMJCDJQ.js.map +0 -1
  43. package/dist/chunk-NEBFJSJW.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  var chunkUDS6UJAL_cjs = require('./chunk-UDS6UJAL.cjs');
4
4
  var chunkQ7SFCCGT_cjs = require('./chunk-Q7SFCCGT.cjs');
5
- var crypto = require('crypto');
5
+ var crypto$1 = require('crypto');
6
6
  var zlib = require('zlib');
7
7
  var QRCode = require('qrcode');
8
8
 
@@ -1603,11 +1603,7 @@ var Bundle = class {
1603
1603
  }
1604
1604
  };
1605
1605
  function generateUuid() {
1606
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
1607
- const r = Math.random() * 16 | 0;
1608
- const v = c === "x" ? r : r & 3 | 8;
1609
- return v.toString(16);
1610
- });
1606
+ return crypto.randomUUID();
1611
1607
  }
1612
1608
 
1613
1609
  // src/shl/index.ts
@@ -1632,10 +1628,10 @@ function base64urlDecode(str) {
1632
1628
  return Buffer.from(str, "base64url");
1633
1629
  }
1634
1630
  function generateKey() {
1635
- return crypto.randomBytes(32);
1631
+ return crypto$1.randomBytes(32);
1636
1632
  }
1637
1633
  function generateShlId() {
1638
- return base64url(crypto.randomBytes(32));
1634
+ return base64url(crypto$1.randomBytes(32));
1639
1635
  }
1640
1636
  function encryptBundle(bundle, key) {
1641
1637
  const json = JSON.stringify(bundle);
@@ -1647,8 +1643,8 @@ function encryptBundle(bundle, key) {
1647
1643
  zip: "DEF"
1648
1644
  };
1649
1645
  const headerB64 = base64url(Buffer.from(JSON.stringify(header), "utf8"));
1650
- const iv = crypto.randomBytes(12);
1651
- const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
1646
+ const iv = crypto$1.randomBytes(12);
1647
+ const cipher = crypto$1.createCipheriv("aes-256-gcm", key, iv);
1652
1648
  cipher.setAAD(Buffer.from(headerB64, "ascii"));
1653
1649
  const ciphertext = Buffer.concat([cipher.update(compressed), cipher.final()]);
1654
1650
  const tag = cipher.getAuthTag();
@@ -1658,8 +1654,8 @@ function encryptContent(data, key, contentType) {
1658
1654
  const compressed = zlib.deflateRawSync(data);
1659
1655
  const header = { alg: "dir", enc: "A256GCM", cty: contentType, zip: "DEF" };
1660
1656
  const headerB64 = base64url(Buffer.from(JSON.stringify(header), "utf8"));
1661
- const iv = crypto.randomBytes(12);
1662
- const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
1657
+ const iv = crypto$1.randomBytes(12);
1658
+ const cipher = crypto$1.createCipheriv("aes-256-gcm", key, iv);
1663
1659
  cipher.setAAD(Buffer.from(headerB64, "ascii"));
1664
1660
  const ciphertext = Buffer.concat([cipher.update(compressed), cipher.final()]);
1665
1661
  const tag = cipher.getAuthTag();
@@ -1678,7 +1674,7 @@ function decryptContent(jwe, key) {
1678
1674
  const iv = base64urlDecode(ivB64);
1679
1675
  const ciphertext = base64urlDecode(ciphertextB64);
1680
1676
  const tag = base64urlDecode(tagB64);
1681
- const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
1677
+ const decipher = crypto$1.createDecipheriv("aes-256-gcm", key, iv);
1682
1678
  decipher.setAAD(Buffer.from(headerB64, "ascii"));
1683
1679
  decipher.setAuthTag(tag);
1684
1680
  const compressed = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
@@ -1698,7 +1694,7 @@ function decryptBundle(jwe, key) {
1698
1694
  const iv = base64urlDecode(ivB64);
1699
1695
  const ciphertext = base64urlDecode(ciphertextB64);
1700
1696
  const tag = base64urlDecode(tagB64);
1701
- const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
1697
+ const decipher = crypto$1.createDecipheriv("aes-256-gcm", key, iv);
1702
1698
  decipher.setAAD(Buffer.from(headerB64, "ascii"));
1703
1699
  decipher.setAuthTag(tag);
1704
1700
  const compressed = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
@@ -1804,7 +1800,7 @@ async function create(options) {
1804
1800
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
1805
1801
  };
1806
1802
  if (passcode) {
1807
- metadata.passcode = crypto.createHash("sha256").update(passcode).digest("hex");
1803
+ metadata.passcode = crypto$1.createHash("sha256").update(passcode).digest("hex");
1808
1804
  }
1809
1805
  if (maxAccesses !== void 0) metadata.maxAccesses = maxAccesses;
1810
1806
  if (expiresAt) metadata.expiresAt = expiresAt.toISOString();
@@ -1952,5 +1948,5 @@ async function revoke(shlId, storage) {
1952
1948
 
1953
1949
  exports.ips_exports = ips_exports;
1954
1950
  exports.shl_exports = shl_exports;
1955
- //# sourceMappingURL=chunk-IDS43FSS.cjs.map
1956
- //# sourceMappingURL=chunk-IDS43FSS.cjs.map
1951
+ //# sourceMappingURL=chunk-63Q54EKN.cjs.map
1952
+ //# sourceMappingURL=chunk-63Q54EKN.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/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-63Q54EKN.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 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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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 } 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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} 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} 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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} 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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} 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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} 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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} 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: \"ips\" | \"r4\",\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: \"ips\" | \"r4\",\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 type { DocumentOptions } 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: \"ips\" | \"r4\",\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 const typeCode = doc.typeCode ?? \"34133-9\";\n const typeDisplay = 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 (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 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 compositionId = generateUuid();\n const patientId = generateUuid();\n const compositionDate = options?.compositionDate ?? new Date().toISOString();\n\n const patientFullUrl = `urn:uuid:${patientId}`;\n const compositionFullUrl = `urn:uuid:${compositionId}`;\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 // 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 compositionDate,\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: compositionDate,\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 // 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 buildComposition(\n id: string,\n patientRef: string,\n date: string,\n profile: \"ips\" | \"r4\",\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} 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.\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 } 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, expiresAt, maxAccesses, label, storage, debug } = options;\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 // 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\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 // Build and store metadata\n const metadata: SHLMetadata = {\n createdAt: new Date().toISOString(),\n };\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(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 * `L` is always set (manifest mode). `P` is set if a passcode is provided.\n */\nfunction buildFlags(passcode?: string): string {\n const flags: string[] = [\"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"]}
@@ -282,5 +282,5 @@ exports.ServerAzureStorage = ServerAzureStorage;
282
282
  exports.ServerGCSStorage = ServerGCSStorage;
283
283
  exports.ServerLocalStorage = ServerLocalStorage;
284
284
  exports.ServerS3Storage = ServerS3Storage;
285
- //# sourceMappingURL=chunk-5I5H3SLO.cjs.map
286
- //# sourceMappingURL=chunk-5I5H3SLO.cjs.map
285
+ //# sourceMappingURL=chunk-LXJB46WB.cjs.map
286
+ //# sourceMappingURL=chunk-LXJB46WB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/storage.ts"],"names":["LocalStorage","join","existsSync","readFileSync","StorageError","AzureStorage","GCSStorage"],"mappings":"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","file":"chunk-LXJB46WB.cjs","sourcesContent":["// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { LocalStorage, AzureStorage, GCSStorage } from \"../shl/storage.js\";\nimport type { LocalStorageConfig, S3StorageConfig, AzureStorageConfig, GCSStorageConfig } from \"../shl/storage.js\";\nimport type { SHLServerStorage } from \"./types.js\";\nimport type { SHLMetadata } from \"../shl/types.js\";\nimport { StorageError } from \"../errors.js\";\n\n/**\n * Local filesystem server storage for SMART Health Links.\n *\n * Extends the base `LocalStorage` (write-only) with `read` and\n * `updateMetadata` methods needed for serving SHLs.\n *\n * @example\n * ```ts\n * import { ServerLocalStorage } from \"@fhirfly-io/shl/server\";\n *\n * const storage = new ServerLocalStorage({\n * directory: \"./shl-data\",\n * baseUrl: \"https://shl.example.com\",\n * });\n * ```\n */\nexport class ServerLocalStorage extends LocalStorage implements SHLServerStorage {\n constructor(config: LocalStorageConfig) {\n super(config);\n }\n\n async read(key: string): Promise<string | Uint8Array | null> {\n const filePath = join(this.config.directory, key);\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n // Read as UTF-8 for JSON/JWE files, binary for others\n return readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n }\n\n async updateMetadata(\n shlId: string,\n updater: (current: SHLMetadata) => SHLMetadata | null,\n ): Promise<SHLMetadata | null> {\n const key = `${shlId}/metadata.json`;\n const raw = await this.read(key);\n if (raw === null) return null;\n\n const current = JSON.parse(raw as string) as SHLMetadata;\n const updated = updater(current);\n if (updated === null) return null;\n\n await this.store(key, JSON.stringify(updated));\n return updated;\n }\n}\n\n// Minimal S3 interfaces (same pattern as shl/storage.ts)\ninterface S3ClientInstance {\n send(command: unknown): Promise<unknown>;\n}\ninterface S3Module {\n S3Client: new (config: { region: string }) => S3ClientInstance;\n PutObjectCommand: new (input: Record<string, unknown>) => unknown;\n GetObjectCommand: new (input: Record<string, unknown>) => unknown;\n ListObjectsV2Command: new (input: Record<string, unknown>) => unknown;\n DeleteObjectsCommand: new (input: Record<string, unknown>) => unknown;\n}\n\nlet _s3Module: S3Module | undefined;\nasync function getS3Module(): Promise<S3Module> {\n if (_s3Module) return _s3Module;\n try {\n _s3Module = (await import(\"@aws-sdk/client-s3\")) as unknown as S3Module;\n return _s3Module;\n } catch {\n throw new StorageError(\n \"@aws-sdk/client-s3 is required for ServerS3Storage. Install it: npm install @aws-sdk/client-s3\",\n \"import\",\n );\n }\n}\n\n/**\n * S3-backed server storage for SMART Health Links.\n *\n * Implements the full `SHLServerStorage` interface with `read` and\n * `updateMetadata` on top of S3.\n *\n * Note: `updateMetadata` uses a plain read-modify-write pattern without\n * conditional writes. Under concurrent load, a few extra accesses may be\n * allowed beyond `maxAccesses`. For strict enforcement, use FhirflyStorage\n * or add your own atomic counter.\n *\n * @example\n * ```ts\n * import { ServerS3Storage } from \"@fhirfly-io/shl/server\";\n *\n * const storage = new ServerS3Storage({\n * bucket: \"my-shl-bucket\",\n * region: \"us-east-1\",\n * baseUrl: \"https://shl.example.com\",\n * });\n * ```\n */\nexport class ServerS3Storage implements SHLServerStorage {\n private readonly _config: S3StorageConfig;\n private _client?: S3ClientInstance;\n\n constructor(config: S3StorageConfig) {\n this._config = config;\n }\n\n get baseUrl(): string {\n return this._config.baseUrl.replace(/\\/+$/, \"\");\n }\n\n async store(key: string, content: string | Uint8Array): Promise<void> {\n try {\n const s3 = await getS3Module();\n const client = this._getClient(s3);\n const body = typeof content === \"string\" ? Buffer.from(content, \"utf8\") : content;\n\n const command = new s3.PutObjectCommand({\n Bucket: this._config.bucket,\n Key: this._s3Key(key),\n Body: body,\n ContentType: this._contentType(key),\n });\n\n await client.send(command);\n } catch (err) {\n if (err instanceof StorageError) throw err;\n throw new StorageError(\n `Failed to store ${key}: ${err instanceof Error ? err.message : String(err)}`,\n \"store\",\n );\n }\n }\n\n async delete(prefix: string): Promise<void> {\n try {\n const s3 = await getS3Module();\n const client = this._getClient(s3);\n const s3Prefix = this._s3Key(prefix);\n\n let continuationToken: string | undefined;\n do {\n const listInput: Record<string, unknown> = {\n Bucket: this._config.bucket,\n Prefix: s3Prefix,\n };\n if (continuationToken) listInput[\"ContinuationToken\"] = continuationToken;\n\n const listCommand = new s3.ListObjectsV2Command(listInput);\n const response = (await client.send(listCommand)) as {\n Contents?: Array<{ Key?: string }>;\n IsTruncated?: boolean;\n NextContinuationToken?: string;\n };\n\n const objects = response.Contents;\n if (!objects || objects.length === 0) break;\n\n const deleteCommand = new s3.DeleteObjectsCommand({\n Bucket: this._config.bucket,\n Delete: {\n Objects: objects.map((obj) => ({ Key: obj.Key })),\n Quiet: true,\n },\n });\n await client.send(deleteCommand);\n\n continuationToken = response.IsTruncated\n ? response.NextContinuationToken\n : undefined;\n } while (continuationToken);\n } catch (err) {\n if (err instanceof StorageError) throw err;\n throw new StorageError(\n `Failed to delete ${prefix}: ${err instanceof Error ? err.message : String(err)}`,\n \"delete\",\n );\n }\n }\n\n async read(key: string): Promise<string | Uint8Array | null> {\n try {\n const s3 = await getS3Module();\n const client = this._getClient(s3);\n\n const command = new s3.GetObjectCommand({\n Bucket: this._config.bucket,\n Key: this._s3Key(key),\n });\n\n const response = (await client.send(command)) as {\n Body?: { transformToString(): Promise<string> };\n };\n\n if (!response.Body) return null;\n return response.Body.transformToString();\n } catch (err) {\n // S3 returns NoSuchKey for missing objects\n const code = (err as { name?: string }).name;\n if (code === \"NoSuchKey\") return null;\n if (err instanceof StorageError) throw err;\n throw new StorageError(\n `Failed to read ${key}: ${err instanceof Error ? err.message : String(err)}`,\n \"read\",\n );\n }\n }\n\n async updateMetadata(\n shlId: string,\n updater: (current: SHLMetadata) => SHLMetadata | null,\n ): Promise<SHLMetadata | null> {\n const key = `${shlId}/metadata.json`;\n const raw = await this.read(key);\n if (raw === null) return null;\n\n const current = JSON.parse(raw as string) as SHLMetadata;\n const updated = updater(current);\n if (updated === null) return null;\n\n await this.store(key, JSON.stringify(updated));\n return updated;\n }\n\n private _getClient(s3: S3Module): S3ClientInstance {\n if (!this._client) {\n this._client = new s3.S3Client({ region: this._config.region });\n }\n return this._client;\n }\n\n private _s3Key(key: string): string {\n const prefix = this._config.prefix?.replace(/\\/+$/, \"\");\n return prefix ? `${prefix}/${key}` : key;\n }\n\n private _contentType(key: string): string {\n if (key.endsWith(\".jwe\")) return \"application/jose\";\n if (key.endsWith(\".json\")) return \"application/json\";\n return \"application/octet-stream\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Azure Blob Storage (Server)\n// ---------------------------------------------------------------------------\n\n// Minimal Azure interfaces for server-side operations\ninterface AzureBlobModule {\n BlobServiceClient: {\n fromConnectionString(connectionString: string): AzureBlobServiceClient;\n };\n}\ninterface AzureBlobServiceClient {\n getContainerClient(container: string): AzureContainerClient;\n}\ninterface AzureContainerClient {\n getBlockBlobClient(blobName: string): AzureBlockBlobClient;\n listBlobsFlat(options?: { prefix?: string }): AsyncIterable<{ name: string }>;\n}\ninterface AzureBlockBlobClient {\n upload(content: Uint8Array | Buffer, contentLength: number, options?: Record<string, unknown>): Promise<unknown>;\n deleteIfExists(): Promise<unknown>;\n download(): Promise<{ readableStreamBody?: NodeJS.ReadableStream }>;\n}\n\nlet _azureModule: AzureBlobModule | undefined;\nasync function getAzureModule(): Promise<AzureBlobModule> {\n if (_azureModule) return _azureModule;\n try {\n _azureModule = (await import(\"@azure/storage-blob\")) as unknown as AzureBlobModule;\n return _azureModule;\n } catch {\n throw new StorageError(\n \"@azure/storage-blob is required for ServerAzureStorage. Install it: npm install @azure/storage-blob\",\n \"import\",\n );\n }\n}\n\n/**\n * Azure Blob Storage server storage for SMART Health Links.\n *\n * Extends the base `AzureStorage` with `read` and `updateMetadata`\n * methods needed for serving SHLs.\n *\n * @example\n * ```ts\n * import { ServerAzureStorage } from \"@fhirfly-io/shl/server\";\n *\n * const storage = new ServerAzureStorage({\n * container: \"shl-data\",\n * connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,\n * baseUrl: \"https://shl.example.com\",\n * });\n * ```\n */\nexport class ServerAzureStorage extends AzureStorage implements SHLServerStorage {\n private _serverContainerClient?: AzureContainerClient;\n\n constructor(config: AzureStorageConfig) {\n super(config);\n }\n\n async read(key: string): Promise<string | Uint8Array | null> {\n try {\n const container = await this._getServerContainer();\n const blobName = this._serverBlobName(key);\n const client = container.getBlockBlobClient(blobName);\n\n const response = await client.download();\n if (!response.readableStreamBody) return null;\n\n return await streamToString(response.readableStreamBody);\n } catch (err) {\n const code = (err as { statusCode?: number }).statusCode;\n if (code === 404) return null;\n if (err instanceof StorageError) throw err;\n throw new StorageError(\n `Failed to read ${key}: ${err instanceof Error ? err.message : String(err)}`,\n \"read\",\n );\n }\n }\n\n async updateMetadata(\n shlId: string,\n updater: (current: SHLMetadata) => SHLMetadata | null,\n ): Promise<SHLMetadata | null> {\n const key = `${shlId}/metadata.json`;\n const raw = await this.read(key);\n if (raw === null) return null;\n\n const current = JSON.parse(raw as string) as SHLMetadata;\n const updated = updater(current);\n if (updated === null) return null;\n\n await this.store(key, JSON.stringify(updated));\n return updated;\n }\n\n private async _getServerContainer(): Promise<AzureContainerClient> {\n if (!this._serverContainerClient) {\n const azure = await getAzureModule();\n const serviceClient = azure.BlobServiceClient.fromConnectionString(this.config.connectionString);\n this._serverContainerClient = serviceClient.getContainerClient(this.config.container);\n }\n return this._serverContainerClient;\n }\n\n private _serverBlobName(key: string): string {\n const prefix = this.config.prefix?.replace(/\\/+$/, \"\");\n return prefix ? `${prefix}/${key}` : key;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Google Cloud Storage (Server)\n// ---------------------------------------------------------------------------\n\n// Minimal GCS interfaces for server-side operations\ninterface GCSModule {\n Storage: new () => GCSStorageClient;\n}\ninterface GCSStorageClient {\n bucket(name: string): GCSBucket;\n}\ninterface GCSBucket {\n file(name: string): GCSFile;\n getFiles(options?: { prefix?: string }): Promise<[GCSFile[]]>;\n}\ninterface GCSFile {\n save(content: Buffer, options?: Record<string, unknown>): Promise<void>;\n delete(options?: Record<string, unknown>): Promise<unknown>;\n download(): Promise<[Buffer]>;\n name: string;\n}\n\nlet _gcsModule: GCSModule | undefined;\nasync function getGCSModule(): Promise<GCSModule> {\n if (_gcsModule) return _gcsModule;\n try {\n _gcsModule = (await import(\"@google-cloud/storage\")) as unknown as GCSModule;\n return _gcsModule;\n } catch {\n throw new StorageError(\n \"@google-cloud/storage is required for ServerGCSStorage. Install it: npm install @google-cloud/storage\",\n \"import\",\n );\n }\n}\n\n/**\n * Google Cloud Storage server storage for SMART Health Links.\n *\n * Extends the base `GCSStorage` with `read` and `updateMetadata`\n * methods needed for serving SHLs.\n *\n * @example\n * ```ts\n * import { ServerGCSStorage } from \"@fhirfly-io/shl/server\";\n *\n * const storage = new ServerGCSStorage({\n * bucket: \"my-shl-bucket\",\n * baseUrl: \"https://shl.example.com\",\n * });\n * ```\n */\nexport class ServerGCSStorage extends GCSStorage implements SHLServerStorage {\n private _serverBucket?: GCSBucket;\n\n constructor(config: GCSStorageConfig) {\n super(config);\n }\n\n async read(key: string): Promise<string | Uint8Array | null> {\n try {\n const bucket = await this._getServerBucket();\n const fileName = this._serverFileName(key);\n const file = bucket.file(fileName);\n\n const [content] = await file.download();\n return content.toString(\"utf8\");\n } catch (err) {\n const code = (err as { code?: number }).code;\n if (code === 404) return null;\n if (err instanceof StorageError) throw err;\n throw new StorageError(\n `Failed to read ${key}: ${err instanceof Error ? err.message : String(err)}`,\n \"read\",\n );\n }\n }\n\n async updateMetadata(\n shlId: string,\n updater: (current: SHLMetadata) => SHLMetadata | null,\n ): Promise<SHLMetadata | null> {\n const key = `${shlId}/metadata.json`;\n const raw = await this.read(key);\n if (raw === null) return null;\n\n const current = JSON.parse(raw as string) as SHLMetadata;\n const updated = updater(current);\n if (updated === null) return null;\n\n await this.store(key, JSON.stringify(updated));\n return updated;\n }\n\n private async _getServerBucket(): Promise<GCSBucket> {\n if (!this._serverBucket) {\n const gcs = await getGCSModule();\n const storage = new gcs.Storage();\n this._serverBucket = storage.bucket(this.config.bucket);\n }\n return this._serverBucket;\n }\n\n private _serverFileName(key: string): string {\n const prefix = this.config.prefix?.replace(/\\/+$/, \"\");\n return prefix ? `${prefix}/${key}` : key;\n }\n}\n\n/** Helper: convert a Node.js ReadableStream to a string. */\nasync function streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n"]}