@oystehr/sdk 4.3.9 → 4.3.11
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/dist/cjs/client/client.cjs +12 -5
- package/dist/cjs/client/client.cjs.map +1 -1
- package/dist/cjs/client/client.d.ts +5 -0
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/cjs/index.min.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir-ext.cjs +196 -4
- package/dist/cjs/resources/classes/fhir-ext.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir-ext.d.ts +70 -3
- package/dist/cjs/resources/classes/fhir.cjs +14 -3
- package/dist/cjs/resources/classes/fhir.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir.d.ts +14 -3
- package/dist/cjs/resources/types/FaxSendParams.d.ts +1 -1
- package/dist/cjs/resources/types/ZambdaCreateParams.d.ts +1 -1
- package/dist/cjs/resources/types/ZambdaUpdateParams.d.ts +1 -1
- package/dist/cjs/resources/types/fhir.d.ts +20 -0
- package/dist/esm/client/client.d.ts +5 -0
- package/dist/esm/client/client.js +12 -5
- package/dist/esm/client/client.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/resources/classes/fhir-ext.d.ts +70 -3
- package/dist/esm/resources/classes/fhir-ext.js +194 -5
- package/dist/esm/resources/classes/fhir-ext.js.map +1 -1
- package/dist/esm/resources/classes/fhir.d.ts +14 -3
- package/dist/esm/resources/classes/fhir.js +15 -4
- package/dist/esm/resources/classes/fhir.js.map +1 -1
- package/dist/esm/resources/types/FaxSendParams.d.ts +1 -1
- package/dist/esm/resources/types/ZambdaCreateParams.d.ts +1 -1
- package/dist/esm/resources/types/ZambdaUpdateParams.d.ts +1 -1
- package/dist/esm/resources/types/fhir.d.ts +20 -0
- package/package.json +1 -1
- package/src/client/client.ts +22 -8
- package/src/resources/classes/fhir-ext.ts +257 -7
- package/src/resources/classes/fhir.ts +14 -3
- package/src/resources/types/FaxSendParams.ts +1 -1
- package/src/resources/types/ZambdaCreateParams.ts +1 -1
- package/src/resources/types/ZambdaUpdateParams.ts +1 -1
- package/src/resources/types/fhir.ts +22 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fhir-ext.js","sources":["../../../../src/resources/classes/fhir-ext.ts"],"sourcesContent":["import type { Operation } from 'fast-json-patch';\nimport { Address as AddressR4B, HumanName as HumanNameR4B } from 'fhir/r4b';\nimport { Address as AddressR5, HumanName as HumanNameR5 } from 'fhir/r5';\nimport {\n BatchBundle,\n BatchInput,\n BatchInputRequest,\n Binary,\n Bundle,\n BundleEntry,\n Coding,\n FhirAsyncJobHandle,\n FhirAsyncJobStatus,\n FhirAsyncWaitOptions,\n FhirBundle,\n FhirCreateParams,\n FhirDeleteParams,\n FhirGetParams,\n FhirHistoryGetParams,\n FhirHistorySearchParams,\n FhirPatchParams,\n FhirResource,\n FhirResourceReturnValue,\n FhirResponseMode,\n FhirSearchParams,\n FhirUpdateParams,\n GenerateFriendlyPatientIdParams,\n OperationOutcome,\n Resource,\n SearchParam,\n TransactionBundle,\n} from '../..';\nimport { addParamsToSearch, FhirFetcherResponse, OystehrClientRequest, SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../../errors';\n\n// Code adapted from https://github.com/sindresorhus/uint8array-extras\nconst MAX_BLOCK_SIZE = 65_535;\nfunction stringToBase64(input: string): string {\n const data: Uint8Array<ArrayBuffer> = new globalThis.TextEncoder().encode(input);\n let base64 = '';\n\n for (let index = 0; index < data.length; index += MAX_BLOCK_SIZE) {\n const chunk = data.subarray(index, index + MAX_BLOCK_SIZE);\n // Required as `btoa` and `atob` don't properly support Unicode: https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n base64 += globalThis.btoa(String.fromCodePoint.apply(undefined, chunk as unknown as number[]));\n }\n return base64;\n}\n\nfunction base64ToString(input: string): string {\n const binaryString = globalThis.atob(input);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return new globalThis.TextDecoder().decode(bytes);\n}\n\n// ─── Tag-mode helpers ────────────────────────────────────────────────────────\n\n/** Converts a Coding to the FHIR _tag parameter value format \"system|code\". */\nfunction codingToTagValue(coding: Coding): string {\n return coding.system ? `${coding.system}|${coding.code ?? ''}` : coding.code ?? '';\n}\n\n/** Returns true if two Codings match on system (treating absent as empty string) and code. */\nfunction codingMatches(a: Coding, b: Coding): boolean {\n return (a.system ?? '') === (b.system ?? '') && (a.code ?? '') === (b.code ?? '');\n}\n\n/**\n * Appends _tag (tag-workspace mode) or _tag:not (ignore-tags mode) search\n * params to an existing SearchParam array and returns the new array.\n */\nfunction applyTagSearchParams(config: OystehrConfig, params: SearchParam[] | undefined): SearchParam[] {\n const out: SearchParam[] = params ? [...params] : [];\n if (config.workspaceTag) {\n out.push({ name: '_tag', value: codingToTagValue(config.workspaceTag) });\n } else if (config.ignoreTags?.length) {\n for (const tag of config.ignoreTags) {\n out.push({ name: '_tag:not', value: codingToTagValue(tag) });\n }\n }\n return out;\n}\n\n/**\n * In ignore-tags mode: throws OystehrSdkError if the resource carries any ignored tag.\n * In tag-workspace mode: injects the workspace tag into resource.meta.tag if not already present.\n * Returns the (possibly cloned) resource.\n */\nfunction applyTagToResource<T extends FhirResource>(config: OystehrConfig, resource: T): T {\n const resourceLike = resource as unknown as Resource;\n\n if (config.ignoreTags?.length) {\n const resourceTags = (resourceLike.meta?.tag ?? []) as Coding[];\n for (const ignored of config.ignoreTags) {\n if (resourceTags.some((t) => codingMatches(t, ignored))) {\n throw new OystehrSdkError({\n message: `Resource has an ignored tag (system: \"${ignored.system ?? ''}\", code: \"${\n ignored.code ?? ''\n }\") and cannot be mutated in ignoreTags mode`,\n code: 400,\n });\n }\n }\n return resource;\n }\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n const existingTags = (resourceLike.meta?.tag ?? []) as Coding[];\n if (!existingTags.some((t) => codingMatches(t, tag))) {\n return {\n ...resource,\n meta: {\n ...resourceLike.meta,\n tag: [...existingTags, tag],\n },\n } as T;\n }\n }\n\n return resource;\n}\n\n/**\n * In ignore-tags mode: throws OystehrSdkError if any operation value resembles an ignored tag.\n * In tag-workspace mode: guards against removal or loss of the workspace tag:\n * - add/replace of the tag array: ensures workspace tag is present in the value\n * - add/replace of meta: ensures workspace tag is present in meta.tag\n * - remove of /meta/tag or /meta: keeps the remove and appends an operation to restore the workspace tag\n * - add of a single tag (path ends in /-): left unchanged (workspace tag already on the resource)\n */\nfunction applyTagToPatchOperations(config: OystehrConfig, operations: Operation[]): Operation[] {\n if (config.ignoreTags?.length) {\n for (const op of operations) {\n if (op.op === 'add' || op.op === 'replace' || op.op === 'test') {\n const opValue: unknown = op.value;\n if (opValue !== null && opValue !== undefined && typeof opValue === 'object') {\n const v = opValue as Coding;\n if (v.code !== undefined) {\n for (const ignored of config.ignoreTags) {\n if (codingMatches(v, ignored)) {\n throw new OystehrSdkError({\n message: `Patch operation contains an ignored tag (system: \"${ignored.system ?? ''}\", code: \"${\n ignored.code ?? ''\n }\") and cannot be applied in ignoreTags mode`,\n code: 400,\n });\n }\n }\n }\n }\n }\n }\n return operations;\n }\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n return operations.reduce<Operation[]>((result, op) => {\n // remove /meta/tag — restore workspace tag afterwards\n if (op.op === 'remove' && op.path === '/meta/tag') {\n result.push(op);\n result.push({ op: 'add' as const, path: '/meta/tag', value: [tag] });\n return result;\n }\n\n // remove /meta — restore workspace tag afterwards\n if (op.op === 'remove' && op.path === '/meta') {\n result.push(op);\n result.push({ op: 'add' as const, path: '/meta', value: { tag: [tag] } });\n return result;\n }\n\n // add/replace the entire tag array — ensure workspace tag is present\n if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta/tag') {\n const tags: Coding[] = Array.isArray(op.value) ? (op.value as Coding[]) : [];\n if (!tags.some((t) => codingMatches(t, tag))) {\n result.push({ ...op, value: [...tags, tag] });\n } else {\n result.push(op);\n }\n return result;\n }\n\n // add/replace the entire meta object — ensure workspace tag is present in meta.tag\n if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta') {\n const metaValue: { tag?: Coding[] } =\n op.value != null && typeof op.value === 'object' ? (op.value as { tag?: Coding[] }) : {};\n const tags = metaValue.tag ?? [];\n if (!tags.some((t) => codingMatches(t, tag))) {\n result.push({ ...op, value: { ...metaValue, tag: [...tags, tag] } });\n } else {\n result.push(op);\n }\n return result;\n }\n\n // All other operations (including add /meta/tag/- for individual tags) pass through unchanged.\n // Workspace tag is assumed already present on the resource from create/update.\n result.push(op);\n return result;\n }, []);\n }\n\n return operations;\n}\n\n/**\n * Throws OystehrFHIRError (404) if the retrieved resource violates the tag configuration:\n * - workspaceTag mode: resource must carry the workspace tag\n * - ignoreTags mode: resource must not carry any ignored tag\n */\nfunction assertRetrievedResource(config: OystehrConfig, resource: FhirResource): void {\n const resourceLike = resource as unknown as Resource;\n const resourceTags = (resourceLike.meta?.tag ?? []) as Coding[];\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n if (!resourceTags.some((t) => codingMatches(t, tag))) {\n throw new OystehrFHIRError({\n error: {\n resourceType: 'OperationOutcome',\n id: 'not-found',\n issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],\n },\n code: 404,\n });\n }\n return;\n }\n\n if (config.ignoreTags?.length) {\n for (const ignored of config.ignoreTags) {\n if (resourceTags.some((t) => codingMatches(t, ignored))) {\n throw new OystehrFHIRError({\n error: {\n resourceType: 'OperationOutcome',\n id: 'not-found',\n issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],\n },\n code: 404,\n });\n }\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Optional parameter that can be passed to the client methods. It allows\n * overriding the access token or project ID, and setting various headers,\n * such as 'Content-Type'. Also support enabling optimistic locking.\n */\nexport interface OystehrFHIRUpdateClientRequest extends OystehrClientRequest {\n /**\n * Enable optimistic locking for the request. If set to a version ID, the request will\n * include the 'If-Match' header with that value in the FHIR optimistic-locking format.\n * If the resource has been updated since the version provided, the request\n * will fail with a 412 Precondition Failed error.\n */\n optimisticLockingVersionId?: string;\n}\n\nfunction isAsyncRequestMode(mode: FhirResponseMode | undefined): mode is Exclude<FhirResponseMode, 'sync'> {\n return mode === 'async-bundle' || mode === 'async-bulk';\n}\n\n/**\n * Performs a FHIR search and returns the results as a Bundle resource\n *\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>> | FhirAsyncJobHandle> {\n const { resourceType } = params;\n const taggedParams = applyTagSearchParams(this.config, params.params);\n let paramMap: Record<string, (string | number)[]> | undefined;\n if (taggedParams.length) {\n paramMap = taggedParams.reduce((acc, param) => {\n if (!acc[param.name]) {\n acc[param.name] = [];\n }\n acc[param.name].push(param.value);\n return acc;\n }, {} as Record<string, (string | number)[]>);\n }\n\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/_search`, 'POST', paramMap ?? {}, requestMode, {\n ...request,\n contentType: 'application/x-www-form-urlencoded',\n });\n }\n\n const requestBundle = await this.fhirRequest<FhirBundle<T>>(`/${resourceType}/_search`, 'POST')(paramMap, {\n ...request,\n contentType: 'application/x-www-form-urlencoded',\n });\n const bundle: Bundle<T> = {\n ...requestBundle,\n entry: requestBundle.entry as Array<BundleEntry<T>> | undefined,\n unbundle: function (this: { entry?: Array<BundleEntry<T>> | undefined }) {\n return (\n this.entry?.map((entry) => entry.resource).filter((resource): resource is T => resource !== undefined) ?? []\n );\n },\n };\n return bundle;\n}\n\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const tagged = applyTagToResource(this.config, params);\n const { resourceType } = tagged;\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}`,\n 'POST',\n tagged as unknown as Record<string, unknown>,\n requestMode,\n request\n );\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}`, 'POST')(\n tagged as unknown as Record<string, unknown>,\n request\n );\n}\n\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/${id}`, 'GET', {}, requestMode, request);\n }\n\n const result = await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'GET')({}, request);\n assertRetrievedResource(this.config, result);\n return result;\n}\n\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request: OystehrFHIRUpdateClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request?: OystehrFHIRUpdateClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const tagged = applyTagToResource(this.config, params);\n const { id, resourceType } = tagged;\n const requestMode = request?.mode;\n const ifMatchRequest = {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n };\n\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}/${id}`,\n 'PUT',\n tagged as unknown as Record<string, unknown>,\n requestMode,\n ifMatchRequest\n );\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'PUT')(\n tagged as unknown as Record<string, unknown>,\n ifMatchRequest\n );\n}\n\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n params: FhirPatchParams<T>,\n request: OystehrFHIRUpdateClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n params: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, operations }: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const taggedOperations = applyTagToPatchOperations(this.config, operations);\n const requestMode = request?.mode;\n const ifMatchRequest = {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n };\n\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}/${id}`,\n 'PATCH',\n taggedOperations as unknown as Record<string, unknown>,\n requestMode,\n {\n ...ifMatchRequest,\n contentType: 'application/json-patch+json',\n }\n );\n }\n\n return this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'PATCH')(taggedOperations, {\n ...ifMatchRequest,\n contentType: 'application/json-patch+json',\n });\n}\n\nasync function del<T extends FhirResource>(\n this: SDKResource,\n params: FhirDeleteParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nasync function del<T extends FhirResource>(\n this: SDKResource,\n params: FhirDeleteParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nasync function del<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirDeleteParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/${id}`, 'DELETE', {}, requestMode, request);\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'DELETE')({}, request);\n}\nexport { del as delete };\n\nfunction getRetryDelayMs(retryAfter: string | undefined, fallbackMs: number): number {\n if (!retryAfter) {\n return fallbackMs;\n }\n\n const asSeconds = Number(retryAfter);\n if (Number.isFinite(asSeconds) && asSeconds >= 0) {\n return Math.max(0, Math.floor(asSeconds * 1000));\n }\n\n const asTimestamp = Date.parse(retryAfter);\n if (Number.isFinite(asTimestamp)) {\n return Math.max(0, asTimestamp - Date.now());\n }\n\n return fallbackMs;\n}\n\nexport async function getAsyncJob<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n request?: OystehrClientRequest\n): Promise<FhirAsyncJobStatus<T>> {\n return await this.fetchAsyncJobStatus<T>(jobId, request);\n}\n\nexport async function waitForAsyncJob<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n options?: FhirAsyncWaitOptions,\n request?: OystehrClientRequest\n): Promise<FhirAsyncJobStatus<T>> {\n // 5 seconds poll interval by default\n const pollIntervalMs = options?.pollIntervalMs ?? 5000;\n // 15 minutes timout by default\n const timeoutMs = options?.timeoutMs ?? 900000;\n const attempts = Math.max(1, Math.ceil(timeoutMs / pollIntervalMs));\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n const status = await this.fetchAsyncJobStatus<T>(jobId, request);\n if (status.status !== 202) {\n return status;\n }\n\n if (attempt < attempts - 1) {\n const retryAfter = 'retryAfter' in status ? status.retryAfter : undefined;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelayMs(retryAfter, pollIntervalMs)));\n }\n }\n\n throw new OystehrSdkError({\n message: `Async job ${jobId} did not complete within ${timeoutMs} ms`,\n code: 408,\n });\n}\n\nexport async function cancelAsyncJob(this: SDKResource, jobId: string, request?: OystehrClientRequest): Promise<void> {\n await this.fhirRequest(`/async-job/${jobId}`, 'DELETE')({}, request);\n}\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<T>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, count, offset }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n {\n resourceType,\n id,\n versionId,\n count,\n offset,\n }: { resourceType: string; id: string; versionId?: string; count?: number; offset?: number },\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>> | FhirFetcherResponse<T> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n if (versionId) {\n return await this.startAsyncJob(`/${resourceType}/${id}/_history/${versionId}`, 'GET', {}, requestMode, request);\n }\n return await this.startAsyncJob(`/${resourceType}/${id}/_history`, 'GET', {}, requestMode, request);\n }\n\n if (versionId) {\n return this.fhirRequest<T>(`/${resourceType}/${id}/_history/${versionId}`, 'GET')({}, request);\n }\n if (count) {\n return this.fhirRequest<Bundle<T>>(\n `/${resourceType}/${id}/_history?_total=accurate&_count=${count}\n ${offset ? `&_offset=${offset}` : ''}`,\n 'GET'\n )({}, request);\n }\n return this.fhirRequest<Bundle<T>>(`/${resourceType}/${id}/_history?_total=accurate`, 'GET')({}, request);\n}\n\n/**\n * Returns true when a batch GET/HEAD URL is a search (e.g. \"Patient\" or \"Patient?name=foo\")\n * rather than a direct retrieval (e.g. \"Patient/abc-123\").\n * A retrieval URL has a path segment after the resource type that is not a FHIR operation\n * (operations start with \"_\", e.g. \"_search\" or \"_history\").\n */\nfunction isBatchSearchUrl(url: string): boolean {\n const path = url.split('?')[0];\n const segments = path.split('/').filter(Boolean);\n // Only one segment → bare resource type, always a search\n if (segments.length <= 1) return true;\n // Two or more segments: second segment is an ID if it doesn't start with '_'\n return segments[1].startsWith('_');\n}\n\n/** Returns true when a batch POST URL targets a `_search` endpoint (e.g. \"Patient/_search\"). */\nfunction isBatchSearchPostUrl(url: string): boolean {\n return url.split('?')[0].endsWith('/_search');\n}\n\nfunction batchInputRequestToBundleEntryItem<T extends FhirResource>(\n request: BatchInputRequest<T>,\n config: OystehrConfig\n): BundleEntry<T | Binary<T>> {\n const { method } = request;\n let url = request.url;\n\n // Inject tag search params into search request URLs before URL encoding.\n // GET/HEAD: only for search URLs (not retrievals like Patient/<id>).\n // POST: only for _search endpoints (not creates).\n if (\n ((method === 'GET' || method === 'HEAD') && isBatchSearchUrl(url)) ||\n (method === 'POST' && isBatchSearchPostUrl(url))\n ) {\n if (config.workspaceTag) {\n url += (url.includes('?') ? '&' : '?') + `_tag=${codingToTagValue(config.workspaceTag)}`;\n }\n if (config.ignoreTags?.length) {\n for (const tag of config.ignoreTags) {\n url += (url.includes('?') ? '&' : '?') + `_tag:not=${codingToTagValue(tag)}`;\n }\n }\n }\n\n const baseRequest = {\n request: {\n method,\n url,\n },\n };\n\n // Escape query string parameters in entry.request.url\n if (url.split('?').length > 1) {\n const [resource, query] = url.split('?');\n const params = query\n .split('&')\n .map((param) => {\n const [name, value] = param.split('=');\n return { name, value };\n })\n .reduce((acc, { name, value }) => {\n if (!name) {\n return acc;\n }\n if (!acc[name]) {\n acc[name] = [];\n }\n acc[name].push(value);\n return acc;\n }, {} as Record<string, string[]>);\n const search = new URLSearchParams();\n addParamsToSearch(params, search);\n baseRequest.request.url = `${resource}?${search.toString()}`;\n }\n\n // GET, DELETE, and HEAD require no further parameters\n if (['GET', 'DELETE', 'HEAD'].includes(method)) {\n return baseRequest as BundleEntry<T>;\n }\n\n // PUT updates require a full resource\n if (method === 'PUT') {\n const resource = applyTagToResource(config, request.resource);\n return {\n request: {\n ...baseRequest.request,\n ifMatch: request.ifMatch,\n },\n resource: resource as T,\n } as BundleEntry<T>;\n }\n\n // PATCH can be Binary resource or JSON patch\n if (method === 'PATCH') {\n if ('resource' in request) {\n // Binary patch — decode operations, apply tag transforms, re-encode\n let patchResource = request.resource;\n const binaryData = patchResource.data;\n if (binaryData) {\n const operations = JSON.parse(base64ToString(binaryData)) as Operation[];\n const taggedOperations = applyTagToPatchOperations(config, operations);\n patchResource = { ...patchResource, data: stringToBase64(JSON.stringify(taggedOperations)) } as Binary<T>;\n }\n return {\n request: {\n ...baseRequest.request,\n ifMatch: request.ifMatch,\n },\n resource: patchResource,\n } as BundleEntry<Binary<T>>;\n }\n const operations = applyTagToPatchOperations(config, request.operations);\n const data = stringToBase64(JSON.stringify(operations));\n return {\n ...baseRequest,\n resource: {\n resourceType: 'Binary',\n contentType: 'application/json-patch+json',\n data,\n },\n } as BundleEntry<Binary<T>>;\n }\n\n // POST _search — no resource body; tag params were already injected into the URL above\n if (method === 'POST' && isBatchSearchPostUrl(url)) {\n return baseRequest as BundleEntry<T>;\n }\n\n // POST creates require a full resource\n if (method === 'POST' && 'resource' in request) {\n const resource = applyTagToResource(config, request.resource);\n const { fullUrl } = request;\n return {\n ...baseRequest,\n resource: resource as T,\n fullUrl,\n } as BundleEntry<T>;\n }\n\n // // Add ifMatch for the entries that support it\n // if ('ifMatch' in request) {\n // baseRequest.request = {\n // ...baseRequest.request,\n // ifMatch: request.ifMatch,\n // };\n // }\n\n throw new Error('Unrecognized method');\n}\n\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>>>;\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>> | FhirAsyncJobHandle> {\n const requestPayload = {\n resourceType: 'Bundle',\n type: 'batch',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n };\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob('/', 'POST', requestPayload, requestMode, request);\n }\n\n const resp = await this.fhirRequest<BatchBundle<BundleContentType>>('/', 'POST')(requestPayload, request);\n // Validate each GET/HEAD retrieval entry against the tag config.\n // Violations are replaced with a synthetic 404 OperationOutcome entry; batch entries are independent.\n const rawEntries = resp.entry as Array<BundleEntry<BundleContentType>> | undefined;\n const processedEntries: Array<BundleEntry<BundleContentType>> | undefined =\n this.config.workspaceTag || this.config.ignoreTags?.length\n ? rawEntries?.map((entry, i) => {\n const req = input.requests[i];\n if (!req || !entry?.resource) return entry;\n if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {\n try {\n assertRetrievedResource(this.config, entry.resource);\n } catch (err) {\n if (!(err instanceof OystehrFHIRError)) throw err;\n return {\n request: entry.request,\n response: { status: '404', outcome: err.cause },\n } as unknown as BundleEntry<BundleContentType>;\n }\n }\n return entry;\n })\n : rawEntries;\n const bundle: BatchBundle<BundleContentType> = {\n ...resp,\n entry: processedEntries,\n unbundle: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return (\n this.entry\n ?.map((entry) => entry.resource)\n .filter((resource): resource is BundleContentType => resource !== undefined) ?? []\n );\n },\n errors: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return this.entry\n ?.filter((entry) => entry.response?.status?.startsWith('4') || entry.response?.status?.startsWith('5'))\n .map((entry) => entry.response?.outcome)\n .filter((outcome): outcome is OperationOutcome => outcome !== undefined);\n },\n };\n return bundle;\n}\n\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>>>;\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>> | FhirAsyncJobHandle> {\n const requestPayload = {\n resourceType: 'Bundle',\n type: 'transaction',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n };\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob('/', 'POST', requestPayload, requestMode, request);\n }\n\n const resp = await this.fhirRequest<TransactionBundle<BundleContentType>>('/', 'POST')(requestPayload, request);\n // Validate each GET/HEAD retrieval entry against the tag config.\n // A violation throws OystehrFHIRError(404) — transactions are all-or-nothing.\n if (this.config.workspaceTag || this.config.ignoreTags?.length) {\n (resp.entry as Array<BundleEntry<BundleContentType>> | undefined)?.forEach((entry, i) => {\n const req = input.requests[i];\n if (!req || !entry?.resource) return;\n if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {\n assertRetrievedResource(this.config, entry.resource);\n }\n });\n }\n const bundle: TransactionBundle<BundleContentType> = {\n ...resp,\n entry: resp.entry as Array<BundleEntry<BundleContentType>> | undefined,\n unbundle: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return (\n this.entry\n ?.map((entry) => entry.resource)\n .filter((resource): resource is BundleContentType => resource !== undefined) ?? []\n );\n },\n };\n return bundle;\n}\n\nexport async function generateFriendlyPatientId(\n this: SDKResource,\n { id }: GenerateFriendlyPatientIdParams,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResource>> {\n return this.fhirRequest(`/Patient/${id}/$generate-friendly-patient-id`, 'POST')({}, request);\n}\n\nexport function formatAddress(\n address: AddressR4B | AddressR5,\n options?: { all?: boolean; use?: boolean; lineSeparator?: string }\n): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city || address.state || address.postalCode) {\n const cityStateZip = [];\n if (address.city) {\n cityStateZip.push(address.city);\n }\n if (address.state) {\n cityStateZip.push(address.state);\n }\n if (address.postalCode) {\n cityStateZip.push(address.postalCode);\n }\n builder.push(cityStateZip.join(', '));\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(options?.lineSeparator || ', ').trim();\n}\n\nexport function formatHumanName(\n name: HumanNameR4B | HumanNameR5,\n options?: {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n }\n): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && options?.suffix !== false) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fhir-ext.js","sources":["../../../../src/resources/classes/fhir-ext.ts"],"sourcesContent":["import type { Operation } from 'fast-json-patch';\nimport { Address as AddressR4B, HumanName as HumanNameR4B } from 'fhir/r4b';\nimport { Address as AddressR5, HumanName as HumanNameR5 } from 'fhir/r5';\nimport {\n BatchBundle,\n BatchInput,\n BatchInputRequest,\n Binary,\n Bundle,\n BundleEntry,\n Coding,\n FhirAsyncBulkOutputResult,\n FhirAsyncJobHandle,\n FhirAsyncJobStatus,\n FhirAsyncWaitOptions,\n FhirBundle,\n FhirCreateParams,\n FhirDeleteParams,\n FhirGetParams,\n FhirHistoryGetParams,\n FhirHistorySearchParams,\n FhirPatchParams,\n FhirResource,\n FhirResourceReturnValue,\n FhirResponseMode,\n FhirSearchParams,\n FhirUpdateParams,\n GenerateFriendlyPatientIdParams,\n OperationOutcome,\n Resource,\n SearchParam,\n TransactionBundle,\n} from '../..';\nimport { addParamsToSearch, FhirFetcherResponse, OystehrClientRequest, SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../../errors';\n\n// Code adapted from https://github.com/sindresorhus/uint8array-extras\nconst MAX_BLOCK_SIZE = 65_535;\nfunction stringToBase64(input: string): string {\n const data: Uint8Array<ArrayBuffer> = new globalThis.TextEncoder().encode(input);\n let base64 = '';\n\n for (let index = 0; index < data.length; index += MAX_BLOCK_SIZE) {\n const chunk = data.subarray(index, index + MAX_BLOCK_SIZE);\n // Required as `btoa` and `atob` don't properly support Unicode: https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n base64 += globalThis.btoa(String.fromCodePoint.apply(undefined, chunk as unknown as number[]));\n }\n return base64;\n}\n\nfunction base64ToString(input: string): string {\n const binaryString = globalThis.atob(input);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return new globalThis.TextDecoder().decode(bytes);\n}\n\n// ─── Tag-mode helpers ────────────────────────────────────────────────────────\n\n/** Converts a Coding to the FHIR _tag parameter value format \"system|code\". */\nfunction codingToTagValue(coding: Coding): string {\n return coding.system ? `${coding.system}|${coding.code ?? ''}` : coding.code ?? '';\n}\n\n/** Returns true if two Codings match on system (treating absent as empty string) and code. */\nfunction codingMatches(a: Coding, b: Coding): boolean {\n return (a.system ?? '') === (b.system ?? '') && (a.code ?? '') === (b.code ?? '');\n}\n\n/**\n * Appends _tag (tag-workspace mode) or _tag:not (ignore-tags mode) search\n * params to an existing SearchParam array and returns the new array.\n */\nfunction applyTagSearchParams(config: OystehrConfig, params: SearchParam[] | undefined): SearchParam[] {\n const out: SearchParam[] = params ? [...params] : [];\n if (config.workspaceTag) {\n out.push({ name: '_tag', value: codingToTagValue(config.workspaceTag) });\n } else if (config.ignoreTags?.length) {\n for (const tag of config.ignoreTags) {\n out.push({ name: '_tag:not', value: codingToTagValue(tag) });\n }\n }\n return out;\n}\n\n/**\n * In ignore-tags mode: throws OystehrSdkError if the resource carries any ignored tag.\n * In tag-workspace mode: injects the workspace tag into resource.meta.tag if not already present.\n * Returns the (possibly cloned) resource.\n */\nfunction applyTagToResource<T extends FhirResource>(config: OystehrConfig, resource: T): T {\n const resourceLike = resource as unknown as Resource;\n\n if (config.ignoreTags?.length) {\n const resourceTags = (resourceLike.meta?.tag ?? []) as Coding[];\n for (const ignored of config.ignoreTags) {\n if (resourceTags.some((t) => codingMatches(t, ignored))) {\n throw new OystehrSdkError({\n message: `Resource has an ignored tag (system: \"${ignored.system ?? ''}\", code: \"${\n ignored.code ?? ''\n }\") and cannot be mutated in ignoreTags mode`,\n code: 400,\n });\n }\n }\n return resource;\n }\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n const existingTags = (resourceLike.meta?.tag ?? []) as Coding[];\n if (!existingTags.some((t) => codingMatches(t, tag))) {\n return {\n ...resource,\n meta: {\n ...resourceLike.meta,\n tag: [...existingTags, tag],\n },\n } as T;\n }\n }\n\n return resource;\n}\n\n/**\n * In ignore-tags mode: throws OystehrSdkError if any operation value resembles an ignored tag.\n * In tag-workspace mode: guards against removal or loss of the workspace tag:\n * - add/replace of the tag array: ensures workspace tag is present in the value\n * - add/replace of meta: ensures workspace tag is present in meta.tag\n * - remove of /meta/tag or /meta: keeps the remove and appends an operation to restore the workspace tag\n * - add of a single tag (path ends in /-): left unchanged (workspace tag already on the resource)\n */\nfunction applyTagToPatchOperations(config: OystehrConfig, operations: Operation[]): Operation[] {\n if (config.ignoreTags?.length) {\n for (const op of operations) {\n if (op.op === 'add' || op.op === 'replace' || op.op === 'test') {\n const opValue: unknown = op.value;\n if (opValue !== null && opValue !== undefined && typeof opValue === 'object') {\n const v = opValue as Coding;\n if (v.code !== undefined) {\n for (const ignored of config.ignoreTags) {\n if (codingMatches(v, ignored)) {\n throw new OystehrSdkError({\n message: `Patch operation contains an ignored tag (system: \"${ignored.system ?? ''}\", code: \"${\n ignored.code ?? ''\n }\") and cannot be applied in ignoreTags mode`,\n code: 400,\n });\n }\n }\n }\n }\n }\n }\n return operations;\n }\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n return operations.reduce<Operation[]>((result, op) => {\n // remove /meta/tag — restore workspace tag afterwards\n if (op.op === 'remove' && op.path === '/meta/tag') {\n result.push(op);\n result.push({ op: 'add' as const, path: '/meta/tag', value: [tag] });\n return result;\n }\n\n // remove /meta — restore workspace tag afterwards\n if (op.op === 'remove' && op.path === '/meta') {\n result.push(op);\n result.push({ op: 'add' as const, path: '/meta', value: { tag: [tag] } });\n return result;\n }\n\n // add/replace the entire tag array — ensure workspace tag is present\n if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta/tag') {\n const tags: Coding[] = Array.isArray(op.value) ? (op.value as Coding[]) : [];\n if (!tags.some((t) => codingMatches(t, tag))) {\n result.push({ ...op, value: [...tags, tag] });\n } else {\n result.push(op);\n }\n return result;\n }\n\n // add/replace the entire meta object — ensure workspace tag is present in meta.tag\n if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta') {\n const metaValue: { tag?: Coding[] } =\n op.value != null && typeof op.value === 'object' ? (op.value as { tag?: Coding[] }) : {};\n const tags = metaValue.tag ?? [];\n if (!tags.some((t) => codingMatches(t, tag))) {\n result.push({ ...op, value: { ...metaValue, tag: [...tags, tag] } });\n } else {\n result.push(op);\n }\n return result;\n }\n\n // All other operations (including add /meta/tag/- for individual tags) pass through unchanged.\n // Workspace tag is assumed already present on the resource from create/update.\n result.push(op);\n return result;\n }, []);\n }\n\n return operations;\n}\n\n/**\n * Throws OystehrFHIRError (404) if the retrieved resource violates the tag configuration:\n * - workspaceTag mode: resource must carry the workspace tag\n * - ignoreTags mode: resource must not carry any ignored tag\n */\nfunction assertRetrievedResource(config: OystehrConfig, resource: FhirResource): void {\n const resourceLike = resource as unknown as Resource;\n const resourceTags = (resourceLike.meta?.tag ?? []) as Coding[];\n\n if (config.workspaceTag) {\n const tag = config.workspaceTag;\n if (!resourceTags.some((t) => codingMatches(t, tag))) {\n throw new OystehrFHIRError({\n error: {\n resourceType: 'OperationOutcome',\n id: 'not-found',\n issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],\n },\n code: 404,\n });\n }\n return;\n }\n\n if (config.ignoreTags?.length) {\n for (const ignored of config.ignoreTags) {\n if (resourceTags.some((t) => codingMatches(t, ignored))) {\n throw new OystehrFHIRError({\n error: {\n resourceType: 'OperationOutcome',\n id: 'not-found',\n issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],\n },\n code: 404,\n });\n }\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Optional parameter that can be passed to the client methods. It allows\n * overriding the access token or project ID, and setting various headers,\n * such as 'Content-Type'. Also support enabling optimistic locking.\n */\nexport interface OystehrFHIRUpdateClientRequest extends OystehrClientRequest {\n /**\n * Enable optimistic locking for the request. If set to a version ID, the request will\n * include the 'If-Match' header with that value in the FHIR optimistic-locking format.\n * If the resource has been updated since the version provided, the request\n * will fail with a 412 Precondition Failed error.\n */\n optimisticLockingVersionId?: string;\n}\n\n/**\n * Optional parameter that can be passed to the FHIR create method. In addition\n * to the standard request options, it supports FHIR conditional create via the\n * 'If-None-Exist' header.\n */\nexport interface OystehrFHIRCreateClientRequest extends OystehrClientRequest {\n /**\n * Perform a FHIR conditional create using the 'If-None-Exist' header. The value is a\n * FHIR search query that identifies whether a matching resource already exists:\n * - if no resource matches, the resource is created as normal;\n * - if exactly one resource matches, no resource is created and the existing one is returned;\n * - if more than one resource matches, the request fails with a 412 Precondition Failed error.\n *\n * Accepts either a raw search query string (e.g. `'identifier=http://acme.org|1234'`) or an\n * array of SearchParam objects (e.g. `[{ name: 'identifier', value: 'http://acme.org|1234' }]`).\n *\n * @see https://www.hl7.org/fhir/http.html#cond-update for the conditional create specification.\n */\n ifNoneExist?: string | SearchParam[];\n}\n\n/**\n * Serializes an If-None-Exist value into a FHIR search query string. A raw string is\n * returned unchanged; an array of SearchParam objects is encoded as a query string\n * (e.g. \"identifier=sys|123&active=true\").\n */\nfunction ifNoneExistToString(value: string | SearchParam[]): string {\n if (typeof value === 'string') {\n return value;\n }\n const search = new URLSearchParams();\n for (const param of value) {\n search.append(param.name, String(param.value));\n }\n return search.toString();\n}\n\nfunction isAsyncRequestMode(mode: FhirResponseMode | undefined): mode is Exclude<FhirResponseMode, 'sync'> {\n return mode === 'async-bundle' || mode === 'async-bulk';\n}\n\n/**\n * Performs a FHIR search and returns the results as a Bundle resource\n *\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function search<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>> | FhirAsyncJobHandle> {\n const { resourceType } = params;\n const taggedParams = applyTagSearchParams(this.config, params.params);\n let paramMap: Record<string, (string | number)[]> | undefined;\n if (taggedParams.length) {\n paramMap = taggedParams.reduce((acc, param) => {\n if (!acc[param.name]) {\n acc[param.name] = [];\n }\n acc[param.name].push(param.value);\n return acc;\n }, {} as Record<string, (string | number)[]>);\n }\n\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/_search`, 'POST', paramMap ?? {}, requestMode, {\n ...request,\n contentType: 'application/x-www-form-urlencoded',\n });\n }\n\n const requestBundle = await this.fhirRequest<FhirBundle<T>>(`/${resourceType}/_search`, 'POST')(paramMap, {\n ...request,\n contentType: 'application/x-www-form-urlencoded',\n });\n const bundle: Bundle<T> = {\n ...requestBundle,\n entry: requestBundle.entry as Array<BundleEntry<T>> | undefined,\n unbundle: function (this: { entry?: Array<BundleEntry<T>> | undefined }) {\n return (\n this.entry?.map((entry) => entry.resource).filter((resource): resource is T => resource !== undefined) ?? []\n );\n },\n };\n return bundle;\n}\n\n/**\n * Performs an iterative FHIR search over initial request and following \"next\" urls,\n * collecting all pages into a single Bundle.\n *\n * @param params FHIR search parameters plus optional pageSize that will overwrite _count in params\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata\n * (id, meta, total, etc.) is taken from the first page.\n */\nexport async function searchAndGetAllPages<T extends FhirResource>(\n this: SDKResource,\n params: FhirSearchParams<T> & { pageSize?: number },\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<Bundle<T>> {\n const { pageSize, ...searchParams } = params;\n\n let firstPageParams: FhirSearchParams<T> = searchParams;\n if (pageSize) {\n const baseParams = (searchParams.params ?? []).filter((p) => p.name !== '_count') ?? [];\n firstPageParams = { ...searchParams, params: [...baseParams, { name: '_count', value: pageSize }] };\n }\n\n const allEntries: Array<BundleEntry<T>> = [];\n\n const typedSearch = search<T>;\n // search returns Bundle, and fhirRequest in the while block returns FhirBundle\n let currentBundle: Bundle<T> | FhirBundle<T> = await typedSearch.call(this, firstPageParams, request);\n const firstBundle = { ...currentBundle, link: currentBundle.link?.filter((link) => link.relation !== 'next') };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const entries = currentBundle.entry as Array<BundleEntry<T>> | undefined;\n if (entries) {\n allEntries.push(...entries);\n }\n\n const nextLink: string | undefined = currentBundle.link?.find((link) => link.relation === 'next')?.url;\n if (!nextLink) {\n break;\n }\n currentBundle = await this.fhirRequest<FhirBundle<T>>(nextLink, 'GET')({}, request);\n }\n\n return {\n ...firstBundle,\n entry: allEntries.length ? allEntries : undefined,\n unbundle: function (this: { entry?: Array<BundleEntry<T>> }) {\n return this.entry?.map((e) => e.resource).filter((r): r is T => r !== undefined) ?? [];\n },\n };\n}\n\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request: OystehrFHIRCreateClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request?: OystehrFHIRCreateClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function create<T extends FhirResource>(\n this: SDKResource,\n params: FhirCreateParams<T>,\n request?: OystehrFHIRCreateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const tagged = applyTagToResource(this.config, params);\n const { resourceType } = tagged;\n const requestMode = request?.mode;\n const ifNoneExistRequest = {\n ...request,\n ifNoneExist: request?.ifNoneExist !== undefined ? ifNoneExistToString(request.ifNoneExist) : undefined,\n };\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}`,\n 'POST',\n tagged as unknown as Record<string, unknown>,\n requestMode,\n ifNoneExistRequest\n );\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}`, 'POST')(\n tagged as unknown as Record<string, unknown>,\n ifNoneExistRequest\n );\n}\n\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/${id}`, 'GET', {}, requestMode, request);\n }\n\n const result = await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'GET')({}, request);\n assertRetrievedResource(this.config, result);\n return result;\n}\n\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request: OystehrFHIRUpdateClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request?: OystehrFHIRUpdateClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const tagged = applyTagToResource(this.config, params);\n const { id, resourceType } = tagged;\n const requestMode = request?.mode;\n const ifMatchRequest = {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n };\n\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}/${id}`,\n 'PUT',\n tagged as unknown as Record<string, unknown>,\n requestMode,\n ifMatchRequest\n );\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'PUT')(\n tagged as unknown as Record<string, unknown>,\n ifMatchRequest\n );\n}\n\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n params: FhirPatchParams<T>,\n request: OystehrFHIRUpdateClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n params: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, operations }: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const taggedOperations = applyTagToPatchOperations(this.config, operations);\n const requestMode = request?.mode;\n const ifMatchRequest = {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n };\n\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(\n `/${resourceType}/${id}`,\n 'PATCH',\n taggedOperations as unknown as Record<string, unknown>,\n requestMode,\n {\n ...ifMatchRequest,\n contentType: 'application/json-patch+json',\n }\n );\n }\n\n return this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'PATCH')(taggedOperations, {\n ...ifMatchRequest,\n contentType: 'application/json-patch+json',\n });\n}\n\nasync function del<T extends FhirResource>(\n this: SDKResource,\n params: FhirDeleteParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nasync function del<T extends FhirResource>(\n this: SDKResource,\n params: FhirDeleteParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;\nasync function del<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirDeleteParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob(`/${resourceType}/${id}`, 'DELETE', {}, requestMode, request);\n }\n\n return await this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'DELETE')({}, request);\n}\nexport { del as delete };\n\nfunction getRetryDelayMs(retryAfter: string | undefined, fallbackMs: number): number {\n if (!retryAfter) {\n return fallbackMs;\n }\n\n const asSeconds = Number(retryAfter);\n if (Number.isFinite(asSeconds) && asSeconds >= 0) {\n return Math.max(0, Math.floor(asSeconds * 1000));\n }\n\n const asTimestamp = Date.parse(retryAfter);\n if (Number.isFinite(asTimestamp)) {\n return Math.max(0, asTimestamp - Date.now());\n }\n\n return fallbackMs;\n}\n\n/**\n * Fetches the status of an async job. If the job is still in progress, returns an object with status 202. If the job is completed, returns the job result with status 200. If the job has failed, returns an object with status 500 and an OperationOutcome resource describing the failure. If the job has expired, returns an object with status 410.\n * @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.getAsyncJob(jobId)`)\n * @param jobId The ID of the async job to fetch\n * @param request Optional OystehrClientRequest for authentication and headers\n * @returns A Promise that resolves to the FhirAsyncJobStatus\n */\nexport async function getAsyncJob<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n request?: OystehrClientRequest\n): Promise<FhirAsyncJobStatus<T>> {\n return await this.fetchAsyncJobStatus<T>(jobId, request);\n}\n\n/**\n * Waits for an async job to complete by polling its status until it reaches a terminal state (success, failure, or expiration) or the specified timeout is reached. Returns the final job status. Throws if the job fails, expires, or does not complete within the timeout.\n * @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.waitForAsyncJob(jobId)`)\n * @param jobId The ID of the async job to wait for\n * @param options Optional FhirAsyncWaitOptions to configure polling behavior\n * @param request Optional OystehrClientRequest for authentication and headers\n * @returns A Promise that resolves to the final FhirAsyncJobStatus\n */\nexport async function waitForAsyncJob<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n options?: FhirAsyncWaitOptions,\n request?: OystehrClientRequest\n): Promise<FhirAsyncJobStatus<T>> {\n // 5 seconds poll interval by default\n const pollIntervalMs = options?.pollIntervalMs ?? 5000;\n // 15 minutes timout by default\n const timeoutMs = options?.timeoutMs ?? 900000;\n const attempts = Math.max(1, Math.ceil(timeoutMs / pollIntervalMs));\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n const status = await this.fetchAsyncJobStatus<T>(jobId, request);\n if (status.status !== 202) {\n return status;\n }\n\n if (attempt < attempts - 1) {\n const retryAfter = 'retryAfter' in status ? status.retryAfter : undefined;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelayMs(retryAfter, pollIntervalMs)));\n }\n }\n\n throw new OystehrSdkError({\n message: `Async job ${jobId} did not complete within ${timeoutMs} ms`,\n code: 408,\n });\n}\n\nfunction parseNdjsonResources<T extends FhirResource>(ndjson: string, sourceUrl: string): T[] {\n const resources: T[] = [];\n const lines = ndjson.split('\\n');\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index].trim();\n if (line.length === 0) {\n continue;\n }\n try {\n resources.push(JSON.parse(line) as T);\n } catch (error) {\n throw new OystehrSdkError({\n message: `Failed to parse NDJSON line ${index + 1} from ${sourceUrl}`,\n code: 500,\n cause: error,\n });\n }\n }\n return resources;\n}\n\n/**\n * Waits for an async job to complete and retrieves the bulk output manifest and files. Throws if the job fails, expires, or does not complete within the specified timeout.\n * @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.waitForAsyncBulkOutput(jobId)`)\n * @param jobId The ID of the async job to wait for\n * @param options Optional FhirAsyncWaitOptions to configure polling behavior\n * @param request Optional OystehrClientRequest for authentication and headers\n * @returns A Promise that resolves to a FhirAsyncBulkOutputResult containing the bulk output manifest and files\n */\nexport async function waitForAsyncBulkOutput<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n options?: FhirAsyncWaitOptions,\n request?: OystehrClientRequest\n): Promise<FhirAsyncBulkOutputResult<T>> {\n const status = await waitForAsyncJob.call(this, jobId, options, request);\n\n if (status.status === 404) {\n throw new OystehrSdkError({\n message: `Async job ${jobId} not found`,\n code: 404,\n });\n }\n\n if (status.status === 410) {\n throw new OystehrSdkError({\n message: `Async job ${jobId} expired`,\n code: 410,\n });\n }\n\n if (status.status !== 200 || !('mode' in status) || status.mode !== 'bulk') {\n throw new OystehrSdkError({\n message: `Async job ${jobId} did not complete in bulk mode`,\n code: status.status,\n });\n }\n\n const accessToken = request?.accessToken ?? this.config.accessToken;\n const projectId = request?.projectId ?? this.config.projectId;\n if (status.manifest.requiresAccessToken && !accessToken) {\n throw new OystehrSdkError({\n message: `Bulk output for async job ${jobId} requires an access token`,\n code: 401,\n });\n }\n\n const fetchImpl = this.config.fetch ?? fetch;\n const headers: Record<string, string> = {};\n if (projectId) {\n headers['x-zapehr-project-id'] = projectId;\n headers['x-oystehr-project-id'] = projectId;\n }\n if (status.manifest.requiresAccessToken && accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n const requestHeaders = Object.keys(headers).length > 0 ? headers : undefined;\n\n const output = await Promise.all(\n status.manifest.output.map(async (file) => {\n const response = await fetchImpl(\n new Request(file.url, {\n method: 'GET',\n headers: requestHeaders,\n })\n );\n\n if (!response.ok) {\n throw new OystehrSdkError({\n message: `Failed to download bulk output (${file.type}): HTTP ${response.status}`,\n code: response.status,\n });\n }\n\n const ndjson = await response.text();\n return {\n ...file,\n resources: parseNdjsonResources<T>(ndjson, file.url),\n };\n })\n );\n\n return {\n manifest: status.manifest,\n output,\n };\n}\n\n/**\n * Wrapper around waitForAsyncBulkOutput that transforms the retrieved bulk output files into a single Bundle resource containing all the output resources as entries. This is a convenience method for use cases where you want to work with the bulk output as a Bundle, but it may not be efficient for large outputs due to the overhead of downloading and parsing all files and constructing the Bundle in memory.\n * Can be slow due to downloading and parsing potentially large NDJSON files, so use only if you need the full output as a Bundle resource. For more efficient processing of large bulk outputs, use waitForAsyncBulkOutput directly.\n * @param jobId the ID of the async job to wait for\n * @param options optional FhirAsyncWaitOptions to configure polling behavior\n * @param request optional OystehrClientRequest for authentication and headers\n * @returns a Promise that resolves to a Bundle containing all resources from the bulk output\n */\nexport async function waitForAsyncBulkBundle<T extends FhirResource>(\n this: SDKResource,\n jobId: string,\n options?: FhirAsyncWaitOptions,\n request?: OystehrClientRequest\n): Promise<Bundle<T>> {\n const bulkOutput = await waitForAsyncBulkOutput.call(this, jobId, options, request);\n const resources = bulkOutput.output.flatMap((file) => file.resources);\n\n const bundle = {\n resourceType: 'Bundle',\n type: 'collection',\n entry: resources.map((resource) => ({ resource } as BundleEntry<T>)),\n unbundle: function (this: { entry?: Array<BundleEntry<T>> | undefined }) {\n return this.entry?.map((entry) => entry.resource).filter((value): value is T => value !== undefined) ?? [];\n },\n } as unknown as Bundle<T>;\n\n return bundle;\n}\n\nexport async function cancelAsyncJob(this: SDKResource, jobId: string, request?: OystehrClientRequest): Promise<void> {\n await this.fhirRequest(`/async-job/${jobId}`, 'DELETE')({}, request);\n}\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<T>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, count, offset }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<Bundle<T>>>;\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n {\n resourceType,\n id,\n versionId,\n count,\n offset,\n }: { resourceType: string; id: string; versionId?: string; count?: number; offset?: number },\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>> | FhirFetcherResponse<T> | FhirAsyncJobHandle> {\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n if (versionId) {\n return await this.startAsyncJob(`/${resourceType}/${id}/_history/${versionId}`, 'GET', {}, requestMode, request);\n }\n return await this.startAsyncJob(`/${resourceType}/${id}/_history`, 'GET', {}, requestMode, request);\n }\n\n if (versionId) {\n return this.fhirRequest<T>(`/${resourceType}/${id}/_history/${versionId}`, 'GET')({}, request);\n }\n if (count) {\n return this.fhirRequest<Bundle<T>>(\n `/${resourceType}/${id}/_history?_total=accurate&_count=${count}\n ${offset ? `&_offset=${offset}` : ''}`,\n 'GET'\n )({}, request);\n }\n return this.fhirRequest<Bundle<T>>(`/${resourceType}/${id}/_history?_total=accurate`, 'GET')({}, request);\n}\n\n/**\n * Returns true when a batch GET/HEAD URL is a search (e.g. \"Patient\" or \"Patient?name=foo\")\n * rather than a direct retrieval (e.g. \"Patient/abc-123\").\n * A retrieval URL has a path segment after the resource type that is not a FHIR operation\n * (operations start with \"_\", e.g. \"_search\" or \"_history\").\n */\nfunction isBatchSearchUrl(url: string): boolean {\n const path = url.split('?')[0];\n const segments = path.split('/').filter(Boolean);\n // Only one segment → bare resource type, always a search\n if (segments.length <= 1) return true;\n // Two or more segments: second segment is an ID if it doesn't start with '_'\n return segments[1].startsWith('_');\n}\n\n/** Returns true when a batch POST URL targets a `_search` endpoint (e.g. \"Patient/_search\"). */\nfunction isBatchSearchPostUrl(url: string): boolean {\n return url.split('?')[0].endsWith('/_search');\n}\n\nfunction batchInputRequestToBundleEntryItem<T extends FhirResource>(\n request: BatchInputRequest<T>,\n config: OystehrConfig\n): BundleEntry<T | Binary<T>> {\n const { method } = request;\n let url = request.url;\n\n // Inject tag search params into search request URLs before URL encoding.\n // GET/HEAD: only for search URLs (not retrievals like Patient/<id>).\n // POST: only for _search endpoints (not creates).\n if (\n ((method === 'GET' || method === 'HEAD') && isBatchSearchUrl(url)) ||\n (method === 'POST' && isBatchSearchPostUrl(url))\n ) {\n if (config.workspaceTag) {\n url += (url.includes('?') ? '&' : '?') + `_tag=${codingToTagValue(config.workspaceTag)}`;\n }\n if (config.ignoreTags?.length) {\n for (const tag of config.ignoreTags) {\n url += (url.includes('?') ? '&' : '?') + `_tag:not=${codingToTagValue(tag)}`;\n }\n }\n }\n\n const baseRequest = {\n request: {\n method,\n url,\n },\n };\n\n // Escape query string parameters in entry.request.url\n if (url.split('?').length > 1) {\n const [resource, query] = url.split('?');\n const params = query\n .split('&')\n .map((param) => {\n const [name, value] = param.split('=');\n return { name, value };\n })\n .reduce((acc, { name, value }) => {\n if (!name) {\n return acc;\n }\n if (!acc[name]) {\n acc[name] = [];\n }\n acc[name].push(value);\n return acc;\n }, {} as Record<string, string[]>);\n const search = new URLSearchParams();\n addParamsToSearch(params, search);\n baseRequest.request.url = `${resource}?${search.toString()}`;\n }\n\n // GET, DELETE, and HEAD require no further parameters\n if (['GET', 'DELETE', 'HEAD'].includes(method)) {\n return baseRequest as BundleEntry<T>;\n }\n\n // PUT updates require a full resource\n if (method === 'PUT') {\n const resource = applyTagToResource(config, request.resource);\n return {\n request: {\n ...baseRequest.request,\n ifMatch: request.ifMatch,\n },\n resource: resource as T,\n } as BundleEntry<T>;\n }\n\n // PATCH can be Binary resource or JSON patch\n if (method === 'PATCH') {\n if ('resource' in request) {\n // Binary patch — decode operations, apply tag transforms, re-encode\n let patchResource = request.resource;\n const binaryData = patchResource.data;\n if (binaryData) {\n const operations = JSON.parse(base64ToString(binaryData)) as Operation[];\n const taggedOperations = applyTagToPatchOperations(config, operations);\n patchResource = { ...patchResource, data: stringToBase64(JSON.stringify(taggedOperations)) } as Binary<T>;\n }\n return {\n request: {\n ...baseRequest.request,\n ifMatch: request.ifMatch,\n },\n resource: patchResource,\n } as BundleEntry<Binary<T>>;\n }\n const operations = applyTagToPatchOperations(config, request.operations);\n const data = stringToBase64(JSON.stringify(operations));\n return {\n ...baseRequest,\n resource: {\n resourceType: 'Binary',\n contentType: 'application/json-patch+json',\n data,\n },\n } as BundleEntry<Binary<T>>;\n }\n\n // POST _search — no resource body; tag params were already injected into the URL above\n if (method === 'POST' && isBatchSearchPostUrl(url)) {\n return baseRequest as BundleEntry<T>;\n }\n\n // POST creates require a full resource\n if (method === 'POST' && 'resource' in request) {\n const resource = applyTagToResource(config, request.resource);\n const { fullUrl, ifNoneExist } = request;\n return {\n request: {\n ...baseRequest.request,\n // Conditional create: only create the resource if no existing resource matches the query.\n ifNoneExist: ifNoneExist !== undefined ? ifNoneExistToString(ifNoneExist) : undefined,\n },\n resource: resource as T,\n fullUrl,\n } as BundleEntry<T>;\n }\n\n // // Add ifMatch for the entries that support it\n // if ('ifMatch' in request) {\n // baseRequest.request = {\n // ...baseRequest.request,\n // ifMatch: request.ifMatch,\n // };\n // }\n\n throw new Error('Unrecognized method');\n}\n\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>>>;\nexport async function batch<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>> | FhirAsyncJobHandle> {\n const requestPayload = {\n resourceType: 'Bundle',\n type: 'batch',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n };\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob('/', 'POST', requestPayload, requestMode, request);\n }\n\n const resp = await this.fhirRequest<BatchBundle<BundleContentType>>('/', 'POST')(requestPayload, request);\n // Validate each GET/HEAD retrieval entry against the tag config.\n // Violations are replaced with a synthetic 404 OperationOutcome entry; batch entries are independent.\n const rawEntries = resp.entry as Array<BundleEntry<BundleContentType>> | undefined;\n const processedEntries: Array<BundleEntry<BundleContentType>> | undefined =\n this.config.workspaceTag || this.config.ignoreTags?.length\n ? rawEntries?.map((entry, i) => {\n const req = input.requests[i];\n if (!req || !entry?.resource) return entry;\n if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {\n try {\n assertRetrievedResource(this.config, entry.resource);\n } catch (err) {\n if (!(err instanceof OystehrFHIRError)) throw err;\n return {\n request: entry.request,\n response: { status: '404', outcome: err.cause },\n } as unknown as BundleEntry<BundleContentType>;\n }\n }\n return entry;\n })\n : rawEntries;\n const bundle: BatchBundle<BundleContentType> = {\n ...resp,\n entry: processedEntries,\n unbundle: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return (\n this.entry\n ?.map((entry) => entry.resource)\n .filter((resource): resource is BundleContentType => resource !== undefined) ?? []\n );\n },\n errors: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return this.entry\n ?.filter((entry) => entry.response?.status?.startsWith('4') || entry.response?.status?.startsWith('5'))\n .map((entry) => entry.response?.outcome)\n .filter((outcome): outcome is OperationOutcome => outcome !== undefined);\n },\n };\n return bundle;\n}\n\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request: OystehrClientRequest & { mode: Exclude<FhirResponseMode, 'sync'> }\n): Promise<FhirAsyncJobHandle>;\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest & { mode?: 'sync' | undefined }\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>>>;\nexport async function transaction<BundleContentType extends FhirResource>(\n this: SDKResource,\n input: BatchInput<BundleContentType>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>> | FhirAsyncJobHandle> {\n const requestPayload = {\n resourceType: 'Bundle',\n type: 'transaction',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n };\n const requestMode = request?.mode;\n if (isAsyncRequestMode(requestMode)) {\n return await this.startAsyncJob('/', 'POST', requestPayload, requestMode, request);\n }\n\n const resp = await this.fhirRequest<TransactionBundle<BundleContentType>>('/', 'POST')(requestPayload, request);\n // Validate each GET/HEAD retrieval entry against the tag config.\n // A violation throws OystehrFHIRError(404) — transactions are all-or-nothing.\n if (this.config.workspaceTag || this.config.ignoreTags?.length) {\n (resp.entry as Array<BundleEntry<BundleContentType>> | undefined)?.forEach((entry, i) => {\n const req = input.requests[i];\n if (!req || !entry?.resource) return;\n if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {\n assertRetrievedResource(this.config, entry.resource);\n }\n });\n }\n const bundle: TransactionBundle<BundleContentType> = {\n ...resp,\n entry: resp.entry as Array<BundleEntry<BundleContentType>> | undefined,\n unbundle: function (this: { entry?: Array<BundleEntry<BundleContentType>> | undefined }) {\n return (\n this.entry\n ?.map((entry) => entry.resource)\n .filter((resource): resource is BundleContentType => resource !== undefined) ?? []\n );\n },\n };\n return bundle;\n}\n\nexport async function generateFriendlyPatientId(\n this: SDKResource,\n { id }: GenerateFriendlyPatientIdParams,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResource>> {\n return this.fhirRequest(`/Patient/${id}/$generate-friendly-patient-id`, 'POST')({}, request);\n}\n\nexport function formatAddress(\n address: AddressR4B | AddressR5,\n options?: { all?: boolean; use?: boolean; lineSeparator?: string }\n): string {\n const builder = [];\n\n if (address.line) {\n builder.push(...address.line);\n }\n\n if (address.city || address.state || address.postalCode) {\n const cityStateZip = [];\n if (address.city) {\n cityStateZip.push(address.city);\n }\n if (address.state) {\n cityStateZip.push(address.state);\n }\n if (address.postalCode) {\n cityStateZip.push(address.postalCode);\n }\n builder.push(cityStateZip.join(', '));\n }\n\n if (address.use && (options?.all || options?.use)) {\n builder.push('[' + address.use + ']');\n }\n\n return builder.join(options?.lineSeparator || ', ').trim();\n}\n\nexport function formatHumanName(\n name: HumanNameR4B | HumanNameR5,\n options?: {\n all?: boolean;\n prefix?: boolean;\n suffix?: boolean;\n use?: boolean;\n }\n): string {\n const builder = [];\n\n if (name.prefix && options?.prefix !== false) {\n builder.push(...name.prefix);\n }\n\n if (name.given) {\n builder.push(...name.given);\n }\n\n if (name.family) {\n builder.push(name.family);\n }\n\n if (name.suffix && options?.suffix !== false) {\n builder.push(...name.suffix);\n }\n\n if (name.use && (options?.all || options?.use)) {\n builder.push('[' + name.use + ']');\n }\n\n return builder.join(' ').trim();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,14 +11,25 @@ export declare class Fhir extends SDKResource {
|
|
|
11
11
|
* @returns FHIR Bundle resource
|
|
12
12
|
*/
|
|
13
13
|
search: typeof ext.search;
|
|
14
|
+
/**
|
|
15
|
+
* Performs an iterative FHIR search over initial request and following "next" urls,
|
|
16
|
+
* collecting all pages into a single Bundle.
|
|
17
|
+
* @param params FHIR search parameters plus optional pageSize that will overwrite _count in params
|
|
18
|
+
* @param request optional OystehrClientRequest object
|
|
19
|
+
* @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata
|
|
20
|
+
* (id, meta, total, etc.) is taken from the first page.
|
|
21
|
+
*/
|
|
22
|
+
searchAndGetAllPages: typeof ext.searchAndGetAllPages;
|
|
14
23
|
create: typeof ext.create;
|
|
15
24
|
get: typeof ext.get;
|
|
16
|
-
getAsyncJob: typeof ext.getAsyncJob;
|
|
17
|
-
waitForAsyncJob: typeof ext.waitForAsyncJob;
|
|
18
|
-
cancelAsyncJob: typeof ext.cancelAsyncJob;
|
|
19
25
|
update: typeof ext.update;
|
|
20
26
|
patch: typeof ext.patch;
|
|
21
27
|
delete: typeof ext.delete;
|
|
28
|
+
getAsyncJob: typeof ext.getAsyncJob;
|
|
29
|
+
waitForAsyncJob: typeof ext.waitForAsyncJob;
|
|
30
|
+
waitForAsyncBulkOutput: typeof ext.waitForAsyncBulkOutput;
|
|
31
|
+
waitForAsyncBulkBundle: typeof ext.waitForAsyncBulkBundle;
|
|
32
|
+
cancelAsyncJob: typeof ext.cancelAsyncJob;
|
|
22
33
|
history: typeof ext.history;
|
|
23
34
|
batch: typeof ext.batch;
|
|
24
35
|
transaction: typeof ext.transaction;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SDKResource } from '../../client/client.js';
|
|
2
|
-
import { search, create, get,
|
|
2
|
+
import { search, searchAndGetAllPages, create, get, update, patch, delete as del, getAsyncJob, waitForAsyncJob, waitForAsyncBulkOutput, waitForAsyncBulkBundle, cancelAsyncJob, history, batch, transaction, generateFriendlyPatientId, formatAddress, formatHumanName } from './fhir-ext.js';
|
|
3
3
|
|
|
4
4
|
// AUTOGENERATED -- DO NOT EDIT
|
|
5
5
|
class Fhir extends SDKResource {
|
|
@@ -16,14 +16,25 @@ class Fhir extends SDKResource {
|
|
|
16
16
|
* @returns FHIR Bundle resource
|
|
17
17
|
*/
|
|
18
18
|
search = search;
|
|
19
|
+
/**
|
|
20
|
+
* Performs an iterative FHIR search over initial request and following "next" urls,
|
|
21
|
+
* collecting all pages into a single Bundle.
|
|
22
|
+
* @param params FHIR search parameters plus optional pageSize that will overwrite _count in params
|
|
23
|
+
* @param request optional OystehrClientRequest object
|
|
24
|
+
* @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata
|
|
25
|
+
* (id, meta, total, etc.) is taken from the first page.
|
|
26
|
+
*/
|
|
27
|
+
searchAndGetAllPages = searchAndGetAllPages;
|
|
19
28
|
create = create;
|
|
20
29
|
get = get;
|
|
21
|
-
getAsyncJob = getAsyncJob;
|
|
22
|
-
waitForAsyncJob = waitForAsyncJob;
|
|
23
|
-
cancelAsyncJob = cancelAsyncJob;
|
|
24
30
|
update = update;
|
|
25
31
|
patch = patch;
|
|
26
32
|
delete = del;
|
|
33
|
+
getAsyncJob = getAsyncJob;
|
|
34
|
+
waitForAsyncJob = waitForAsyncJob;
|
|
35
|
+
waitForAsyncBulkOutput = waitForAsyncBulkOutput;
|
|
36
|
+
waitForAsyncBulkBundle = waitForAsyncBulkBundle;
|
|
37
|
+
cancelAsyncJob = cancelAsyncJob;
|
|
27
38
|
history = history;
|
|
28
39
|
batch = batch;
|
|
29
40
|
transaction = transaction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fhir.js","sources":["../../../../src/resources/classes/fhir.ts"],"sourcesContent":["// AUTOGENERATED -- DO NOT EDIT\n\nimport { SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport * as ext from './fhir-ext';\n\nexport class Fhir extends SDKResource {\n constructor(config: OystehrConfig) {\n super(config);\n }\n #baseUrlThunk(): string {\n return this.config.services?.['fhirApiUrl'] ?? 'https://fhir-api.zapehr.com';\n }\n /**\n * Performs a FHIR search and returns the results as a Bundle resource\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\n search = ext.search;\n create = ext.create;\n get = ext.get;\n
|
|
1
|
+
{"version":3,"file":"fhir.js","sources":["../../../../src/resources/classes/fhir.ts"],"sourcesContent":["// AUTOGENERATED -- DO NOT EDIT\n\nimport { SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport * as ext from './fhir-ext';\n\nexport class Fhir extends SDKResource {\n constructor(config: OystehrConfig) {\n super(config);\n }\n #baseUrlThunk(): string {\n return this.config.services?.['fhirApiUrl'] ?? 'https://fhir-api.zapehr.com';\n }\n /**\n * Performs a FHIR search and returns the results as a Bundle resource\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\n search = ext.search;\n /**\n * Performs an iterative FHIR search over initial request and following \"next\" urls,\n * collecting all pages into a single Bundle.\n * @param params FHIR search parameters plus optional pageSize that will overwrite _count in params\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata\n * (id, meta, total, etc.) is taken from the first page.\n */\n searchAndGetAllPages = ext.searchAndGetAllPages;\n create = ext.create;\n get = ext.get;\n update = ext.update;\n patch = ext.patch;\n delete = ext.delete;\n getAsyncJob = ext.getAsyncJob;\n waitForAsyncJob = ext.waitForAsyncJob;\n waitForAsyncBulkOutput = ext.waitForAsyncBulkOutput;\n waitForAsyncBulkBundle = ext.waitForAsyncBulkBundle;\n cancelAsyncJob = ext.cancelAsyncJob;\n history = ext.history;\n batch = ext.batch;\n transaction = ext.transaction;\n generateFriendlyPatientId = ext.generateFriendlyPatientId;\n formatAddress = ext.formatAddress;\n formatHumanName = ext.formatHumanName;\n}\n"],"names":["ext.search","ext.searchAndGetAllPages","ext.create","ext.get","ext.update","ext.patch","ext.delete","ext.getAsyncJob","ext.waitForAsyncJob","ext.waitForAsyncBulkOutput","ext.waitForAsyncBulkBundle","ext.cancelAsyncJob","ext.history","ext.batch","ext.transaction","ext.generateFriendlyPatientId","ext.formatAddress","ext.formatHumanName"],"mappings":";;;AAAA;AAMM,MAAO,IAAK,SAAQ,WAAW,CAAA;AACnC,IAAA,WAAA,CAAY,MAAqB,EAAA;QAC/B,KAAK,CAAC,MAAM,CAAC;IACf;IACA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,6BAA6B;IAC9E;AACA;;;;;AAKG;AACH,IAAA,MAAM,GAAGA,MAAU;AACnB;;;;;;;AAOG;AACH,IAAA,oBAAoB,GAAGC,oBAAwB;AAC/C,IAAA,MAAM,GAAGC,MAAU;AACnB,IAAA,GAAG,GAAGC,GAAO;AACb,IAAA,MAAM,GAAGC,MAAU;AACnB,IAAA,KAAK,GAAGC,KAAS;AACjB,IAAA,MAAM,GAAGC,GAAU;AACnB,IAAA,WAAW,GAAGC,WAAe;AAC7B,IAAA,eAAe,GAAGC,eAAmB;AACrC,IAAA,sBAAsB,GAAGC,sBAA0B;AACnD,IAAA,sBAAsB,GAAGC,sBAA0B;AACnD,IAAA,cAAc,GAAGC,cAAkB;AACnC,IAAA,OAAO,GAAGC,OAAW;AACrB,IAAA,KAAK,GAAGC,KAAS;AACjB,IAAA,WAAW,GAAGC,WAAe;AAC7B,IAAA,yBAAyB,GAAGC,yBAA6B;AACzD,IAAA,aAAa,GAAGC,aAAiB;AACjC,IAAA,eAAe,GAAGC,eAAmB;AACtC;;;;"}
|
|
@@ -12,7 +12,7 @@ export interface ZambdaCreateParams {
|
|
|
12
12
|
/**
|
|
13
13
|
* The runtime to use for the Zambda Function.
|
|
14
14
|
*/
|
|
15
|
-
runtime: '
|
|
15
|
+
runtime: 'nodejs22.x' | 'nodejs24.x' | 'python3.13' | 'python3.12' | 'java21' | 'dotnet8' | 'ruby3.3';
|
|
16
16
|
/**
|
|
17
17
|
* The amount of memory in MB to allocate to the Zambda Function. If not specified, a system default (1024MB) will be used. Min: 128MB, Max: 10240MB.
|
|
18
18
|
*/
|
|
@@ -12,7 +12,7 @@ export interface ZambdaUpdateParams {
|
|
|
12
12
|
/**
|
|
13
13
|
* The runtime to use for the Zambda Function.
|
|
14
14
|
*/
|
|
15
|
-
runtime?: '
|
|
15
|
+
runtime?: 'nodejs22.x' | 'nodejs24.x' | 'python3.13' | 'python3.12' | 'java21' | 'dotnet8' | 'ruby3.3';
|
|
16
16
|
/**
|
|
17
17
|
* The amount of memory in MB to allocate to the Zambda Function. If not specified, a system default (1024MB) will be used. Min: 128MB, Max: 10240MB.
|
|
18
18
|
*/
|
|
@@ -93,6 +93,19 @@ export interface BatchInputPostRequest<F extends FhirResource> extends BatchInpu
|
|
|
93
93
|
method: 'POST';
|
|
94
94
|
resource: F;
|
|
95
95
|
fullUrl?: string;
|
|
96
|
+
/**
|
|
97
|
+
* Perform a FHIR conditional create for this entry using the bundle entry's `ifNoneExist`
|
|
98
|
+
* field. The value is a FHIR search query that identifies whether a matching resource already
|
|
99
|
+
* exists: if no resource matches, the resource is created; if exactly one matches, no resource
|
|
100
|
+
* is created and the existing one is returned; if more than one matches, the entry fails with a
|
|
101
|
+
* 412 Precondition Failed error.
|
|
102
|
+
*
|
|
103
|
+
* Accepts either a raw search query string (e.g. `'identifier=http://acme.org|1234'`) or an
|
|
104
|
+
* array of SearchParam objects (e.g. `[{ name: 'identifier', value: 'http://acme.org|1234' }]`).
|
|
105
|
+
*
|
|
106
|
+
* @see https://www.hl7.org/fhir/http.html#cond-update
|
|
107
|
+
*/
|
|
108
|
+
ifNoneExist?: string | SearchParam[];
|
|
96
109
|
}
|
|
97
110
|
/**
|
|
98
111
|
* A batch POST to a `_search` endpoint (e.g. `Patient/_search`). Search parameters
|
|
@@ -167,6 +180,13 @@ export interface FhirAsyncJobCompletedBulk {
|
|
|
167
180
|
mode: 'bulk';
|
|
168
181
|
manifest: FhirAsyncBulkManifest;
|
|
169
182
|
}
|
|
183
|
+
export interface FhirAsyncBulkOutputFileResult<T extends FhirResource = FhirResource> extends FhirAsyncBulkOutputFile {
|
|
184
|
+
resources: T[];
|
|
185
|
+
}
|
|
186
|
+
export interface FhirAsyncBulkOutputResult<T extends FhirResource = FhirResource> {
|
|
187
|
+
manifest: FhirAsyncBulkManifest;
|
|
188
|
+
output: FhirAsyncBulkOutputFileResult<T>[];
|
|
189
|
+
}
|
|
170
190
|
export interface FhirAsyncJobExpired {
|
|
171
191
|
status: 410;
|
|
172
192
|
}
|
package/package.json
CHANGED
package/src/client/client.ts
CHANGED
|
@@ -59,6 +59,11 @@ export interface OystehrClientRequest {
|
|
|
59
59
|
|
|
60
60
|
interface InternalClientRequest extends OystehrClientRequest {
|
|
61
61
|
ifMatch?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Internal-only: the value of the 'If-None-Exist' header, used for FHIR
|
|
64
|
+
* conditional creates. A FHIR search query string (e.g. "identifier=sys|123").
|
|
65
|
+
*/
|
|
66
|
+
ifNoneExist?: string;
|
|
62
67
|
/**
|
|
63
68
|
* Internal-only: returns raw response metadata ({ status, headers, body }) instead of throwing on non-2xx statuses.
|
|
64
69
|
*/
|
|
@@ -299,11 +304,16 @@ function isInternalClientRequest(request: Record<string, any>): request is Inter
|
|
|
299
304
|
('contentType' in request && request.contentType?.split('/').length === 2) ||
|
|
300
305
|
'requestId' in request ||
|
|
301
306
|
('ifMatch' in request && request.ifMatch.startsWith('W/"')) ||
|
|
307
|
+
'ifNoneExist' in request ||
|
|
302
308
|
'mode' in request ||
|
|
303
309
|
'rawResponse' in request
|
|
304
310
|
);
|
|
305
311
|
}
|
|
306
312
|
|
|
313
|
+
function isResourcePayload(params: Record<string, unknown>): boolean {
|
|
314
|
+
return typeof params.resourceType === 'string' && params.resourceType.length > 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
307
317
|
function getPreferHeaderFromMode(mode: FhirResponseMode | undefined): string | undefined {
|
|
308
318
|
if (mode === 'async-bundle' || mode === 'async-bulk') {
|
|
309
319
|
return 'respond-async';
|
|
@@ -422,6 +432,7 @@ function fetcher(
|
|
|
422
432
|
preferHeader ? { Prefer: preferHeader } : {},
|
|
423
433
|
accessToken ? { Authorization: `Bearer ${accessToken}` } : {},
|
|
424
434
|
requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {},
|
|
435
|
+
requestCtx?.ifNoneExist ? { 'If-None-Exist': requestCtx.ifNoneExist } : {},
|
|
425
436
|
{ 'x-oystehr-request-id': requestCtx?.requestId }
|
|
426
437
|
);
|
|
427
438
|
const retryConfig: ConstructedRetryConfig = {
|
|
@@ -628,13 +639,16 @@ export function extractParamsAndRequest(
|
|
|
628
639
|
params?: Record<string, unknown> | [any] | InternalClientRequest,
|
|
629
640
|
request?: InternalClientRequest
|
|
630
641
|
): [Record<string, unknown>, InternalClientRequest | undefined] {
|
|
631
|
-
const
|
|
632
|
-
!!params &&
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
642
|
+
const shouldUseFirstArgAsRequest =
|
|
643
|
+
!!params &&
|
|
644
|
+
!request &&
|
|
645
|
+
!Array.isArray(params) &&
|
|
646
|
+
isInternalClientRequest(params) &&
|
|
647
|
+
!isResourcePayload(params as Record<string, unknown>);
|
|
648
|
+
|
|
649
|
+
const providedParams: Record<string, unknown> | [any] = shouldUseFirstArgAsRequest
|
|
650
|
+
? {}
|
|
651
|
+
: (params as Record<string, unknown>) ?? {};
|
|
652
|
+
const requestCtx = shouldUseFirstArgAsRequest ? (params as InternalClientRequest) : request;
|
|
639
653
|
return [providedParams, requestCtx];
|
|
640
654
|
}
|