@oystehr/sdk 4.0.0-alpha.6 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/cjs/client/client.cjs +259 -0
  2. package/dist/cjs/client/client.cjs.map +1 -0
  3. package/dist/cjs/errors/index.cjs +58 -0
  4. package/dist/cjs/errors/index.cjs.map +1 -0
  5. package/dist/cjs/index.cjs +11 -1980
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.min.cjs +1 -1
  8. package/dist/cjs/index.min.cjs.map +1 -1
  9. package/dist/cjs/resources/classes/application.cjs +88 -0
  10. package/dist/cjs/resources/classes/application.cjs.map +1 -0
  11. package/dist/cjs/resources/classes/charge.cjs +44 -0
  12. package/dist/cjs/resources/classes/charge.cjs.map +1 -0
  13. package/dist/cjs/resources/classes/conversation-ext.cjs +31 -0
  14. package/dist/cjs/resources/classes/conversation-ext.cjs.map +1 -0
  15. package/dist/cjs/resources/classes/conversation.cjs +84 -0
  16. package/dist/cjs/resources/classes/conversation.cjs.map +1 -0
  17. package/dist/cjs/resources/classes/developer.cjs +72 -0
  18. package/dist/cjs/resources/classes/developer.cjs.map +1 -0
  19. package/dist/cjs/resources/classes/erx.cjs +88 -0
  20. package/dist/cjs/resources/classes/erx.cjs.map +1 -0
  21. package/dist/cjs/resources/classes/erx.d.ts +5 -1
  22. package/dist/cjs/resources/classes/erxV1.cjs +46 -0
  23. package/dist/cjs/resources/classes/erxV1.cjs.map +1 -0
  24. package/dist/cjs/resources/classes/erxV2.cjs +22 -0
  25. package/dist/cjs/resources/classes/erxV2.cjs.map +1 -0
  26. package/dist/cjs/resources/classes/fax.cjs +46 -0
  27. package/dist/cjs/resources/classes/fax.cjs.map +1 -0
  28. package/dist/cjs/resources/classes/fhir-ext.cjs +200 -0
  29. package/dist/cjs/resources/classes/fhir-ext.cjs.map +1 -0
  30. package/dist/cjs/resources/classes/fhir-ext.d.ts +7 -7
  31. package/dist/cjs/resources/classes/fhir.cjs +34 -0
  32. package/dist/cjs/resources/classes/fhir.cjs.map +1 -0
  33. package/dist/cjs/resources/classes/fhir.d.ts +2 -2
  34. package/dist/cjs/resources/classes/index.cjs +88 -0
  35. package/dist/cjs/resources/classes/index.cjs.map +1 -0
  36. package/dist/cjs/resources/classes/lab.cjs +76 -0
  37. package/dist/cjs/resources/classes/lab.cjs.map +1 -0
  38. package/dist/cjs/resources/classes/m2m.cjs +81 -0
  39. package/dist/cjs/resources/classes/m2m.cjs.map +1 -0
  40. package/dist/cjs/resources/classes/messaging.cjs +22 -0
  41. package/dist/cjs/resources/classes/messaging.cjs.map +1 -0
  42. package/dist/cjs/resources/classes/paymentMethod.cjs +88 -0
  43. package/dist/cjs/resources/classes/paymentMethod.cjs.map +1 -0
  44. package/dist/cjs/resources/classes/project.cjs +34 -0
  45. package/dist/cjs/resources/classes/project.cjs.map +1 -0
  46. package/dist/cjs/resources/classes/rcm.cjs +55 -0
  47. package/dist/cjs/resources/classes/rcm.cjs.map +1 -0
  48. package/dist/cjs/resources/classes/role.cjs +62 -0
  49. package/dist/cjs/resources/classes/role.cjs.map +1 -0
  50. package/dist/cjs/resources/classes/secret.cjs +52 -0
  51. package/dist/cjs/resources/classes/secret.cjs.map +1 -0
  52. package/dist/cjs/resources/classes/telemed.cjs +43 -0
  53. package/dist/cjs/resources/classes/telemed.cjs.map +1 -0
  54. package/dist/cjs/resources/classes/transactionalSMS.cjs +34 -0
  55. package/dist/cjs/resources/classes/transactionalSMS.cjs.map +1 -0
  56. package/dist/cjs/resources/classes/user.cjs +80 -0
  57. package/dist/cjs/resources/classes/user.cjs.map +1 -0
  58. package/dist/cjs/resources/classes/version.cjs +22 -0
  59. package/dist/cjs/resources/classes/version.cjs.map +1 -0
  60. package/dist/cjs/resources/classes/z3-ext.cjs +81 -0
  61. package/dist/cjs/resources/classes/z3-ext.cjs.map +1 -0
  62. package/dist/cjs/resources/classes/z3.cjs +88 -0
  63. package/dist/cjs/resources/classes/z3.cjs.map +1 -0
  64. package/dist/cjs/resources/classes/zambda-ext.cjs +15 -0
  65. package/dist/cjs/resources/classes/zambda-ext.cjs.map +1 -0
  66. package/dist/cjs/resources/classes/zambda.cjs +89 -0
  67. package/dist/cjs/resources/classes/zambda.cjs.map +1 -0
  68. package/dist/cjs/resources/classes/zambdaLogStream.cjs +43 -0
  69. package/dist/cjs/resources/classes/zambdaLogStream.cjs.map +1 -0
  70. package/dist/cjs/resources/types/ErxGetConfigurationResponse.d.ts +9 -0
  71. package/dist/cjs/resources/types/ZambdaCreateParams.d.ts +5 -1
  72. package/dist/cjs/resources/types/ZambdaFunction.d.ts +1 -1
  73. package/dist/cjs/resources/types/ZambdaUpdateParams.d.ts +1 -1
  74. package/dist/cjs/resources/types/index.d.ts +1 -0
  75. package/dist/esm/client/client.js +68 -67
  76. package/dist/esm/client/client.js.map +1 -1
  77. package/dist/esm/errors/index.js +3 -2
  78. package/dist/esm/errors/index.js.map +1 -1
  79. package/dist/esm/index.js +2 -2
  80. package/dist/esm/index.js.map +1 -1
  81. package/dist/esm/index.min.js +1 -1
  82. package/dist/esm/index.min.js.map +1 -1
  83. package/dist/esm/node_modules/tslib/package.json +1 -0
  84. package/dist/esm/resources/classes/application.js +11 -15
  85. package/dist/esm/resources/classes/application.js.map +1 -1
  86. package/dist/esm/resources/classes/charge.js +5 -9
  87. package/dist/esm/resources/classes/charge.js.map +1 -1
  88. package/dist/esm/resources/classes/conversation-ext.js +4 -5
  89. package/dist/esm/resources/classes/conversation-ext.js.map +1 -1
  90. package/dist/esm/resources/classes/conversation.js +16 -20
  91. package/dist/esm/resources/classes/conversation.js.map +1 -1
  92. package/dist/esm/resources/classes/developer.js +9 -13
  93. package/dist/esm/resources/classes/developer.js.map +1 -1
  94. package/dist/esm/resources/classes/erx.d.ts +5 -1
  95. package/dist/esm/resources/classes/erx.js +20 -18
  96. package/dist/esm/resources/classes/erx.js.map +1 -1
  97. package/dist/esm/resources/classes/erxV1.js +8 -12
  98. package/dist/esm/resources/classes/erxV1.js.map +1 -1
  99. package/dist/esm/resources/classes/erxV2.js +4 -8
  100. package/dist/esm/resources/classes/erxV2.js.map +1 -1
  101. package/dist/esm/resources/classes/fax.js +6 -10
  102. package/dist/esm/resources/classes/fax.js.map +1 -1
  103. package/dist/esm/resources/classes/fhir-ext.d.ts +7 -7
  104. package/dist/esm/resources/classes/fhir-ext.js +71 -62
  105. package/dist/esm/resources/classes/fhir-ext.js.map +1 -1
  106. package/dist/esm/resources/classes/fhir.d.ts +2 -2
  107. package/dist/esm/resources/classes/fhir.js +20 -20
  108. package/dist/esm/resources/classes/fhir.js.map +1 -1
  109. package/dist/esm/resources/classes/index.js +28 -5
  110. package/dist/esm/resources/classes/index.js.map +1 -1
  111. package/dist/esm/resources/classes/lab.js +9 -13
  112. package/dist/esm/resources/classes/lab.js.map +1 -1
  113. package/dist/esm/resources/classes/m2m.js +10 -14
  114. package/dist/esm/resources/classes/m2m.js.map +1 -1
  115. package/dist/esm/resources/classes/messaging.js +4 -8
  116. package/dist/esm/resources/classes/messaging.js.map +1 -1
  117. package/dist/esm/resources/classes/paymentMethod.js +7 -11
  118. package/dist/esm/resources/classes/paymentMethod.js.map +1 -1
  119. package/dist/esm/resources/classes/project.js +5 -9
  120. package/dist/esm/resources/classes/project.js.map +1 -1
  121. package/dist/esm/resources/classes/rcm.js +6 -10
  122. package/dist/esm/resources/classes/rcm.js.map +1 -1
  123. package/dist/esm/resources/classes/role.js +8 -12
  124. package/dist/esm/resources/classes/role.js.map +1 -1
  125. package/dist/esm/resources/classes/secret.js +7 -11
  126. package/dist/esm/resources/classes/secret.js.map +1 -1
  127. package/dist/esm/resources/classes/telemed.js +5 -9
  128. package/dist/esm/resources/classes/telemed.js.map +1 -1
  129. package/dist/esm/resources/classes/transactionalSMS.js +4 -8
  130. package/dist/esm/resources/classes/transactionalSMS.js.map +1 -1
  131. package/dist/esm/resources/classes/user.js +10 -14
  132. package/dist/esm/resources/classes/user.js.map +1 -1
  133. package/dist/esm/resources/classes/version.js +4 -8
  134. package/dist/esm/resources/classes/version.js.map +1 -1
  135. package/dist/esm/resources/classes/z3-ext.js +47 -56
  136. package/dist/esm/resources/classes/z3-ext.js.map +1 -1
  137. package/dist/esm/resources/classes/z3.js +26 -30
  138. package/dist/esm/resources/classes/z3.js.map +1 -1
  139. package/dist/esm/resources/classes/zambda-ext.js +6 -11
  140. package/dist/esm/resources/classes/zambda-ext.js.map +1 -1
  141. package/dist/esm/resources/classes/zambda.js +12 -16
  142. package/dist/esm/resources/classes/zambda.js.map +1 -1
  143. package/dist/esm/resources/classes/zambdaLogStream.js +6 -10
  144. package/dist/esm/resources/classes/zambdaLogStream.js.map +1 -1
  145. package/dist/esm/resources/types/ErxGetConfigurationResponse.d.ts +9 -0
  146. package/dist/esm/resources/types/ZambdaCreateParams.d.ts +5 -1
  147. package/dist/esm/resources/types/ZambdaFunction.d.ts +1 -1
  148. package/dist/esm/resources/types/ZambdaUpdateParams.d.ts +1 -1
  149. package/dist/esm/resources/types/index.d.ts +1 -0
  150. package/package.json +4 -3
  151. package/rollup.config-cjs.mjs +97 -18
  152. package/src/resources/classes/erx.ts +7 -0
  153. package/src/resources/classes/fhir-ext.ts +5 -5
  154. package/src/resources/types/ErxGetConfigurationResponse.ts +11 -0
  155. package/src/resources/types/ZambdaCreateParams.ts +5 -1
  156. package/src/resources/types/ZambdaFunction.ts +1 -1
  157. package/src/resources/types/ZambdaUpdateParams.ts +1 -1
  158. package/src/resources/types/index.ts +1 -0
@@ -1,4 +1,3 @@
1
- import { __awaiter } from '../node_modules/tslib/tslib.es6.js';
2
1
  import { v4 } from 'uuid';
3
2
  import { OystehrSdkError, OystehrFHIRError } from '../errors/index.js';
4
3
 
@@ -16,28 +15,29 @@ const ERROR_CODES_TO_RETRY = [
16
15
  'UND_ERR_SOCKET',
17
16
  ];
18
17
  class SDKResource {
18
+ config;
19
19
  constructor(config) {
20
20
  this.config = config;
21
21
  }
22
22
  request(path, method, baseUrlThunk) {
23
- return (params, request) => __awaiter(this, void 0, void 0, function* () {
23
+ return async (params, request) => {
24
24
  const configThunk = () => this.config;
25
25
  try {
26
- return yield fetcher(baseUrlThunk, configThunk, path, method)(params, request);
26
+ return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);
27
27
  }
28
28
  catch (err) {
29
29
  const error = err;
30
30
  throw new OystehrSdkError({ message: error.message, code: error.code, cause: error.cause });
31
31
  }
32
- });
32
+ };
33
33
  }
34
34
  fhirRequest(path, method) {
35
- return (params, request) => __awaiter(this, void 0, void 0, function* () {
35
+ return async (params, request) => {
36
36
  try {
37
- const baseUrlThunk = () => { var _a, _b; return (_b = (_a = this.config.services) === null || _a === void 0 ? void 0 : _a.fhirApiUrl) !== null && _b !== void 0 ? _b : defaultFhirApiUrl; };
37
+ const baseUrlThunk = () => this.config.services?.fhirApiUrl ?? defaultFhirApiUrl;
38
38
  const configThunk = () => this.config;
39
39
  // must await here to catch
40
- return yield fetcher(baseUrlThunk, configThunk, path, method)(params, request);
40
+ return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);
41
41
  }
42
42
  catch (err) {
43
43
  // FHIR API error messages are JSON strings
@@ -54,30 +54,29 @@ class SDKResource {
54
54
  code: fullError.code,
55
55
  });
56
56
  }
57
- });
57
+ };
58
58
  }
59
59
  }
60
60
  function isInternalClientRequest(request) {
61
61
  return 'accessToken' in request;
62
62
  }
63
63
  function fetcher(baseUrlThunk, configThunk, path, methodParam) {
64
- return (params, request) => __awaiter(this, void 0, void 0, function* () {
65
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
64
+ return async (params, request) => {
66
65
  // this function supports multiple signatures. fetcher(baseUrl, path, method)(params, request) or fetcher(baseUrl, path, method)(request)
67
66
  // or fetcher(baseUrl, path, method)(params) or fetcher(baseUrl, path, method)(). the types for this are handled by Client<Path, Methods>
68
67
  // and this is the backend implementation behind it. the heuristic we're using is that if the first param is an object with an accessToken
69
68
  // and there is no second param, assume the first one is the request object instead
70
69
  const providedParams = !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)
71
70
  ? {}
72
- : (_a = params) !== null && _a !== void 0 ? _a : {};
71
+ : params ?? {};
73
72
  const requestCtx = !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)
74
73
  ? params
75
74
  : request;
76
75
  const method = methodParam.toLowerCase();
77
76
  const config = configThunk();
78
- const fetchImpl = (_b = config.fetch) !== null && _b !== void 0 ? _b : fetch;
79
- const accessToken = (_c = requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.accessToken) !== null && _c !== void 0 ? _c : config.accessToken;
80
- const projectId = (_d = requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.projectId) !== null && _d !== void 0 ? _d : configThunk().projectId;
77
+ const fetchImpl = config.fetch ?? fetch;
78
+ const accessToken = requestCtx?.accessToken ?? config.accessToken;
79
+ const projectId = requestCtx?.projectId ?? configThunk().projectId;
81
80
  let finalPath = path;
82
81
  let finalParams = providedParams;
83
82
  if (!Array.isArray(providedParams)) {
@@ -97,7 +96,7 @@ function fetcher(baseUrlThunk, configThunk, path, methodParam) {
97
96
  if (method === 'get') {
98
97
  addParamsToSearch(finalParams, url.searchParams);
99
98
  }
100
- else if ((requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.contentType) === 'application/x-www-form-urlencoded') {
99
+ else if (requestCtx?.contentType === 'application/x-www-form-urlencoded') {
101
100
  const search = new URLSearchParams();
102
101
  addParamsToSearch(finalParams, search);
103
102
  body = search.toString();
@@ -108,7 +107,7 @@ function fetcher(baseUrlThunk, configThunk, path, methodParam) {
108
107
  }
109
108
  else {
110
109
  // override for rpc call
111
- if ((requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.contentType) !== 'application/x-www-form-urlencoded' && method === 'post') {
110
+ if (requestCtx?.contentType !== 'application/x-www-form-urlencoded' && method === 'post') {
112
111
  body = '{}';
113
112
  }
114
113
  }
@@ -118,31 +117,30 @@ function fetcher(baseUrlThunk, configThunk, path, methodParam) {
118
117
  'x-oystehr-project-id': projectId,
119
118
  }
120
119
  : {}, {
121
- 'content-type': (_e = requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.contentType) !== null && _e !== void 0 ? _e : 'application/json',
122
- }, accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, (requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.ifMatch) ? { 'If-Match': requestCtx.ifMatch } : {}, { 'x-oystehr-request-id': (_f = requestCtx === null || requestCtx === void 0 ? void 0 : requestCtx.requestId) !== null && _f !== void 0 ? _f : v4() });
120
+ 'content-type': requestCtx?.contentType ?? 'application/json',
121
+ }, accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {}, { 'x-oystehr-request-id': requestCtx?.requestId ?? v4() });
123
122
  const retryConfig = {
124
- retries: (_h = (_g = config.retry) === null || _g === void 0 ? void 0 : _g.retries) !== null && _h !== void 0 ? _h : 3,
125
- jitter: (_k = (_j = config.retry) === null || _j === void 0 ? void 0 : _j.jitter) !== null && _k !== void 0 ? _k : 20,
126
- delay: (_m = (_l = config.retry) === null || _l === void 0 ? void 0 : _l.delay) !== null && _m !== void 0 ? _m : 100,
127
- onRetry: (_o = config.retry) === null || _o === void 0 ? void 0 : _o.onRetry,
123
+ retries: config.retry?.retries ?? 3,
124
+ jitter: config.retry?.jitter ?? 20,
125
+ delay: config.retry?.delay ?? 100,
126
+ onRetry: config.retry?.onRetry,
128
127
  // Using array instead of set because the length is too short for uniqueness to be important
129
- retryOn: [...((_q = (_p = config.retry) === null || _p === void 0 ? void 0 : _p.retryOn) !== null && _q !== void 0 ? _q : []), ...STATUS_CODES_TO_RETRY],
128
+ retryOn: [...(config.retry?.retryOn ?? []), ...STATUS_CODES_TO_RETRY],
130
129
  };
131
130
  retryConfig.retryOn.push(...STATUS_CODES_TO_RETRY);
132
- return retry(() => __awaiter(this, void 0, void 0, function* () {
133
- var _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
134
- const response = yield fetchImpl(new Request(url, {
131
+ return retry(async () => {
132
+ const response = await fetchImpl(new Request(url, {
135
133
  method: method.toUpperCase(),
136
134
  body,
137
135
  headers,
138
136
  }));
139
- const responseBody = response.body ? yield response.text() : null;
137
+ const responseBody = response.body ? await response.text() : null;
140
138
  let responseJson;
141
139
  try {
142
140
  responseJson =
143
141
  responseBody &&
144
- (((_r = response.headers.get('content-type')) === null || _r === void 0 ? void 0 : _r.includes('application/json')) ||
145
- ((_s = response.headers.get('content-type')) === null || _s === void 0 ? void 0 : _s.includes('application/fhir+json')))
142
+ (response.headers.get('content-type')?.includes('application/json') ||
143
+ response.headers.get('content-type')?.includes('application/fhir+json'))
146
144
  ? JSON.parse(responseBody)
147
145
  : null;
148
146
  }
@@ -153,53 +151,56 @@ function fetcher(baseUrlThunk, configThunk, path, methodParam) {
153
151
  const isError = !response.ok || response.status >= 400;
154
152
  if (isError) {
155
153
  const errObj = {
156
- message: (_x = (_w = (_v = (_u = (_t = responseJson === null || responseJson === void 0 ? void 0 : responseJson.output) === null || _t === void 0 ? void 0 : _t.message) !== null && _u !== void 0 ? _u : responseJson === null || responseJson === void 0 ? void 0 : responseJson.message) !== null && _v !== void 0 ? _v : responseJson) !== null && _w !== void 0 ? _w : responseBody) !== null && _x !== void 0 ? _x : response.statusText,
157
- code: (_0 = (_z = (_y = responseJson === null || responseJson === void 0 ? void 0 : responseJson.output) === null || _y === void 0 ? void 0 : _y.code) !== null && _z !== void 0 ? _z : responseJson === null || responseJson === void 0 ? void 0 : responseJson.code) !== null && _0 !== void 0 ? _0 : response.status,
154
+ message: responseJson?.output?.message ?? // official zambda output format
155
+ responseJson?.message ?? // normal endpoint output format
156
+ responseJson ?? // parsable json
157
+ responseBody ?? // raw response
158
+ response.statusText, // fallback to status text
159
+ code: responseJson?.output?.code ?? // official zambda output format
160
+ responseJson?.code ?? // normal endpoint output format
161
+ response.status, // fallback to status code
158
162
  response,
159
163
  };
160
164
  throw errObj;
161
165
  }
162
166
  return responseJson;
163
- }), retryConfig);
164
- });
167
+ }, retryConfig);
168
+ };
165
169
  }
166
- function retry(work, config) {
167
- var _a, _b;
168
- return __awaiter(this, void 0, void 0, function* () {
169
- let lastErr;
170
- for (const attempt of Array.from({ length: ((_a = config.retries) !== null && _a !== void 0 ? _a : 0) + 1 }, (_, index) => index)) {
171
- try {
172
- return yield work(attempt);
170
+ async function retry(work, config) {
171
+ let lastErr;
172
+ for (const attempt of Array.from({ length: (config.retries ?? 0) + 1 }, (_, index) => index)) {
173
+ try {
174
+ return await work(attempt);
175
+ }
176
+ catch (e) {
177
+ let isRetryable = false;
178
+ if ('response' in e) {
179
+ // error from API
180
+ const err = e;
181
+ isRetryable = config.retryOn.includes(err.code);
182
+ // Removes response
183
+ lastErr = { message: e.message, code: e.code };
173
184
  }
174
- catch (e) {
175
- let isRetryable = false;
176
- if ('response' in e) {
177
- // error from API
185
+ else {
186
+ lastErr = e;
187
+ // error from fetch
188
+ if ('code' in e && typeof e.code === 'string') {
178
189
  const err = e;
179
- isRetryable = config.retryOn.includes(err.code);
180
- // Removes response
181
- lastErr = { message: e.message, code: e.code };
182
- }
183
- else {
184
- lastErr = e;
185
- // error from fetch
186
- if ('code' in e && typeof e.code === 'string') {
187
- const err = e;
188
- isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);
189
- }
190
- }
191
- if (!isRetryable) {
192
- break;
193
- }
194
- const jitter = Math.floor(Math.random() * (config.jitter + 1));
195
- yield new Promise((resolve) => setTimeout(resolve, config.delay + jitter));
196
- if (config.onRetry && attempt !== ((_b = config.retries) !== null && _b !== void 0 ? _b : 0)) {
197
- config.onRetry(attempt + 1);
190
+ isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);
198
191
  }
199
192
  }
193
+ if (!isRetryable) {
194
+ break;
195
+ }
196
+ const jitter = Math.floor(Math.random() * (config.jitter + 1));
197
+ await new Promise((resolve) => setTimeout(resolve, config.delay + jitter));
198
+ if (config.onRetry && attempt !== (config.retries ?? 0)) {
199
+ config.onRetry(attempt + 1);
200
+ }
200
201
  }
201
- throw lastErr;
202
- });
202
+ }
203
+ throw lastErr;
203
204
  }
204
205
  /**
205
206
  * Substitutes params in a path and returns the path with params substituted and any unused params.
@@ -211,7 +212,7 @@ function retry(work, config) {
211
212
  * @returns resource URI with params substituted and any unused params
212
213
  */
213
214
  function subParamsInPath(path, params) {
214
- const unusedParams = Object.assign({}, params);
215
+ const unusedParams = { ...params };
215
216
  // capture everything of the form `{paramName}` and replace with the value of `params[paramName]`
216
217
  const subbedPath = path.replace(/\{([^}]+)\}/g, (_, paramName) => {
217
218
  delete unusedParams[paramName];
@@ -231,7 +232,7 @@ function subParamsInPath(path, params) {
231
232
  });
232
233
  const unusedKeys = Object.keys(unusedParams);
233
234
  const addlParams = unusedKeys.length
234
- ? unusedKeys.reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: unusedParams[key] })), {})
235
+ ? unusedKeys.reduce((acc, key) => ({ ...acc, [key]: unusedParams[key] }), {})
235
236
  : {};
236
237
  return [subbedPath, addlParams];
237
238
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../../src/client/client.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { OystehrConfig } from '../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../errors';\nimport { FhirBundle, FhirResource, OperationOutcome } from '../resources/types';\n\ntype HttpMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace';\nexport const defaultProjectApiUrl = 'https://project-api.zapehr.com/v1';\nconst defaultFhirApiUrl = 'https://fhir-api.zapehr.com';\nconst STATUS_CODES_TO_RETRY = [408, 429, 500, 502, 503, 504];\nconst ERROR_CODES_TO_RETRY = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ETIMEDOUT',\n 'UND_ERR_CONNECT_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_SOCKET',\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'.\n */\nexport interface OystehrClientRequest {\n /**\n * The access token to use for the request. If not provided, the access token from `oystehr.init()` will be used.\n */\n accessToken?: string;\n /**\n * The project ID to use for the request. If not provided, the project ID from `oystehr.init()` will be used.\n */\n projectId?: string;\n /**\n * The value of the 'Content-Type' header to use for the request.\n */\n contentType?: string;\n /**\n * Unique identifier for this request.\n */\n requestId?: string;\n}\n\ninterface InternalClientRequest extends OystehrClientRequest {\n ifMatch?: string;\n}\n\ntype FhirData<T extends FhirResource> = T | T[] | FhirBundle<T>;\nexport type FhirFetcherResponse<T extends FhirData<FhirResource> = any> = T;\n\nexport class SDKResource {\n protected readonly config: OystehrConfig;\n constructor(config: OystehrConfig) {\n this.config = config;\n }\n\n protected request(path: string, method: string, baseUrlThunk: () => string): FetcherFunction {\n return async (params: any, request?: InternalClientRequest): Promise<FetcherResponse> => {\n const configThunk = (): OystehrConfig => this.config;\n try {\n return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);\n } catch (err: any) {\n const error = err as { message: string; code: number; cause?: unknown };\n throw new OystehrSdkError({ message: error.message, code: error.code, cause: error.cause });\n }\n };\n }\n\n protected fhirRequest<T extends FhirResource = any>(path: string, method: string) {\n return async (params: any, request?: InternalClientRequest): Promise<FhirFetcherResponse<T>> => {\n try {\n const baseUrlThunk = (): string => this.config.services?.fhirApiUrl ?? defaultFhirApiUrl;\n const configThunk = (): OystehrConfig => this.config;\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);\n } catch (err: unknown) {\n // FHIR API error messages are JSON strings\n const fullError = err as { message: string | Record<string, any>; code: number; cause?: unknown };\n if (typeof fullError.message === 'string') {\n throw new OystehrSdkError({\n message: fullError.message,\n code: fullError.code,\n cause: fullError.cause,\n });\n }\n throw new OystehrFHIRError({\n error: fullError.message as OperationOutcome,\n code: fullError.code,\n });\n }\n };\n }\n}\n\nexport type FetcherError = { message: string; code: number };\nexport type FetcherResponse = any;\nexport type FetcherFunction = (\n params?: Record<string, any> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n) => Promise<FetcherResponse>;\n\nfunction isInternalClientRequest(request: Record<string, any>): request is InternalClientRequest {\n return 'accessToken' in request;\n}\n\nfunction fetcher(\n baseUrlThunk: () => string,\n configThunk: () => OystehrConfig,\n path: string,\n methodParam: string\n): FetcherFunction {\n return async (\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n ): Promise<FetcherResponse> => {\n // this function supports multiple signatures. fetcher(baseUrl, path, method)(params, request) or fetcher(baseUrl, path, method)(request)\n // or fetcher(baseUrl, path, method)(params) or fetcher(baseUrl, path, method)(). the types for this are handled by Client<Path, Methods>\n // and this is the backend implementation behind it. the heuristic we're using is that if the first param is an object with an accessToken\n // and there is no second param, assume the first one is the request object instead\n const providedParams: Record<string, unknown> | [any] =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? {}\n : (params as Record<string, unknown>) ?? {};\n const requestCtx =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? (params as InternalClientRequest)\n : request;\n const method = methodParam.toLowerCase() as HttpMethod;\n const config = configThunk();\n const fetchImpl = config.fetch ?? fetch;\n const accessToken = requestCtx?.accessToken ?? config.accessToken;\n const projectId = requestCtx?.projectId ?? configThunk().projectId;\n let finalPath = path;\n let finalParams = providedParams;\n if (!Array.isArray(providedParams)) {\n const [subbedPath, addlParams] = subParamsInPath(path, providedParams);\n finalPath = subbedPath;\n finalParams = addlParams;\n }\n finalPath = finalPath.replace(/^\\//, ''); // remove leading slash\n const baseUrlEvaluated = baseUrlThunk();\n const fullBaseUrl = baseUrlEvaluated.endsWith('/') ? baseUrlEvaluated : baseUrlEvaluated + '/';\n const url = new URL(finalPath, fullBaseUrl);\n let body: any;\n\n if (Array.isArray(finalParams)) {\n body = JSON.stringify(finalParams);\n } else if (Object.keys(finalParams).length) {\n if (method === 'get') {\n addParamsToSearch(finalParams, url.searchParams);\n } else if (requestCtx?.contentType === 'application/x-www-form-urlencoded') {\n const search = new URLSearchParams();\n addParamsToSearch(finalParams, search);\n body = search.toString();\n } else {\n body = JSON.stringify(finalParams);\n }\n } else {\n // override for rpc call\n if (requestCtx?.contentType !== 'application/x-www-form-urlencoded' && method === 'post') {\n body = '{}';\n }\n }\n\n const headers: Record<string, string> = Object.assign(\n projectId\n ? {\n 'x-zapehr-project-id': projectId,\n 'x-oystehr-project-id': projectId,\n }\n : {},\n {\n 'content-type': requestCtx?.contentType ?? 'application/json',\n },\n accessToken ? { Authorization: `Bearer ${accessToken}` } : {},\n requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {},\n { 'x-oystehr-request-id': requestCtx?.requestId ?? uuidv4() }\n );\n const retryConfig: ConstructedRetryConfig = {\n retries: config.retry?.retries ?? 3,\n jitter: config.retry?.jitter ?? 20,\n delay: config.retry?.delay ?? 100,\n onRetry: config.retry?.onRetry,\n // Using array instead of set because the length is too short for uniqueness to be important\n retryOn: [...(config.retry?.retryOn ?? []), ...STATUS_CODES_TO_RETRY],\n };\n retryConfig.retryOn.push(...STATUS_CODES_TO_RETRY);\n return retry(async () => {\n const response = await fetchImpl(\n new Request(url, {\n method: method.toUpperCase(),\n body,\n headers,\n })\n );\n const responseBody = response.body ? await response.text() : null;\n let responseJson: Record<string, unknown> | null;\n try {\n responseJson =\n responseBody &&\n (response.headers.get('content-type')?.includes('application/json') ||\n response.headers.get('content-type')?.includes('application/fhir+json'))\n ? JSON.parse(responseBody)\n : null;\n } catch (_err) {\n // ignore JSON.parse errors\n responseJson = null;\n }\n const isError = !response.ok || response.status >= 400;\n if (isError) {\n const errObj = {\n message:\n (responseJson?.output as Record<string, unknown>)?.message ?? // official zambda output format\n responseJson?.message ?? // normal endpoint output format\n responseJson ?? // parsable json\n responseBody ?? // raw response\n response.statusText, // fallback to status text\n code:\n (responseJson?.output as Record<string, unknown>)?.code ?? // official zambda output format\n responseJson?.code ?? // normal endpoint output format\n response.status, // fallback to status code\n response,\n };\n throw errObj;\n }\n return responseJson;\n }, retryConfig);\n };\n}\n\ntype ConstructedRetryConfig = Omit<NonNullable<OystehrConfig['retry']>, 'retryOn'> & {\n jitter: NonNullable<NonNullable<OystehrConfig['retry']>['jitter']>;\n delay: NonNullable<NonNullable<OystehrConfig['retry']>['delay']>;\n retryOn: NonNullable<NonNullable<OystehrConfig['retry']>['retryOn']>;\n};\nasync function retry<T>(work: (attempt: number) => Promise<T>, config: ConstructedRetryConfig): Promise<T> {\n let lastErr;\n for (const attempt of Array.from({ length: (config.retries ?? 0) + 1 }, (_, index) => index)) {\n try {\n return await work(attempt);\n } catch (e: any) {\n let isRetryable = false;\n if ('response' in e) {\n // error from API\n const err = e as FetcherError;\n isRetryable = config.retryOn.includes(err.code);\n // Removes response\n lastErr = { message: e.message, code: e.code };\n } else {\n lastErr = e;\n // error from fetch\n if ('code' in e && typeof e.code === 'string') {\n const err = e as { code: string };\n isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);\n }\n }\n if (!isRetryable) {\n break;\n }\n const jitter = Math.floor(Math.random() * (config.jitter + 1));\n await new Promise((resolve) => setTimeout(resolve, config.delay + jitter));\n if (config.onRetry && attempt !== (config.retries ?? 0)) {\n config.onRetry(attempt + 1);\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Substitutes params in a path and returns the path with params substituted and any unused params.\n *\n * Uses the property names in the params object to determine the param to substitute in the path.\n *\n * @param path JSON API resource URI\n * @param params all params provided to the client method\n * @returns resource URI with params substituted and any unused params\n */\nfunction subParamsInPath(path: string, params: Record<string, unknown>): [string, Record<string, string>] {\n const unusedParams = { ...params };\n // capture everything of the form `{paramName}` and replace with the value of `params[paramName]`\n const subbedPath = path.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n delete unusedParams[paramName];\n // override for path params that are paths, indicated by a `+` at the end\n if (paramName.match(/^.*\\+$/)) {\n return params[paramName] + '';\n }\n // error if param value is empty\n if (!params[paramName] || params[paramName] === '') {\n throw new OystehrSdkError({ message: `Required path parameter is an empty string: ${paramName}`, code: 400 });\n }\n // encode search params\n if (params[paramName]) {\n return encodeURIComponent(params[paramName] + ''); // coerce to string\n }\n return '';\n });\n\n const unusedKeys = Object.keys(unusedParams);\n const addlParams = unusedKeys.length\n ? unusedKeys.reduce((acc, key) => ({ ...acc, [key]: unusedParams[key] }), {})\n : {};\n return [subbedPath, addlParams];\n}\n\n/**\n * Adds params to a URLSearchParams object in such a way as to preserve array values.\n * @param params params\n * @param search URLSearchParams object\n */\nexport function addParamsToSearch(params: Record<string, unknown>, search: URLSearchParams): void {\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n value.forEach((v) => search.append(key, v as string));\n continue;\n }\n search.append(key, value as string);\n }\n}\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sources":["../../../src/client/client.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { OystehrConfig } from '../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../errors';\nimport { FhirBundle, FhirResource, OperationOutcome } from '../resources/types';\n\ntype HttpMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace';\nexport const defaultProjectApiUrl = 'https://project-api.zapehr.com/v1';\nconst defaultFhirApiUrl = 'https://fhir-api.zapehr.com';\nconst STATUS_CODES_TO_RETRY = [408, 429, 500, 502, 503, 504];\nconst ERROR_CODES_TO_RETRY = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ETIMEDOUT',\n 'UND_ERR_CONNECT_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_SOCKET',\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'.\n */\nexport interface OystehrClientRequest {\n /**\n * The access token to use for the request. If not provided, the access token from `oystehr.init()` will be used.\n */\n accessToken?: string;\n /**\n * The project ID to use for the request. If not provided, the project ID from `oystehr.init()` will be used.\n */\n projectId?: string;\n /**\n * The value of the 'Content-Type' header to use for the request.\n */\n contentType?: string;\n /**\n * Unique identifier for this request.\n */\n requestId?: string;\n}\n\ninterface InternalClientRequest extends OystehrClientRequest {\n ifMatch?: string;\n}\n\ntype FhirData<T extends FhirResource> = T | T[] | FhirBundle<T>;\nexport type FhirFetcherResponse<T extends FhirData<FhirResource> = any> = T;\n\nexport class SDKResource {\n protected readonly config: OystehrConfig;\n constructor(config: OystehrConfig) {\n this.config = config;\n }\n\n protected request(path: string, method: string, baseUrlThunk: () => string): FetcherFunction {\n return async (params: any, request?: InternalClientRequest): Promise<FetcherResponse> => {\n const configThunk = (): OystehrConfig => this.config;\n try {\n return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);\n } catch (err: any) {\n const error = err as { message: string; code: number; cause?: unknown };\n throw new OystehrSdkError({ message: error.message, code: error.code, cause: error.cause });\n }\n };\n }\n\n protected fhirRequest<T extends FhirResource = any>(path: string, method: string) {\n return async (params: any, request?: InternalClientRequest): Promise<FhirFetcherResponse<T>> => {\n try {\n const baseUrlThunk = (): string => this.config.services?.fhirApiUrl ?? defaultFhirApiUrl;\n const configThunk = (): OystehrConfig => this.config;\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, path, method)(params, request);\n } catch (err: unknown) {\n // FHIR API error messages are JSON strings\n const fullError = err as { message: string | Record<string, any>; code: number; cause?: unknown };\n if (typeof fullError.message === 'string') {\n throw new OystehrSdkError({\n message: fullError.message,\n code: fullError.code,\n cause: fullError.cause,\n });\n }\n throw new OystehrFHIRError({\n error: fullError.message as OperationOutcome,\n code: fullError.code,\n });\n }\n };\n }\n}\n\nexport type FetcherError = { message: string; code: number };\nexport type FetcherResponse = any;\nexport type FetcherFunction = (\n params?: Record<string, any> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n) => Promise<FetcherResponse>;\n\nfunction isInternalClientRequest(request: Record<string, any>): request is InternalClientRequest {\n return 'accessToken' in request;\n}\n\nfunction fetcher(\n baseUrlThunk: () => string,\n configThunk: () => OystehrConfig,\n path: string,\n methodParam: string\n): FetcherFunction {\n return async (\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n ): Promise<FetcherResponse> => {\n // this function supports multiple signatures. fetcher(baseUrl, path, method)(params, request) or fetcher(baseUrl, path, method)(request)\n // or fetcher(baseUrl, path, method)(params) or fetcher(baseUrl, path, method)(). the types for this are handled by Client<Path, Methods>\n // and this is the backend implementation behind it. the heuristic we're using is that if the first param is an object with an accessToken\n // and there is no second param, assume the first one is the request object instead\n const providedParams: Record<string, unknown> | [any] =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? {}\n : (params as Record<string, unknown>) ?? {};\n const requestCtx =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? (params as InternalClientRequest)\n : request;\n const method = methodParam.toLowerCase() as HttpMethod;\n const config = configThunk();\n const fetchImpl = config.fetch ?? fetch;\n const accessToken = requestCtx?.accessToken ?? config.accessToken;\n const projectId = requestCtx?.projectId ?? configThunk().projectId;\n let finalPath = path;\n let finalParams = providedParams;\n if (!Array.isArray(providedParams)) {\n const [subbedPath, addlParams] = subParamsInPath(path, providedParams);\n finalPath = subbedPath;\n finalParams = addlParams;\n }\n finalPath = finalPath.replace(/^\\//, ''); // remove leading slash\n const baseUrlEvaluated = baseUrlThunk();\n const fullBaseUrl = baseUrlEvaluated.endsWith('/') ? baseUrlEvaluated : baseUrlEvaluated + '/';\n const url = new URL(finalPath, fullBaseUrl);\n let body: any;\n\n if (Array.isArray(finalParams)) {\n body = JSON.stringify(finalParams);\n } else if (Object.keys(finalParams).length) {\n if (method === 'get') {\n addParamsToSearch(finalParams, url.searchParams);\n } else if (requestCtx?.contentType === 'application/x-www-form-urlencoded') {\n const search = new URLSearchParams();\n addParamsToSearch(finalParams, search);\n body = search.toString();\n } else {\n body = JSON.stringify(finalParams);\n }\n } else {\n // override for rpc call\n if (requestCtx?.contentType !== 'application/x-www-form-urlencoded' && method === 'post') {\n body = '{}';\n }\n }\n\n const headers: Record<string, string> = Object.assign(\n projectId\n ? {\n 'x-zapehr-project-id': projectId,\n 'x-oystehr-project-id': projectId,\n }\n : {},\n {\n 'content-type': requestCtx?.contentType ?? 'application/json',\n },\n accessToken ? { Authorization: `Bearer ${accessToken}` } : {},\n requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {},\n { 'x-oystehr-request-id': requestCtx?.requestId ?? uuidv4() }\n );\n const retryConfig: ConstructedRetryConfig = {\n retries: config.retry?.retries ?? 3,\n jitter: config.retry?.jitter ?? 20,\n delay: config.retry?.delay ?? 100,\n onRetry: config.retry?.onRetry,\n // Using array instead of set because the length is too short for uniqueness to be important\n retryOn: [...(config.retry?.retryOn ?? []), ...STATUS_CODES_TO_RETRY],\n };\n retryConfig.retryOn.push(...STATUS_CODES_TO_RETRY);\n return retry(async () => {\n const response = await fetchImpl(\n new Request(url, {\n method: method.toUpperCase(),\n body,\n headers,\n })\n );\n const responseBody = response.body ? await response.text() : null;\n let responseJson: Record<string, unknown> | null;\n try {\n responseJson =\n responseBody &&\n (response.headers.get('content-type')?.includes('application/json') ||\n response.headers.get('content-type')?.includes('application/fhir+json'))\n ? JSON.parse(responseBody)\n : null;\n } catch (_err) {\n // ignore JSON.parse errors\n responseJson = null;\n }\n const isError = !response.ok || response.status >= 400;\n if (isError) {\n const errObj = {\n message:\n (responseJson?.output as Record<string, unknown>)?.message ?? // official zambda output format\n responseJson?.message ?? // normal endpoint output format\n responseJson ?? // parsable json\n responseBody ?? // raw response\n response.statusText, // fallback to status text\n code:\n (responseJson?.output as Record<string, unknown>)?.code ?? // official zambda output format\n responseJson?.code ?? // normal endpoint output format\n response.status, // fallback to status code\n response,\n };\n throw errObj;\n }\n return responseJson;\n }, retryConfig);\n };\n}\n\ntype ConstructedRetryConfig = Omit<NonNullable<OystehrConfig['retry']>, 'retryOn'> & {\n jitter: NonNullable<NonNullable<OystehrConfig['retry']>['jitter']>;\n delay: NonNullable<NonNullable<OystehrConfig['retry']>['delay']>;\n retryOn: NonNullable<NonNullable<OystehrConfig['retry']>['retryOn']>;\n};\nasync function retry<T>(work: (attempt: number) => Promise<T>, config: ConstructedRetryConfig): Promise<T> {\n let lastErr;\n for (const attempt of Array.from({ length: (config.retries ?? 0) + 1 }, (_, index) => index)) {\n try {\n return await work(attempt);\n } catch (e: any) {\n let isRetryable = false;\n if ('response' in e) {\n // error from API\n const err = e as FetcherError;\n isRetryable = config.retryOn.includes(err.code);\n // Removes response\n lastErr = { message: e.message, code: e.code };\n } else {\n lastErr = e;\n // error from fetch\n if ('code' in e && typeof e.code === 'string') {\n const err = e as { code: string };\n isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);\n }\n }\n if (!isRetryable) {\n break;\n }\n const jitter = Math.floor(Math.random() * (config.jitter + 1));\n await new Promise((resolve) => setTimeout(resolve, config.delay + jitter));\n if (config.onRetry && attempt !== (config.retries ?? 0)) {\n config.onRetry(attempt + 1);\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Substitutes params in a path and returns the path with params substituted and any unused params.\n *\n * Uses the property names in the params object to determine the param to substitute in the path.\n *\n * @param path JSON API resource URI\n * @param params all params provided to the client method\n * @returns resource URI with params substituted and any unused params\n */\nfunction subParamsInPath(path: string, params: Record<string, unknown>): [string, Record<string, string>] {\n const unusedParams = { ...params };\n // capture everything of the form `{paramName}` and replace with the value of `params[paramName]`\n const subbedPath = path.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n delete unusedParams[paramName];\n // override for path params that are paths, indicated by a `+` at the end\n if (paramName.match(/^.*\\+$/)) {\n return params[paramName] + '';\n }\n // error if param value is empty\n if (!params[paramName] || params[paramName] === '') {\n throw new OystehrSdkError({ message: `Required path parameter is an empty string: ${paramName}`, code: 400 });\n }\n // encode search params\n if (params[paramName]) {\n return encodeURIComponent(params[paramName] + ''); // coerce to string\n }\n return '';\n });\n\n const unusedKeys = Object.keys(unusedParams);\n const addlParams = unusedKeys.length\n ? unusedKeys.reduce((acc, key) => ({ ...acc, [key]: unusedParams[key] }), {})\n : {};\n return [subbedPath, addlParams];\n}\n\n/**\n * Adds params to a URLSearchParams object in such a way as to preserve array values.\n * @param params params\n * @param search URLSearchParams object\n */\nexport function addParamsToSearch(params: Record<string, unknown>, search: URLSearchParams): void {\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n value.forEach((v) => search.append(key, v as string));\n continue;\n }\n search.append(key, value as string);\n }\n}\n"],"names":["uuidv4"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  class OystehrSdkError extends Error {
2
+ code;
2
3
  constructor({ message, code, cause }) {
3
4
  super(message, { cause });
4
5
  Object.setPrototypeOf(this, OystehrSdkError.prototype);
@@ -18,9 +19,8 @@ class OystehrSdkError extends Error {
18
19
  }
19
20
  }
20
21
  function transformOperationOutcomeToErrorMessage(cause) {
21
- var _a;
22
22
  const causes = [];
23
- for (const issue of (_a = cause.issue) !== null && _a !== void 0 ? _a : []) {
23
+ for (const issue of cause.issue ?? []) {
24
24
  if (issue.details && issue.details.text) {
25
25
  causes.push(issue.details.text);
26
26
  }
@@ -31,6 +31,7 @@ function transformOperationOutcomeToErrorMessage(cause) {
31
31
  return causes.join(',');
32
32
  }
33
33
  class OystehrFHIRError extends OystehrSdkError {
34
+ cause;
34
35
  constructor({ error, code }) {
35
36
  super({
36
37
  message: transformOperationOutcomeToErrorMessage(error),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/errors/index.ts"],"sourcesContent":["import { OperationOutcome as OperationOutcomeR4B } from 'fhir/r4b';\nimport { OperationOutcome as OperationOutcomeR5 } from 'fhir/r5';\n\nexport class OystehrSdkError extends Error {\n code: number;\n constructor({ message, code, cause }: { message: string; code: number; cause?: unknown }) {\n super(message, { cause });\n Object.setPrototypeOf(this, OystehrSdkError.prototype);\n this.code = code;\n this.name = 'OystehrSdkError';\n }\n toString(): string {\n return `${this.name}: ${this.message} (code: ${this.code})`;\n }\n toJSON(): any {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause,\n };\n }\n}\n\nfunction transformOperationOutcomeToErrorMessage(cause: OperationOutcomeR4B | OperationOutcomeR5): string {\n const causes = [];\n for (const issue of cause.issue ?? []) {\n if (issue.details && issue.details.text) {\n causes.push(issue.details.text);\n }\n }\n if (!causes.length) {\n causes.push('Unknown FHIR error');\n }\n return causes.join(',');\n}\n\nexport class OystehrFHIRError extends OystehrSdkError {\n cause: OperationOutcomeR4B | OperationOutcomeR5;\n constructor({ error, code }: { error: OperationOutcomeR4B | OperationOutcomeR5; code: number }) {\n super({\n message: transformOperationOutcomeToErrorMessage(error as OperationOutcomeR4B | OperationOutcomeR5),\n code,\n });\n Object.setPrototypeOf(this, OystehrFHIRError.prototype);\n this.cause = error as OperationOutcomeR4B | OperationOutcomeR5;\n this.name = 'OystehrFHIRError';\n }\n toJSON(): any {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause,\n };\n }\n}\n"],"names":[],"mappings":"AAGM,MAAO,eAAgB,SAAQ,KAAK,CAAA;AAExC,IAAA,WAAA,CAAY,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAsD,EAAA;AACtF,QAAA,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;KAC/B;IACD,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAK,EAAA,EAAA,IAAI,CAAC,OAAO,CAAW,QAAA,EAAA,IAAI,CAAC,IAAI,GAAG,CAAC;KAC7D;IACD,MAAM,GAAA;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;KACH;AACF,CAAA;AAED,SAAS,uCAAuC,CAAC,KAA+C,EAAA;;IAC9F,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,CAAA,EAAA,GAAA,KAAK,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,EAAE;QACrC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjC,SAAA;AACF,KAAA;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,QAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AACnC,KAAA;AACD,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAEK,MAAO,gBAAiB,SAAQ,eAAe,CAAA;AAEnD,IAAA,WAAA,CAAY,EAAE,KAAK,EAAE,IAAI,EAAqE,EAAA;AAC5F,QAAA,KAAK,CAAC;AACJ,YAAA,OAAO,EAAE,uCAAuC,CAAC,KAAiD,CAAC;YACnG,IAAI;AACL,SAAA,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAiD,CAAC;AAC/D,QAAA,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;KAChC;IACD,MAAM,GAAA;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;KACH;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/errors/index.ts"],"sourcesContent":["import { OperationOutcome as OperationOutcomeR4B } from 'fhir/r4b';\nimport { OperationOutcome as OperationOutcomeR5 } from 'fhir/r5';\n\nexport class OystehrSdkError extends Error {\n code: number;\n constructor({ message, code, cause }: { message: string; code: number; cause?: unknown }) {\n super(message, { cause });\n Object.setPrototypeOf(this, OystehrSdkError.prototype);\n this.code = code;\n this.name = 'OystehrSdkError';\n }\n toString(): string {\n return `${this.name}: ${this.message} (code: ${this.code})`;\n }\n toJSON(): any {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause,\n };\n }\n}\n\nfunction transformOperationOutcomeToErrorMessage(cause: OperationOutcomeR4B | OperationOutcomeR5): string {\n const causes = [];\n for (const issue of cause.issue ?? []) {\n if (issue.details && issue.details.text) {\n causes.push(issue.details.text);\n }\n }\n if (!causes.length) {\n causes.push('Unknown FHIR error');\n }\n return causes.join(',');\n}\n\nexport class OystehrFHIRError extends OystehrSdkError {\n cause: OperationOutcomeR4B | OperationOutcomeR5;\n constructor({ error, code }: { error: OperationOutcomeR4B | OperationOutcomeR5; code: number }) {\n super({\n message: transformOperationOutcomeToErrorMessage(error as OperationOutcomeR4B | OperationOutcomeR5),\n code,\n });\n Object.setPrototypeOf(this, OystehrFHIRError.prototype);\n this.cause = error as OperationOutcomeR4B | OperationOutcomeR5;\n this.name = 'OystehrFHIRError';\n }\n toJSON(): any {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause,\n };\n }\n}\n"],"names":[],"mappings":"AAGM,MAAO,eAAgB,SAAQ,KAAK,CAAA;AACxC,IAAA,IAAI,CAAS;AACb,IAAA,WAAA,CAAY,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAsD,EAAA;AACtF,QAAA,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;KAC/B;IACD,QAAQ,GAAA;AACN,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,IAAI,CAAK,EAAA,EAAA,IAAI,CAAC,OAAO,CAAW,QAAA,EAAA,IAAI,CAAC,IAAI,GAAG,CAAC;KAC7D;IACD,MAAM,GAAA;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;KACH;AACF,CAAA;AAED,SAAS,uCAAuC,CAAC,KAA+C,EAAA;IAC9F,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QACrC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACjC;KACF;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,QAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;KACnC;AACD,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAEK,MAAO,gBAAiB,SAAQ,eAAe,CAAA;AACnD,IAAA,KAAK,CAA2C;AAChD,IAAA,WAAA,CAAY,EAAE,KAAK,EAAE,IAAI,EAAqE,EAAA;AAC5F,QAAA,KAAK,CAAC;AACJ,YAAA,OAAO,EAAE,uCAAuC,CAAC,KAAiD,CAAC;YACnG,IAAI;AACL,SAAA,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAiD,CAAC;AAC/D,QAAA,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;KAChC;IACD,MAAM,GAAA;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;KACH;AACF;;;;"}
package/dist/esm/index.js CHANGED
@@ -6,9 +6,9 @@ import { Oystehr as Oystehr$1 } from './resources/classes/index.js';
6
6
  // our ancient tsc settings are somehow grabbing js from
7
7
  // dist/esm and types from dist/cjs
8
8
  class Oystehr extends Oystehr$1 {
9
+ static OystehrFHIRError = OystehrFHIRError;
10
+ static OystehrSdkError = OystehrSdkError;
9
11
  }
10
- Oystehr.OystehrFHIRError = OystehrFHIRError;
11
- Oystehr.OystehrSdkError = OystehrSdkError;
12
12
 
13
13
  export { Oystehr as default };
14
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import type { OystehrClientRequest } from './client/client';\nimport { OystehrConfig } from './config';\nimport * as errors from './errors';\nimport { Oystehr as OystehrBase } from './resources/classes';\n\nexport * from './resources';\n\nexport type { OystehrClientRequest };\nexport type { OystehrConfig };\n\n// HACK: ideally we would only have to do this for CommonJS\n// where default + named exports are not allowed; however,\n// our ancient tsc settings are somehow grabbing js from\n// dist/esm and types from dist/cjs\n\nclass Oystehr extends OystehrBase {\n static OystehrFHIRError = errors.OystehrFHIRError;\n static OystehrSdkError = errors.OystehrSdkError;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Oystehr {\n export type OystehrFHIRError = errors.OystehrFHIRError;\n export type OystehrSdkError = errors.OystehrSdkError;\n}\n\nexport default Oystehr;\n"],"names":["OystehrBase","errors.OystehrFHIRError","errors.OystehrSdkError"],"mappings":";;;AAUA;AACA;AACA;AACA;AAEA,MAAM,OAAQ,SAAQA,SAAW,CAAA;;AACxB,OAAA,CAAA,gBAAgB,GAAGC,gBAAuB,CAAC;AAC3C,OAAA,CAAA,eAAe,GAAGC,eAAsB;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import type { OystehrClientRequest } from './client/client';\nimport { OystehrConfig } from './config';\nimport * as errors from './errors';\nimport { Oystehr as OystehrBase } from './resources/classes';\n\nexport * from './resources';\n\nexport type { OystehrClientRequest };\nexport type { OystehrConfig };\n\n// HACK: ideally we would only have to do this for CommonJS\n// where default + named exports are not allowed; however,\n// our ancient tsc settings are somehow grabbing js from\n// dist/esm and types from dist/cjs\n\nclass Oystehr extends OystehrBase {\n static OystehrFHIRError = errors.OystehrFHIRError;\n static OystehrSdkError = errors.OystehrSdkError;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Oystehr {\n export type OystehrFHIRError = errors.OystehrFHIRError;\n export type OystehrSdkError = errors.OystehrSdkError;\n}\n\nexport default Oystehr;\n"],"names":["OystehrBase","errors.OystehrFHIRError","errors.OystehrSdkError"],"mappings":";;;AAUA;AACA;AACA;AACA;AAEA,MAAM,OAAQ,SAAQA,SAAW,CAAA;AAC/B,IAAA,OAAO,gBAAgB,GAAGC,gBAAuB,CAAC;AAClD,IAAA,OAAO,eAAe,GAAGC,eAAsB,CAAC;;;;;"}
@@ -1,2 +1,2 @@
1
- import{v4 as t}from"uuid";class e extends Error{constructor({message:t,code:i,cause:s}){super(t,{cause:s}),Object.setPrototypeOf(this,e.prototype),this.code=i,this.name="OystehrSdkError"}toString(){return`${this.name}: ${this.message} (code: ${this.code})`}toJSON(){return{name:this.name,message:this.message,code:this.code,cause:this.cause}}}function i(t){var e;const i=[];for(const s of null!==(e=t.issue)&&void 0!==e?e:[])s.details&&s.details.text&&i.push(s.details.text);return i.length||i.push("Unknown FHIR error"),i.join(",")}class s extends e{constructor({error:t,code:e}){super({message:i(t),code:e}),Object.setPrototypeOf(this,s.prototype),this.cause=t,this.name="OystehrFHIRError"}toJSON(){return{name:this.name,message:this.message,code:this.code,cause:this.cause}}}function r(t,e,i,s){return new(i||(i=Promise))((function(r,n){function o(t){try{c(s.next(t))}catch(t){n(t)}}function u(t){try{c(s.throw(t))}catch(t){n(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,u)}c((s=s.apply(t,e||[])).next())}))}function n(t,e,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(t):s?s.value:e.get(t)}"function"==typeof SuppressedError&&SuppressedError;const o=[408,429,500,502,503,504],u=["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT","UND_ERR_CONNECT_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_SOCKET"];class c{constructor(t){this.config=t}request(t,i,s){return(n,o)=>r(this,void 0,void 0,(function*(){const r=()=>this.config;try{return yield a(s,r,t,i)(n,o)}catch(t){const i=t;throw new e({message:i.message,code:i.code,cause:i.cause})}}))}fhirRequest(t,i){return(n,o)=>r(this,void 0,void 0,(function*(){try{const e=()=>{var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.fhirApiUrl)&&void 0!==e?e:"https://fhir-api.zapehr.com"},s=()=>this.config;return yield a(e,s,t,i)(n,o)}catch(t){const i=t;if("string"==typeof i.message)throw new e({message:i.message,code:i.code,cause:i.cause});throw new s({error:i.message,code:i.code})}}))}}function h(t){return"accessToken"in t}function a(i,s,n,c){return(a,l)=>r(this,void 0,void 0,(function*(){var p,v,m,f,g,b,y,q,j,w,k,S,x,U,O;const E=a&&!l&&!Array.isArray(a)&&h(a)?{}:null!==(p=a)&&void 0!==p?p:{},T=a&&!l&&!Array.isArray(a)&&h(a)?a:l,z=c.toLowerCase(),A=s(),I=null!==(v=A.fetch)&&void 0!==v?v:fetch,P=null!==(m=null==T?void 0:T.accessToken)&&void 0!==m?m:A.accessToken,R=null!==(f=null==T?void 0:T.projectId)&&void 0!==f?f:s().projectId;let N=n,W=E;if(!Array.isArray(E)){const[t,i]=function(t,i){const s=Object.assign({},i),r=t.replace(/\{([^}]+)\}/g,((t,r)=>{if(delete s[r],r.match(/^.*\+$/))return i[r]+"";if(!i[r]||""===i[r])throw new e({message:`Required path parameter is an empty string: ${r}`,code:400});return i[r]?encodeURIComponent(i[r]+""):""})),n=Object.keys(s),o=n.length?n.reduce(((t,e)=>Object.assign(Object.assign({},t),{[e]:s[e]})),{}):{};return[r,o]}(n,E);N=t,W=i}N=N.replace(/^\//,"");const $=i(),C=$.endsWith("/")?$:$+"/",_=new URL(N,C);let L;if(Array.isArray(W))L=JSON.stringify(W);else if(Object.keys(W).length)if("get"===z)d(W,_.searchParams);else if("application/x-www-form-urlencoded"===(null==T?void 0:T.contentType)){const t=new URLSearchParams;d(W,t),L=t.toString()}else L=JSON.stringify(W);else"application/x-www-form-urlencoded"!==(null==T?void 0:T.contentType)&&"post"===z&&(L="{}");const M=Object.assign(R?{"x-zapehr-project-id":R,"x-oystehr-project-id":R}:{},{"content-type":null!==(g=null==T?void 0:T.contentType)&&void 0!==g?g:"application/json"},P?{Authorization:`Bearer ${P}`}:{},(null==T?void 0:T.ifMatch)?{"If-Match":T.ifMatch}:{},{"x-oystehr-request-id":null!==(b=null==T?void 0:T.requestId)&&void 0!==b?b:t()}),D={retries:null!==(q=null===(y=A.retry)||void 0===y?void 0:y.retries)&&void 0!==q?q:3,jitter:null!==(w=null===(j=A.retry)||void 0===j?void 0:j.jitter)&&void 0!==w?w:20,delay:null!==(S=null===(k=A.retry)||void 0===k?void 0:k.delay)&&void 0!==S?S:100,onRetry:null===(x=A.retry)||void 0===x?void 0:x.onRetry,retryOn:[...null!==(O=null===(U=A.retry)||void 0===U?void 0:U.retryOn)&&void 0!==O?O:[],...o]};return D.retryOn.push(...o),function(t,e){var i,s;return r(this,void 0,void 0,(function*(){let r;for(const n of Array.from({length:(null!==(i=e.retries)&&void 0!==i?i:0)+1},((t,e)=>e)))try{return yield t(n)}catch(t){let i=!1;if("response"in t){const s=t;i=e.retryOn.includes(s.code),r={message:t.message,code:t.code}}else if(r=t,"code"in t&&"string"==typeof t.code){const e=t;i=u.includes(e.code)}if(!i)break;const o=Math.floor(Math.random()*(e.jitter+1));yield new Promise((t=>setTimeout(t,e.delay+o))),e.onRetry&&n!==(null!==(s=e.retries)&&void 0!==s?s:0)&&e.onRetry(n+1)}throw r}))}((()=>r(this,void 0,void 0,(function*(){var t,e,i,s,r,n,o,u,c,h;const a=yield I(new Request(_,{method:z.toUpperCase(),body:L,headers:M})),d=a.body?yield a.text():null;let l;try{l=d&&((null===(t=a.headers.get("content-type"))||void 0===t?void 0:t.includes("application/json"))||(null===(e=a.headers.get("content-type"))||void 0===e?void 0:e.includes("application/fhir+json")))?JSON.parse(d):null}catch(t){l=null}if(!a.ok||a.status>=400){throw{message:null!==(o=null!==(n=null!==(r=null!==(s=null===(i=null==l?void 0:l.output)||void 0===i?void 0:i.message)&&void 0!==s?s:null==l?void 0:l.message)&&void 0!==r?r:l)&&void 0!==n?n:d)&&void 0!==o?o:a.statusText,code:null!==(h=null!==(c=null===(u=null==l?void 0:l.output)||void 0===u?void 0:u.code)&&void 0!==c?c:null==l?void 0:l.code)&&void 0!==h?h:a.status,response:a}}return l}))),D)}))}function d(t,e){for(const[i,s]of Object.entries(t))Array.isArray(s)?s.forEach((t=>e.append(i,t))):e.append(i,s)}var l,p,v,m;class f extends c{constructor(t){super(t),l.add(this)}list(t){return this.request("/application","get",n(this,l,"m",p).bind(this))(t)}create(t,e){return this.request("/application","post",n(this,l,"m",p).bind(this))(t,e)}get(t,e){return this.request("/application/{id}","get",n(this,l,"m",p).bind(this))(t,e)}update(t,e){return this.request("/application/{id}","patch",n(this,l,"m",p).bind(this))(t,e)}delete(t,e){return this.request("/application/{id}","delete",n(this,l,"m",p).bind(this))(t,e)}rotateSecret(t,e){return this.request("/application/{id}/rotate-secret","post",n(this,l,"m",p).bind(this))(t,e)}revokeRefreshToken(t,e){return this.request("/application/{id}/revoke-refresh-token","post",n(this,l,"m",p).bind(this))(t,e)}revokeAccessToken(t,e){return this.request("/application/{id}/revoke-access-token","post",n(this,l,"m",p).bind(this))(t,e)}}l=new WeakSet,p=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class g extends c{constructor(t){super(t),v.add(this)}issue(t,e){return this.request("/payment/charge/issue","post",n(this,v,"m",m).bind(this))(t,e)}status(t,e){return this.request("/payment/charge/status","post",n(this,v,"m",m).bind(this))(t,e)}}v=new WeakSet,m=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};const b="https://extensions.fhir.zapehr.com/encounter-virtual-service-pre-release",y="addressString";function q(t){var e,i,s;if(function(t){return Object.hasOwn(t,"virtualService")}(t)){const i=null===(e=t.virtualService)||void 0===e?void 0:e.find((t=>{var e;return"https://fhir.zapehr.com/virtual-service-type"===(null===(e=t.channelType)||void 0===e?void 0:e.system)}));return null==i?void 0:i.addressString}if(!t.extension)return;const r=t.extension.find((t=>t.url===b));if(!(null==r?void 0:r.extension))return;return null===(s=null===(i=r.extension)||void 0===i?void 0:i.find((t=>t.url===y)))||void 0===s?void 0:s.valueString}var j,w,k,S,x,U,O,E,T,z,A,I;class P extends c{constructor(t){super(t),j.add(this),this.ENCOUNTER_VS_EXTENSION_URL=b,this.ENCOUNTER_VS_EXTENSION_RELATIVE_URL=y,this.getConversationIdFromEncounter=q}create(t,e){return this.request("/messaging/conversation","post",n(this,j,"m",w).bind(this))(t,e)}getToken(t){return this.request("/messaging/conversation/token","get",n(this,j,"m",w).bind(this))(t)}addParticipant(t,e){return this.request("/messaging/conversation/{conversationId}/participant","post",n(this,j,"m",w).bind(this))(t,e)}removeParticipant(t,e){return this.request("/messaging/conversation/{conversationId}/participant","delete",n(this,j,"m",w).bind(this))(t,e)}message(t,e){return this.request("/messaging/conversation/{conversationId}/message","post",n(this,j,"m",w).bind(this))(t,e)}}j=new WeakSet,w=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class R extends c{constructor(t){super(t),k.add(this)}get(t,e){return this.request("/developer/{id}","get",n(this,k,"m",S).bind(this))(t,e)}update(t,e){return this.request("/developer/{id}","patch",n(this,k,"m",S).bind(this))(t,e)}delete(t,e){return this.request("/developer/{id}","delete",n(this,k,"m",S).bind(this))(t,e)}invite(t,e){return this.request("/developer/invite","post",n(this,k,"m",S).bind(this))(t,e)}list(t){return this.request("/developer","get",n(this,k,"m",S).bind(this))(t)}listV2(t,e){return this.request("/developer/v2/list","get",n(this,k,"m",S).bind(this))(t,e)}}k=new WeakSet,S=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class N extends c{constructor(t){super(t),x.add(this)}searchAllergens(t,e){return this.request("/allergen","get",n(this,x,"m",U).bind(this))(t,e)}searchMedications(t,e){return this.request("/medication","get",n(this,x,"m",U).bind(this))(t,e)}checkAllergyInteractions(t,e){return this.request("/patient/{patientId}/interactions/allergy","get",n(this,x,"m",U).bind(this))(t,e)}checkMedicationInteractions(t,e){return this.request("/patient/{patientId}/interactions/medication","get",n(this,x,"m",U).bind(this))(t,e)}checkPrecheckInteractions(t,e){return this.request("/patient/{patientId}/interactions/precheck/{drugId}","get",n(this,x,"m",U).bind(this))(t,e)}cancelPrescription(t,e){return this.request("/patient/{patientId}/prescriptions/{medicationRequestId}","delete",n(this,x,"m",U).bind(this))(t,e)}syncPatient(t,e){return this.request("/patient/{patientId}/sync","post",n(this,x,"m",U).bind(this))(t,e)}connectPractitioner(t,e){return this.request("/practitioner/connect","get",n(this,x,"m",U).bind(this))(t,e)}checkPractitionerEnrollment(t,e){return this.request("/practitioner/{practitionerId}","get",n(this,x,"m",U).bind(this))(t,e)}enrollPractitioner(t,e){return this.request("/practitioner/{practitionerId}","post",n(this,x,"m",U).bind(this))(t,e)}unenrollPractitioner(t,e){return this.request("/practitioner/{practitionerId}","delete",n(this,x,"m",U).bind(this))(t,e)}}x=new WeakSet,U=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.erxApiUrl)&&void 0!==e?e:"https://erx-api.zapehr.com/v3"};class W extends c{constructor(t){super(t),O.add(this)}syncPatient(t,e){return this.request("/erx/sync-patient/{patientId}","post",n(this,O,"m",E).bind(this))(t,e)}allergySearch(t,e){return this.request("/erx/allergy/search","get",n(this,O,"m",E).bind(this))(t,e)}cancelOrder(t,e){return this.request("/erx/cancel-order","post",n(this,O,"m",E).bind(this))(t,e)}cancelPrescription(t,e){return this.request("/erx/cancel-prescription","post",n(this,O,"m",E).bind(this))(t,e)}medicationSearch(t,e){return this.request("/erx/medication/search","get",n(this,O,"m",E).bind(this))(t,e)}}O=new WeakSet,E=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class $ extends c{constructor(t){super(t),T.add(this)}medicationSearch(t,e){return this.request("/erx/v2/medication/search","get",n(this,T,"m",z).bind(this))(t,e)}}T=new WeakSet,z=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class C extends c{constructor(t){super(t),A.add(this)}offboard(t){return this.request("/offboard","post",n(this,A,"m",I).bind(this))(t)}onboard(t){return this.request("/onboard","post",n(this,A,"m",I).bind(this))(t)}send(t,e){return this.request("/send","post",n(this,A,"m",I).bind(this))(t,e)}}function _(t,e){return r(this,void 0,void 0,(function*(){const{resourceType:i,params:s}=t;let r;s&&(r=Object.entries(s).reduce(((t,[e,i])=>(t[i.name]||(t[i.name]=[]),t[i.name].push(i.value),t)),{}));const n=yield this.fhirRequest(`/${i}/_search`,"POST")(r,Object.assign(Object.assign({},e),{contentType:"application/x-www-form-urlencoded"}));return Object.assign(Object.assign({},n),{entry:n.entry,unbundle:function(){var t,e;return null!==(e=null===(t=this.entry)||void 0===t?void 0:t.map((t=>t.resource)).filter((t=>void 0!==t)))&&void 0!==e?e:[]}})}))}function L(t,e){return r(this,void 0,void 0,(function*(){const{resourceType:i}=t;return this.fhirRequest(`/${i}`,"POST")(t,e)}))}function M({resourceType:t,id:e},i){return r(this,void 0,void 0,(function*(){return this.fhirRequest(`/${t}/${e}`,"GET")({},i)}))}function D(t,e){return r(this,void 0,void 0,(function*(){const{id:i,resourceType:s}=t;return this.fhirRequest(`/${s}/${i}`,"PUT")(t,Object.assign(Object.assign({},e),{ifMatch:(null==e?void 0:e.optimisticLockingVersionId)?`W/"${e.optimisticLockingVersionId}"`:void 0}))}))}function V({resourceType:t,id:e,operations:i},s){return r(this,void 0,void 0,(function*(){return this.fhirRequest(`/${t}/${e}`,"PATCH")(i,Object.assign(Object.assign({},s),{contentType:"application/json-patch+json",ifMatch:(null==s?void 0:s.optimisticLockingVersionId)?`W/"${s.optimisticLockingVersionId}"`:void 0}))}))}function F({resourceType:t,id:e},i){return r(this,void 0,void 0,(function*(){return this.fhirRequest(`/${t}/${e}`,"DELETE")({},i)}))}function H({resourceType:t,id:e,versionId:i},s){return r(this,void 0,void 0,(function*(){return this.fhirRequest(`/${t}/${e}/_history${i?`/${i}`:""}`,"GET")({},s)}))}function B(t){const{method:e,url:i}=t,s={request:{method:e,url:i}};if(i.split("?").length>1){const[t,e]=i.split("?"),r=e.split("&").map((t=>{const[e,i]=t.split("=");return{name:e,value:i}})).reduce(((t,{name:e,value:i})=>e?(t[e]||(t[e]=[]),t[e].push(i),t):t),{}),n=new URLSearchParams;d(r,n),s.request.url=`${t}?${n.toString()}`}if(["GET","DELETE","HEAD"].includes(e))return s;if("PUT"===e){const{resource:e}=t;return Object.assign(Object.assign({},s),{resource:e})}if("PATCH"===e)return"resource"in t?Object.assign(Object.assign({},s),{resource:t.resource}):Object.assign(Object.assign({},s),{resource:{resourceType:"Binary",contentType:"application/json-patch+json",data:Buffer.from(JSON.stringify(t.operations),"utf8").toString("base64")}});if("POST"===e){const{resource:e,fullUrl:i}=t;return Object.assign(Object.assign({},s),{resource:e,fullUrl:i})}throw new Error("Unrecognized method")}function G(t){return function(e,i){return r(this,void 0,void 0,(function*(){return this.fhirRequest("/","POST")({resourceType:"Bundle",type:t,entry:e.requests.map(B)},i)}))}}A=new WeakSet,I=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.faxApiUrl)&&void 0!==e?e:"https://fax-api.zapehr.com/v1"};const J=G("batch"),X=G("transaction");function Z(t,e){const i=[];if(t.line&&i.push(...t.line),t.city||t.state||t.postalCode){const e=[];t.city&&e.push(t.city),t.state&&e.push(t.state),t.postalCode&&e.push(t.postalCode),i.push(e.join(", "))}return t.use&&((null==e?void 0:e.all)||(null==e?void 0:e.use))&&i.push("["+t.use+"]"),i.join((null==e?void 0:e.lineSeparator)||", ").trim()}function K(t,e){const i=[];return t.prefix&&!1!==(null==e?void 0:e.prefix)&&i.push(...t.prefix),t.given&&i.push(...t.given),t.family&&i.push(t.family),t.suffix&&!1!==(null==e?void 0:e.suffix)&&i.push(...t.suffix),t.use&&((null==e?void 0:e.all)||(null==e?void 0:e.use))&&i.push("["+t.use+"]"),i.join(" ").trim()}var Q,Y,tt,et,it,st,rt,nt,ot,ut,ct,ht,at,dt,lt,pt,vt,mt,ft,gt,bt,yt,qt,jt,wt,kt,St,xt,Ut,Ot,Et;class Tt extends c{constructor(t){super(t),Q.add(this),this.search=_,this.create=L,this.get=M,this.update=D,this.patch=V,this.delete=F,this.history=H,this.batch=J,this.transaction=X,this.formatAddress=Z,this.formatHumanName=K}}Q=new WeakSet;class zt extends c{constructor(t){super(t),Y.add(this)}routeList(t){return this.request("/route","get",n(this,Y,"m",tt).bind(this))(t)}routeCreate(t,e){return this.request("/route","post",n(this,Y,"m",tt).bind(this))(t,e)}routeDelete(t,e){return this.request("/route/{routeGuid}","delete",n(this,Y,"m",tt).bind(this))(t,e)}orderableItemList(t,e){return this.request("/orderableItem","get",n(this,Y,"m",tt).bind(this))(t,e)}orderableItemQuestionnaireGet(t,e){return this.request("/canonical-questionnaire/lab/{labGuid}/compendium/{compendiumVersion}/item/{itemCode}/questionnaire","get",n(this,Y,"m",tt).bind(this))(t,e)}orderSubmit(t,e){return this.request("/submit","post",n(this,Y,"m",tt).bind(this))(t,e)}}Y=new WeakSet,tt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.labApiUrl)&&void 0!==e?e:"https://labs-api.zapehr.com/v1"};class At extends c{constructor(t){super(t),et.add(this)}list(t){return this.request("/m2m","get",n(this,et,"m",it).bind(this))(t)}create(t,e){return this.request("/m2m","post",n(this,et,"m",it).bind(this))(t,e)}get(t,e){return this.request("/m2m/{id}","get",n(this,et,"m",it).bind(this))(t,e)}update(t,e){return this.request("/m2m/{id}","patch",n(this,et,"m",it).bind(this))(t,e)}delete(t,e){return this.request("/m2m/{id}","delete",n(this,et,"m",it).bind(this))(t,e)}rotateSecret(t,e){return this.request("/m2m/{id}/rotate-secret","post",n(this,et,"m",it).bind(this))(t,e)}listV2(t,e){return this.request("/m2m/v2/list","get",n(this,et,"m",it).bind(this))(t,e)}}et=new WeakSet,it=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class It extends c{constructor(t){super(t),st.add(this)}getMessagingConfig(t){return this.request("/messaging/config","get",n(this,st,"m",rt).bind(this))(t)}}st=new WeakSet,rt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Pt extends c{constructor(t){super(t),nt.add(this)}setUp(t,e){return this.request("/payment/payment-method/setup","post",n(this,nt,"m",ot).bind(this))(t,e)}setDefault(t,e){return this.request("/payment/payment-method/set-default","post",n(this,nt,"m",ot).bind(this))(t,e)}delete(t,e){return this.request("/payment/payment-method","delete",n(this,nt,"m",ot).bind(this))(t,e)}list(t,e){return this.request("/payment/payment-method/list","post",n(this,nt,"m",ot).bind(this))(t,e)}}nt=new WeakSet,ot=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Rt extends c{constructor(t){super(t),ut.add(this)}get(t){return this.request("/project","get",n(this,ut,"m",ct).bind(this))(t)}update(t,e){return this.request("/project","patch",n(this,ut,"m",ct).bind(this))(t,e)}}ut=new WeakSet,ct=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Nt extends c{constructor(t){super(t),ht.add(this)}eligibilityCheck(t,e){return this.request("/rcm/eligibility-check","post",n(this,ht,"m",at).bind(this))(t,e)}validateProfessionalClaim(t,e){return this.request("/rcm/professional-claim/validate","post",n(this,ht,"m",at).bind(this))(t,e)}submitProfessionalClaim(t,e){return this.request("/rcm/professional-claim/submit","post",n(this,ht,"m",at).bind(this))(t,e)}}ht=new WeakSet,at=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Wt extends c{constructor(t){super(t),dt.add(this)}list(t){return this.request("/iam/role","get",n(this,dt,"m",lt).bind(this))(t)}create(t,e){return this.request("/iam/role","post",n(this,dt,"m",lt).bind(this))(t,e)}get(t,e){return this.request("/iam/role/{roleId}","get",n(this,dt,"m",lt).bind(this))(t,e)}update(t,e){return this.request("/iam/role/{roleId}","patch",n(this,dt,"m",lt).bind(this))(t,e)}delete(t,e){return this.request("/iam/role/{roleId}","delete",n(this,dt,"m",lt).bind(this))(t,e)}}dt=new WeakSet,lt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class $t extends c{constructor(t){super(t),pt.add(this)}list(t){return this.request("/secret","get",n(this,pt,"m",vt).bind(this))(t)}set(t,e){return this.request("/secret","post",n(this,pt,"m",vt).bind(this))(t,e)}get(t,e){return this.request("/secret/{name}","get",n(this,pt,"m",vt).bind(this))(t,e)}delete(t,e){return this.request("/secret/{name}","delete",n(this,pt,"m",vt).bind(this))(t,e)}}pt=new WeakSet,vt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Ct extends c{constructor(t){super(t),mt.add(this)}createMeeting(t,e){return this.request("/telemed/v2/meeting","post",n(this,mt,"m",ft).bind(this))(t,e)}joinMeeting(t,e){return this.request("/telemed/v2/meeting/{encounterId}/join","get",n(this,mt,"m",ft).bind(this))(t,e)}}mt=new WeakSet,ft=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class _t extends c{constructor(t){super(t),gt.add(this)}send(t,e){return this.request("/messaging/transactional-sms/send","post",n(this,gt,"m",bt).bind(this))(t,e)}}gt=new WeakSet,bt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Lt extends c{constructor(t){super(t),yt.add(this)}me(t){return this.request("/user/me","get",n(this,yt,"m",qt).bind(this))(t)}get(t,e){return this.request("/user/{id}","get",n(this,yt,"m",qt).bind(this))(t,e)}update(t,e){return this.request("/user/{id}","patch",n(this,yt,"m",qt).bind(this))(t,e)}delete(t,e){return this.request("/user/{id}","delete",n(this,yt,"m",qt).bind(this))(t,e)}invite(t,e){return this.request("/user/invite","post",n(this,yt,"m",qt).bind(this))(t,e)}list(t){return this.request("/user","get",n(this,yt,"m",qt).bind(this))(t)}listV2(t,e){return this.request("/user/v2/list","get",n(this,yt,"m",qt).bind(this))(t,e)}}yt=new WeakSet,qt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Mt extends c{constructor(t){super(t),jt.add(this)}get(t){return this.request("/version","get",n(this,jt,"m",wt).bind(this))(t)}}function Dt(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"}function Vt({bucketName:t,"objectPath+":e,file:i}){return r(this,void 0,void 0,(function*(){const s=yield this.request("/z3/{bucketName}/{objectPath+}","post",Dt.bind(this))({action:"upload",bucketName:t,"objectPath+":e});yield fetch(s.signedUrl,{method:"PUT",body:i})}))}function Ft({bucketName:t,"objectPath+":e}){return r(this,void 0,void 0,(function*(){const i=yield this.request("/z3/{bucketName}/{objectPath+}","post",Dt.bind(this))({action:"download",bucketName:t,"objectPath+":e}),s=yield fetch(i.signedUrl,{method:"GET"});if(!s.ok)throw new Error("Failed to download file");return s.arrayBuffer()}))}function Ht(t){var i,s;return r(this,void 0,void 0,(function*(){let r,n;const o=new URL(t.url);if("z3:"===o.protocol){const t=o.pathname.split("/").slice(1);r=o.hostname,n=t.join("/")}else{if(!o.href.startsWith(null!==(s=null===(i=this.config.services)||void 0===i?void 0:i.projectApiUrl)&&void 0!==s?s:"https://project-api.zapehr.com/v1"))throw new e({message:"Invalid Z3 URL",code:400});{const t=o.pathname.split("/").slice(3);r=t[0],n=t.slice(1).join("/")}}const u={action:"upload",bucketName:r,"objectPath+":n};return this.request("/z3/{bucketName}/{objectPath+}","post",Dt.bind(this))(u)}))}jt=new WeakSet,wt=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Bt extends c{constructor(t){super(t),kt.add(this),this.uploadFile=Vt,this.downloadFile=Ft,this.getPresignedUrlForZ3Url=Ht}listBuckets(t){return this.request("/z3","get",n(this,kt,"m",St).bind(this))(t)}createBucket(t,e){return this.request("/z3/{bucketName}","put",n(this,kt,"m",St).bind(this))(t,e)}deleteBucket(t,e){return this.request("/z3/{bucketName}","delete",n(this,kt,"m",St).bind(this))(t,e)}listObjects(t,e){return this.request("/z3/{bucketName}/{objectPath+}","get",n(this,kt,"m",St).bind(this))(t,e)}getPresignedUrl(t,e){return this.request("/z3/{bucketName}/{objectPath+}","post",n(this,kt,"m",St).bind(this))(t,e)}deleteObject(t,e){return this.request("/z3/{bucketName}/{objectPath+}","delete",n(this,kt,"m",St).bind(this))(t,e)}}function Gt(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"}function Jt({id:t,file:e,filename:i}){return r(this,void 0,void 0,(function*(){const s=yield this.request("/zambda/{id}/s3-upload","post",Gt.bind(this))({id:t,filename:i});yield fetch(s.signedUrl,{method:"PUT",body:e})}))}kt=new WeakSet,St=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Xt extends c{constructor(t){super(t),xt.add(this),this.uploadFile=Jt}list(t){return this.request("/zambda","get",n(this,xt,"m",Ut).bind(this))(t)}create(t,e){return this.request("/zambda","post",n(this,xt,"m",Ut).bind(this))(t,e)}get(t,e){return this.request("/zambda/{id}","get",n(this,xt,"m",Ut).bind(this))(t,e)}update(t,e){return this.request("/zambda/{id}","patch",n(this,xt,"m",Ut).bind(this))(t,e)}delete(t,e){return this.request("/zambda/{id}","delete",n(this,xt,"m",Ut).bind(this))(t,e)}execute(t,e){return this.request("/zambda/{id}/execute","post",n(this,xt,"m",Ut).bind(this))(t,e)}executePublic(t,e){return this.request("/zambda/{id}/execute-public","post",n(this,xt,"m",Ut).bind(this))(t,e)}s3Upload(t,e){return this.request("/zambda/{id}/s3-upload","post",n(this,xt,"m",Ut).bind(this))(t,e)}}xt=new WeakSet,Ut=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};class Zt extends c{constructor(t){super(t),Ot.add(this)}list(t,e){return this.request("/zambda/{id}/logStream","post",n(this,Ot,"m",Et).bind(this))(t,e)}search(t,e){return this.request("/zambda/{id}/logStream/search","post",n(this,Ot,"m",Et).bind(this))(t,e)}get(t,e){return this.request("/zambda/{id}/logStream/{logStreamName}","post",n(this,Ot,"m",Et).bind(this))(t,e)}}Ot=new WeakSet,Et=function(){var t,e;return null!==(e=null===(t=this.config.services)||void 0===t?void 0:t.projectApiUrl)&&void 0!==e?e:"https://project-api.zapehr.com/v1"};let Kt=class{constructor(t){var e,i,s,r,n,o;this.config=t,null!==(e=(r=this.config).services)&&void 0!==e||(r.services={}),null!==(i=(n=this.config.services).projectApiUrl)&&void 0!==i||(n.projectApiUrl=t.projectApiUrl),null!==(s=(o=this.config.services).fhirApiUrl)&&void 0!==s||(o.fhirApiUrl=t.fhirApiUrl),this.application=new f(t),this.developer=new R(t),this.m2m=new At(t),this.messaging=new It(t),this.conversation=new P(t),this.transactionalSMS=new _t(t),this.paymentMethod=new Pt(t),this.charge=new g(t),this.project=new Rt(t),this.rcm=new Nt(t),this.erxV1=new W(t),this.erxV2=new $(t),this.role=new Wt(t),this.secret=new $t(t),this.telemed=new Ct(t),this.user=new Lt(t),this.version=new Mt(t),this.z3=new Bt(t),this.zambda=new Xt(t),this.zambdaLogStream=new Zt(t),this.fax=new C(t),this.lab=new zt(t),this.erx=new N(t),this.fhir=new Tt(t)}};class Qt extends Kt{}Qt.OystehrFHIRError=s,Qt.OystehrSdkError=e;export{Qt as default};
1
+ import{v4 as e}from"uuid";class t extends Error{code;constructor({message:e,code:s,cause:r}){super(e,{cause:r}),Object.setPrototypeOf(this,t.prototype),this.code=s,this.name="OystehrSdkError"}toString(){return`${this.name}: ${this.message} (code: ${this.code})`}toJSON(){return{name:this.name,message:this.message,code:this.code,cause:this.cause}}}function s(e){const t=[];for(const s of e.issue??[])s.details&&s.details.text&&t.push(s.details.text);return t.length||t.push("Unknown FHIR error"),t.join(",")}class r extends t{cause;constructor({error:e,code:t}){super({message:s(e),code:t}),Object.setPrototypeOf(this,r.prototype),this.cause=e,this.name="OystehrFHIRError"}toJSON(){return{name:this.name,message:this.message,code:this.code,cause:this.cause}}}const i=[408,429,500,502,503,504],n=["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT","UND_ERR_CONNECT_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_SOCKET"];class h{config;constructor(e){this.config=e}request(e,s,r){return async(i,n)=>{const h=()=>this.config;try{return await o(r,h,e,s)(i,n)}catch(e){const s=e;throw new t({message:s.message,code:s.code,cause:s.cause})}}}fhirRequest(e,s){return async(i,n)=>{try{const t=()=>this.config.services?.fhirApiUrl??"https://fhir-api.zapehr.com",r=()=>this.config;return await o(t,r,e,s)(i,n)}catch(e){const s=e;if("string"==typeof s.message)throw new t({message:s.message,code:s.code,cause:s.cause});throw new r({error:s.message,code:s.code})}}}}function a(e){return"accessToken"in e}function o(s,r,h,o){return async(c,p)=>{const l=c&&!p&&!Array.isArray(c)&&a(c)?{}:c??{},d=c&&!p&&!Array.isArray(c)&&a(c)?c:p,b=o.toLowerCase(),m=r(),g=m.fetch??fetch,U=d?.accessToken??m.accessToken,f=d?.projectId??r().projectId;let T=h,k=l;if(!Array.isArray(l)){const[e,s]=function(e,s){const r={...s},i=e.replace(/\{([^}]+)\}/g,((e,i)=>{if(delete r[i],i.match(/^.*\+$/))return s[i]+"";if(!s[i]||""===s[i])throw new t({message:`Required path parameter is an empty string: ${i}`,code:400});return s[i]?encodeURIComponent(s[i]+""):""})),n=Object.keys(r),h=n.length?n.reduce(((e,t)=>({...e,[t]:r[t]})),{}):{};return[i,h]}(h,l);T=e,k=s}T=T.replace(/^\//,"");const y=s(),q=y.endsWith("/")?y:y+"/",v=new URL(T,q);let j;if(Array.isArray(k))j=JSON.stringify(k);else if(Object.keys(k).length)if("get"===b)u(k,v.searchParams);else if("application/x-www-form-urlencoded"===d?.contentType){const e=new URLSearchParams;u(k,e),j=e.toString()}else j=JSON.stringify(k);else"application/x-www-form-urlencoded"!==d?.contentType&&"post"===b&&(j="{}");const w=Object.assign(f?{"x-zapehr-project-id":f,"x-oystehr-project-id":f}:{},{"content-type":d?.contentType??"application/json"},U?{Authorization:`Bearer ${U}`}:{},d?.ifMatch?{"If-Match":d.ifMatch}:{},{"x-oystehr-request-id":d?.requestId??e()}),x={retries:m.retry?.retries??3,jitter:m.retry?.jitter??20,delay:m.retry?.delay??100,onRetry:m.retry?.onRetry,retryOn:[...m.retry?.retryOn??[],...i]};return x.retryOn.push(...i),async function(e,t){let s;for(const r of Array.from({length:(t.retries??0)+1},((e,t)=>t)))try{return await e(r)}catch(e){let i=!1;if("response"in e){const r=e;i=t.retryOn.includes(r.code),s={message:e.message,code:e.code}}else if(s=e,"code"in e&&"string"==typeof e.code){const t=e;i=n.includes(t.code)}if(!i)break;const h=Math.floor(Math.random()*(t.jitter+1));await new Promise((e=>setTimeout(e,t.delay+h))),t.onRetry&&r!==(t.retries??0)&&t.onRetry(r+1)}throw s}((async()=>{const e=await g(new Request(v,{method:b.toUpperCase(),body:j,headers:w})),t=e.body?await e.text():null;let s;try{s=t&&(e.headers.get("content-type")?.includes("application/json")||e.headers.get("content-type")?.includes("application/fhir+json"))?JSON.parse(t):null}catch(e){s=null}if(!e.ok||e.status>=400){throw{message:s?.output?.message??s?.message??s??t??e.statusText,code:s?.output?.code??s?.code??e.status,response:e}}return s}),x)}}function u(e,t){for(const[s,r]of Object.entries(e))Array.isArray(r)?r.forEach((e=>t.append(s,e))):t.append(s,r)}class c extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}list(e){return this.request("/application","get",this.#e.bind(this))(e)}create(e,t){return this.request("/application","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/application/{id}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/application/{id}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/application/{id}","delete",this.#e.bind(this))(e,t)}rotateSecret(e,t){return this.request("/application/{id}/rotate-secret","post",this.#e.bind(this))(e,t)}revokeRefreshToken(e,t){return this.request("/application/{id}/revoke-refresh-token","post",this.#e.bind(this))(e,t)}revokeAccessToken(e,t){return this.request("/application/{id}/revoke-access-token","post",this.#e.bind(this))(e,t)}}class p extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}issue(e,t){return this.request("/payment/charge/issue","post",this.#e.bind(this))(e,t)}status(e,t){return this.request("/payment/charge/status","post",this.#e.bind(this))(e,t)}}const l="https://extensions.fhir.zapehr.com/encounter-virtual-service-pre-release",d="addressString";function b(e){if(function(e){return Object.hasOwn(e,"virtualService")}(e)){const t=e.virtualService?.find((e=>"https://fhir.zapehr.com/virtual-service-type"===e.channelType?.system));return t?.addressString}if(!e.extension)return;const t=e.extension.find((e=>e.url===l));if(!t?.extension)return;const s=t.extension?.find((e=>e.url===d))?.valueString;return s}class m extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}ENCOUNTER_VS_EXTENSION_URL=l;ENCOUNTER_VS_EXTENSION_RELATIVE_URL=d;getConversationIdFromEncounter=b;create(e,t){return this.request("/messaging/conversation","post",this.#e.bind(this))(e,t)}getToken(e){return this.request("/messaging/conversation/token","get",this.#e.bind(this))(e)}addParticipant(e,t){return this.request("/messaging/conversation/{conversationId}/participant","post",this.#e.bind(this))(e,t)}removeParticipant(e,t){return this.request("/messaging/conversation/{conversationId}/participant","delete",this.#e.bind(this))(e,t)}message(e,t){return this.request("/messaging/conversation/{conversationId}/message","post",this.#e.bind(this))(e,t)}}class g extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}get(e,t){return this.request("/developer/{id}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/developer/{id}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/developer/{id}","delete",this.#e.bind(this))(e,t)}invite(e,t){return this.request("/developer/invite","post",this.#e.bind(this))(e,t)}list(e){return this.request("/developer","get",this.#e.bind(this))(e)}listV2(e,t){return this.request("/developer/v2/list","get",this.#e.bind(this))(e,t)}}class U extends h{constructor(e){super(e)}#e(){return this.config.services?.erxApiUrl??"https://erx-api.zapehr.com/v3"}searchAllergens(e,t){return this.request("/allergen","get",this.#e.bind(this))(e,t)}searchMedications(e,t){return this.request("/medication","get",this.#e.bind(this))(e,t)}getConfiguration(e){return this.request("/config","get",this.#e.bind(this))(e)}checkAllergyInteractions(e,t){return this.request("/patient/{patientId}/interactions/allergy","get",this.#e.bind(this))(e,t)}checkMedicationInteractions(e,t){return this.request("/patient/{patientId}/interactions/medication","get",this.#e.bind(this))(e,t)}checkPrecheckInteractions(e,t){return this.request("/patient/{patientId}/interactions/precheck/{drugId}","get",this.#e.bind(this))(e,t)}cancelPrescription(e,t){return this.request("/patient/{patientId}/prescriptions/{medicationRequestId}","delete",this.#e.bind(this))(e,t)}syncPatient(e,t){return this.request("/patient/{patientId}/sync","post",this.#e.bind(this))(e,t)}connectPractitioner(e,t){return this.request("/practitioner/connect","get",this.#e.bind(this))(e,t)}checkPractitionerEnrollment(e,t){return this.request("/practitioner/{practitionerId}","get",this.#e.bind(this))(e,t)}enrollPractitioner(e,t){return this.request("/practitioner/{practitionerId}","post",this.#e.bind(this))(e,t)}unenrollPractitioner(e,t){return this.request("/practitioner/{practitionerId}","delete",this.#e.bind(this))(e,t)}}class f extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}syncPatient(e,t){return this.request("/erx/sync-patient/{patientId}","post",this.#e.bind(this))(e,t)}allergySearch(e,t){return this.request("/erx/allergy/search","get",this.#e.bind(this))(e,t)}cancelOrder(e,t){return this.request("/erx/cancel-order","post",this.#e.bind(this))(e,t)}cancelPrescription(e,t){return this.request("/erx/cancel-prescription","post",this.#e.bind(this))(e,t)}medicationSearch(e,t){return this.request("/erx/medication/search","get",this.#e.bind(this))(e,t)}}class T extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}medicationSearch(e,t){return this.request("/erx/v2/medication/search","get",this.#e.bind(this))(e,t)}}class k extends h{constructor(e){super(e)}#e(){return this.config.services?.faxApiUrl??"https://fax-api.zapehr.com/v1"}offboard(e){return this.request("/offboard","post",this.#e.bind(this))(e)}onboard(e){return this.request("/onboard","post",this.#e.bind(this))(e)}send(e,t){return this.request("/send","post",this.#e.bind(this))(e,t)}}async function y(e,t){const{resourceType:s,params:r}=e;let i;r&&(i=Object.entries(r).reduce(((e,[t,s])=>(e[s.name]||(e[s.name]=[]),e[s.name].push(s.value),e)),{}));const n=await this.fhirRequest(`/${s}/_search`,"POST")(i,{...t,contentType:"application/x-www-form-urlencoded"});return{...n,entry:n.entry,unbundle:function(){return this.entry?.map((e=>e.resource)).filter((e=>void 0!==e))??[]}}}async function q(e,t){const{resourceType:s}=e;return this.fhirRequest(`/${s}`,"POST")(e,t)}async function v({resourceType:e,id:t},s){return this.fhirRequest(`/${e}/${t}`,"GET")({},s)}async function j(e,t){const{id:s,resourceType:r}=e;return this.fhirRequest(`/${r}/${s}`,"PUT")(e,{...t,ifMatch:t?.optimisticLockingVersionId?`W/"${t.optimisticLockingVersionId}"`:void 0})}async function w({resourceType:e,id:t,operations:s},r){return this.fhirRequest(`/${e}/${t}`,"PATCH")(s,{...r,contentType:"application/json-patch+json",ifMatch:r?.optimisticLockingVersionId?`W/"${r.optimisticLockingVersionId}"`:void 0})}async function x({resourceType:e,id:t},s){return this.fhirRequest(`/${e}/${t}`,"DELETE")({},s)}async function z({resourceType:e,id:t,versionId:s},r){return this.fhirRequest(`/${e}/${t}/_history${s?`/${s}`:""}`,"GET")({},r)}function A(e){const{method:t,url:s}=e,r={request:{method:t,url:s}};if(s.split("?").length>1){const[e,t]=s.split("?"),i=t.split("&").map((e=>{const[t,s]=e.split("=");return{name:t,value:s}})).reduce(((e,{name:t,value:s})=>t?(e[t]||(e[t]=[]),e[t].push(s),e):e),{}),n=new URLSearchParams;u(i,n),r.request.url=`${e}?${n.toString()}`}if(["GET","DELETE","HEAD"].includes(t))return r;if("PUT"===t){const{resource:t}=e;return{...r,resource:t}}if("PATCH"===t)return"resource"in e?{...r,resource:e.resource}:{...r,resource:{resourceType:"Binary",contentType:"application/json-patch+json",data:Buffer.from(JSON.stringify(e.operations),"utf8").toString("base64")}};if("POST"===t){const{resource:t,fullUrl:s}=e;return{...r,resource:t,fullUrl:s}}throw new Error("Unrecognized method")}function E(e){return async function(t,s){return this.fhirRequest("/","POST")({resourceType:"Bundle",type:e,entry:t.requests.map(A)},s)}}const S=E("batch"),I=E("transaction");function P(e,t){const s=[];if(e.line&&s.push(...e.line),e.city||e.state||e.postalCode){const t=[];e.city&&t.push(e.city),e.state&&t.push(e.state),e.postalCode&&t.push(e.postalCode),s.push(t.join(", "))}return e.use&&(t?.all||t?.use)&&s.push("["+e.use+"]"),s.join(t?.lineSeparator||", ").trim()}function O(e,t){const s=[];return e.prefix&&!1!==t?.prefix&&s.push(...e.prefix),e.given&&s.push(...e.given),e.family&&s.push(e.family),e.suffix&&!1!==t?.suffix&&s.push(...e.suffix),e.use&&(t?.all||t?.use)&&s.push("["+e.use+"]"),s.join(" ").trim()}class R extends h{constructor(e){super(e)}#e(){return this.config.services?.fhirApiUrl??"https://fhir-api.zapehr.com"}search=y;create=q;get=v;update=j;patch=w;delete=x;history=z;batch=S;transaction=I;formatAddress=P;formatHumanName=O}class N extends h{constructor(e){super(e)}#e(){return this.config.services?.labApiUrl??"https://labs-api.zapehr.com/v1"}routeList(e){return this.request("/route","get",this.#e.bind(this))(e)}routeCreate(e,t){return this.request("/route","post",this.#e.bind(this))(e,t)}routeDelete(e,t){return this.request("/route/{routeGuid}","delete",this.#e.bind(this))(e,t)}orderableItemList(e,t){return this.request("/orderableItem","get",this.#e.bind(this))(e,t)}orderableItemQuestionnaireGet(e,t){return this.request("/canonical-questionnaire/lab/{labGuid}/compendium/{compendiumVersion}/item/{itemCode}/questionnaire","get",this.#e.bind(this))(e,t)}orderSubmit(e,t){return this.request("/submit","post",this.#e.bind(this))(e,t)}}class $ extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}list(e){return this.request("/m2m","get",this.#e.bind(this))(e)}create(e,t){return this.request("/m2m","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/m2m/{id}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/m2m/{id}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/m2m/{id}","delete",this.#e.bind(this))(e,t)}rotateSecret(e,t){return this.request("/m2m/{id}/rotate-secret","post",this.#e.bind(this))(e,t)}listV2(e,t){return this.request("/m2m/v2/list","get",this.#e.bind(this))(e,t)}}class C extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}getMessagingConfig(e){return this.request("/messaging/config","get",this.#e.bind(this))(e)}}class M extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}setUp(e,t){return this.request("/payment/payment-method/setup","post",this.#e.bind(this))(e,t)}setDefault(e,t){return this.request("/payment/payment-method/set-default","post",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/payment/payment-method","delete",this.#e.bind(this))(e,t)}list(e,t){return this.request("/payment/payment-method/list","post",this.#e.bind(this))(e,t)}}class _ extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}get(e){return this.request("/project","get",this.#e.bind(this))(e)}update(e,t){return this.request("/project","patch",this.#e.bind(this))(e,t)}}class L extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}eligibilityCheck(e,t){return this.request("/rcm/eligibility-check","post",this.#e.bind(this))(e,t)}validateProfessionalClaim(e,t){return this.request("/rcm/professional-claim/validate","post",this.#e.bind(this))(e,t)}submitProfessionalClaim(e,t){return this.request("/rcm/professional-claim/submit","post",this.#e.bind(this))(e,t)}}class V extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}list(e){return this.request("/iam/role","get",this.#e.bind(this))(e)}create(e,t){return this.request("/iam/role","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/iam/role/{roleId}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/iam/role/{roleId}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/iam/role/{roleId}","delete",this.#e.bind(this))(e,t)}}class D extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}list(e){return this.request("/secret","get",this.#e.bind(this))(e)}set(e,t){return this.request("/secret","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/secret/{name}","get",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/secret/{name}","delete",this.#e.bind(this))(e,t)}}class F extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}createMeeting(e,t){return this.request("/telemed/v2/meeting","post",this.#e.bind(this))(e,t)}joinMeeting(e,t){return this.request("/telemed/v2/meeting/{encounterId}/join","get",this.#e.bind(this))(e,t)}}class H extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}send(e,t){return this.request("/messaging/transactional-sms/send","post",this.#e.bind(this))(e,t)}}class B extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}me(e){return this.request("/user/me","get",this.#e.bind(this))(e)}get(e,t){return this.request("/user/{id}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/user/{id}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/user/{id}","delete",this.#e.bind(this))(e,t)}invite(e,t){return this.request("/user/invite","post",this.#e.bind(this))(e,t)}list(e){return this.request("/user","get",this.#e.bind(this))(e)}listV2(e,t){return this.request("/user/v2/list","get",this.#e.bind(this))(e,t)}}class G extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}get(e){return this.request("/version","get",this.#e.bind(this))(e)}}function J(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}async function W({bucketName:e,"objectPath+":t,file:s}){const r=await this.request("/z3/{bucketName}/{objectPath+}","post",J.bind(this))({action:"upload",bucketName:e,"objectPath+":t});await fetch(r.signedUrl,{method:"PUT",body:s})}async function X({bucketName:e,"objectPath+":t}){const s=await this.request("/z3/{bucketName}/{objectPath+}","post",J.bind(this))({action:"download",bucketName:e,"objectPath+":t}),r=await fetch(s.signedUrl,{method:"GET"});if(!r.ok)throw new Error("Failed to download file");return r.arrayBuffer()}async function Z(e){let s,r;const i=new URL(e.url);if("z3:"===i.protocol){const e=i.pathname.split("/").slice(1);s=i.hostname,r=e.join("/")}else{if(!i.href.startsWith(this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"))throw new t({message:"Invalid Z3 URL",code:400});{const e=i.pathname.split("/").slice(3);s=e[0],r=e.slice(1).join("/")}}const n={action:"upload",bucketName:s,"objectPath+":r};return this.request("/z3/{bucketName}/{objectPath+}","post",J.bind(this))(n)}class K extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}uploadFile=W;downloadFile=X;getPresignedUrlForZ3Url=Z;listBuckets(e){return this.request("/z3","get",this.#e.bind(this))(e)}createBucket(e,t){return this.request("/z3/{bucketName}","put",this.#e.bind(this))(e,t)}deleteBucket(e,t){return this.request("/z3/{bucketName}","delete",this.#e.bind(this))(e,t)}listObjects(e,t){return this.request("/z3/{bucketName}/{objectPath+}","get",this.#e.bind(this))(e,t)}getPresignedUrl(e,t){return this.request("/z3/{bucketName}/{objectPath+}","post",this.#e.bind(this))(e,t)}deleteObject(e,t){return this.request("/z3/{bucketName}/{objectPath+}","delete",this.#e.bind(this))(e,t)}}function Q(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}async function Y({id:e,file:t,filename:s}){const r=await this.request("/zambda/{id}/s3-upload","post",Q.bind(this))({id:e,filename:s});await fetch(r.signedUrl,{method:"PUT",body:t})}class ee extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}uploadFile=Y;list(e){return this.request("/zambda","get",this.#e.bind(this))(e)}create(e,t){return this.request("/zambda","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/zambda/{id}","get",this.#e.bind(this))(e,t)}update(e,t){return this.request("/zambda/{id}","patch",this.#e.bind(this))(e,t)}delete(e,t){return this.request("/zambda/{id}","delete",this.#e.bind(this))(e,t)}execute(e,t){return this.request("/zambda/{id}/execute","post",this.#e.bind(this))(e,t)}executePublic(e,t){return this.request("/zambda/{id}/execute-public","post",this.#e.bind(this))(e,t)}s3Upload(e,t){return this.request("/zambda/{id}/s3-upload","post",this.#e.bind(this))(e,t)}}class te extends h{constructor(e){super(e)}#e(){return this.config.services?.projectApiUrl??"https://project-api.zapehr.com/v1"}list(e,t){return this.request("/zambda/{id}/logStream","post",this.#e.bind(this))(e,t)}search(e,t){return this.request("/zambda/{id}/logStream/search","post",this.#e.bind(this))(e,t)}get(e,t){return this.request("/zambda/{id}/logStream/{logStreamName}","post",this.#e.bind(this))(e,t)}}let se=class{config;application;developer;m2m;messaging;conversation;transactionalSMS;paymentMethod;charge;project;rcm;erxV1;erxV2;role;secret;telemed;user;version;z3;zambda;zambdaLogStream;fax;lab;erx;fhir;constructor(e){this.config=e,this.config.services??={},this.config.services.projectApiUrl??=e.projectApiUrl,this.config.services.fhirApiUrl??=e.fhirApiUrl,this.application=new c(e),this.developer=new g(e),this.m2m=new $(e),this.messaging=new C(e),this.conversation=new m(e),this.transactionalSMS=new H(e),this.paymentMethod=new M(e),this.charge=new p(e),this.project=new _(e),this.rcm=new L(e),this.erxV1=new f(e),this.erxV2=new T(e),this.role=new V(e),this.secret=new D(e),this.telemed=new F(e),this.user=new B(e),this.version=new G(e),this.z3=new K(e),this.zambda=new ee(e),this.zambdaLogStream=new te(e),this.fax=new k(e),this.lab=new N(e),this.erx=new U(e),this.fhir=new R(e)}};class re extends se{static OystehrFHIRError=r;static OystehrSdkError=t}export{re as default};
2
2
  //# sourceMappingURL=index.min.js.map