@medplum/core 2.0.6 → 2.0.9

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.
@@ -4,6 +4,7 @@ import type { CustomTableLayout, TDocumentDefinitions, TFontDictionary } from 'p
4
4
  import { EventTarget } from './eventtarget';
5
5
  import { Hl7Message } from './hl7';
6
6
  import { ReadablePromise } from './readablepromise';
7
+ import { ClientStorage } from './storage';
7
8
  import { IndexedStructureDefinition } from './types';
8
9
  import { ProfileResource } from './utils';
9
10
  export declare const MEDPLUM_VERSION: string | undefined;
@@ -87,6 +88,12 @@ export interface MedplumClientOptions {
87
88
  * For Node.js applications, consider the 'node-fetch' package.
88
89
  */
89
90
  fetch?: FetchLike;
91
+ /**
92
+ * Storage implementation.
93
+ *
94
+ * Default is window.localStorage (if available), or an in-memory storage implementation.
95
+ */
96
+ storage?: ClientStorage;
90
97
  /**
91
98
  * Create PDF implementation.
92
99
  *
@@ -1167,10 +1174,12 @@ export declare class MedplumClient extends EventTarget {
1167
1174
  */
1168
1175
  setActiveLogin(login: LoginState): Promise<void>;
1169
1176
  /**
1177
+ * Returns the current access token.
1170
1178
  * @category Authentication
1171
1179
  */
1172
1180
  getAccessToken(): string | undefined;
1173
1181
  /**
1182
+ * Sets the current access token.
1174
1183
  * @category Authentication
1175
1184
  */
1176
1185
  setAccessToken(accessToken: string): void;
@@ -1215,9 +1224,10 @@ export declare class MedplumClient extends EventTarget {
1215
1224
  * Processes an OAuth authorization code.
1216
1225
  * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenRequest
1217
1226
  * @param code The authorization code received by URL parameter.
1227
+ * @param loginParams Optional login parameters.
1218
1228
  * @category Authentication
1219
1229
  */
1220
- processCode(code: string): Promise<ProfileResource>;
1230
+ processCode(code: string, loginParams?: Partial<BaseLoginRequest>): Promise<ProfileResource>;
1221
1231
  /**
1222
1232
  * Starts a new OAuth2 client credentials flow.
1223
1233
  * See: https://datatracker.ietf.org/doc/html/rfc6749#section-4.4
@@ -12,7 +12,7 @@ export * from './readablepromise';
12
12
  export * from './schema';
13
13
  export * from './search/details';
14
14
  export * from './search/match';
15
- export * from './search/parse';
16
15
  export * from './search/search';
16
+ export * from './storage';
17
17
  export * from './types';
18
18
  export * from './utils';
@@ -36,3 +36,9 @@ export declare function normalizeOperationOutcome(error: unknown): OperationOutc
36
36
  * @returns A display string for the error.
37
37
  */
38
38
  export declare function normalizeErrorString(error: unknown): string;
39
+ /**
40
+ * Returns a string represenation of the operation outcome.
41
+ * @param outcome The operation outcome.
42
+ * @returns The string representation of the operation outcome.
43
+ */
44
+ export declare function operationOutcomeToString(outcome: OperationOutcome): string;
@@ -46,13 +46,24 @@ export declare enum Operator {
46
46
  IN = "in",
47
47
  NOT_IN = "not-in",
48
48
  OF_TYPE = "of-type",
49
- MISSING = "missing"
49
+ MISSING = "missing",
50
+ IDENTIFIER = "identifier"
50
51
  }
51
52
  /**
52
- * Parses a URL into a SearchRequest.
53
- *
54
- * See the FHIR search spec: http://hl7.org/fhir/r4/search.html
55
- *
53
+ * Parses a search URL into a search request.
54
+ * @param resourceType The FHIR resource type.
55
+ * @param query The collection of query string parameters.
56
+ * @returns A parsed SearchRequest.
57
+ */
58
+ export declare function parseSearchRequest(resourceType: ResourceType, query: Record<string, string[] | string | undefined>): SearchRequest;
59
+ /**
60
+ * Parses a search URL into a search request.
61
+ * @param url The search URL.
62
+ * @returns A parsed SearchRequest.
63
+ */
64
+ export declare function parseSearchUrl(url: URL): SearchRequest;
65
+ /**
66
+ * Parses a URL string into a SearchRequest.
56
67
  * @param url The URL to parse.
57
68
  * @returns Parsed search definition.
58
69
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medplum/core",
3
- "version": "2.0.6",
3
+ "version": "2.0.9",
4
4
  "description": "Medplum TS/JS Library",
5
5
  "author": "Medplum <hello@medplum.com>",
6
6
  "license": "Apache-2.0",
@@ -1,218 +0,0 @@
1
- import { __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.mjs';
2
- import { globalSchema } from '../types.mjs';
3
- import { Operator } from './search.mjs';
4
-
5
- var _SearchParser_instances, _SearchParser_parseKeyValue, _SearchParser_parseSortRule, _SearchParser_parseParameter, _SearchParser_parsePrefixType, _SearchParser_parseModifierType, _SearchParser_parseReference, _SearchParser_parseQuantity, _SearchParser_parseUnknownParameter;
6
- /**
7
- * Parses a FHIR search query.
8
- * See: https://www.hl7.org/fhir/search.html
9
- */
10
- /**
11
- * For the ordered parameter types of number, date, and quantity,
12
- * a prefix to the parameter value may be used to control the nature
13
- * of the matching.
14
- * See: https://www.hl7.org/fhir/search.html#prefix
15
- */
16
- const prefixMap = {
17
- eq: Operator.EQUALS,
18
- ne: Operator.NOT_EQUALS,
19
- lt: Operator.LESS_THAN,
20
- le: Operator.LESS_THAN_OR_EQUALS,
21
- gt: Operator.GREATER_THAN,
22
- ge: Operator.GREATER_THAN_OR_EQUALS,
23
- sa: Operator.STARTS_AFTER,
24
- eb: Operator.ENDS_BEFORE,
25
- ap: Operator.APPROXIMATELY,
26
- };
27
- /**
28
- * Parameter names may specify a modifier as a suffix.
29
- * The modifiers are separated from the parameter name by a colon.
30
- * See: https://www.hl7.org/fhir/search.html#modifiers
31
- */
32
- const modifierMap = {
33
- contains: Operator.CONTAINS,
34
- exact: Operator.EXACT,
35
- above: Operator.ABOVE,
36
- below: Operator.BELOW,
37
- text: Operator.TEXT,
38
- not: Operator.NOT,
39
- in: Operator.IN,
40
- 'not-in': Operator.NOT_IN,
41
- 'of-type': Operator.OF_TYPE,
42
- };
43
- /**
44
- * Parses a search URL into a search request.
45
- * @param resourceType The FHIR resource type.
46
- * @param query The collection of query string parameters.
47
- * @returns A parsed SearchRequest.
48
- */
49
- function parseSearchRequest(resourceType, query) {
50
- return new SearchParser(resourceType, query);
51
- }
52
- /**
53
- * Parses a search URL into a search request.
54
- * @param url The search URL.
55
- * @returns A parsed SearchRequest.
56
- */
57
- function parseSearchUrl(url) {
58
- const resourceType = url.pathname.split('/').pop();
59
- return new SearchParser(resourceType, Object.fromEntries(url.searchParams.entries()));
60
- }
61
- class SearchParser {
62
- constructor(resourceType, query) {
63
- _SearchParser_instances.add(this);
64
- this.resourceType = resourceType;
65
- this.filters = [];
66
- this.sortRules = [];
67
- for (const [key, value] of Object.entries(query)) {
68
- if (Array.isArray(value)) {
69
- value.forEach((element) => __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseKeyValue).call(this, key, element));
70
- }
71
- else {
72
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseKeyValue).call(this, key, value ?? '');
73
- }
74
- }
75
- }
76
- }
77
- _SearchParser_instances = new WeakSet(), _SearchParser_parseKeyValue = function _SearchParser_parseKeyValue(key, value) {
78
- let code;
79
- let modifier;
80
- const colonIndex = key.indexOf(':');
81
- if (colonIndex >= 0) {
82
- code = key.substring(0, colonIndex);
83
- modifier = key.substring(colonIndex + 1);
84
- }
85
- else {
86
- code = key;
87
- modifier = '';
88
- }
89
- switch (code) {
90
- case '_sort':
91
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseSortRule).call(this, value);
92
- break;
93
- case '_count':
94
- this.count = parseInt(value);
95
- break;
96
- case '_offset':
97
- this.offset = parseInt(value);
98
- break;
99
- case '_total':
100
- this.total = value;
101
- break;
102
- case '_summary':
103
- this.total = 'estimate';
104
- this.count = 0;
105
- break;
106
- case '_revinclude':
107
- this.revInclude = value;
108
- break;
109
- default: {
110
- const param = globalSchema.types[this.resourceType]?.searchParams?.[code];
111
- if (param) {
112
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseParameter).call(this, param, modifier, value);
113
- }
114
- else {
115
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseUnknownParameter).call(this, code, modifier, value);
116
- }
117
- }
118
- }
119
- }, _SearchParser_parseSortRule = function _SearchParser_parseSortRule(value) {
120
- for (const field of value.split(',')) {
121
- let code;
122
- let descending = false;
123
- if (field.startsWith('-')) {
124
- code = field.substring(1);
125
- descending = true;
126
- }
127
- else {
128
- code = field;
129
- }
130
- this.sortRules.push({ code, descending });
131
- }
132
- }, _SearchParser_parseParameter = function _SearchParser_parseParameter(searchParam, modifier, value) {
133
- if (modifier === 'missing') {
134
- this.filters.push({
135
- code: searchParam.code,
136
- operator: Operator.MISSING,
137
- value,
138
- });
139
- return;
140
- }
141
- switch (searchParam.type) {
142
- case 'number':
143
- case 'date':
144
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parsePrefixType).call(this, searchParam, value);
145
- break;
146
- case 'string':
147
- case 'token':
148
- case 'uri':
149
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseModifierType).call(this, searchParam, modifier, value);
150
- break;
151
- case 'reference':
152
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseReference).call(this, searchParam, value);
153
- break;
154
- case 'quantity':
155
- __classPrivateFieldGet(this, _SearchParser_instances, "m", _SearchParser_parseQuantity).call(this, searchParam, value);
156
- break;
157
- }
158
- }, _SearchParser_parsePrefixType = function _SearchParser_parsePrefixType(param, input) {
159
- const { operator, value } = parsePrefix(input);
160
- this.filters.push({
161
- code: param.code,
162
- operator,
163
- value,
164
- });
165
- }, _SearchParser_parseModifierType = function _SearchParser_parseModifierType(param, modifier, value) {
166
- this.filters.push({
167
- code: param.code,
168
- operator: parseModifier(modifier),
169
- value,
170
- });
171
- }, _SearchParser_parseReference = function _SearchParser_parseReference(param, value) {
172
- this.filters.push({
173
- code: param.code,
174
- operator: Operator.EQUALS,
175
- value: value,
176
- });
177
- }, _SearchParser_parseQuantity = function _SearchParser_parseQuantity(param, input) {
178
- const [prefixNumber, unitSystem, unitCode] = input.split('|');
179
- const { operator, value } = parsePrefix(prefixNumber);
180
- this.filters.push({
181
- code: param.code,
182
- operator,
183
- value,
184
- unitSystem,
185
- unitCode,
186
- });
187
- }, _SearchParser_parseUnknownParameter = function _SearchParser_parseUnknownParameter(code, modifier, value) {
188
- let operator = Operator.EQUALS;
189
- if (modifier) {
190
- operator = modifier;
191
- }
192
- else {
193
- for (const prefix of Object.keys(prefixMap)) {
194
- if (value.match(new RegExp('^' + prefix + '\\d'))) {
195
- operator = prefix;
196
- value = value.substring(prefix.length);
197
- }
198
- }
199
- }
200
- this.filters.push({
201
- code,
202
- operator,
203
- value,
204
- });
205
- };
206
- function parsePrefix(input) {
207
- const prefix = input.substring(0, 2);
208
- if (prefix in prefixMap) {
209
- return { operator: prefixMap[prefix], value: input.substring(2) };
210
- }
211
- return { operator: Operator.EQUALS, value: input };
212
- }
213
- function parseModifier(modifier) {
214
- return modifierMap[modifier] || Operator.EQUALS;
215
- }
216
-
217
- export { parseSearchRequest, parseSearchUrl };
218
- //# sourceMappingURL=parse.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.mjs","sources":["../../../src/search/parse.ts"],"sourcesContent":["import { ResourceType, SearchParameter } from '@medplum/fhirtypes';\nimport { URL } from 'url';\nimport { globalSchema } from '../types';\nimport { Filter, Operator, SearchRequest, SortRule } from './search';\n\n/**\n * Parses a FHIR search query.\n * See: https://www.hl7.org/fhir/search.html\n */\n\n/**\n * For the ordered parameter types of number, date, and quantity,\n * a prefix to the parameter value may be used to control the nature\n * of the matching.\n * See: https://www.hl7.org/fhir/search.html#prefix\n */\nconst prefixMap: Record<string, Operator> = {\n eq: Operator.EQUALS,\n ne: Operator.NOT_EQUALS,\n lt: Operator.LESS_THAN,\n le: Operator.LESS_THAN_OR_EQUALS,\n gt: Operator.GREATER_THAN,\n ge: Operator.GREATER_THAN_OR_EQUALS,\n sa: Operator.STARTS_AFTER,\n eb: Operator.ENDS_BEFORE,\n ap: Operator.APPROXIMATELY,\n};\n\n/**\n * Parameter names may specify a modifier as a suffix.\n * The modifiers are separated from the parameter name by a colon.\n * See: https://www.hl7.org/fhir/search.html#modifiers\n */\nconst modifierMap: Record<string, Operator> = {\n contains: Operator.CONTAINS,\n exact: Operator.EXACT,\n above: Operator.ABOVE,\n below: Operator.BELOW,\n text: Operator.TEXT,\n not: Operator.NOT,\n in: Operator.IN,\n 'not-in': Operator.NOT_IN,\n 'of-type': Operator.OF_TYPE,\n};\n\n/**\n * Parses a search URL into a search request.\n * @param resourceType The FHIR resource type.\n * @param query The collection of query string parameters.\n * @returns A parsed SearchRequest.\n */\nexport function parseSearchRequest(\n resourceType: ResourceType,\n query: Record<string, string[] | string | undefined>\n): SearchRequest {\n return new SearchParser(resourceType, query);\n}\n\n/**\n * Parses a search URL into a search request.\n * @param url The search URL.\n * @returns A parsed SearchRequest.\n */\nexport function parseSearchUrl(url: URL): SearchRequest {\n const resourceType = url.pathname.split('/').pop() as ResourceType;\n return new SearchParser(resourceType, Object.fromEntries(url.searchParams.entries()));\n}\n\nclass SearchParser implements SearchRequest {\n readonly resourceType: ResourceType;\n readonly filters: Filter[];\n readonly sortRules: SortRule[];\n count?: number;\n offset?: number;\n total?: 'none' | 'estimate' | 'accurate';\n revInclude?: string;\n\n constructor(resourceType: ResourceType, query: Record<string, string[] | string | undefined>) {\n this.resourceType = resourceType;\n this.filters = [];\n this.sortRules = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (Array.isArray(value)) {\n value.forEach((element) => this.#parseKeyValue(key, element));\n } else {\n this.#parseKeyValue(key, value ?? '');\n }\n }\n }\n\n #parseKeyValue(key: string, value: string): void {\n let code;\n let modifier;\n\n const colonIndex = key.indexOf(':');\n if (colonIndex >= 0) {\n code = key.substring(0, colonIndex);\n modifier = key.substring(colonIndex + 1);\n } else {\n code = key;\n modifier = '';\n }\n\n switch (code) {\n case '_sort':\n this.#parseSortRule(value);\n break;\n\n case '_count':\n this.count = parseInt(value);\n break;\n\n case '_offset':\n this.offset = parseInt(value);\n break;\n\n case '_total':\n this.total = value as 'none' | 'estimate' | 'accurate';\n break;\n\n case '_summary':\n this.total = 'estimate';\n this.count = 0;\n break;\n\n case '_revinclude':\n this.revInclude = value;\n break;\n\n default: {\n const param = globalSchema.types[this.resourceType]?.searchParams?.[code];\n if (param) {\n this.#parseParameter(param, modifier, value);\n } else {\n this.#parseUnknownParameter(code, modifier, value);\n }\n }\n }\n }\n\n #parseSortRule(value: string): void {\n for (const field of value.split(',')) {\n let code;\n let descending = false;\n if (field.startsWith('-')) {\n code = field.substring(1);\n descending = true;\n } else {\n code = field;\n }\n this.sortRules.push({ code, descending });\n }\n }\n\n #parseParameter(searchParam: SearchParameter, modifier: string, value: string): void {\n if (modifier === 'missing') {\n this.filters.push({\n code: searchParam.code as string,\n operator: Operator.MISSING,\n value,\n });\n return;\n }\n switch (searchParam.type) {\n case 'number':\n case 'date':\n this.#parsePrefixType(searchParam, value);\n break;\n case 'string':\n case 'token':\n case 'uri':\n this.#parseModifierType(searchParam, modifier, value);\n break;\n case 'reference':\n this.#parseReference(searchParam, value);\n break;\n case 'quantity':\n this.#parseQuantity(searchParam, value);\n break;\n }\n }\n\n #parsePrefixType(param: SearchParameter, input: string): void {\n const { operator, value } = parsePrefix(input);\n this.filters.push({\n code: param.code as string,\n operator,\n value,\n });\n }\n\n #parseModifierType(param: SearchParameter, modifier: string, value: string): void {\n this.filters.push({\n code: param.code as string,\n operator: parseModifier(modifier),\n value,\n });\n }\n\n #parseReference(param: SearchParameter, value: string): void {\n this.filters.push({\n code: param.code as string,\n operator: Operator.EQUALS,\n value: value,\n });\n }\n\n #parseQuantity(param: SearchParameter, input: string): void {\n const [prefixNumber, unitSystem, unitCode] = input.split('|');\n const { operator, value } = parsePrefix(prefixNumber);\n this.filters.push({\n code: param.code as string,\n operator,\n value,\n unitSystem,\n unitCode,\n });\n }\n\n #parseUnknownParameter(code: string, modifier: string, value: string): void {\n let operator = Operator.EQUALS;\n if (modifier) {\n operator = modifier as Operator;\n } else {\n for (const prefix of Object.keys(prefixMap)) {\n if (value.match(new RegExp('^' + prefix + '\\\\d'))) {\n operator = prefix as Operator;\n value = value.substring(prefix.length);\n }\n }\n }\n\n this.filters.push({\n code,\n operator,\n value,\n });\n }\n}\n\nfunction parsePrefix(input: string): { operator: Operator; value: string } {\n const prefix = input.substring(0, 2);\n if (prefix in prefixMap) {\n return { operator: prefixMap[prefix], value: input.substring(2) };\n }\n return { operator: Operator.EQUALS, value: input };\n}\n\nfunction parseModifier(modifier: string): Operator {\n return modifierMap[modifier] || Operator.EQUALS;\n}\n"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /// <reference types="node" />
2
- import { ResourceType } from '@medplum/fhirtypes';
3
- import { URL } from 'url';
4
- import { SearchRequest } from './search';
5
- /**
6
- * Parses a search URL into a search request.
7
- * @param resourceType The FHIR resource type.
8
- * @param query The collection of query string parameters.
9
- * @returns A parsed SearchRequest.
10
- */
11
- export declare function parseSearchRequest(resourceType: ResourceType, query: Record<string, string[] | string | undefined>): SearchRequest;
12
- /**
13
- * Parses a search URL into a search request.
14
- * @param url The search URL.
15
- * @returns A parsed SearchRequest.
16
- */
17
- export declare function parseSearchUrl(url: URL): SearchRequest;
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "dist/types",
5
- "noEmit": false,
6
- "emitDeclarationOnly": true
7
- },
8
- "exclude": ["**/*.test.ts"]
9
- }