@oystehr/sdk 4.3.3 → 4.3.5
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/README.md +1 -1
- package/dist/cjs/config.d.ts +15 -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 +294 -19
- package/dist/cjs/resources/classes/fhir-ext.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir-ext.d.ts +2 -1
- package/dist/cjs/resources/classes/fhir.cjs +1 -0
- package/dist/cjs/resources/classes/fhir.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir.d.ts +1 -0
- package/dist/cjs/resources/classes/index.cjs +7 -0
- package/dist/cjs/resources/classes/index.cjs.map +1 -1
- package/dist/cjs/resources/types/RcmListPayersParams.d.ts +4 -0
- package/dist/cjs/resources/types/RcmListPayersResponse.d.ts +9 -1
- package/dist/cjs/resources/types/TelemedCreateMeetingParams.d.ts +4 -0
- package/dist/cjs/resources/types/fhir.d.ts +16 -3
- package/dist/esm/config.d.ts +15 -0
- 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 +2 -1
- package/dist/esm/resources/classes/fhir-ext.js +294 -20
- package/dist/esm/resources/classes/fhir-ext.js.map +1 -1
- package/dist/esm/resources/classes/fhir.d.ts +1 -0
- package/dist/esm/resources/classes/fhir.js +2 -1
- package/dist/esm/resources/classes/fhir.js.map +1 -1
- package/dist/esm/resources/classes/index.js +7 -0
- package/dist/esm/resources/classes/index.js.map +1 -1
- package/dist/esm/resources/types/RcmListPayersParams.d.ts +4 -0
- package/dist/esm/resources/types/RcmListPayersResponse.d.ts +9 -1
- package/dist/esm/resources/types/TelemedCreateMeetingParams.d.ts +4 -0
- package/dist/esm/resources/types/fhir.d.ts +16 -3
- package/package.json +1 -1
- package/src/config.ts +16 -0
- package/src/resources/classes/fhir-ext.ts +331 -19
- package/src/resources/classes/fhir.ts +1 -0
- package/src/resources/classes/index.ts +7 -0
- package/src/resources/types/RcmListPayersParams.ts +4 -0
- package/src/resources/types/RcmListPayersResponse.ts +9 -1
- package/src/resources/types/TelemedCreateMeetingParams.ts +4 -0
- package/src/resources/types/fhir.ts +20 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Address as AddressR4B, HumanName as HumanNameR4B } from 'fhir/r4b';
|
|
2
2
|
import { Address as AddressR5, HumanName as HumanNameR5 } from 'fhir/r5';
|
|
3
|
-
import { BatchBundle, BatchInput, Bundle, FhirCreateParams, FhirDeleteParams, FhirGetParams, FhirHistoryGetParams, FhirHistorySearchParams, FhirPatchParams, FhirResource, FhirResourceReturnValue, FhirSearchParams, FhirUpdateParams, TransactionBundle } from '../..';
|
|
3
|
+
import { BatchBundle, BatchInput, Bundle, FhirCreateParams, FhirDeleteParams, FhirGetParams, FhirHistoryGetParams, FhirHistorySearchParams, FhirPatchParams, FhirResource, FhirResourceReturnValue, FhirSearchParams, FhirUpdateParams, GenerateFriendlyPatientIdParams, TransactionBundle } from '../..';
|
|
4
4
|
import { FhirFetcherResponse, OystehrClientRequest, SDKResource } from '../../client/client';
|
|
5
5
|
/**
|
|
6
6
|
* Optional parameter that can be passed to the client methods. It allows
|
|
@@ -35,6 +35,7 @@ export declare function history<T extends FhirResource>(this: SDKResource, { res
|
|
|
35
35
|
export declare function history<T extends FhirResource>(this: SDKResource, { resourceType, id, count, offset }: FhirHistorySearchParams<T>, request?: OystehrClientRequest): Promise<FhirFetcherResponse<Bundle<T>>>;
|
|
36
36
|
export declare function batch<BundleContentType extends FhirResource>(this: SDKResource, input: BatchInput<BundleContentType>, request?: OystehrClientRequest): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>>>;
|
|
37
37
|
export declare function transaction<BundleContentType extends FhirResource>(this: SDKResource, input: BatchInput<BundleContentType>, request?: OystehrClientRequest): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>>>;
|
|
38
|
+
export declare function generateFriendlyPatientId(this: SDKResource, { id }: GenerateFriendlyPatientIdParams, request?: OystehrClientRequest): Promise<FhirFetcherResponse<FhirResource>>;
|
|
38
39
|
export declare function formatAddress(address: AddressR4B | AddressR5, options?: {
|
|
39
40
|
all?: boolean;
|
|
40
41
|
use?: boolean;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { addParamsToSearch } from '../../client/client.js';
|
|
2
|
+
import { OystehrFHIRError, OystehrSdkError } from '../../errors/index.js';
|
|
2
3
|
|
|
3
4
|
// Code adapted from https://github.com/sindresorhus/uint8array-extras
|
|
4
5
|
const MAX_BLOCK_SIZE = 65_535;
|
|
@@ -12,6 +13,186 @@ function stringToBase64(input) {
|
|
|
12
13
|
}
|
|
13
14
|
return base64;
|
|
14
15
|
}
|
|
16
|
+
function base64ToString(input) {
|
|
17
|
+
const binaryString = globalThis.atob(input);
|
|
18
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
19
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
20
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
21
|
+
}
|
|
22
|
+
return new globalThis.TextDecoder().decode(bytes);
|
|
23
|
+
}
|
|
24
|
+
// ─── Tag-mode helpers ────────────────────────────────────────────────────────
|
|
25
|
+
/** Converts a Coding to the FHIR _tag parameter value format "system|code". */
|
|
26
|
+
function codingToTagValue(coding) {
|
|
27
|
+
return coding.system ? `${coding.system}|${coding.code ?? ''}` : coding.code ?? '';
|
|
28
|
+
}
|
|
29
|
+
/** Returns true if two Codings match on system (treating absent as empty string) and code. */
|
|
30
|
+
function codingMatches(a, b) {
|
|
31
|
+
return (a.system ?? '') === (b.system ?? '') && (a.code ?? '') === (b.code ?? '');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Appends _tag (tag-workspace mode) or _tag:not (ignore-tags mode) search
|
|
35
|
+
* params to an existing SearchParam array and returns the new array.
|
|
36
|
+
*/
|
|
37
|
+
function applyTagSearchParams(config, params) {
|
|
38
|
+
const out = params ? [...params] : [];
|
|
39
|
+
if (config.workspaceTag) {
|
|
40
|
+
out.push({ name: '_tag', value: codingToTagValue(config.workspaceTag) });
|
|
41
|
+
}
|
|
42
|
+
else if (config.ignoreTags?.length) {
|
|
43
|
+
for (const tag of config.ignoreTags) {
|
|
44
|
+
out.push({ name: '_tag:not', value: codingToTagValue(tag) });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* In ignore-tags mode: throws OystehrSdkError if the resource carries any ignored tag.
|
|
51
|
+
* In tag-workspace mode: injects the workspace tag into resource.meta.tag if not already present.
|
|
52
|
+
* Returns the (possibly cloned) resource.
|
|
53
|
+
*/
|
|
54
|
+
function applyTagToResource(config, resource) {
|
|
55
|
+
const resourceLike = resource;
|
|
56
|
+
if (config.ignoreTags?.length) {
|
|
57
|
+
const resourceTags = (resourceLike.meta?.tag ?? []);
|
|
58
|
+
for (const ignored of config.ignoreTags) {
|
|
59
|
+
if (resourceTags.some((t) => codingMatches(t, ignored))) {
|
|
60
|
+
throw new OystehrSdkError({
|
|
61
|
+
message: `Resource has an ignored tag (system: "${ignored.system ?? ''}", code: "${ignored.code ?? ''}") and cannot be mutated in ignoreTags mode`,
|
|
62
|
+
code: 400,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return resource;
|
|
67
|
+
}
|
|
68
|
+
if (config.workspaceTag) {
|
|
69
|
+
const tag = config.workspaceTag;
|
|
70
|
+
const existingTags = (resourceLike.meta?.tag ?? []);
|
|
71
|
+
if (!existingTags.some((t) => codingMatches(t, tag))) {
|
|
72
|
+
return {
|
|
73
|
+
...resource,
|
|
74
|
+
meta: {
|
|
75
|
+
...resourceLike.meta,
|
|
76
|
+
tag: [...existingTags, tag],
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return resource;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* In ignore-tags mode: throws OystehrSdkError if any operation value resembles an ignored tag.
|
|
85
|
+
* In tag-workspace mode: guards against removal or loss of the workspace tag:
|
|
86
|
+
* - add/replace of the tag array: ensures workspace tag is present in the value
|
|
87
|
+
* - add/replace of meta: ensures workspace tag is present in meta.tag
|
|
88
|
+
* - remove of /meta/tag or /meta: keeps the remove and appends an operation to restore the workspace tag
|
|
89
|
+
* - add of a single tag (path ends in /-): left unchanged (workspace tag already on the resource)
|
|
90
|
+
*/
|
|
91
|
+
function applyTagToPatchOperations(config, operations) {
|
|
92
|
+
if (config.ignoreTags?.length) {
|
|
93
|
+
for (const op of operations) {
|
|
94
|
+
if (op.op === 'add' || op.op === 'replace' || op.op === 'test') {
|
|
95
|
+
const opValue = op.value;
|
|
96
|
+
if (opValue !== null && opValue !== undefined && typeof opValue === 'object') {
|
|
97
|
+
const v = opValue;
|
|
98
|
+
if (v.code !== undefined) {
|
|
99
|
+
for (const ignored of config.ignoreTags) {
|
|
100
|
+
if (codingMatches(v, ignored)) {
|
|
101
|
+
throw new OystehrSdkError({
|
|
102
|
+
message: `Patch operation contains an ignored tag (system: "${ignored.system ?? ''}", code: "${ignored.code ?? ''}") and cannot be applied in ignoreTags mode`,
|
|
103
|
+
code: 400,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return operations;
|
|
112
|
+
}
|
|
113
|
+
if (config.workspaceTag) {
|
|
114
|
+
const tag = config.workspaceTag;
|
|
115
|
+
return operations.reduce((result, op) => {
|
|
116
|
+
// remove /meta/tag — restore workspace tag afterwards
|
|
117
|
+
if (op.op === 'remove' && op.path === '/meta/tag') {
|
|
118
|
+
result.push(op);
|
|
119
|
+
result.push({ op: 'add', path: '/meta/tag', value: [tag] });
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
// remove /meta — restore workspace tag afterwards
|
|
123
|
+
if (op.op === 'remove' && op.path === '/meta') {
|
|
124
|
+
result.push(op);
|
|
125
|
+
result.push({ op: 'add', path: '/meta', value: { tag: [tag] } });
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
// add/replace the entire tag array — ensure workspace tag is present
|
|
129
|
+
if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta/tag') {
|
|
130
|
+
const tags = Array.isArray(op.value) ? op.value : [];
|
|
131
|
+
if (!tags.some((t) => codingMatches(t, tag))) {
|
|
132
|
+
result.push({ ...op, value: [...tags, tag] });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
result.push(op);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
// add/replace the entire meta object — ensure workspace tag is present in meta.tag
|
|
140
|
+
if ((op.op === 'add' || op.op === 'replace') && op.path === '/meta') {
|
|
141
|
+
const metaValue = op.value != null && typeof op.value === 'object' ? op.value : {};
|
|
142
|
+
const tags = metaValue.tag ?? [];
|
|
143
|
+
if (!tags.some((t) => codingMatches(t, tag))) {
|
|
144
|
+
result.push({ ...op, value: { ...metaValue, tag: [...tags, tag] } });
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
result.push(op);
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
// All other operations (including add /meta/tag/- for individual tags) pass through unchanged.
|
|
152
|
+
// Workspace tag is assumed already present on the resource from create/update.
|
|
153
|
+
result.push(op);
|
|
154
|
+
return result;
|
|
155
|
+
}, []);
|
|
156
|
+
}
|
|
157
|
+
return operations;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Throws OystehrFHIRError (404) if the retrieved resource violates the tag configuration:
|
|
161
|
+
* - workspaceTag mode: resource must carry the workspace tag
|
|
162
|
+
* - ignoreTags mode: resource must not carry any ignored tag
|
|
163
|
+
*/
|
|
164
|
+
function assertRetrievedResource(config, resource) {
|
|
165
|
+
const resourceLike = resource;
|
|
166
|
+
const resourceTags = (resourceLike.meta?.tag ?? []);
|
|
167
|
+
if (config.workspaceTag) {
|
|
168
|
+
const tag = config.workspaceTag;
|
|
169
|
+
if (!resourceTags.some((t) => codingMatches(t, tag))) {
|
|
170
|
+
throw new OystehrFHIRError({
|
|
171
|
+
error: {
|
|
172
|
+
resourceType: 'OperationOutcome',
|
|
173
|
+
id: 'not-found',
|
|
174
|
+
issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],
|
|
175
|
+
},
|
|
176
|
+
code: 404,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (config.ignoreTags?.length) {
|
|
182
|
+
for (const ignored of config.ignoreTags) {
|
|
183
|
+
if (resourceTags.some((t) => codingMatches(t, ignored))) {
|
|
184
|
+
throw new OystehrFHIRError({
|
|
185
|
+
error: {
|
|
186
|
+
resourceType: 'OperationOutcome',
|
|
187
|
+
id: 'not-found',
|
|
188
|
+
issue: [{ severity: 'error', code: 'not-found', details: { text: 'Not found' } }],
|
|
189
|
+
},
|
|
190
|
+
code: 404,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
15
196
|
/**
|
|
16
197
|
* Performs a FHIR search and returns the results as a Bundle resource
|
|
17
198
|
*
|
|
@@ -20,10 +201,11 @@ function stringToBase64(input) {
|
|
|
20
201
|
* @returns FHIR Bundle resource
|
|
21
202
|
*/
|
|
22
203
|
async function search(params, request) {
|
|
23
|
-
const { resourceType
|
|
204
|
+
const { resourceType } = params;
|
|
205
|
+
const taggedParams = applyTagSearchParams(this.config, params.params);
|
|
24
206
|
let paramMap;
|
|
25
|
-
if (
|
|
26
|
-
paramMap =
|
|
207
|
+
if (taggedParams.length) {
|
|
208
|
+
paramMap = taggedParams.reduce((acc, param) => {
|
|
27
209
|
if (!acc[param.name]) {
|
|
28
210
|
acc[param.name] = [];
|
|
29
211
|
}
|
|
@@ -45,21 +227,26 @@ async function search(params, request) {
|
|
|
45
227
|
return bundle;
|
|
46
228
|
}
|
|
47
229
|
async function create(params, request) {
|
|
48
|
-
const
|
|
49
|
-
|
|
230
|
+
const tagged = applyTagToResource(this.config, params);
|
|
231
|
+
const { resourceType } = tagged;
|
|
232
|
+
return this.fhirRequest(`/${resourceType}`, 'POST')(tagged, request);
|
|
50
233
|
}
|
|
51
234
|
async function get({ resourceType, id }, request) {
|
|
52
|
-
|
|
235
|
+
const result = await this.fhirRequest(`/${resourceType}/${id}`, 'GET')({}, request);
|
|
236
|
+
assertRetrievedResource(this.config, result);
|
|
237
|
+
return result;
|
|
53
238
|
}
|
|
54
239
|
async function update(params, request) {
|
|
55
|
-
const
|
|
56
|
-
|
|
240
|
+
const tagged = applyTagToResource(this.config, params);
|
|
241
|
+
const { id, resourceType } = tagged;
|
|
242
|
+
return this.fhirRequest(`/${resourceType}/${id}`, 'PUT')(tagged, {
|
|
57
243
|
...request,
|
|
58
244
|
ifMatch: request?.optimisticLockingVersionId ? `W/"${request.optimisticLockingVersionId}"` : undefined,
|
|
59
245
|
});
|
|
60
246
|
}
|
|
61
247
|
async function patch({ resourceType, id, operations }, request) {
|
|
62
|
-
|
|
248
|
+
const taggedOperations = applyTagToPatchOperations(this.config, operations);
|
|
249
|
+
return this.fhirRequest(`/${resourceType}/${id}`, 'PATCH')(taggedOperations, {
|
|
63
250
|
...request,
|
|
64
251
|
contentType: 'application/json-patch+json',
|
|
65
252
|
ifMatch: request?.optimisticLockingVersionId ? `W/"${request.optimisticLockingVersionId}"` : undefined,
|
|
@@ -78,8 +265,42 @@ async function history({ resourceType, id, versionId, count, offset, }, request)
|
|
|
78
265
|
}
|
|
79
266
|
return this.fhirRequest(`/${resourceType}/${id}/_history?_total=accurate`, 'GET')({}, request);
|
|
80
267
|
}
|
|
81
|
-
|
|
82
|
-
|
|
268
|
+
/**
|
|
269
|
+
* Returns true when a batch GET/HEAD URL is a search (e.g. "Patient" or "Patient?name=foo")
|
|
270
|
+
* rather than a direct retrieval (e.g. "Patient/abc-123").
|
|
271
|
+
* A retrieval URL has a path segment after the resource type that is not a FHIR operation
|
|
272
|
+
* (operations start with "_", e.g. "_search" or "_history").
|
|
273
|
+
*/
|
|
274
|
+
function isBatchSearchUrl(url) {
|
|
275
|
+
const path = url.split('?')[0];
|
|
276
|
+
const segments = path.split('/').filter(Boolean);
|
|
277
|
+
// Only one segment → bare resource type, always a search
|
|
278
|
+
if (segments.length <= 1)
|
|
279
|
+
return true;
|
|
280
|
+
// Two or more segments: second segment is an ID if it doesn't start with '_'
|
|
281
|
+
return segments[1].startsWith('_');
|
|
282
|
+
}
|
|
283
|
+
/** Returns true when a batch POST URL targets a `_search` endpoint (e.g. "Patient/_search"). */
|
|
284
|
+
function isBatchSearchPostUrl(url) {
|
|
285
|
+
return url.split('?')[0].endsWith('/_search');
|
|
286
|
+
}
|
|
287
|
+
function batchInputRequestToBundleEntryItem(request, config) {
|
|
288
|
+
const { method } = request;
|
|
289
|
+
let url = request.url;
|
|
290
|
+
// Inject tag search params into search request URLs before URL encoding.
|
|
291
|
+
// GET/HEAD: only for search URLs (not retrievals like Patient/<id>).
|
|
292
|
+
// POST: only for _search endpoints (not creates).
|
|
293
|
+
if (((method === 'GET' || method === 'HEAD') && isBatchSearchUrl(url)) ||
|
|
294
|
+
(method === 'POST' && isBatchSearchPostUrl(url))) {
|
|
295
|
+
if (config.workspaceTag) {
|
|
296
|
+
url += (url.includes('?') ? '&' : '?') + `_tag=${codingToTagValue(config.workspaceTag)}`;
|
|
297
|
+
}
|
|
298
|
+
if (config.ignoreTags?.length) {
|
|
299
|
+
for (const tag of config.ignoreTags) {
|
|
300
|
+
url += (url.includes('?') ? '&' : '?') + `_tag:not=${codingToTagValue(tag)}`;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
83
304
|
const baseRequest = {
|
|
84
305
|
request: {
|
|
85
306
|
method,
|
|
@@ -115,7 +336,7 @@ function batchInputRequestToBundleEntryItem(request) {
|
|
|
115
336
|
}
|
|
116
337
|
// PUT updates require a full resource
|
|
117
338
|
if (method === 'PUT') {
|
|
118
|
-
const
|
|
339
|
+
const resource = applyTagToResource(config, request.resource);
|
|
119
340
|
return {
|
|
120
341
|
request: {
|
|
121
342
|
...baseRequest.request,
|
|
@@ -127,15 +348,24 @@ function batchInputRequestToBundleEntryItem(request) {
|
|
|
127
348
|
// PATCH can be Binary resource or JSON patch
|
|
128
349
|
if (method === 'PATCH') {
|
|
129
350
|
if ('resource' in request) {
|
|
351
|
+
// Binary patch — decode operations, apply tag transforms, re-encode
|
|
352
|
+
let patchResource = request.resource;
|
|
353
|
+
const binaryData = patchResource.data;
|
|
354
|
+
if (binaryData) {
|
|
355
|
+
const operations = JSON.parse(base64ToString(binaryData));
|
|
356
|
+
const taggedOperations = applyTagToPatchOperations(config, operations);
|
|
357
|
+
patchResource = { ...patchResource, data: stringToBase64(JSON.stringify(taggedOperations)) };
|
|
358
|
+
}
|
|
130
359
|
return {
|
|
131
360
|
request: {
|
|
132
361
|
...baseRequest.request,
|
|
133
362
|
ifMatch: request.ifMatch,
|
|
134
363
|
},
|
|
135
|
-
resource:
|
|
364
|
+
resource: patchResource,
|
|
136
365
|
};
|
|
137
366
|
}
|
|
138
|
-
const
|
|
367
|
+
const operations = applyTagToPatchOperations(config, request.operations);
|
|
368
|
+
const data = stringToBase64(JSON.stringify(operations));
|
|
139
369
|
return {
|
|
140
370
|
...baseRequest,
|
|
141
371
|
resource: {
|
|
@@ -145,9 +375,14 @@ function batchInputRequestToBundleEntryItem(request) {
|
|
|
145
375
|
},
|
|
146
376
|
};
|
|
147
377
|
}
|
|
378
|
+
// POST _search — no resource body; tag params were already injected into the URL above
|
|
379
|
+
if (method === 'POST' && isBatchSearchPostUrl(url)) {
|
|
380
|
+
return baseRequest;
|
|
381
|
+
}
|
|
148
382
|
// POST creates require a full resource
|
|
149
|
-
if (method === 'POST') {
|
|
150
|
-
const
|
|
383
|
+
if (method === 'POST' && 'resource' in request) {
|
|
384
|
+
const resource = applyTagToResource(config, request.resource);
|
|
385
|
+
const { fullUrl } = request;
|
|
151
386
|
return {
|
|
152
387
|
...baseRequest,
|
|
153
388
|
resource: resource,
|
|
@@ -167,11 +402,35 @@ async function batch(input, request) {
|
|
|
167
402
|
const resp = await this.fhirRequest('/', 'POST')({
|
|
168
403
|
resourceType: 'Bundle',
|
|
169
404
|
type: 'batch',
|
|
170
|
-
entry: input.requests.map(batchInputRequestToBundleEntryItem),
|
|
405
|
+
entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),
|
|
171
406
|
}, request);
|
|
407
|
+
// Validate each GET/HEAD retrieval entry against the tag config.
|
|
408
|
+
// Violations are replaced with a synthetic 404 OperationOutcome entry; batch entries are independent.
|
|
409
|
+
const rawEntries = resp.entry;
|
|
410
|
+
const processedEntries = this.config.workspaceTag || this.config.ignoreTags?.length
|
|
411
|
+
? rawEntries?.map((entry, i) => {
|
|
412
|
+
const req = input.requests[i];
|
|
413
|
+
if (!req || !entry?.resource)
|
|
414
|
+
return entry;
|
|
415
|
+
if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {
|
|
416
|
+
try {
|
|
417
|
+
assertRetrievedResource(this.config, entry.resource);
|
|
418
|
+
}
|
|
419
|
+
catch (err) {
|
|
420
|
+
if (!(err instanceof OystehrFHIRError))
|
|
421
|
+
throw err;
|
|
422
|
+
return {
|
|
423
|
+
request: entry.request,
|
|
424
|
+
response: { status: '404', outcome: err.cause },
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return entry;
|
|
429
|
+
})
|
|
430
|
+
: rawEntries;
|
|
172
431
|
const bundle = {
|
|
173
432
|
...resp,
|
|
174
|
-
entry:
|
|
433
|
+
entry: processedEntries,
|
|
175
434
|
unbundle: function () {
|
|
176
435
|
return (this.entry
|
|
177
436
|
?.map((entry) => entry.resource)
|
|
@@ -190,8 +449,20 @@ async function transaction(input, request) {
|
|
|
190
449
|
const resp = await this.fhirRequest('/', 'POST')({
|
|
191
450
|
resourceType: 'Bundle',
|
|
192
451
|
type: 'transaction',
|
|
193
|
-
entry: input.requests.map(batchInputRequestToBundleEntryItem),
|
|
452
|
+
entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),
|
|
194
453
|
}, request);
|
|
454
|
+
// Validate each GET/HEAD retrieval entry against the tag config.
|
|
455
|
+
// A violation throws OystehrFHIRError(404) — transactions are all-or-nothing.
|
|
456
|
+
if (this.config.workspaceTag || this.config.ignoreTags?.length) {
|
|
457
|
+
resp.entry?.forEach((entry, i) => {
|
|
458
|
+
const req = input.requests[i];
|
|
459
|
+
if (!req || !entry?.resource)
|
|
460
|
+
return;
|
|
461
|
+
if ((req.method === 'GET' || req.method === 'HEAD') && !isBatchSearchUrl(req.url)) {
|
|
462
|
+
assertRetrievedResource(this.config, entry.resource);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
}
|
|
195
466
|
const bundle = {
|
|
196
467
|
...resp,
|
|
197
468
|
entry: resp.entry,
|
|
@@ -203,6 +474,9 @@ async function transaction(input, request) {
|
|
|
203
474
|
};
|
|
204
475
|
return bundle;
|
|
205
476
|
}
|
|
477
|
+
async function generateFriendlyPatientId({ id }, request) {
|
|
478
|
+
return this.fhirRequest(`/Patient/${id}/$generate-friendly-patient-id`, 'POST')({}, request);
|
|
479
|
+
}
|
|
206
480
|
function formatAddress(address, options) {
|
|
207
481
|
const builder = [];
|
|
208
482
|
if (address.line) {
|
|
@@ -246,5 +520,5 @@ function formatHumanName(name, options) {
|
|
|
246
520
|
return builder.join(' ').trim();
|
|
247
521
|
}
|
|
248
522
|
|
|
249
|
-
export { batch, create, del as delete, formatAddress, formatHumanName, get, history, patch, search, transaction, update };
|
|
523
|
+
export { batch, create, del as delete, formatAddress, formatHumanName, generateFriendlyPatientId, get, history, patch, search, transaction, update };
|
|
250
524
|
//# sourceMappingURL=fhir-ext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fhir-ext.js","sources":["../../../../src/resources/classes/fhir-ext.ts"],"sourcesContent":["import { 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 FhirBundle,\n FhirCreateParams,\n FhirDeleteParams,\n FhirGetParams,\n FhirHistoryGetParams,\n FhirHistorySearchParams,\n FhirPatchParams,\n FhirResource,\n FhirResourceReturnValue,\n FhirSearchParams,\n FhirUpdateParams,\n OperationOutcome,\n TransactionBundle,\n} from '../..';\nimport { addParamsToSearch, FhirFetcherResponse, OystehrClientRequest, SDKResource } from '../../client/client';\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\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 * 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\n): Promise<FhirFetcherResponse<Bundle<T>>> {\n const { resourceType, params: searchParams } = params;\n let paramMap: Record<string, (string | number)[]> | undefined;\n if (searchParams) {\n paramMap = Object.entries(searchParams).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 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\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n const { resourceType } = params;\n return this.fhirRequest(`/${resourceType}`, 'POST')(params as unknown as Record<string, unknown>, request);\n}\n\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n return this.fhirRequest<FhirResourceReturnValue<T>>(`/${resourceType}/${id}`, 'GET')({}, request);\n}\n\nexport async function update<T extends FhirResource>(\n this: SDKResource,\n params: FhirUpdateParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n const { id, resourceType } = params;\n return this.fhirRequest(`/${resourceType}/${id}`, 'PUT')(params as unknown as Record<string, unknown>, {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n });\n}\n\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, operations }: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n return this.fhirRequest(`/${resourceType}/${id}`, 'PATCH')(operations, {\n ...request,\n contentType: 'application/json-patch+json',\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n });\n}\n\nasync function del<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirDeleteParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n return this.fhirRequest(`/${resourceType}/${id}`, 'DELETE')({}, request);\n}\nexport { del as delete };\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<T>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, count, offset }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>>>;\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>> {\n if (versionId) {\n return this.fhirRequest(`/${resourceType}/${id}/_history/${versionId}`, 'GET')({}, request);\n }\n if (count) {\n return this.fhirRequest(\n `/${resourceType}/${id}/_history?_total=accurate&_count=${count}\n ${offset ? `&_offset=${offset}` : ''}`,\n 'GET'\n )({}, request);\n }\n return this.fhirRequest(`/${resourceType}/${id}/_history?_total=accurate`, 'GET')({}, request);\n}\n\nfunction batchInputRequestToBundleEntryItem<T extends FhirResource>(\n request: BatchInputRequest<T>\n): BundleEntry<T | Binary<T>> {\n const { method, url } = request;\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 } = request;\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 return {\n request: {\n ...baseRequest.request,\n ifMatch: request.ifMatch,\n },\n resource: request.resource,\n } as BundleEntry<Binary<T>>;\n }\n const data = stringToBase64(JSON.stringify(request.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 creates require a full resource\n if (method === 'POST') {\n const { resource, 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\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>>> {\n const resp = await this.fhirRequest('/', 'POST')(\n {\n resourceType: 'Bundle',\n type: 'batch',\n entry: input.requests.map(batchInputRequestToBundleEntryItem),\n },\n request\n );\n const bundle: BatchBundle<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 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\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>>> {\n const resp = await this.fhirRequest('/', 'POST')(\n {\n resourceType: 'Bundle',\n type: 'transaction',\n entry: input.requests.map(batchInputRequestToBundleEntryItem),\n },\n request\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 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 FhirBundle,\n FhirCreateParams,\n FhirDeleteParams,\n FhirGetParams,\n FhirHistoryGetParams,\n FhirHistorySearchParams,\n FhirPatchParams,\n FhirResource,\n FhirResourceReturnValue,\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 * 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\n): Promise<FhirFetcherResponse<Bundle<T>>> {\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 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\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n const tagged = applyTagToResource(this.config, params);\n const { resourceType } = tagged;\n return this.fhirRequest(`/${resourceType}`, 'POST')(tagged as unknown as Record<string, unknown>, request);\n}\n\nexport async function get<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\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\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n const tagged = applyTagToResource(this.config, params);\n const { id, resourceType } = tagged;\n return this.fhirRequest(`/${resourceType}/${id}`, 'PUT')(tagged as unknown as Record<string, unknown>, {\n ...request,\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n });\n}\n\nexport async function patch<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, operations }: FhirPatchParams<T>,\n request?: OystehrFHIRUpdateClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n const taggedOperations = applyTagToPatchOperations(this.config, operations);\n return this.fhirRequest(`/${resourceType}/${id}`, 'PATCH')(taggedOperations, {\n ...request,\n contentType: 'application/json-patch+json',\n ifMatch: request?.optimisticLockingVersionId ? `W/\"${request.optimisticLockingVersionId}\"` : undefined,\n });\n}\n\nasync function del<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirDeleteParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>> {\n return this.fhirRequest(`/${resourceType}/${id}`, 'DELETE')({}, request);\n}\nexport { del as delete };\n\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, versionId }: FhirHistoryGetParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<T>>;\nexport async function history<T extends FhirResource>(\n this: SDKResource,\n { resourceType, id, count, offset }: FhirHistorySearchParams<T>,\n request?: OystehrClientRequest\n): Promise<FhirFetcherResponse<Bundle<T>>>;\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>> {\n if (versionId) {\n return this.fhirRequest(`/${resourceType}/${id}/_history/${versionId}`, 'GET')({}, request);\n }\n if (count) {\n return this.fhirRequest(\n `/${resourceType}/${id}/_history?_total=accurate&_count=${count}\n ${offset ? `&_offset=${offset}` : ''}`,\n 'GET'\n )({}, request);\n }\n return this.fhirRequest(`/${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\n): Promise<FhirFetcherResponse<BatchBundle<BundleContentType>>> {\n const resp = await this.fhirRequest('/', 'POST')(\n {\n resourceType: 'Bundle',\n type: 'batch',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n },\n request\n );\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\n): Promise<FhirFetcherResponse<TransactionBundle<BundleContentType>>> {\n const resp = await this.fhirRequest('/', 'POST')(\n {\n resourceType: 'Bundle',\n type: 'transaction',\n entry: input.requests.map((req) => batchInputRequestToBundleEntryItem(req, this.config)),\n },\n request\n );\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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"}
|
|
@@ -19,6 +19,7 @@ export declare class Fhir extends SDKResource {
|
|
|
19
19
|
history: typeof ext.history;
|
|
20
20
|
batch: typeof ext.batch;
|
|
21
21
|
transaction: typeof ext.transaction;
|
|
22
|
+
generateFriendlyPatientId: typeof ext.generateFriendlyPatientId;
|
|
22
23
|
formatAddress: typeof ext.formatAddress;
|
|
23
24
|
formatHumanName: typeof ext.formatHumanName;
|
|
24
25
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SDKResource } from '../../client/client.js';
|
|
2
|
-
import { search, create, get, update, patch, delete as del, history, batch, transaction, formatAddress, formatHumanName } from './fhir-ext.js';
|
|
2
|
+
import { search, create, get, update, patch, delete as del, history, batch, transaction, generateFriendlyPatientId, formatAddress, formatHumanName } from './fhir-ext.js';
|
|
3
3
|
|
|
4
4
|
// AUTOGENERATED -- DO NOT EDIT
|
|
5
5
|
class Fhir extends SDKResource {
|
|
@@ -24,6 +24,7 @@ class Fhir extends SDKResource {
|
|
|
24
24
|
history = history;
|
|
25
25
|
batch = batch;
|
|
26
26
|
transaction = transaction;
|
|
27
|
+
generateFriendlyPatientId = generateFriendlyPatientId;
|
|
27
28
|
formatAddress = formatAddress;
|
|
28
29
|
formatHumanName = formatHumanName;
|
|
29
30
|
}
|
|
@@ -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 update = ext.update;\n patch = ext.patch;\n delete = ext.delete;\n history = ext.history;\n batch = ext.batch;\n transaction = ext.transaction;\n formatAddress = ext.formatAddress;\n formatHumanName = ext.formatHumanName;\n}\n"],"names":["ext.search","ext.create","ext.get","ext.update","ext.patch","ext.delete","ext.history","ext.batch","ext.transaction","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,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,OAAO,GAAGC,OAAW;AACrB,IAAA,KAAK,GAAGC,KAAS;AACjB,IAAA,WAAW,GAAGC,WAAe;AAC7B,IAAA,aAAa,GAAGC,aAAiB;AACjC,IAAA,eAAe,GAAGC,eAAmB;AACtC;;;;"}
|
|
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 update = ext.update;\n patch = ext.patch;\n delete = ext.delete;\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.create","ext.get","ext.update","ext.patch","ext.delete","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,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,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;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { OystehrSdkError } from '../../errors/index.js';
|
|
1
2
|
import { Application } from './application.js';
|
|
2
3
|
import { Charge } from './charge.js';
|
|
3
4
|
import { Conversation } from './conversation.js';
|
|
@@ -49,6 +50,12 @@ let Oystehr$1 = class Oystehr {
|
|
|
49
50
|
rcm;
|
|
50
51
|
fhir;
|
|
51
52
|
constructor(config) {
|
|
53
|
+
if (config.workspaceTag && config.ignoreTags) {
|
|
54
|
+
throw new OystehrSdkError({
|
|
55
|
+
message: 'workspaceTag and ignoreTags are mutually exclusive and cannot both be set in config',
|
|
56
|
+
code: 400,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
52
59
|
this.config = config;
|
|
53
60
|
this.config.services ??= {};
|
|
54
61
|
this.config.services['projectApiUrl'] ??= config.projectApiUrl;
|