fhir-kit-client
Version:
53 lines • 2.1 kB
JavaScript
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