UNPKG

fhir-kit-client

Version:
53 lines 2.1 kB
import { splitReference } from './utils.js'; /** * Resolves FHIR References. Used internally by Client. */ export class ReferenceResolver { client; constructor(client) { this.client = client; } async resolve({ reference, context, options, }) { if (context === undefined) { if (reference.startsWith('http')) { return this.resolveAbsoluteReference(reference, options); } return this.client.httpClient.get(reference, options); } if (reference.startsWith('#')) { return this.resolveContainedReference(reference, context); } return this.resolveBundleReference(reference, context, options); } async resolveAbsoluteReference(reference, options) { if (reference.startsWith(this.client.baseUrl)) { return this.client.httpClient.get(reference, options); } const { baseUrl, resourceType, id } = splitReference(reference); if (!baseUrl) { throw new Error(`Unable to resolve absolute reference without a base URL: ${reference}`); } const { Client } = await import('./client.js'); return new Client({ baseUrl }).read({ resourceType, id, options }); } resolveContainedReference(reference, context) { const contained = context.contained; if (contained) { const referenceId = reference.slice(1); const resource = contained.find((r) => r.id === referenceId); if (resource) return resource; } throw new Error(`Unable to resolve contained reference: ${reference}`); } async resolveBundleReference(reference, bundle, options) { const entries = bundle.entry; const referenceRegEx = new RegExp(`(^|/)${reference}$`); const entry = entries?.find((e) => e.fullUrl && referenceRegEx.test(e.fullUrl)); if (!entry?.resource) { return this.resolve({ reference, options }); } return entry.resource; } } //# sourceMappingURL=reference-resolver.js.map