@medplum/core 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/cjs/index.cjs +477 -209
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.min.cjs +1 -1
  4. package/dist/esm/client.mjs +18 -21
  5. package/dist/esm/client.mjs.map +1 -1
  6. package/dist/esm/index.min.mjs +1 -1
  7. package/dist/esm/index.mjs +6 -5
  8. package/dist/esm/index.mjs.map +1 -1
  9. package/dist/esm/outcomes.mjs +17 -2
  10. package/dist/esm/outcomes.mjs.map +1 -1
  11. package/dist/esm/{searchparams.mjs → search/details.mjs} +9 -11
  12. package/dist/esm/search/details.mjs.map +1 -0
  13. package/dist/esm/{match.mjs → search/match.mjs} +16 -11
  14. package/dist/esm/search/match.mjs.map +1 -0
  15. package/dist/esm/search/parse.mjs +218 -0
  16. package/dist/esm/search/parse.mjs.map +1 -0
  17. package/dist/esm/{search.mjs → search/search.mjs} +0 -3
  18. package/dist/esm/search/search.mjs.map +1 -0
  19. package/dist/esm/types.mjs +63 -25
  20. package/dist/esm/types.mjs.map +1 -1
  21. package/dist/{esm → types}/client.d.ts +5 -3
  22. package/dist/{esm → types}/index.d.ts +4 -3
  23. package/dist/{esm → types}/outcomes.d.ts +7 -1
  24. package/dist/types/search/parse.d.ts +17 -0
  25. package/dist/{cjs → types}/types.d.ts +30 -7
  26. package/package.json +4 -4
  27. package/tsconfig.build.json +9 -0
  28. package/dist/cjs/client.d.ts +0 -1216
  29. package/dist/cjs/index.d.ts +0 -13
  30. package/dist/cjs/outcomes.d.ts +0 -31
  31. package/dist/esm/cache.d.ts +0 -34
  32. package/dist/esm/crypto.d.ts +0 -9
  33. package/dist/esm/eventtarget.d.ts +0 -13
  34. package/dist/esm/fhirlexer/index.d.ts +0 -2
  35. package/dist/esm/fhirlexer/parse.d.ts +0 -47
  36. package/dist/esm/fhirlexer/tokenize.d.ts +0 -14
  37. package/dist/esm/fhirmapper/parse.d.ts +0 -7
  38. package/dist/esm/fhirmapper/tokenize.d.ts +0 -2
  39. package/dist/esm/fhirpath/atoms.d.ts +0 -120
  40. package/dist/esm/fhirpath/date.d.ts +0 -1
  41. package/dist/esm/fhirpath/functions.d.ts +0 -6
  42. package/dist/esm/fhirpath/index.d.ts +0 -4
  43. package/dist/esm/fhirpath/parse.d.ts +0 -64
  44. package/dist/esm/fhirpath/tokenize.d.ts +0 -4
  45. package/dist/esm/fhirpath/utils.d.ts +0 -95
  46. package/dist/esm/format.d.ts +0 -118
  47. package/dist/esm/hl7.d.ts +0 -136
  48. package/dist/esm/jwt.d.ts +0 -5
  49. package/dist/esm/match.d.ts +0 -9
  50. package/dist/esm/match.mjs.map +0 -1
  51. package/dist/esm/readablepromise.d.ts +0 -48
  52. package/dist/esm/search.d.ts +0 -66
  53. package/dist/esm/search.mjs.map +0 -1
  54. package/dist/esm/searchparams.d.ts +0 -33
  55. package/dist/esm/searchparams.mjs.map +0 -1
  56. package/dist/esm/storage.d.ts +0 -47
  57. package/dist/esm/types.d.ts +0 -177
  58. package/dist/esm/utils.d.ts +0 -259
  59. /package/dist/{cjs → types}/cache.d.ts +0 -0
  60. /package/dist/{cjs → types}/crypto.d.ts +0 -0
  61. /package/dist/{cjs → types}/eventtarget.d.ts +0 -0
  62. /package/dist/{cjs → types}/fhirlexer/index.d.ts +0 -0
  63. /package/dist/{cjs → types}/fhirlexer/parse.d.ts +0 -0
  64. /package/dist/{cjs → types}/fhirlexer/tokenize.d.ts +0 -0
  65. /package/dist/{cjs → types}/fhirmapper/parse.d.ts +0 -0
  66. /package/dist/{cjs → types}/fhirmapper/tokenize.d.ts +0 -0
  67. /package/dist/{cjs → types}/fhirpath/atoms.d.ts +0 -0
  68. /package/dist/{cjs → types}/fhirpath/date.d.ts +0 -0
  69. /package/dist/{cjs → types}/fhirpath/functions.d.ts +0 -0
  70. /package/dist/{cjs → types}/fhirpath/index.d.ts +0 -0
  71. /package/dist/{cjs → types}/fhirpath/parse.d.ts +0 -0
  72. /package/dist/{cjs → types}/fhirpath/tokenize.d.ts +0 -0
  73. /package/dist/{cjs → types}/fhirpath/utils.d.ts +0 -0
  74. /package/dist/{cjs → types}/format.d.ts +0 -0
  75. /package/dist/{cjs → types}/hl7.d.ts +0 -0
  76. /package/dist/{cjs → types}/jwt.d.ts +0 -0
  77. /package/dist/{cjs → types}/readablepromise.d.ts +0 -0
  78. /package/dist/{cjs/searchparams.d.ts → types/search/details.d.ts} +0 -0
  79. /package/dist/{cjs → types/search}/match.d.ts +0 -0
  80. /package/dist/{cjs → types/search}/search.d.ts +0 -0
  81. /package/dist/{cjs → types}/storage.d.ts +0 -0
  82. /package/dist/{cjs → types}/utils.d.ts +0 -0
package/dist/esm/hl7.d.ts DELETED
@@ -1,136 +0,0 @@
1
- /**
2
- * The Hl7Context class represents the parsing context for an HL7 message.
3
- *
4
- * MSH-1:
5
- * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.1
6
- *
7
- * MSH-2:
8
- * https://hl7-definition.caristix.com/v2/HL7v2.6/Fields/MSH.2
9
- *
10
- * See this tutorial on MSH, and why it's a bad idea to use anything other than the default values:
11
- * https://www.hl7soup.com/HL7TutorialMSH.html
12
- */
13
- export declare class Hl7Context {
14
- readonly segmentSeparator: string;
15
- readonly fieldSeparator: string;
16
- readonly componentSeparator: string;
17
- readonly repetitionSeparator: string;
18
- readonly escapeCharacter: string;
19
- readonly subcomponentSeparator: string;
20
- constructor(segmentSeparator?: string, fieldSeparator?: string, componentSeparator?: string, repetitionSeparator?: string, escapeCharacter?: string, subcomponentSeparator?: string);
21
- /**
22
- * Returns the MSH-2 field value based on the configured separators.
23
- * @returns The HL7 MSH-2 field value.
24
- */
25
- getMsh2(): string;
26
- }
27
- /**
28
- * The Hl7Message class represents one HL7 message.
29
- * A message is a collection of segments.
30
- */
31
- export declare class Hl7Message {
32
- readonly context: Hl7Context;
33
- readonly segments: Hl7Segment[];
34
- /**
35
- * Creates a new HL7 message.
36
- * @param segments The HL7 segments.
37
- * @param context Optional HL7 parsing context.
38
- */
39
- constructor(segments: Hl7Segment[], context?: Hl7Context);
40
- /**
41
- * Returns an HL7 segment by index or by name.
42
- * @param index The HL7 segment index or name.
43
- * @returns The HL7 segment if found; otherwise, undefined.
44
- */
45
- get(index: number | string): Hl7Segment | undefined;
46
- /**
47
- * Returns all HL7 segments of a given name.
48
- * @param name The HL7 segment name.
49
- * @returns An array of HL7 segments with the specified name.
50
- */
51
- getAll(name: string): Hl7Segment[];
52
- /**
53
- * Returns the HL7 message as a string.
54
- * @returns The HL7 message as a string.
55
- */
56
- toString(): string;
57
- /**
58
- * Returns an HL7 "ACK" (acknowledgement) message for this message.
59
- * @returns The HL7 "ACK" message.
60
- */
61
- buildAck(): Hl7Message;
62
- /**
63
- * Parses an HL7 message string into an Hl7Message object.
64
- * @param text The HL7 message text.
65
- * @returns The parsed HL7 message.
66
- */
67
- static parse(text: string): Hl7Message;
68
- }
69
- /**
70
- * The Hl7Segment class represents one HL7 segment.
71
- * A segment is a collection of fields.
72
- * The name field is the first field.
73
- */
74
- export declare class Hl7Segment {
75
- readonly context: Hl7Context;
76
- readonly name: string;
77
- readonly fields: Hl7Field[];
78
- /**
79
- * Creates a new HL7 segment.
80
- * @param fields The HL7 fields.
81
- * @param context Optional HL7 parsing context.
82
- */
83
- constructor(fields: Hl7Field[] | string[], context?: Hl7Context);
84
- /**
85
- * Returns an HL7 field by index.
86
- * @param index The HL7 field index.
87
- * @returns The HL7 field.
88
- */
89
- get(index: number): Hl7Field;
90
- /**
91
- * Returns the HL7 segment as a string.
92
- * @returns The HL7 segment as a string.
93
- */
94
- toString(): string;
95
- /**
96
- * Parses an HL7 segment string into an Hl7Segment object.
97
- * @param text The HL7 segment text.
98
- * @param context Optional HL7 parsing context.
99
- * @returns The parsed HL7 segment.
100
- */
101
- static parse(text: string, context?: Hl7Context): Hl7Segment;
102
- }
103
- /**
104
- * The Hl7Field class represents one HL7 field.
105
- * A field is a collection of components.
106
- */
107
- export declare class Hl7Field {
108
- readonly context: Hl7Context;
109
- readonly components: string[][];
110
- /**
111
- * Creates a new HL7 field.
112
- * @param components The HL7 components.
113
- * @param context Optional HL7 parsing context.
114
- */
115
- constructor(components: string[][], context?: Hl7Context);
116
- /**
117
- * Returns an HL7 component by index.
118
- * @param component The component index.
119
- * @param subcomponent Optional subcomponent index.
120
- * @param repetition Optional repetition index.
121
- * @returns The string value of the specified component.
122
- */
123
- get(component: number, subcomponent?: number, repetition?: number): string;
124
- /**
125
- * Returns the HL7 field as a string.
126
- * @returns The HL7 field as a string.
127
- */
128
- toString(): string;
129
- /**
130
- * Parses an HL7 field string into an Hl7Field object.
131
- * @param text The HL7 field text.
132
- * @param context Optional HL7 parsing context.
133
- * @returns The parsed HL7 field.
134
- */
135
- static parse(text: string, context?: Hl7Context): Hl7Field;
136
- }
package/dist/esm/jwt.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * Parses the JWT payload.
3
- * @param token JWT token
4
- */
5
- export declare function parseJWTPayload(token: string): Record<string, number | string>;
@@ -1,9 +0,0 @@
1
- import { Resource } from '@medplum/fhirtypes';
2
- import { SearchRequest } from './search';
3
- /**
4
- * Determines if the resource matches the search request.
5
- * @param resource The resource that was created or updated.
6
- * @param searchRequest The subscription criteria as a search request.
7
- * @returns True if the resource satisfies the search request.
8
- */
9
- export declare function matchesSearchRequest(resource: Resource, searchRequest: SearchRequest): boolean;
@@ -1 +0,0 @@
1
- {"version":3,"file":"match.mjs","sources":["../../src/match.ts"],"sourcesContent":["import { Reference, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport { evalFhirPath } from './fhirpath';\nimport { Filter, Operator, SearchRequest } from './search';\nimport { getSearchParameterDetails, SearchParameterType } from './searchparams';\nimport { globalSchema } from './types';\n\n/**\n * Determines if the resource matches the search request.\n * @param resource The resource that was created or updated.\n * @param searchRequest The subscription criteria as a search request.\n * @returns True if the resource satisfies the search request.\n */\nexport function matchesSearchRequest(resource: Resource, searchRequest: SearchRequest): boolean {\n if (searchRequest.resourceType !== resource.resourceType) {\n return false;\n }\n if (searchRequest.filters) {\n for (const filter of searchRequest.filters) {\n if (!matchesSearchFilter(resource, searchRequest, filter)) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Determines if the resource matches the search filter.\n * @param resource The resource that was created or updated.\n * @param filter One of the filters of a subscription criteria.\n * @returns True if the resource satisfies the search filter.\n */\nfunction matchesSearchFilter(resource: Resource, searchRequest: SearchRequest, filter: Filter): boolean {\n const searchParam = globalSchema.types[searchRequest.resourceType]?.searchParams?.[filter.code];\n switch (searchParam?.type) {\n case 'reference':\n return matchesReferenceFilter(resource, filter, searchParam);\n case 'string':\n return matchesStringFilter(resource, filter, searchParam);\n case 'token':\n return matchesTokenFilter(resource, filter, searchParam);\n case 'date':\n return matchesDateFilter(resource, filter, searchParam);\n }\n // Unknown search parameter or search parameter type\n // Default fail the check\n return false;\n}\n\nfunction matchesReferenceFilter(resource: Resource, filter: Filter, searchParam: SearchParameter): boolean {\n const values = evalFhirPath(searchParam.expression as string, resource) as (Reference | string)[];\n const negated = isNegated(filter.operator);\n\n if (filter.value === '' && values.length === 0) {\n // If the filter operator is \"equals\", then the filter matches.\n // If the filter operator is \"not equals\", then the filter does not match.\n return filter.operator === Operator.EQUALS;\n }\n\n // Normalize the values array into reference strings\n const references = values.map((value) => (typeof value === 'string' ? value : value.reference));\n\n for (const filterValue of filter.value.split(',')) {\n let match = references.includes(filterValue);\n if (!match && filter.code === '_compartment') {\n // Backwards compability for compartment search parameter\n // In previous versions, the resource type was not required in compartment values\n // So, \"123\" would match \"Patient/123\"\n // We need to maintain this behavior for backwards compatibility\n match = references.some((reference) => reference?.endsWith('/' + filterValue));\n }\n if (match) {\n return !negated;\n }\n }\n // If \"not equals\" and no matches, then return true\n // If \"equals\" and no matches, then return false\n return negated;\n}\n\nfunction matchesTokenFilter(resource: Resource, filter: Filter, searchParam: SearchParameter): boolean {\n const details = getSearchParameterDetails(resource.resourceType, searchParam);\n if (details.type === SearchParameterType.BOOLEAN) {\n return matchesBooleanFilter(resource, filter, searchParam);\n } else {\n return matchesStringFilter(resource, filter, searchParam);\n }\n}\n\nfunction matchesBooleanFilter(resource: Resource, filter: Filter, searchParam: SearchParameter): boolean {\n const values = evalFhirPath(searchParam.expression as string, resource);\n const expected = filter.value === 'true';\n const result = values.includes(expected);\n return isNegated(filter.operator) ? !result : result;\n}\n\nfunction matchesStringFilter(resource: Resource, filter: Filter, searchParam: SearchParameter): boolean {\n const resourceValues = evalFhirPath(searchParam.expression as string, resource);\n const filterValues = filter.value.split(',');\n const negated = isNegated(filter.operator);\n for (const resourceValue of resourceValues) {\n for (const filterValue of filterValues) {\n const match = matchesStringValue(resourceValue, filter.operator, filterValue);\n if (match) {\n return !negated;\n }\n }\n }\n // If \"not equals\" and no matches, then return true\n // If \"equals\" and no matches, then return false\n return negated;\n}\n\nfunction matchesStringValue(resourceValue: unknown, operator: Operator, filterValue: string): boolean {\n let str = '';\n if (resourceValue) {\n if (typeof resourceValue === 'string') {\n str = resourceValue;\n } else if (typeof resourceValue === 'object') {\n str = JSON.stringify(resourceValue);\n }\n }\n return str.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nfunction matchesDateFilter(resource: Resource, filter: Filter, searchParam: SearchParameter): boolean {\n const resourceValues = evalFhirPath(searchParam.expression as string, resource);\n const filterValues = filter.value.split(',');\n const negated = isNegated(filter.operator);\n for (const resourceValue of resourceValues) {\n for (const filterValue of filterValues) {\n const match = matchesDateValue(resourceValue as string, filter.operator, filterValue);\n if (match) {\n return !negated;\n }\n }\n }\n // If \"not equals\" and no matches, then return true\n // If \"equals\" and no matches, then return false\n return negated;\n}\n\nfunction matchesDateValue(resourceValue: string, operator: Operator, filterValue: string): boolean {\n switch (operator) {\n case Operator.STARTS_AFTER:\n case Operator.GREATER_THAN:\n return resourceValue > filterValue;\n case Operator.GREATER_THAN_OR_EQUALS:\n return resourceValue >= filterValue;\n case Operator.ENDS_BEFORE:\n case Operator.LESS_THAN:\n return resourceValue < filterValue;\n case Operator.LESS_THAN_OR_EQUALS:\n return resourceValue <= filterValue;\n case Operator.EQUALS:\n case Operator.NOT_EQUALS:\n return resourceValue === filterValue;\n }\n return false;\n}\n\nfunction isNegated(operator: Operator): boolean {\n return operator === Operator.NOT_EQUALS || operator === Operator.NOT;\n}\n"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- /**
2
- * The ReadablePromise class wraps a request promise suitable for React Suspense.
3
- * See: https://blog.logrocket.com/react-suspense-data-fetching/#wrappromise-js
4
- * See: https://github.com/ovieokeh/suspense-data-fetching/blob/master/lib/api/wrapPromise.js
5
- */
6
- export declare class ReadablePromise<T> implements Promise<T> {
7
- #private;
8
- readonly [Symbol.toStringTag]: string;
9
- constructor(requestPromise: Promise<T>);
10
- /**
11
- * Returns true if the promise is pending.
12
- * @returns True if the Promise is pending.
13
- */
14
- isPending(): boolean;
15
- /**
16
- * Returns true if the promise resolved successfully.
17
- * @returns True if the Promise resolved successfully.
18
- */
19
- isOk(): boolean;
20
- /**
21
- * Attempts to read the value of the promise.
22
- * If the promise is pending, this method will throw a promise.
23
- * If the promise rejected, this method will throw the rejection reason.
24
- * If the promise resolved, this method will return the resolved value.
25
- * @returns The resolved value of the Promise.
26
- */
27
- read(): T;
28
- /**
29
- * Attaches callbacks for the resolution and/or rejection of the Promise.
30
- * @param onfulfilled The callback to execute when the Promise is resolved.
31
- * @param onrejected The callback to execute when the Promise is rejected.
32
- * @returns A Promise for the completion of which ever callback is executed.
33
- */
34
- then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
35
- /**
36
- * Attaches a callback for only the rejection of the Promise.
37
- * @param onrejected The callback to execute when the Promise is rejected.
38
- * @returns A Promise for the completion of the callback.
39
- */
40
- catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
41
- /**
42
- * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The
43
- * resolved value cannot be modified from the callback.
44
- * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).
45
- * @returns A Promise for the completion of the callback.
46
- */
47
- finally(onfinally?: (() => void) | undefined | null): Promise<T>;
48
- }
@@ -1,66 +0,0 @@
1
- import { ResourceType } from '@medplum/fhirtypes';
2
- export declare const DEFAULT_SEARCH_COUNT = 20;
3
- export interface SearchRequest {
4
- readonly resourceType: ResourceType;
5
- filters?: Filter[];
6
- sortRules?: SortRule[];
7
- offset?: number;
8
- count?: number;
9
- fields?: string[];
10
- name?: string;
11
- total?: 'none' | 'estimate' | 'accurate';
12
- revInclude?: string;
13
- }
14
- export interface Filter {
15
- code: string;
16
- operator: Operator;
17
- value: string;
18
- unitSystem?: string;
19
- unitCode?: string;
20
- }
21
- export interface SortRule {
22
- code: string;
23
- descending?: boolean;
24
- }
25
- /**
26
- * Search operators.
27
- * These operators represent "modifiers" and "prefixes" in FHIR search.
28
- * See: https://www.hl7.org/fhir/search.html
29
- */
30
- export declare enum Operator {
31
- EQUALS = "eq",
32
- NOT_EQUALS = "ne",
33
- GREATER_THAN = "gt",
34
- LESS_THAN = "lt",
35
- GREATER_THAN_OR_EQUALS = "ge",
36
- LESS_THAN_OR_EQUALS = "le",
37
- STARTS_AFTER = "sa",
38
- ENDS_BEFORE = "eb",
39
- APPROXIMATELY = "ap",
40
- CONTAINS = "contains",
41
- EXACT = "exact",
42
- TEXT = "text",
43
- NOT = "not",
44
- ABOVE = "above",
45
- BELOW = "below",
46
- IN = "in",
47
- NOT_IN = "not-in",
48
- OF_TYPE = "of-type",
49
- MISSING = "missing"
50
- }
51
- /**
52
- * Parses a URL into a SearchRequest.
53
- *
54
- * See the FHIR search spec: http://hl7.org/fhir/r4/search.html
55
- *
56
- * @param url The URL to parse.
57
- * @returns Parsed search definition.
58
- */
59
- export declare function parseSearchDefinition(url: string): SearchRequest;
60
- /**
61
- * Formats a search definition object into a query string.
62
- * Note: The return value does not include the resource type.
63
- * @param {!SearchRequest} definition The search definition.
64
- * @returns Formatted URL.
65
- */
66
- export declare function formatSearchQuery(definition: SearchRequest): string;
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.mjs","sources":["../../src/search.ts"],"sourcesContent":["import { ResourceType } from '@medplum/fhirtypes';\n\nexport const DEFAULT_SEARCH_COUNT = 20;\n\nexport interface SearchRequest {\n readonly resourceType: ResourceType;\n filters?: Filter[];\n sortRules?: SortRule[];\n offset?: number;\n count?: number;\n fields?: string[];\n name?: string;\n total?: 'none' | 'estimate' | 'accurate';\n revInclude?: string;\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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"}
@@ -1,33 +0,0 @@
1
- import { ElementDefinition, SearchParameter } from '@medplum/fhirtypes';
2
- export declare enum SearchParameterType {
3
- BOOLEAN = "BOOLEAN",
4
- NUMBER = "NUMBER",
5
- QUANTITY = "QUANTITY",
6
- TEXT = "TEXT",
7
- REFERENCE = "REFERENCE",
8
- DATE = "DATE",
9
- DATETIME = "DATETIME",
10
- PERIOD = "PERIOD"
11
- }
12
- export interface SearchParameterDetails {
13
- readonly columnName: string;
14
- readonly type: SearchParameterType;
15
- readonly elementDefinition?: ElementDefinition;
16
- readonly array?: boolean;
17
- }
18
- /**
19
- * Returns the type details of a SearchParameter.
20
- *
21
- * The SearchParameter resource has a "type" parameter, but that is missing some critical information.
22
- *
23
- * For example:
24
- * 1) The "date" type includes "date", "datetime", and "period".
25
- * 2) The "token" type includes enums and booleans.
26
- * 3) Arrays/multiple values are not reflected at all.
27
- *
28
- * @param resourceType The root resource type.
29
- * @param searchParam The search parameter.
30
- * @returns The search parameter type details.
31
- */
32
- export declare function getSearchParameterDetails(resourceType: string, searchParam: SearchParameter): SearchParameterDetails;
33
- export declare function getExpressionForResourceType(resourceType: string, expression: string): string | undefined;
@@ -1 +0,0 @@
1
- {"version":3,"file":"searchparams.mjs","sources":["../../src/searchparams.ts"],"sourcesContent":["import { ElementDefinition, SearchParameter } from '@medplum/fhirtypes';\nimport { globalSchema, PropertyType } from './types';\nimport { capitalize } from './utils';\n\nexport enum SearchParameterType {\n BOOLEAN = 'BOOLEAN',\n NUMBER = 'NUMBER',\n QUANTITY = 'QUANTITY',\n TEXT = 'TEXT',\n REFERENCE = 'REFERENCE',\n DATE = 'DATE',\n DATETIME = 'DATETIME',\n PERIOD = 'PERIOD',\n}\n\nexport interface SearchParameterDetails {\n readonly columnName: string;\n readonly type: SearchParameterType;\n readonly elementDefinition?: ElementDefinition;\n readonly array?: boolean;\n}\n\n/**\n * Returns the type details of a SearchParameter.\n *\n * The SearchParameter resource has a \"type\" parameter, but that is missing some critical information.\n *\n * For example:\n * 1) The \"date\" type includes \"date\", \"datetime\", and \"period\".\n * 2) The \"token\" type includes enums and booleans.\n * 3) Arrays/multiple values are not reflected at all.\n *\n * @param resourceType The root resource type.\n * @param searchParam The search parameter.\n * @returns The search parameter type details.\n */\nexport function getSearchParameterDetails(resourceType: string, searchParam: SearchParameter): SearchParameterDetails {\n let result: SearchParameterDetails | undefined =\n globalSchema.types[resourceType]?.searchParamsDetails?.[searchParam.code as string];\n if (!result) {\n result = buildSearchParamterDetails(resourceType, searchParam);\n }\n return result;\n}\n\nfunction setSearchParamterDetails(resourceType: string, code: string, details: SearchParameterDetails): void {\n const typeSchema = globalSchema.types[resourceType];\n if (!typeSchema.searchParamsDetails) {\n typeSchema.searchParamsDetails = {};\n }\n typeSchema.searchParamsDetails[code] = details;\n}\n\nfunction buildSearchParamterDetails(resourceType: string, searchParam: SearchParameter): SearchParameterDetails {\n if (searchParam.code === '_lastUpdated') {\n return { columnName: 'lastUpdated', type: SearchParameterType.DATETIME };\n }\n\n const code = searchParam.code as string;\n const columnName = convertCodeToColumnName(code);\n const expression = getExpressionForResourceType(resourceType, searchParam.expression as string)?.split('.');\n if (!expression) {\n // This happens on compound types\n // In the future, explore returning multiple column definitions\n return { columnName, type: SearchParameterType.TEXT };\n }\n\n const defaultType = getSearchParameterType(searchParam);\n let baseType = resourceType;\n let elementDefinition = undefined;\n let propertyType = undefined;\n let array = false;\n\n for (let i = 1; i < expression.length; i++) {\n const propertyName = expression[i];\n elementDefinition =\n globalSchema.types[baseType]?.properties?.[propertyName] ??\n globalSchema.types[baseType]?.properties?.[propertyName + '[x]'];\n if (!elementDefinition) {\n throw new Error(`Element definition not found for ${resourceType} ${searchParam.code}`);\n }\n\n if (elementDefinition.max === '*') {\n array = true;\n }\n\n propertyType = elementDefinition.type?.[0].code;\n if (!propertyType) {\n // This happens when one of parent properties uses contentReference\n // In the future, explore following the reference\n return { columnName, type: defaultType, array };\n }\n\n if (i < expression.length - 1) {\n if (propertyType === 'Element' || propertyType === 'BackboneElement') {\n baseType = baseType + capitalize(propertyName);\n } else {\n baseType = propertyType;\n }\n }\n }\n\n const type = getSearchParameterType(searchParam, propertyType as PropertyType);\n const result = { columnName, type, elementDefinition, array };\n setSearchParamterDetails(resourceType, code, result);\n return result;\n}\n\n/**\n * Converts a hyphen-delimited code to camelCase string.\n * @param code The search parameter code.\n * @returns The SQL column name.\n */\nfunction convertCodeToColumnName(code: string): string {\n return code.split('-').reduce((result, word, index) => result + (index ? capitalize(word) : word), '');\n}\n\nfunction getSearchParameterType(searchParam: SearchParameter, propertyType?: PropertyType): SearchParameterType {\n let type = SearchParameterType.TEXT;\n switch (searchParam.type) {\n case 'date':\n if (propertyType === PropertyType.dateTime || propertyType === PropertyType.instant) {\n type = SearchParameterType.DATETIME;\n } else {\n type = SearchParameterType.DATE;\n }\n break;\n case 'number':\n type = SearchParameterType.NUMBER;\n break;\n case 'quantity':\n type = SearchParameterType.QUANTITY;\n break;\n case 'reference':\n type = SearchParameterType.REFERENCE;\n break;\n case 'token':\n if (propertyType === 'boolean') {\n type = SearchParameterType.BOOLEAN;\n }\n break;\n }\n return type;\n}\n\nexport function getExpressionForResourceType(resourceType: string, expression: string): string | undefined {\n const expressions = expression.split(' | ');\n for (const e of expressions) {\n if (isIgnoredExpression(e)) {\n continue;\n }\n const simplified = simplifyExpression(e);\n if (simplified.startsWith(resourceType + '.')) {\n return simplified;\n }\n }\n return undefined;\n}\n\nfunction isIgnoredExpression(input: string): boolean {\n return input.includes(' as Period') || input.includes(' as SampledDate');\n}\n\nfunction simplifyExpression(input: string): string {\n let result = input.trim();\n\n if (result.startsWith('(') && result.endsWith(')')) {\n result = result.substring(1, result.length - 1);\n }\n\n if (result.includes('[0]')) {\n result = result.replaceAll('[0]', '');\n }\n\n const stopStrings = [' != ', ' as ', '.as(', '.exists(', '.where('];\n for (const stopString of stopStrings) {\n if (result.includes(stopString)) {\n result = result.substring(0, result.indexOf(stopString));\n }\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- /**
2
- * The ClientStorage class is a utility class for storing strings and objects.
3
- *
4
- * When using MedplumClient in the browser, it will be backed by browser localStorage.
5
- *
6
- * When Using MedplumClient in the server, it will be backed by the MemoryStorage class.
7
- */
8
- export declare class ClientStorage {
9
- #private;
10
- constructor();
11
- clear(): void;
12
- getString(key: string): string | undefined;
13
- setString(key: string, value: string | undefined): void;
14
- getObject<T>(key: string): T | undefined;
15
- setObject<T>(key: string, value: T): void;
16
- }
17
- /**
18
- * The MemoryStorage class is a minimal in-memory implementation of the Storage interface.
19
- */
20
- export declare class MemoryStorage implements Storage {
21
- #private;
22
- constructor();
23
- /**
24
- * Returns the number of key/value pairs.
25
- */
26
- get length(): number;
27
- /**
28
- * Removes all key/value pairs, if there are any.
29
- */
30
- clear(): void;
31
- /**
32
- * Returns the current value associated with the given key, or null if the given key does not exist.
33
- */
34
- getItem(key: string): string | null;
35
- /**
36
- * Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
37
- */
38
- setItem(key: string, value: string | null): void;
39
- /**
40
- * Removes the key/value pair with the given key, if a key/value pair with the given key exists.
41
- */
42
- removeItem(key: string): void;
43
- /**
44
- * Returns the name of the nth key, or null if n is greater than or equal to the number of key/value pairs.
45
- */
46
- key(index: number): string | null;
47
- }
@@ -1,177 +0,0 @@
1
- import { Bundle, ElementDefinition, SearchParameter, StructureDefinition } from '@medplum/fhirtypes';
2
- import { SearchParameterDetails } from './searchparams';
3
- export interface TypedValue {
4
- readonly type: string;
5
- readonly value: any;
6
- }
7
- /**
8
- * List of property types.
9
- * http://www.hl7.org/fhir/valueset-defined-types.html
10
- * The list here includes additions found from StructureDefinition resources.
11
- */
12
- export declare enum PropertyType {
13
- Address = "Address",
14
- Age = "Age",
15
- Annotation = "Annotation",
16
- Attachment = "Attachment",
17
- BackboneElement = "BackboneElement",
18
- CodeableConcept = "CodeableConcept",
19
- Coding = "Coding",
20
- ContactDetail = "ContactDetail",
21
- ContactPoint = "ContactPoint",
22
- Contributor = "Contributor",
23
- Count = "Count",
24
- DataRequirement = "DataRequirement",
25
- Distance = "Distance",
26
- Dosage = "Dosage",
27
- Duration = "Duration",
28
- Expression = "Expression",
29
- Extension = "Extension",
30
- HumanName = "HumanName",
31
- Identifier = "Identifier",
32
- MarketingStatus = "MarketingStatus",
33
- Meta = "Meta",
34
- Money = "Money",
35
- Narrative = "Narrative",
36
- ParameterDefinition = "ParameterDefinition",
37
- Period = "Period",
38
- Population = "Population",
39
- ProdCharacteristic = "ProdCharacteristic",
40
- ProductShelfLife = "ProductShelfLife",
41
- Quantity = "Quantity",
42
- Range = "Range",
43
- Ratio = "Ratio",
44
- Reference = "Reference",
45
- RelatedArtifact = "RelatedArtifact",
46
- SampledData = "SampledData",
47
- Signature = "Signature",
48
- SubstanceAmount = "SubstanceAmount",
49
- SystemString = "http://hl7.org/fhirpath/System.String",
50
- Timing = "Timing",
51
- TriggerDefinition = "TriggerDefinition",
52
- UsageContext = "UsageContext",
53
- base64Binary = "base64Binary",
54
- boolean = "boolean",
55
- canonical = "canonical",
56
- code = "code",
57
- date = "date",
58
- dateTime = "dateTime",
59
- decimal = "decimal",
60
- id = "id",
61
- instant = "instant",
62
- integer = "integer",
63
- markdown = "markdown",
64
- oid = "oid",
65
- positiveInt = "positiveInt",
66
- string = "string",
67
- time = "time",
68
- unsignedInt = "unsignedInt",
69
- uri = "uri",
70
- url = "url",
71
- uuid = "uuid"
72
- }
73
- /**
74
- * An IndexedStructureDefinition is a lookup-optimized version of a StructureDefinition.
75
- *
76
- * StructureDefinition resources contain schema information for other resource types.
77
- * These schemas can be used to automatically generate user interface elements for
78
- * resources.
79
- *
80
- * However, a StructureDefinition resource is not optimized for realtime lookups. All
81
- * resource types, sub types, and property definitions are stored in a flat array of
82
- * ElementDefinition objects. Therefore, to lookup the schema for a property (i.e., "Patient.name")
83
- * requires a linear scan of all ElementDefinition objects
84
- *
85
- * A StructureDefinition resource contains information about one or more types.
86
- * For example, the "Patient" StructureDefinition includes "Patient", "Patient_Contact",
87
- * "Patient_Communication", and "Patient_Link". This is inefficient.
88
- *
89
- * Instead, we create an indexed version of the StructureDefinition, called IndexedStructureDefinition.
90
- * In an IndexedStructureDefinition, retrieving a property definition is a hashtable lookup.
91
- *
92
- * The hierarchy is:
93
- * IndexedStructureDefinition - top level for one resource type
94
- * TypeSchema - one per resource type and all contained BackboneElements
95
- * PropertySchema - one per property/field
96
- */
97
- export interface IndexedStructureDefinition {
98
- types: {
99
- [resourceType: string]: TypeSchema;
100
- };
101
- }
102
- /**
103
- * An indexed TypeSchema.
104
- *
105
- * Example: The IndexedStructureDefinition for "Patient" would include the following TypeSchemas:
106
- * 1) Patient
107
- * 2) Patient_Contact
108
- * 3) Patient_Communication
109
- * 4) Patient_Link
110
- */
111
- export interface TypeSchema {
112
- structureDefinition: StructureDefinition;
113
- elementDefinition: ElementDefinition;
114
- display: string;
115
- properties: {
116
- [name: string]: ElementDefinition;
117
- };
118
- searchParams?: {
119
- [code: string]: SearchParameter;
120
- };
121
- searchParamsDetails?: {
122
- [code: string]: SearchParameterDetails;
123
- };
124
- description?: string;
125
- parentType?: string;
126
- }
127
- /**
128
- * Creates a new empty IndexedStructureDefinition.
129
- * @returns The empty IndexedStructureDefinition.
130
- * @deprecated Use globalSchema
131
- */
132
- export declare function createSchema(): IndexedStructureDefinition;
133
- /**
134
- * Indexes a bundle of StructureDefinitions for faster lookup.
135
- * @param bundle A FHIR bundle StructureDefinition resources.
136
- * @see {@link IndexedStructureDefinition} for more details on indexed StructureDefinitions.
137
- */
138
- export declare function indexStructureDefinitionBundle(bundle: Bundle): void;
139
- /**
140
- * Indexes a StructureDefinition for fast lookup.
141
- * @param structureDefinition The original StructureDefinition.
142
- * @see {@link IndexedStructureDefinition} for more details on indexed StructureDefinitions.
143
- */
144
- export declare function indexStructureDefinition(structureDefinition: StructureDefinition): void;
145
- /**
146
- * Indexes a bundle of SearchParameter resources for faster lookup.
147
- * @param bundle A FHIR bundle SearchParameter resources.
148
- * @see {@link IndexedStructureDefinition} for more details on indexed StructureDefinitions.
149
- */
150
- export declare function indexSearchParameterBundle(bundle: Bundle<SearchParameter>): void;
151
- /**
152
- * Indexes a SearchParameter resource for fast lookup.
153
- * Indexes by SearchParameter.code, which is the query string parameter name.
154
- * @param searchParam The SearchParameter resource.
155
- * @see {@link IndexedStructureDefinition} for more details on indexed StructureDefinitions.
156
- */
157
- export declare function indexSearchParameter(searchParam: SearchParameter): void;
158
- /**
159
- * Returns the type name for an ElementDefinition.
160
- * @param elementDefinition The element definition.
161
- * @returns The Medplum type name.
162
- */
163
- export declare function getElementDefinitionTypeName(elementDefinition: ElementDefinition): string;
164
- export declare function buildTypeName(components: string[]): string;
165
- export declare function getPropertyDisplayName(path: string): string;
166
- /**
167
- * Returns an element definition by type and property name.
168
- * Handles content references.
169
- * @param typeName The type name.
170
- * @param propertyName The property name.
171
- * @returns The element definition if found.
172
- */
173
- export declare function getElementDefinition(typeName: string, propertyName: string): ElementDefinition | undefined;
174
- /**
175
- * Global schema singleton.
176
- */
177
- export declare const globalSchema: IndexedStructureDefinition;