@fhirfly-io/shl 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/chunk-7WIM2QP5.js +133 -0
- package/dist/chunk-7WIM2QP5.js.map +1 -0
- package/dist/chunk-CNVYKA4D.cjs +135 -0
- package/dist/chunk-CNVYKA4D.cjs.map +1 -0
- package/dist/chunk-KI44MYPE.cjs +170 -0
- package/dist/chunk-KI44MYPE.cjs.map +1 -0
- package/dist/chunk-PZ5AY32C.js +9 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-Q7SFCCGT.cjs +11 -0
- package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
- package/dist/chunk-XTLU6O32.js +163 -0
- package/dist/chunk-XTLU6O32.js.map +1 -0
- package/dist/express.cjs +37 -0
- package/dist/express.cjs.map +1 -0
- package/dist/express.d.cts +39 -0
- package/dist/express.d.ts +39 -0
- package/dist/express.js +35 -0
- package/dist/express.js.map +1 -0
- package/dist/fastify.cjs +49 -0
- package/dist/fastify.cjs.map +1 -0
- package/dist/fastify.d.cts +43 -0
- package/dist/fastify.d.ts +43 -0
- package/dist/fastify.js +47 -0
- package/dist/fastify.js.map +1 -0
- package/dist/index.cjs +1615 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +765 -0
- package/dist/index.d.ts +765 -0
- package/dist/index.js +1593 -0
- package/dist/index.js.map +1 -0
- package/dist/lambda.cjs +64 -0
- package/dist/lambda.cjs.map +1 -0
- package/dist/lambda.d.cts +53 -0
- package/dist/lambda.d.ts +53 -0
- package/dist/lambda.js +62 -0
- package/dist/lambda.js.map +1 -0
- package/dist/server.cjs +166 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +85 -0
- package/dist/server.d.ts +85 -0
- package/dist/server.js +159 -0
- package/dist/server.js.map +1 -0
- package/dist/storage-CHi9vLD_.d.cts +82 -0
- package/dist/storage-iI_tyHcX.d.ts +82 -0
- package/dist/types--f4ITgu9.d.cts +73 -0
- package/dist/types-DKtPO4DP.d.ts +73 -0
- package/dist/types-yk0mDByJ.d.cts +96 -0
- package/dist/types-yk0mDByJ.d.ts +96 -0
- package/package.json +137 -0
|
@@ -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/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","LocalStorage","S3Storage","decryptContent","randomBytes","deflateRawSync","createCipheriv","createDecipheriv","inflateRawSync","QRCode","ValidationError","EncryptionError","StorageError"],"mappings":"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","file":"index.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} from \"./types.js\";\n\n// FHIR R4 datatypes (re-exported for users building PatientFull input)\nexport type {\n HumanName,\n Address,\n ContactPoint,\n Identifier,\n CodeableConcept,\n Reference,\n Coding,\n Period,\n AdministrativeGender,\n} from \"./fhir-types.js\";\n","// Copyright 2026 FHIRfly.io LLC. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root.\nconst XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nfunction esc(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction wrap(lines: string[]): string {\n const body = lines.join(\"\");\n return `<div xmlns=\"${XHTML_NS}\">${body}</div>`;\n}\n\nexport function medicationNarrative(\n displayText: string | undefined,\n dosageText: string | undefined,\n effectiveDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Medication\")}</b></p>`);\n if (dosageText) lines.push(`<p>Dosage: ${esc(dosageText)}</p>`);\n if (effectiveDate) lines.push(`<p>Effective: ${esc(effectiveDate)}</p>`);\n return wrap(lines);\n}\n\nexport function conditionNarrative(\n displayText: string | undefined,\n clinicalStatus: string,\n onsetDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Condition\")}</b></p>`);\n lines.push(`<p>Clinical Status: ${esc(clinicalStatus)}</p>`);\n if (onsetDate) lines.push(`<p>Onset: ${esc(onsetDate)}</p>`);\n return wrap(lines);\n}\n\nexport function allergyNarrative(\n displayText: string | undefined,\n clinicalStatus: string,\n criticality: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Allergy\")}</b></p>`);\n lines.push(`<p>Clinical Status: ${esc(clinicalStatus)}</p>`);\n if (criticality) lines.push(`<p>Criticality: ${esc(criticality)}</p>`);\n return wrap(lines);\n}\n\nexport function immunizationNarrative(\n displayText: string | undefined,\n status: string,\n occurrenceDate: string | undefined,\n): string {\n const lines: string[] = [];\n lines.push(`<p><b>${esc(displayText ?? \"Immunization\")}</b></p>`);\n lines.push(`<p>Status: ${esc(status)}</p>`);\n if (occurrenceDate) lines.push(`<p>Date: ${esc(occurrenceDate)}</p>`);\n return wrap(lines);\n}\n\nexport function 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.\nimport type {\n PatientDemographics,\n BuildOptions,\n ValidationResult,\n ValidationIssue,\n MedicationOptions,\n AllergyOptions,\n ConditionOptions,\n ImmunizationOptions,\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\";\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 _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 * 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] = 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 ]);\n\n this._buildWarnings = [\n ...medResult.warnings,\n ...condResult.warnings,\n ...allergyResult.warnings,\n ...immResult.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\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 );\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 ];\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\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 ): 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 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 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\n/** Generate a v4-style UUID using Math.random (no crypto dependency). */\nfunction generateUuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\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 } from \"./decode.js\";\nexport { revoke } from \"./revoke.js\";\nexport type { DecodedSHL } from \"./decode.js\";\nexport { S3Storage, LocalStorage } from \"./storage.js\";\nexport type { S3StorageConfig, LocalStorageConfig } 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\";\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 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\",\n location: `${baseUrl}/${shlId}/content`,\n },\n ...attachments.map((att, i) => ({\n contentType: att.contentType,\n location: `${baseUrl}/${shlId}/attachment/${i}`,\n })),\n ],\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) metadata.passcode = passcode;\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\";\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","// 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"]}
|