@medplum/core 0.9.23 → 0.9.26

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 (78) hide show
  1. package/dist/cjs/index.js +12 -0
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/index.min.js +1 -1
  4. package/dist/cjs/index.min.js.map +1 -1
  5. package/dist/esm/base-schema.json.js +4872 -0
  6. package/dist/esm/base-schema.json.js.map +1 -0
  7. package/dist/{types → esm}/cache.d.ts +0 -0
  8. package/dist/esm/cache.js +70 -0
  9. package/dist/esm/cache.js.map +1 -0
  10. package/dist/{types → esm}/client.d.ts +0 -0
  11. package/dist/esm/client.js +1450 -0
  12. package/dist/esm/client.js.map +1 -0
  13. package/dist/{types → esm}/crypto.d.ts +0 -0
  14. package/dist/esm/crypto.js +23 -0
  15. package/dist/esm/crypto.js.map +1 -0
  16. package/dist/{types → esm}/eventtarget.d.ts +0 -0
  17. package/dist/esm/eventtarget.js +41 -0
  18. package/dist/esm/eventtarget.js.map +1 -0
  19. package/dist/{types → esm}/fhirpath/atoms.d.ts +0 -0
  20. package/dist/esm/fhirpath/atoms.js +329 -0
  21. package/dist/esm/fhirpath/atoms.js.map +1 -0
  22. package/dist/{types → esm}/fhirpath/date.d.ts +0 -0
  23. package/dist/esm/fhirpath/date.js +24 -0
  24. package/dist/esm/fhirpath/date.js.map +1 -0
  25. package/dist/{types → esm}/fhirpath/functions.d.ts +0 -0
  26. package/dist/esm/fhirpath/functions.js +1503 -0
  27. package/dist/esm/fhirpath/functions.js.map +1 -0
  28. package/dist/{types → esm}/fhirpath/index.d.ts +0 -0
  29. package/dist/{types → esm}/fhirpath/parse.d.ts +0 -0
  30. package/dist/esm/fhirpath/parse.js +258 -0
  31. package/dist/esm/fhirpath/parse.js.map +1 -0
  32. package/dist/{types → esm}/fhirpath/tokenize.d.ts +0 -0
  33. package/dist/esm/fhirpath/tokenize.js +185 -0
  34. package/dist/esm/fhirpath/tokenize.js.map +1 -0
  35. package/dist/{types → esm}/fhirpath/utils.d.ts +0 -0
  36. package/dist/esm/fhirpath/utils.js +372 -0
  37. package/dist/esm/fhirpath/utils.js.map +1 -0
  38. package/dist/{types → esm}/format.d.ts +0 -0
  39. package/dist/esm/format.js +51 -0
  40. package/dist/esm/format.js.map +1 -0
  41. package/dist/{types → esm}/hl7.d.ts +0 -0
  42. package/dist/esm/hl7.js +111 -0
  43. package/dist/esm/hl7.js.map +1 -0
  44. package/dist/{types → esm}/index.d.ts +0 -0
  45. package/dist/esm/index.js +15 -10752
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/index.min.js +1 -1
  48. package/dist/esm/index.min.js.map +1 -1
  49. package/dist/{types → esm}/jwt.d.ts +0 -0
  50. package/dist/esm/jwt.js +35 -0
  51. package/dist/esm/jwt.js.map +1 -0
  52. package/dist/esm/node_modules/tslib/tslib.es6.js +40 -0
  53. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -0
  54. package/dist/{types → esm}/outcomes.d.ts +0 -0
  55. package/dist/esm/outcomes.js +151 -0
  56. package/dist/esm/outcomes.js.map +1 -0
  57. package/dist/{types → esm}/readablepromise.d.ts +0 -0
  58. package/dist/esm/readablepromise.js +87 -0
  59. package/dist/esm/readablepromise.js.map +1 -0
  60. package/dist/{types → esm}/search.d.ts +0 -0
  61. package/dist/esm/search.js +207 -0
  62. package/dist/esm/search.js.map +1 -0
  63. package/dist/{types → esm}/searchparams.d.ts +0 -0
  64. package/dist/esm/searchparams.js +145 -0
  65. package/dist/esm/searchparams.js.map +1 -0
  66. package/dist/{types → esm}/storage.d.ts +0 -0
  67. package/dist/esm/storage.js +94 -0
  68. package/dist/esm/storage.js.map +1 -0
  69. package/dist/{types → esm}/types.d.ts +0 -0
  70. package/dist/esm/types.js +223 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/dist/{types → esm}/utils.d.ts +8 -0
  73. package/dist/esm/utils.js +590 -0
  74. package/dist/esm/utils.js.map +1 -0
  75. package/package.json +5 -5
  76. package/stats.html +4034 -0
  77. package/tsconfig.cjs.json +7 -0
  78. package/tsconfig.esm.json +7 -0
File without changes
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Decodes a section of a JWT.
3
+ * See: https://tools.ietf.org/html/rfc7519
4
+ * @param payload
5
+ */
6
+ function decodePayload(payload) {
7
+ const cleanedPayload = payload.replace(/-/g, '+').replace(/_/g, '/');
8
+ const decodedPayload = decodeBase64(cleanedPayload);
9
+ const uriEncodedPayload = Array.from(decodedPayload).reduce((acc, char) => {
10
+ const uriEncodedChar = ('00' + char.charCodeAt(0).toString(16)).slice(-2);
11
+ return `${acc}%${uriEncodedChar}`;
12
+ }, '');
13
+ const jsonPayload = decodeURIComponent(uriEncodedPayload);
14
+ return JSON.parse(jsonPayload);
15
+ }
16
+ function decodeBase64(data) {
17
+ if (typeof window !== 'undefined') {
18
+ return window.atob(data);
19
+ }
20
+ if (typeof Buffer !== 'undefined') {
21
+ return Buffer.from(data, 'base64').toString('binary');
22
+ }
23
+ throw new Error('Unable to decode base64');
24
+ }
25
+ /**
26
+ * Parses the JWT payload.
27
+ * @param token JWT token
28
+ */
29
+ function parseJWTPayload(token) {
30
+ const [_header, payload, _signature] = token.split('.');
31
+ return decodePayload(payload);
32
+ }
33
+
34
+ export { parseJWTPayload };
35
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sources":["../../src/jwt.ts"],"sourcesContent":["/**\n * Decodes a section of a JWT.\n * See: https://tools.ietf.org/html/rfc7519\n * @param payload\n */\nfunction decodePayload(payload: string): Record<string, number | string> {\n const cleanedPayload = payload.replace(/-/g, '+').replace(/_/g, '/');\n const decodedPayload = decodeBase64(cleanedPayload);\n const uriEncodedPayload = Array.from(decodedPayload).reduce((acc, char) => {\n const uriEncodedChar = ('00' + char.charCodeAt(0).toString(16)).slice(-2);\n return `${acc}%${uriEncodedChar}`;\n }, '');\n const jsonPayload = decodeURIComponent(uriEncodedPayload);\n return JSON.parse(jsonPayload);\n}\n\nfunction decodeBase64(data: string): string {\n if (typeof window !== 'undefined') {\n return window.atob(data);\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(data, 'base64').toString('binary');\n }\n throw new Error('Unable to decode base64');\n}\n\n/**\n * Parses the JWT payload.\n * @param token JWT token\n */\nexport function parseJWTPayload(token: string): Record<string, number | string> {\n const [_header, payload, _signature] = token.split('.');\n return decodePayload(payload);\n}\n"],"names":[],"mappings":"AAAA;;;;AAIG;AACH,SAAS,aAAa,CAAC,OAAe,EAAA;AACpC,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrE,IAAA,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AACpD,IAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;QACxE,MAAM,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,QAAA,OAAO,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,cAAc,EAAE,CAAC;KACnC,EAAE,EAAE,CAAC,CAAC;AACP,IAAA,MAAM,WAAW,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAC1D,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAA;AAChC,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,KAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvD,KAAA;AACD,IAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC;AAED;;;AAGG;AACG,SAAU,eAAe,CAAC,KAAa,EAAA;AAC3C,IAAA,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxD,IAAA,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC;;;;"}
@@ -0,0 +1,40 @@
1
+ /******************************************************************************
2
+ Copyright (c) Microsoft Corporation.
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any
5
+ purpose with or without fee is hereby granted.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13
+ PERFORMANCE OF THIS SOFTWARE.
14
+ ***************************************************************************** */
15
+
16
+ function __awaiter(thisArg, _arguments, P, generator) {
17
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
+ return new (P || (P = Promise))(function (resolve, reject) {
19
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
23
+ });
24
+ }
25
+
26
+ function __classPrivateFieldGet(receiver, state, kind, f) {
27
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
28
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
29
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
30
+ }
31
+
32
+ function __classPrivateFieldSet(receiver, state, value, kind, f) {
33
+ if (kind === "m") throw new TypeError("Private method is not writable");
34
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
35
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
36
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
37
+ }
38
+
39
+ export { __awaiter, __classPrivateFieldGet, __classPrivateFieldSet };
40
+ //# sourceMappingURL=tslib.es6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tslib.es6.js","sources":["../../../../../../node_modules/tslib/tslib.es6.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,151 @@
1
+ const OK_ID = 'ok';
2
+ const CREATED_ID = 'created';
3
+ const GONE_ID = 'gone';
4
+ const NOT_MODIFIED_ID = 'not-modified';
5
+ const NOT_FOUND_ID = 'not-found';
6
+ const ACCESS_DENIED = 'access-denied';
7
+ const allOk = {
8
+ resourceType: 'OperationOutcome',
9
+ id: OK_ID,
10
+ issue: [
11
+ {
12
+ severity: 'information',
13
+ code: 'information',
14
+ details: {
15
+ text: 'All OK',
16
+ },
17
+ },
18
+ ],
19
+ };
20
+ const created = {
21
+ resourceType: 'OperationOutcome',
22
+ id: CREATED_ID,
23
+ issue: [
24
+ {
25
+ severity: 'information',
26
+ code: 'information',
27
+ details: {
28
+ text: 'Created',
29
+ },
30
+ },
31
+ ],
32
+ };
33
+ const notModified = {
34
+ resourceType: 'OperationOutcome',
35
+ id: NOT_MODIFIED_ID,
36
+ issue: [
37
+ {
38
+ severity: 'information',
39
+ code: 'information',
40
+ details: {
41
+ text: 'Not Modified',
42
+ },
43
+ },
44
+ ],
45
+ };
46
+ const notFound = {
47
+ resourceType: 'OperationOutcome',
48
+ id: NOT_FOUND_ID,
49
+ issue: [
50
+ {
51
+ severity: 'error',
52
+ code: 'not-found',
53
+ details: {
54
+ text: 'Not found',
55
+ },
56
+ },
57
+ ],
58
+ };
59
+ const gone = {
60
+ resourceType: 'OperationOutcome',
61
+ id: GONE_ID,
62
+ issue: [
63
+ {
64
+ severity: 'error',
65
+ code: 'gone',
66
+ details: {
67
+ text: 'Gone',
68
+ },
69
+ },
70
+ ],
71
+ };
72
+ const accessDenied = {
73
+ resourceType: 'OperationOutcome',
74
+ id: ACCESS_DENIED,
75
+ issue: [
76
+ {
77
+ severity: 'error',
78
+ code: 'access-denied',
79
+ details: {
80
+ text: 'Access Denied',
81
+ },
82
+ },
83
+ ],
84
+ };
85
+ function badRequest(details, expression) {
86
+ return {
87
+ resourceType: 'OperationOutcome',
88
+ issue: [
89
+ {
90
+ severity: 'error',
91
+ code: 'invalid',
92
+ details: {
93
+ text: details,
94
+ },
95
+ expression: expression ? [expression] : undefined,
96
+ },
97
+ ],
98
+ };
99
+ }
100
+ function isOk(outcome) {
101
+ return outcome.id === OK_ID || outcome.id === CREATED_ID || outcome.id === NOT_MODIFIED_ID;
102
+ }
103
+ function isNotFound(outcome) {
104
+ return outcome.id === NOT_FOUND_ID;
105
+ }
106
+ function isGone(outcome) {
107
+ return outcome.id === GONE_ID;
108
+ }
109
+ function getStatus(outcome) {
110
+ if (outcome.id === OK_ID) {
111
+ return 200;
112
+ }
113
+ else if (outcome.id === CREATED_ID) {
114
+ return 201;
115
+ }
116
+ else if (outcome.id === NOT_MODIFIED_ID) {
117
+ return 304;
118
+ }
119
+ else if (outcome.id === ACCESS_DENIED) {
120
+ return 403;
121
+ }
122
+ else if (outcome.id === NOT_FOUND_ID) {
123
+ return 404;
124
+ }
125
+ else if (outcome.id === GONE_ID) {
126
+ return 410;
127
+ }
128
+ else {
129
+ return 400;
130
+ }
131
+ }
132
+ /**
133
+ * Asserts that the operation completed successfully and that the resource is defined.
134
+ * @param outcome The operation outcome.
135
+ * @param resource The resource that may or may not have been returned.
136
+ */
137
+ function assertOk(outcome, resource) {
138
+ if (!isOk(outcome) || resource === undefined) {
139
+ throw new OperationOutcomeError(outcome);
140
+ }
141
+ }
142
+ class OperationOutcomeError extends Error {
143
+ constructor(outcome) {
144
+ var _a, _b;
145
+ super((_b = (_a = outcome === null || outcome === void 0 ? void 0 : outcome.issue) === null || _a === void 0 ? void 0 : _a[0].details) === null || _b === void 0 ? void 0 : _b.text);
146
+ this.outcome = outcome;
147
+ }
148
+ }
149
+
150
+ export { OperationOutcomeError, accessDenied, allOk, assertOk, badRequest, created, getStatus, gone, isGone, isNotFound, isOk, notFound, notModified };
151
+ //# sourceMappingURL=outcomes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcomes.js","sources":["../../src/outcomes.ts"],"sourcesContent":["import { OperationOutcome } from '@medplum/fhirtypes';\n\nconst OK_ID = 'ok';\nconst CREATED_ID = 'created';\nconst GONE_ID = 'gone';\nconst NOT_MODIFIED_ID = 'not-modified';\nconst NOT_FOUND_ID = 'not-found';\nconst ACCESS_DENIED = 'access-denied';\n\nexport const allOk: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: OK_ID,\n issue: [\n {\n severity: 'information',\n code: 'information',\n details: {\n text: 'All OK',\n },\n },\n ],\n};\n\nexport const created: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: CREATED_ID,\n issue: [\n {\n severity: 'information',\n code: 'information',\n details: {\n text: 'Created',\n },\n },\n ],\n};\n\nexport const notModified: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: NOT_MODIFIED_ID,\n issue: [\n {\n severity: 'information',\n code: 'information',\n details: {\n text: 'Not Modified',\n },\n },\n ],\n};\n\nexport const notFound: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: NOT_FOUND_ID,\n issue: [\n {\n severity: 'error',\n code: 'not-found',\n details: {\n text: 'Not found',\n },\n },\n ],\n};\n\nexport const gone: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: GONE_ID,\n issue: [\n {\n severity: 'error',\n code: 'gone',\n details: {\n text: 'Gone',\n },\n },\n ],\n};\n\nexport const accessDenied: OperationOutcome = {\n resourceType: 'OperationOutcome',\n id: ACCESS_DENIED,\n issue: [\n {\n severity: 'error',\n code: 'access-denied',\n details: {\n text: 'Access Denied',\n },\n },\n ],\n};\n\nexport function badRequest(details: string, expression?: string): OperationOutcome {\n return {\n resourceType: 'OperationOutcome',\n issue: [\n {\n severity: 'error',\n code: 'invalid',\n details: {\n text: details,\n },\n expression: expression ? [expression] : undefined,\n },\n ],\n };\n}\n\nexport function isOk(outcome: OperationOutcome): boolean {\n return outcome.id === OK_ID || outcome.id === CREATED_ID || outcome.id === NOT_MODIFIED_ID;\n}\n\nexport function isNotFound(outcome: OperationOutcome): boolean {\n return outcome.id === NOT_FOUND_ID;\n}\n\nexport function isGone(outcome: OperationOutcome): boolean {\n return outcome.id === GONE_ID;\n}\n\nexport function getStatus(outcome: OperationOutcome): number {\n if (outcome.id === OK_ID) {\n return 200;\n } else if (outcome.id === CREATED_ID) {\n return 201;\n } else if (outcome.id === NOT_MODIFIED_ID) {\n return 304;\n } else if (outcome.id === ACCESS_DENIED) {\n return 403;\n } else if (outcome.id === NOT_FOUND_ID) {\n return 404;\n } else if (outcome.id === GONE_ID) {\n return 410;\n } else {\n return 400;\n }\n}\n\n/**\n * Asserts that the operation completed successfully and that the resource is defined.\n * @param outcome The operation outcome.\n * @param resource The resource that may or may not have been returned.\n */\nexport function assertOk<T>(outcome: OperationOutcome, resource: T | undefined): asserts resource is T {\n if (!isOk(outcome) || resource === undefined) {\n throw new OperationOutcomeError(outcome);\n }\n}\n\nexport class OperationOutcomeError extends Error {\n readonly outcome: OperationOutcome;\n\n constructor(outcome: OperationOutcome) {\n super(outcome?.issue?.[0].details?.text);\n this.outcome = outcome;\n }\n}\n"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,87 @@
1
+ import { __classPrivateFieldSet, __classPrivateFieldGet } from './node_modules/tslib/tslib.es6.js';
2
+
3
+ var _ReadablePromise_suspender, _ReadablePromise_status, _ReadablePromise_response, _ReadablePromise_error, _a;
4
+ /**
5
+ * The ReadablePromise class wraps a request promise suitable for React Suspense.
6
+ * See: https://blog.logrocket.com/react-suspense-data-fetching/#wrappromise-js
7
+ * See: https://github.com/ovieokeh/suspense-data-fetching/blob/master/lib/api/wrapPromise.js
8
+ */
9
+ class ReadablePromise {
10
+ constructor(requestPromise) {
11
+ this[_a] = 'ReadablePromise';
12
+ _ReadablePromise_suspender.set(this, void 0);
13
+ _ReadablePromise_status.set(this, 'pending');
14
+ _ReadablePromise_response.set(this, void 0);
15
+ _ReadablePromise_error.set(this, void 0);
16
+ __classPrivateFieldSet(this, _ReadablePromise_suspender, requestPromise.then((res) => {
17
+ __classPrivateFieldSet(this, _ReadablePromise_status, 'success', "f");
18
+ __classPrivateFieldSet(this, _ReadablePromise_response, res, "f");
19
+ return res;
20
+ }, (err) => {
21
+ __classPrivateFieldSet(this, _ReadablePromise_status, 'error', "f");
22
+ __classPrivateFieldSet(this, _ReadablePromise_error, err, "f");
23
+ throw err;
24
+ }), "f");
25
+ }
26
+ /**
27
+ * Returns true if the promise is pending.
28
+ * @returns True if the Promise is pending.
29
+ */
30
+ isPending() {
31
+ return __classPrivateFieldGet(this, _ReadablePromise_status, "f") === 'pending';
32
+ }
33
+ /**
34
+ * Returns true if the promise resolved successfully.
35
+ * @returns True if the Promise resolved successfully.
36
+ */
37
+ isOk() {
38
+ return __classPrivateFieldGet(this, _ReadablePromise_status, "f") === 'success';
39
+ }
40
+ /**
41
+ * Attempts to read the value of the promise.
42
+ * If the promise is pending, this method will throw a promise.
43
+ * If the promise rejected, this method will throw the rejection reason.
44
+ * If the promise resolved, this method will return the resolved value.
45
+ * @returns The resolved value of the Promise.
46
+ */
47
+ read() {
48
+ switch (__classPrivateFieldGet(this, _ReadablePromise_status, "f")) {
49
+ case 'pending':
50
+ throw __classPrivateFieldGet(this, _ReadablePromise_suspender, "f");
51
+ case 'error':
52
+ throw __classPrivateFieldGet(this, _ReadablePromise_error, "f");
53
+ default:
54
+ return __classPrivateFieldGet(this, _ReadablePromise_response, "f");
55
+ }
56
+ }
57
+ /**
58
+ * Attaches callbacks for the resolution and/or rejection of the Promise.
59
+ * @param onfulfilled The callback to execute when the Promise is resolved.
60
+ * @param onrejected The callback to execute when the Promise is rejected.
61
+ * @returns A Promise for the completion of which ever callback is executed.
62
+ */
63
+ then(onfulfilled, onrejected) {
64
+ return __classPrivateFieldGet(this, _ReadablePromise_suspender, "f").then(onfulfilled, onrejected);
65
+ }
66
+ /**
67
+ * Attaches a callback for only the rejection of the Promise.
68
+ * @param onrejected The callback to execute when the Promise is rejected.
69
+ * @returns A Promise for the completion of the callback.
70
+ */
71
+ catch(onrejected) {
72
+ return __classPrivateFieldGet(this, _ReadablePromise_suspender, "f").catch(onrejected);
73
+ }
74
+ /**
75
+ * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The
76
+ * resolved value cannot be modified from the callback.
77
+ * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).
78
+ * @returns A Promise for the completion of the callback.
79
+ */
80
+ finally(onfinally) {
81
+ return __classPrivateFieldGet(this, _ReadablePromise_suspender, "f").finally(onfinally);
82
+ }
83
+ }
84
+ _ReadablePromise_suspender = new WeakMap(), _ReadablePromise_status = new WeakMap(), _ReadablePromise_response = new WeakMap(), _ReadablePromise_error = new WeakMap(), _a = Symbol.toStringTag;
85
+
86
+ export { ReadablePromise };
87
+ //# sourceMappingURL=readablepromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readablepromise.js","sources":["../../src/readablepromise.ts"],"sourcesContent":["/**\n * The ReadablePromise class wraps a request promise suitable for React Suspense.\n * See: https://blog.logrocket.com/react-suspense-data-fetching/#wrappromise-js\n * See: https://github.com/ovieokeh/suspense-data-fetching/blob/master/lib/api/wrapPromise.js\n */\nexport class ReadablePromise<T> implements Promise<T> {\n readonly [Symbol.toStringTag]: string = 'ReadablePromise';\n #suspender: Promise<T>;\n #status: 'pending' | 'error' | 'success' = 'pending';\n #response: T | undefined;\n #error: Error | undefined;\n\n constructor(requestPromise: Promise<T>) {\n this.#suspender = requestPromise.then(\n (res: T) => {\n this.#status = 'success';\n this.#response = res;\n return res;\n },\n (err: any) => {\n this.#status = 'error';\n this.#error = err;\n throw err;\n }\n );\n }\n\n /**\n * Returns true if the promise is pending.\n * @returns True if the Promise is pending.\n */\n isPending(): boolean {\n return this.#status === 'pending';\n }\n\n /**\n * Returns true if the promise resolved successfully.\n * @returns True if the Promise resolved successfully.\n */\n isOk(): boolean {\n return this.#status === 'success';\n }\n\n /**\n * Attempts to read the value of the promise.\n * If the promise is pending, this method will throw a promise.\n * If the promise rejected, this method will throw the rejection reason.\n * If the promise resolved, this method will return the resolved value.\n * @returns The resolved value of the Promise.\n */\n read(): T {\n switch (this.#status) {\n case 'pending':\n throw this.#suspender;\n case 'error':\n throw this.#error;\n default:\n return this.#response as T;\n }\n }\n\n /**\n * Attaches callbacks for the resolution and/or rejection of the Promise.\n * @param onfulfilled The callback to execute when the Promise is resolved.\n * @param onrejected The callback to execute when the Promise is rejected.\n * @returns A Promise for the completion of which ever callback is executed.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null\n ): Promise<TResult1 | TResult2> {\n return this.#suspender.then(onfulfilled, onrejected);\n }\n\n /**\n * Attaches a callback for only the rejection of the Promise.\n * @param onrejected The callback to execute when the Promise is rejected.\n * @returns A Promise for the completion of the callback.\n */\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null\n ): Promise<T | TResult> {\n return this.#suspender.catch(onrejected);\n }\n\n /**\n * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The\n * resolved value cannot be modified from the callback.\n * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).\n * @returns A Promise for the completion of the callback.\n */\n finally(onfinally?: (() => void) | undefined | null): Promise<T> {\n return this.#suspender.finally(onfinally);\n }\n}\n"],"names":[],"mappings":";;;AAAA;;;;AAIG;MACU,eAAe,CAAA;AAO1B,IAAA,WAAA,CAAY,cAA0B,EAAA;QAN7B,IAAoB,CAAA,EAAA,CAAA,GAAW,iBAAiB,CAAC;QAC1D,0BAAuB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACvB,QAAA,uBAAA,CAAA,GAAA,CAAA,IAAA,EAA2C,SAAS,CAAC,CAAA;QACrD,yBAAyB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;QACzB,sBAA0B,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;QAGxB,sBAAA,CAAA,IAAI,8BAAc,cAAc,CAAC,IAAI,CACnC,CAAC,GAAM,KAAI;AACT,YAAA,sBAAA,CAAA,IAAI,EAAA,uBAAA,EAAW,SAAS,EAAA,GAAA,CAAA,CAAC;AACzB,YAAA,sBAAA,CAAA,IAAI,EAAA,yBAAA,EAAa,GAAG,EAAA,GAAA,CAAA,CAAC;AACrB,YAAA,OAAO,GAAG,CAAC;AACb,SAAC,EACD,CAAC,GAAQ,KAAI;AACX,YAAA,sBAAA,CAAA,IAAI,EAAA,uBAAA,EAAW,OAAO,EAAA,GAAA,CAAA,CAAC;AACvB,YAAA,sBAAA,CAAA,IAAI,EAAA,sBAAA,EAAU,GAAG,EAAA,GAAA,CAAA,CAAC;AAClB,YAAA,MAAM,GAAG,CAAC;SACX,CACF,MAAA,CAAC;KACH;AAED;;;AAGG;IACH,SAAS,GAAA;AACP,QAAA,OAAO,sBAAA,CAAA,IAAI,EAAQ,uBAAA,EAAA,GAAA,CAAA,KAAK,SAAS,CAAC;KACnC;AAED;;;AAGG;IACH,IAAI,GAAA;AACF,QAAA,OAAO,sBAAA,CAAA,IAAI,EAAQ,uBAAA,EAAA,GAAA,CAAA,KAAK,SAAS,CAAC;KACnC;AAED;;;;;;AAMG;IACH,IAAI,GAAA;QACF,QAAQ,sBAAA,CAAA,IAAI,EAAA,uBAAA,EAAA,GAAA,CAAQ;AAClB,YAAA,KAAK,SAAS;gBACZ,MAAM,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,CAAW,CAAC;AACxB,YAAA,KAAK,OAAO;gBACV,MAAM,sBAAA,CAAA,IAAI,EAAA,sBAAA,EAAA,GAAA,CAAO,CAAC;AACpB,YAAA;gBACE,OAAO,sBAAA,CAAA,IAAI,EAAA,yBAAA,EAAA,GAAA,CAAe,CAAC;AAC9B,SAAA;KACF;AAED;;;;;AAKG;IACH,IAAI,CACF,WAAiF,EACjF,UAAmF,EAAA;QAEnF,OAAO,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,CAAW,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;KACtD;AAED;;;;AAIG;AACH,IAAA,KAAK,CACH,UAAiF,EAAA;QAEjF,OAAO,sBAAA,CAAA,IAAI,EAAW,0BAAA,EAAA,GAAA,CAAA,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,OAAO,CAAC,SAA2C,EAAA;QACjD,OAAO,sBAAA,CAAA,IAAI,EAAW,0BAAA,EAAA,GAAA,CAAA,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KAC3C;AACF,CAAA;AAxFW,0BAAA,GAAA,IAAA,OAAA,EAAA,EAAA,uBAAA,GAAA,IAAA,OAAA,EAAA,EAAA,yBAAA,GAAA,IAAA,OAAA,EAAA,EAAA,sBAAA,GAAA,IAAA,OAAA,EAAA,EAAA,EAAA,GAAA,MAAM,CAAC,WAAW;;;;"}
File without changes
@@ -0,0 +1,207 @@
1
+ const DEFAULT_SEARCH_COUNT = 20;
2
+ /**
3
+ * Search operators.
4
+ * These operators represent "modifiers" and "prefixes" in FHIR search.
5
+ * See: https://www.hl7.org/fhir/search.html
6
+ */
7
+ var Operator;
8
+ (function (Operator) {
9
+ Operator["EQUALS"] = "eq";
10
+ Operator["NOT_EQUALS"] = "ne";
11
+ // Numbers
12
+ Operator["GREATER_THAN"] = "gt";
13
+ Operator["LESS_THAN"] = "lt";
14
+ Operator["GREATER_THAN_OR_EQUALS"] = "ge";
15
+ Operator["LESS_THAN_OR_EQUALS"] = "le";
16
+ // Dates
17
+ Operator["STARTS_AFTER"] = "sa";
18
+ Operator["ENDS_BEFORE"] = "eb";
19
+ Operator["APPROXIMATELY"] = "ap";
20
+ // String
21
+ Operator["CONTAINS"] = "contains";
22
+ Operator["EXACT"] = "exact";
23
+ // Token
24
+ Operator["TEXT"] = "text";
25
+ Operator["NOT"] = "not";
26
+ Operator["ABOVE"] = "above";
27
+ Operator["BELOW"] = "below";
28
+ Operator["IN"] = "in";
29
+ Operator["NOT_IN"] = "not-in";
30
+ Operator["OF_TYPE"] = "of-type";
31
+ // All
32
+ Operator["MISSING"] = "missing";
33
+ })(Operator || (Operator = {}));
34
+ const MODIFIER_OPERATORS = [
35
+ Operator.CONTAINS,
36
+ Operator.EXACT,
37
+ Operator.TEXT,
38
+ Operator.NOT,
39
+ Operator.ABOVE,
40
+ Operator.BELOW,
41
+ Operator.IN,
42
+ Operator.NOT_IN,
43
+ Operator.OF_TYPE,
44
+ Operator.MISSING,
45
+ ];
46
+ const PREFIX_OPERATORS = [
47
+ Operator.NOT_EQUALS,
48
+ Operator.GREATER_THAN,
49
+ Operator.LESS_THAN,
50
+ Operator.GREATER_THAN_OR_EQUALS,
51
+ Operator.LESS_THAN_OR_EQUALS,
52
+ Operator.STARTS_AFTER,
53
+ Operator.ENDS_BEFORE,
54
+ Operator.APPROXIMATELY,
55
+ ];
56
+ /**
57
+ * Parses a URL into a SearchRequest.
58
+ *
59
+ * See the FHIR search spec: http://hl7.org/fhir/r4/search.html
60
+ *
61
+ * @param url The URL to parse.
62
+ * @returns Parsed search definition.
63
+ */
64
+ function parseSearchDefinition(url) {
65
+ const location = new URL(url, 'https://example.com/');
66
+ const resourceType = location.pathname
67
+ .replace(/(^\/)|(\/$)/g, '') // Remove leading and trailing slashes
68
+ .split('/')
69
+ .pop();
70
+ const params = new URLSearchParams(location.search);
71
+ let filters = undefined;
72
+ let sortRules = undefined;
73
+ let fields = undefined;
74
+ let offset = undefined;
75
+ let count = undefined;
76
+ let total = undefined;
77
+ params.forEach((value, key) => {
78
+ if (key === '_fields') {
79
+ fields = value.split(',');
80
+ }
81
+ else if (key === '_offset') {
82
+ offset = parseInt(value);
83
+ }
84
+ else if (key === '_count') {
85
+ count = parseInt(value);
86
+ }
87
+ else if (key === '_total') {
88
+ total = value;
89
+ }
90
+ else if (key === '_sort') {
91
+ sortRules = sortRules || [];
92
+ sortRules.push(parseSortRule(value));
93
+ }
94
+ else {
95
+ filters = filters || [];
96
+ filters.push(parseSearchFilter(key, value));
97
+ }
98
+ });
99
+ return {
100
+ resourceType,
101
+ filters,
102
+ fields,
103
+ offset,
104
+ count,
105
+ total,
106
+ sortRules,
107
+ };
108
+ }
109
+ /**
110
+ * Parses a URL query parameter into a sort rule.
111
+ *
112
+ * By default, the sort rule is the field name.
113
+ *
114
+ * Sort rules can be reversed into descending order by prefixing the field name with a minus sign.
115
+ *
116
+ * See sorting: http://hl7.org/fhir/r4/search.html#_sort
117
+ *
118
+ * @param value The URL parameter value.
119
+ * @returns The parsed sort rule.
120
+ */
121
+ function parseSortRule(value) {
122
+ if (value.startsWith('-')) {
123
+ return { code: value.substring(1), descending: true };
124
+ }
125
+ else {
126
+ return { code: value };
127
+ }
128
+ }
129
+ /**
130
+ * Parses a URL query parameter into a search filter.
131
+ *
132
+ * FHIR search filters can be specified as modifiers or prefixes.
133
+ *
134
+ * For string properties, modifiers are appended to the key, e.g. "name:contains=eve".
135
+ *
136
+ * For date and numeric properties, prefixes are prepended to the value, e.g. "birthdate=gt2000".
137
+ *
138
+ * See the FHIR search spec: http://hl7.org/fhir/r4/search.html
139
+ *
140
+ * @param key The URL parameter key.
141
+ * @param value The URL parameter value.
142
+ * @returns The parsed search filter.
143
+ */
144
+ function parseSearchFilter(key, value) {
145
+ let code = key;
146
+ let operator = Operator.EQUALS;
147
+ for (const modifier of MODIFIER_OPERATORS) {
148
+ const modifierIndex = code.indexOf(':' + modifier);
149
+ if (modifierIndex !== -1) {
150
+ operator = modifier;
151
+ code = code.substring(0, modifierIndex);
152
+ }
153
+ }
154
+ for (const prefix of PREFIX_OPERATORS) {
155
+ if (value.match(new RegExp('^' + prefix + '\\d'))) {
156
+ operator = prefix;
157
+ value = value.substring(prefix.length);
158
+ }
159
+ }
160
+ return { code, operator, value };
161
+ }
162
+ /**
163
+ * Formats a search definition object into a query string.
164
+ * Note: The return value does not include the resource type.
165
+ * @param {!SearchRequest} definition The search definition.
166
+ * @returns Formatted URL.
167
+ */
168
+ function formatSearchQuery(definition) {
169
+ const params = [];
170
+ if (definition.fields) {
171
+ params.push('_fields=' + definition.fields.join(','));
172
+ }
173
+ if (definition.filters) {
174
+ definition.filters.forEach((filter) => params.push(formatFilter(filter)));
175
+ }
176
+ if (definition.sortRules && definition.sortRules.length > 0) {
177
+ params.push(formatSortRules(definition.sortRules));
178
+ }
179
+ if (definition.offset !== undefined) {
180
+ params.push('_offset=' + definition.offset);
181
+ }
182
+ if (definition.count !== undefined) {
183
+ params.push('_count=' + definition.count);
184
+ }
185
+ if (definition.total !== undefined) {
186
+ params.push('_total=' + definition.total);
187
+ }
188
+ if (params.length === 0) {
189
+ return '';
190
+ }
191
+ params.sort();
192
+ return '?' + params.join('&');
193
+ }
194
+ function formatFilter(filter) {
195
+ const modifier = MODIFIER_OPERATORS.includes(filter.operator) ? ':' + filter.operator : '';
196
+ const prefix = PREFIX_OPERATORS.includes(filter.operator) ? filter.operator : '';
197
+ return `${filter.code}${modifier}=${prefix}${encodeURIComponent(filter.value)}`;
198
+ }
199
+ function formatSortRules(sortRules) {
200
+ if (!sortRules || sortRules.length === 0) {
201
+ return '';
202
+ }
203
+ return '_sort=' + sortRules.map((sr) => (sr.descending ? '-' + sr.code : sr.code)).join(',');
204
+ }
205
+
206
+ export { DEFAULT_SEARCH_COUNT, Operator, formatSearchQuery, parseSearchDefinition };
207
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sources":["../../src/search.ts"],"sourcesContent":["import { ResourceType } from '@medplum/fhirtypes';\n\nexport const DEFAULT_SEARCH_COUNT = 20;\n\nexport interface SearchRequest {\n readonly resourceType: string;\n filters?: Filter[];\n sortRules?: SortRule[];\n offset?: number;\n count?: number;\n fields?: string[];\n name?: string;\n total?: 'none' | 'estimate' | 'accurate';\n}\n\nexport interface Filter {\n code: string;\n operator: Operator;\n value: string;\n unitSystem?: string;\n unitCode?: string;\n}\n\nexport interface SortRule {\n code: string;\n descending?: boolean;\n}\n\n/**\n * Search operators.\n * These operators represent \"modifiers\" and \"prefixes\" in FHIR search.\n * See: https://www.hl7.org/fhir/search.html\n */\nexport enum Operator {\n EQUALS = 'eq',\n NOT_EQUALS = 'ne',\n\n // Numbers\n GREATER_THAN = 'gt',\n LESS_THAN = 'lt',\n GREATER_THAN_OR_EQUALS = 'ge',\n LESS_THAN_OR_EQUALS = 'le',\n\n // Dates\n STARTS_AFTER = 'sa',\n ENDS_BEFORE = 'eb',\n APPROXIMATELY = 'ap',\n\n // String\n CONTAINS = 'contains',\n EXACT = 'exact',\n\n // Token\n TEXT = 'text',\n NOT = 'not',\n ABOVE = 'above',\n BELOW = 'below',\n IN = 'in',\n NOT_IN = 'not-in',\n OF_TYPE = 'of-type',\n\n // All\n MISSING = 'missing',\n}\n\nconst MODIFIER_OPERATORS: Operator[] = [\n Operator.CONTAINS,\n Operator.EXACT,\n Operator.TEXT,\n Operator.NOT,\n Operator.ABOVE,\n Operator.BELOW,\n Operator.IN,\n Operator.NOT_IN,\n Operator.OF_TYPE,\n Operator.MISSING,\n];\n\nconst PREFIX_OPERATORS: Operator[] = [\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n];\n\n/**\n * Parses a URL into a SearchRequest.\n *\n * See the FHIR search spec: http://hl7.org/fhir/r4/search.html\n *\n * @param url The URL to parse.\n * @returns Parsed search definition.\n */\nexport function parseSearchDefinition(url: string): SearchRequest {\n const location = new URL(url, 'https://example.com/');\n const resourceType = location.pathname\n .replace(/(^\\/)|(\\/$)/g, '') // Remove leading and trailing slashes\n .split('/')\n .pop() as ResourceType;\n const params = new URLSearchParams(location.search);\n let filters: Filter[] | undefined = undefined;\n let sortRules: SortRule[] | undefined = undefined;\n let fields: string[] | undefined = undefined;\n let offset = undefined;\n let count = undefined;\n let total = undefined;\n\n params.forEach((value, key) => {\n if (key === '_fields') {\n fields = value.split(',');\n } else if (key === '_offset') {\n offset = parseInt(value);\n } else if (key === '_count') {\n count = parseInt(value);\n } else if (key === '_total') {\n total = value;\n } else if (key === '_sort') {\n sortRules = sortRules || [];\n sortRules.push(parseSortRule(value));\n } else {\n filters = filters || [];\n filters.push(parseSearchFilter(key, value));\n }\n });\n\n return {\n resourceType,\n filters,\n fields,\n offset,\n count,\n total,\n sortRules,\n };\n}\n\n/**\n * Parses a URL query parameter into a sort rule.\n *\n * By default, the sort rule is the field name.\n *\n * Sort rules can be reversed into descending order by prefixing the field name with a minus sign.\n *\n * See sorting: http://hl7.org/fhir/r4/search.html#_sort\n *\n * @param value The URL parameter value.\n * @returns The parsed sort rule.\n */\nfunction parseSortRule(value: string): SortRule {\n if (value.startsWith('-')) {\n return { code: value.substring(1), descending: true };\n } else {\n return { code: value };\n }\n}\n\n/**\n * Parses a URL query parameter into a search filter.\n *\n * FHIR search filters can be specified as modifiers or prefixes.\n *\n * For string properties, modifiers are appended to the key, e.g. \"name:contains=eve\".\n *\n * For date and numeric properties, prefixes are prepended to the value, e.g. \"birthdate=gt2000\".\n *\n * See the FHIR search spec: http://hl7.org/fhir/r4/search.html\n *\n * @param key The URL parameter key.\n * @param value The URL parameter value.\n * @returns The parsed search filter.\n */\nfunction parseSearchFilter(key: string, value: string): Filter {\n let code = key;\n let operator = Operator.EQUALS;\n\n for (const modifier of MODIFIER_OPERATORS) {\n const modifierIndex = code.indexOf(':' + modifier);\n if (modifierIndex !== -1) {\n operator = modifier;\n code = code.substring(0, modifierIndex);\n }\n }\n\n for (const prefix of PREFIX_OPERATORS) {\n if (value.match(new RegExp('^' + prefix + '\\\\d'))) {\n operator = prefix;\n value = value.substring(prefix.length);\n }\n }\n\n return { code, operator, value };\n}\n\n/**\n * Formats a search definition object into a query string.\n * Note: The return value does not include the resource type.\n * @param {!SearchRequest} definition The search definition.\n * @returns Formatted URL.\n */\nexport function formatSearchQuery(definition: SearchRequest): string {\n const params: string[] = [];\n\n if (definition.fields) {\n params.push('_fields=' + definition.fields.join(','));\n }\n\n if (definition.filters) {\n definition.filters.forEach((filter) => params.push(formatFilter(filter)));\n }\n\n if (definition.sortRules && definition.sortRules.length > 0) {\n params.push(formatSortRules(definition.sortRules));\n }\n\n if (definition.offset !== undefined) {\n params.push('_offset=' + definition.offset);\n }\n\n if (definition.count !== undefined) {\n params.push('_count=' + definition.count);\n }\n\n if (definition.total !== undefined) {\n params.push('_total=' + definition.total);\n }\n\n if (params.length === 0) {\n return '';\n }\n\n params.sort();\n return '?' + params.join('&');\n}\n\nfunction formatFilter(filter: Filter): string {\n const modifier = MODIFIER_OPERATORS.includes(filter.operator) ? ':' + filter.operator : '';\n const prefix = PREFIX_OPERATORS.includes(filter.operator) ? filter.operator : '';\n return `${filter.code}${modifier}=${prefix}${encodeURIComponent(filter.value)}`;\n}\n\nfunction formatSortRules(sortRules: SortRule[] | undefined): string {\n if (!sortRules || sortRules.length === 0) {\n return '';\n }\n return '_sort=' + sortRules.map((sr) => (sr.descending ? '-' + sr.code : sr.code)).join(',');\n}\n"],"names":[],"mappings":"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"}
File without changes