@metriport/fhir-sdk 0.30.0-alpha.1

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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +564 -0
  3. package/dist/__tests__/careplan.test.d.ts +2 -0
  4. package/dist/__tests__/careplan.test.d.ts.map +1 -0
  5. package/dist/__tests__/careplan.test.js +544 -0
  6. package/dist/__tests__/careplan.test.js.map +1 -0
  7. package/dist/__tests__/clinical-dates.test.d.ts +2 -0
  8. package/dist/__tests__/clinical-dates.test.d.ts.map +1 -0
  9. package/dist/__tests__/clinical-dates.test.js +341 -0
  10. package/dist/__tests__/clinical-dates.test.js.map +1 -0
  11. package/dist/__tests__/coding-utilities.test.d.ts +2 -0
  12. package/dist/__tests__/coding-utilities.test.d.ts.map +1 -0
  13. package/dist/__tests__/coding-utilities.test.js +482 -0
  14. package/dist/__tests__/coding-utilities.test.js.map +1 -0
  15. package/dist/__tests__/date-range-performance.test.d.ts +2 -0
  16. package/dist/__tests__/date-range-performance.test.d.ts.map +1 -0
  17. package/dist/__tests__/date-range-performance.test.js +218 -0
  18. package/dist/__tests__/date-range-performance.test.js.map +1 -0
  19. package/dist/__tests__/date-range-search.test.d.ts +2 -0
  20. package/dist/__tests__/date-range-search.test.d.ts.map +1 -0
  21. package/dist/__tests__/date-range-search.test.js +215 -0
  22. package/dist/__tests__/date-range-search.test.js.map +1 -0
  23. package/dist/__tests__/env-setup.d.ts +2 -0
  24. package/dist/__tests__/env-setup.d.ts.map +1 -0
  25. package/dist/__tests__/env-setup.js +37 -0
  26. package/dist/__tests__/env-setup.js.map +1 -0
  27. package/dist/__tests__/fhir-bundle-sdk-basic.test.d.ts +2 -0
  28. package/dist/__tests__/fhir-bundle-sdk-basic.test.d.ts.map +1 -0
  29. package/dist/__tests__/fhir-bundle-sdk-basic.test.js +19 -0
  30. package/dist/__tests__/fhir-bundle-sdk-basic.test.js.map +1 -0
  31. package/dist/__tests__/fhir-bundle-sdk.test.d.ts +2 -0
  32. package/dist/__tests__/fhir-bundle-sdk.test.d.ts.map +1 -0
  33. package/dist/__tests__/fhir-bundle-sdk.test.js +953 -0
  34. package/dist/__tests__/fhir-bundle-sdk.test.js.map +1 -0
  35. package/dist/__tests__/fixtures/fhir-bundles.d.ts +31 -0
  36. package/dist/__tests__/fixtures/fhir-bundles.d.ts.map +1 -0
  37. package/dist/__tests__/fixtures/fhir-bundles.js +487 -0
  38. package/dist/__tests__/fixtures/fhir-bundles.js.map +1 -0
  39. package/dist/__tests__/phase1-verification.test.d.ts +2 -0
  40. package/dist/__tests__/phase1-verification.test.d.ts.map +1 -0
  41. package/dist/__tests__/phase1-verification.test.js +141 -0
  42. package/dist/__tests__/phase1-verification.test.js.map +1 -0
  43. package/dist/__tests__/phase2-verification.test.d.ts +2 -0
  44. package/dist/__tests__/phase2-verification.test.d.ts.map +1 -0
  45. package/dist/__tests__/phase2-verification.test.js +234 -0
  46. package/dist/__tests__/phase2-verification.test.js.map +1 -0
  47. package/dist/__tests__/phase3-verification.test.d.ts +2 -0
  48. package/dist/__tests__/phase3-verification.test.d.ts.map +1 -0
  49. package/dist/__tests__/phase3-verification.test.js +121 -0
  50. package/dist/__tests__/phase3-verification.test.js.map +1 -0
  51. package/dist/__tests__/phase4-verification.test.d.ts +2 -0
  52. package/dist/__tests__/phase4-verification.test.d.ts.map +1 -0
  53. package/dist/__tests__/phase4-verification.test.js +168 -0
  54. package/dist/__tests__/phase4-verification.test.js.map +1 -0
  55. package/dist/__tests__/phase5-verification.test.d.ts +2 -0
  56. package/dist/__tests__/phase5-verification.test.d.ts.map +1 -0
  57. package/dist/__tests__/phase5-verification.test.js +397 -0
  58. package/dist/__tests__/phase5-verification.test.js.map +1 -0
  59. package/dist/__tests__/reverse-references.test.d.ts +2 -0
  60. package/dist/__tests__/reverse-references.test.d.ts.map +1 -0
  61. package/dist/__tests__/reverse-references.test.js +294 -0
  62. package/dist/__tests__/reverse-references.test.js.map +1 -0
  63. package/dist/__tests__/type-guards.test.d.ts +2 -0
  64. package/dist/__tests__/type-guards.test.d.ts.map +1 -0
  65. package/dist/__tests__/type-guards.test.js +163 -0
  66. package/dist/__tests__/type-guards.test.js.map +1 -0
  67. package/dist/clinical-dates.d.ts +26 -0
  68. package/dist/clinical-dates.d.ts.map +1 -0
  69. package/dist/clinical-dates.js +571 -0
  70. package/dist/clinical-dates.js.map +1 -0
  71. package/dist/fhir-bundle-sdk.d.ts +233 -0
  72. package/dist/fhir-bundle-sdk.d.ts.map +1 -0
  73. package/dist/fhir-bundle-sdk.js +545 -0
  74. package/dist/fhir-bundle-sdk.js.map +1 -0
  75. package/dist/index.d.ts +8 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +23 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/internal/bundle-operations.d.ts +14 -0
  80. package/dist/internal/bundle-operations.d.ts.map +1 -0
  81. package/dist/internal/bundle-operations.js +55 -0
  82. package/dist/internal/bundle-operations.js.map +1 -0
  83. package/dist/internal/coding-systems.d.ts +48 -0
  84. package/dist/internal/coding-systems.d.ts.map +1 -0
  85. package/dist/internal/coding-systems.js +55 -0
  86. package/dist/internal/coding-systems.js.map +1 -0
  87. package/dist/internal/coding-utilities.d.ts +27 -0
  88. package/dist/internal/coding-utilities.d.ts.map +1 -0
  89. package/dist/internal/coding-utilities.js +297 -0
  90. package/dist/internal/coding-utilities.js.map +1 -0
  91. package/dist/internal/date-extraction.d.ts +12 -0
  92. package/dist/internal/date-extraction.d.ts.map +1 -0
  93. package/dist/internal/date-extraction.js +629 -0
  94. package/dist/internal/date-extraction.js.map +1 -0
  95. package/dist/internal/graph-traversal.d.ts +13 -0
  96. package/dist/internal/graph-traversal.d.ts.map +1 -0
  97. package/dist/internal/graph-traversal.js +89 -0
  98. package/dist/internal/graph-traversal.js.map +1 -0
  99. package/dist/internal/indexing.d.ts +17 -0
  100. package/dist/internal/indexing.d.ts.map +1 -0
  101. package/dist/internal/indexing.js +129 -0
  102. package/dist/internal/indexing.js.map +1 -0
  103. package/dist/internal/llm-context.d.ts +40 -0
  104. package/dist/internal/llm-context.d.ts.map +1 -0
  105. package/dist/internal/llm-context.js +214 -0
  106. package/dist/internal/llm-context.js.map +1 -0
  107. package/dist/internal/reference-resolution.d.ts +29 -0
  108. package/dist/internal/reference-resolution.d.ts.map +1 -0
  109. package/dist/internal/reference-resolution.js +338 -0
  110. package/dist/internal/reference-resolution.js.map +1 -0
  111. package/dist/internal/reference-utils.d.ts +26 -0
  112. package/dist/internal/reference-utils.d.ts.map +1 -0
  113. package/dist/internal/reference-utils.js +89 -0
  114. package/dist/internal/reference-utils.js.map +1 -0
  115. package/dist/internal/transparent-proxy.d.ts +12 -0
  116. package/dist/internal/transparent-proxy.d.ts.map +1 -0
  117. package/dist/internal/transparent-proxy.js +81 -0
  118. package/dist/internal/transparent-proxy.js.map +1 -0
  119. package/dist/internal/validation.d.ts +16 -0
  120. package/dist/internal/validation.d.ts.map +1 -0
  121. package/dist/internal/validation.js +45 -0
  122. package/dist/internal/validation.js.map +1 -0
  123. package/dist/type-guards.d.ts +212 -0
  124. package/dist/type-guards.d.ts.map +1 -0
  125. package/dist/type-guards.js +375 -0
  126. package/dist/type-guards.js.map +1 -0
  127. package/dist/types/coding-fields.d.ts +311 -0
  128. package/dist/types/coding-fields.d.ts.map +1 -0
  129. package/dist/types/coding-fields.js +3 -0
  130. package/dist/types/coding-fields.js.map +1 -0
  131. package/dist/types/sdk-types.d.ts +107 -0
  132. package/dist/types/sdk-types.d.ts.map +1 -0
  133. package/dist/types/sdk-types.js +17 -0
  134. package/dist/types/sdk-types.js.map +1 -0
  135. package/dist/types/smart-resources.d.ts +470 -0
  136. package/dist/types/smart-resources.d.ts.map +1 -0
  137. package/dist/types/smart-resources.js +249 -0
  138. package/dist/types/smart-resources.js.map +1 -0
  139. package/dist/utils/interval-tree/index.d.ts +87 -0
  140. package/dist/utils/interval-tree/index.d.ts.map +1 -0
  141. package/dist/utils/interval-tree/index.js +774 -0
  142. package/dist/utils/interval-tree/index.js.map +1 -0
  143. package/dist/utils/interval-tree/shallowequal/arrays.d.ts +3 -0
  144. package/dist/utils/interval-tree/shallowequal/arrays.d.ts.map +1 -0
  145. package/dist/utils/interval-tree/shallowequal/arrays.js +25 -0
  146. package/dist/utils/interval-tree/shallowequal/arrays.js.map +1 -0
  147. package/dist/utils/interval-tree/shallowequal/index.d.ts +6 -0
  148. package/dist/utils/interval-tree/shallowequal/index.d.ts.map +1 -0
  149. package/dist/utils/interval-tree/shallowequal/index.js +28 -0
  150. package/dist/utils/interval-tree/shallowequal/index.js.map +1 -0
  151. package/dist/utils/interval-tree/shallowequal/objects.d.ts +3 -0
  152. package/dist/utils/interval-tree/shallowequal/objects.d.ts.map +1 -0
  153. package/dist/utils/interval-tree/shallowequal/objects.js +28 -0
  154. package/dist/utils/interval-tree/shallowequal/objects.js.map +1 -0
  155. package/package.json +70 -0
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ const index_1 = require("../index");
5
+ const fhir_bundles_1 = require("./fixtures/fhir-bundles");
6
+ describe("Reverse References", () => {
7
+ describe("getResourcesReferencingId - basic functionality", () => {
8
+ it("should return all resources that reference a given resource ID", async () => {
9
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
10
+ // patient-123 is referenced by:
11
+ // - encounter-789 (subject)
12
+ // - observation-001 (subject)
13
+ // - diagnostic-report-002 (subject)
14
+ const referencingResources = sdk.getResourcesReferencingId("patient-123");
15
+ expect(referencingResources).toHaveLength(4);
16
+ const resourceTypes = referencingResources.map(r => r.resourceType).sort();
17
+ expect(resourceTypes).toEqual(["Condition", "DiagnosticReport", "Encounter", "Observation"]);
18
+ });
19
+ it("should return empty array when no resources reference the given ID", async () => {
20
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
21
+ const referencingResources = sdk.getResourcesReferencingId("nonexistent-id");
22
+ expect(referencingResources).toEqual([]);
23
+ });
24
+ it("should handle resources referenced by multiple other resources", async () => {
25
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
26
+ // encounter-789 is referenced by:
27
+ // - observation-001 (encounter)
28
+ // - diagnostic-report-002 (encounter)
29
+ const referencingResources = sdk.getResourcesReferencingId("encounter-789");
30
+ expect(referencingResources).toHaveLength(2);
31
+ expect(referencingResources.every(r => r.resourceType === "Observation" || r.resourceType === "DiagnosticReport")).toBe(true);
32
+ });
33
+ it("should handle resources referenced by array fields", async () => {
34
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
35
+ // practitioner-456 is referenced by:
36
+ // - encounter-789 (participant array)
37
+ // - observation-001 (performer array)
38
+ // - diagnostic-report-002 (performer array)
39
+ const referencingResources = sdk.getResourcesReferencingId("practitioner-456");
40
+ expect(referencingResources).toHaveLength(3);
41
+ });
42
+ });
43
+ describe("getResourcesReferencingId - filtering by resource type", () => {
44
+ it("should filter by source resource type", async () => {
45
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
46
+ // Get only Observations that reference patient-123
47
+ const observations = sdk.getResourcesReferencingId("patient-123", {
48
+ resourceType: "Observation",
49
+ });
50
+ expect(observations).toHaveLength(1);
51
+ expect(observations[0]?.resourceType).toBe("Observation");
52
+ expect(observations[0]?.id).toBe("observation-001");
53
+ });
54
+ it("should return empty array when filtering by type with no matches", async () => {
55
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
56
+ // No Practitioners reference patient-123
57
+ const practitioners = sdk.getResourcesReferencingId("patient-123", {
58
+ resourceType: "Practitioner",
59
+ });
60
+ expect(practitioners).toEqual([]);
61
+ });
62
+ it("should handle multiple resources of same type referencing target", async () => {
63
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
64
+ // patient-mix-1 is referenced by observation-mix-1 and observation-mix-2
65
+ const observations = sdk.getResourcesReferencingId("patient-mix-1", {
66
+ resourceType: "Observation",
67
+ });
68
+ expect(observations).toHaveLength(2);
69
+ expect(observations.every(o => o.resourceType === "Observation")).toBe(true);
70
+ });
71
+ });
72
+ describe("getResourcesReferencingId - filtering by reference field", () => {
73
+ it("should filter by specific reference field", async () => {
74
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
75
+ // Get only resources that reference patient-123 via "subject" field
76
+ const subjectReferences = sdk.getResourcesReferencingId("patient-123", {
77
+ referenceField: "subject",
78
+ });
79
+ expect(subjectReferences).toHaveLength(4);
80
+ expect(subjectReferences.every(r => {
81
+ const resource = r;
82
+ return resource.subject?.reference?.includes("patient-123");
83
+ })).toBe(true);
84
+ });
85
+ it("should filter by nested reference field", async () => {
86
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
87
+ // Get only resources that reference practitioner-456 via "performer" field
88
+ const performerReferences = sdk.getResourcesReferencingId("practitioner-456", {
89
+ referenceField: "performer",
90
+ });
91
+ expect(performerReferences.length).toBeGreaterThan(0);
92
+ });
93
+ it("should return empty array when field does not match", async () => {
94
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
95
+ // No resources reference patient-123 via "performer" field
96
+ const performerReferences = sdk.getResourcesReferencingId("patient-123", {
97
+ referenceField: "performer",
98
+ });
99
+ expect(performerReferences).toEqual([]);
100
+ });
101
+ });
102
+ describe("getResourcesReferencingId - combined filters", () => {
103
+ it("should apply both resourceType and referenceField filters", async () => {
104
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
105
+ // Get only Observations that reference patient-123 via "subject"
106
+ const observations = sdk.getResourcesReferencingId("patient-123", {
107
+ resourceType: "Observation",
108
+ referenceField: "subject",
109
+ });
110
+ expect(observations).toHaveLength(1);
111
+ expect(observations[0]?.resourceType).toBe("Observation");
112
+ expect(observations[0]?.id).toBe("observation-001");
113
+ });
114
+ });
115
+ describe("Smart resource getReferencingResources method", () => {
116
+ it("should expose getReferencingResources on smart resources", async () => {
117
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
118
+ const patient = sdk.getPatientById("patient-123");
119
+ expect(patient).toBeDefined();
120
+ expect(typeof patient.getReferencingResources).toBe("function");
121
+ });
122
+ it("should return all resources referencing the smart resource", async () => {
123
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
124
+ const patient = sdk.getPatientById("patient-123");
125
+ const referencingResources = patient.getReferencingResources();
126
+ expect(referencingResources).toHaveLength(4);
127
+ const resourceTypes = referencingResources.map((r) => r.resourceType).sort();
128
+ expect(resourceTypes).toEqual(["Condition", "DiagnosticReport", "Encounter", "Observation"]);
129
+ });
130
+ it("should support filtering options on smart resource method", async () => {
131
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
132
+ const patient = sdk.getPatientById("patient-123");
133
+ const observations = patient.getReferencingResources({
134
+ resourceType: "Observation",
135
+ });
136
+ expect(observations).toHaveLength(1);
137
+ expect(observations[0].resourceType).toBe("Observation");
138
+ });
139
+ it("should support referenceField filtering on smart resource method", async () => {
140
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
141
+ const patient = sdk.getPatientById("patient-123");
142
+ const subjectReferences = patient.getReferencingResources({
143
+ referenceField: "subject",
144
+ });
145
+ expect(subjectReferences).toHaveLength(4);
146
+ });
147
+ it("should return empty array when smart resource is not referenced", async () => {
148
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
149
+ const practitioner = sdk.getPractitionerById("practitioner-456");
150
+ // Check if the method exists and returns an array
151
+ const pracReferences = practitioner.getReferencingResources();
152
+ expect(Array.isArray(pracReferences)).toBe(true);
153
+ });
154
+ it("should work with resources that have no ID", async () => {
155
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
156
+ const observation = sdk.getObservationById("observation-001");
157
+ const referencingResources = observation.getReferencingResources();
158
+ // observation-001 is referenced by diagnostic-report-002 in the "result" field
159
+ expect(referencingResources).toHaveLength(1);
160
+ expect(referencingResources[0].resourceType).toBe("DiagnosticReport");
161
+ });
162
+ });
163
+ describe("Edge cases", () => {
164
+ it("should handle bundle with no references", async () => {
165
+ const bundle = {
166
+ resourceType: "Bundle",
167
+ type: "collection",
168
+ entry: [
169
+ {
170
+ resource: {
171
+ resourceType: "Patient",
172
+ id: "patient-solo",
173
+ name: [{ family: "Solo" }],
174
+ },
175
+ },
176
+ ],
177
+ };
178
+ const sdk = await index_1.FhirBundleSdk.create(bundle);
179
+ const referencingResources = sdk.getResourcesReferencingId("patient-solo");
180
+ expect(referencingResources).toEqual([]);
181
+ });
182
+ it("should handle resources with fullUrl references", async () => {
183
+ const bundle = {
184
+ resourceType: "Bundle",
185
+ type: "collection",
186
+ entry: [
187
+ {
188
+ fullUrl: "urn:uuid:patient-fullurl-test",
189
+ resource: {
190
+ resourceType: "Patient",
191
+ id: "patient-fullurl-test",
192
+ name: [{ family: "FullUrl" }],
193
+ },
194
+ },
195
+ {
196
+ resource: {
197
+ resourceType: "Observation",
198
+ id: "observation-fullurl-test",
199
+ status: "final",
200
+ code: { text: "Test" },
201
+ subject: {
202
+ reference: "urn:uuid:patient-fullurl-test",
203
+ },
204
+ },
205
+ },
206
+ ],
207
+ };
208
+ const sdk = await index_1.FhirBundleSdk.create(bundle);
209
+ // Should work with resource ID
210
+ const referencingById = sdk.getResourcesReferencingId("patient-fullurl-test");
211
+ expect(referencingById).toHaveLength(1);
212
+ // Should also work with fullUrl
213
+ const referencingByFullUrl = sdk.getResourcesReferencingId("urn:uuid:patient-fullurl-test");
214
+ expect(referencingByFullUrl).toHaveLength(1);
215
+ });
216
+ it("should return smart resources from reverse lookup", async () => {
217
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
218
+ const referencingResources = sdk.getResourcesReferencingId("patient-123");
219
+ // Check that returned resources are smart resources
220
+ expect(referencingResources.length).toBeGreaterThan(0);
221
+ expect(referencingResources[0].__isSmartResource).toBe(true);
222
+ });
223
+ });
224
+ describe("Performance", () => {
225
+ it("should perform reverse lookup in constant time", async () => {
226
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
227
+ const iterations = 100;
228
+ const times = [];
229
+ for (let i = 0; i < iterations; i++) {
230
+ const start = performance.now();
231
+ sdk.getResourcesReferencingId("patient-123");
232
+ const end = performance.now();
233
+ times.push(end - start);
234
+ }
235
+ const avgTime = times.reduce((a, b) => a + b) / times.length;
236
+ // Should be extremely fast (under 1ms on average)
237
+ expect(avgTime).toBeLessThan(1);
238
+ });
239
+ });
240
+ describe("getReferencedResources - forward reference lookup", () => {
241
+ it("should expose getReferencedResources on smart resources", async () => {
242
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
243
+ const observation = sdk.getObservationById("observation-001");
244
+ expect(observation).toBeDefined();
245
+ expect(typeof observation.getReferencedResources).toBe("function");
246
+ });
247
+ it("should return all resources referenced by a resource", async () => {
248
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
249
+ const observation = sdk.getObservationById("observation-001");
250
+ const referencedResources = observation.getReferencedResources();
251
+ // observation-001 references:
252
+ // - patient-123 (subject)
253
+ // - encounter-789 (encounter)
254
+ // - practitioner-456 (performer)
255
+ expect(referencedResources.length).toBeGreaterThan(0);
256
+ const resourceTypes = new Set(referencedResources.map((r) => r.resourceType));
257
+ expect(resourceTypes.has("Patient")).toBe(true);
258
+ });
259
+ it("should return empty array for resources with no references", async () => {
260
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
261
+ const patient = sdk.getPatientById("patient-123");
262
+ const referencedResources = patient.getReferencedResources();
263
+ // Patient may have no outgoing references or very few
264
+ expect(Array.isArray(referencedResources)).toBe(true);
265
+ });
266
+ it("should work with SDK-level method getResourcesReferencedBy", async () => {
267
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
268
+ const observation = sdk.getObservationById("observation-001");
269
+ expect(observation).toBeDefined();
270
+ if (!observation) {
271
+ throw new Error("Observation not found");
272
+ }
273
+ const referencedResources = sdk.getResourcesReferencedBy(observation);
274
+ expect(Array.isArray(referencedResources)).toBe(true);
275
+ expect(referencedResources.length).toBeGreaterThan(0);
276
+ });
277
+ it("should handle array reference fields", async () => {
278
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
279
+ const diagnosticReport = sdk.getDiagnosticReportById("diagnostic-report-002");
280
+ const referencedResources = diagnosticReport.getReferencedResources();
281
+ // DiagnosticReport references multiple resources including results array
282
+ expect(Array.isArray(referencedResources)).toBe(true);
283
+ expect(referencedResources.length).toBeGreaterThan(0);
284
+ });
285
+ it("should not include undefined values", async () => {
286
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
287
+ const observation = sdk.getObservationById("observation-001");
288
+ const referencedResources = observation.getReferencedResources();
289
+ // All returned resources should be defined
290
+ expect(referencedResources.every((r) => r !== undefined)).toBe(true);
291
+ });
292
+ });
293
+ });
294
+ //# sourceMappingURL=reverse-references.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reverse-references.test.js","sourceRoot":"","sources":["../../src/__tests__/reverse-references.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=type-guards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-guards.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/type-guards.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fhir_bundle_sdk_1 = require("../fhir-bundle-sdk");
4
+ const type_guards_1 = require("../type-guards");
5
+ describe("Type Guards", () => {
6
+ describe("Basic type narrowing with mixed resource arrays", () => {
7
+ test("filters mixed Resource array to specific type with proper inference", () => {
8
+ const resources = [
9
+ { resourceType: "Patient", id: "patient-1" },
10
+ { resourceType: "Observation", id: "obs-1", status: "final", code: { text: "test" } },
11
+ { resourceType: "Patient", id: "patient-2" },
12
+ {
13
+ resourceType: "DiagnosticReport",
14
+ id: "report-1",
15
+ status: "final",
16
+ code: { text: "test" },
17
+ },
18
+ { resourceType: "Observation", id: "obs-2", status: "final", code: { text: "test" } },
19
+ ];
20
+ const patients = resources.filter(type_guards_1.isPatient);
21
+ const observations = resources.filter(type_guards_1.isObservation);
22
+ const reports = resources.filter(type_guards_1.isDiagnosticReport);
23
+ // Type assertions validate TypeScript properly inferred the types
24
+ expect(patients).toHaveLength(2);
25
+ expect(observations).toHaveLength(2);
26
+ expect(reports).toHaveLength(1);
27
+ // TypeScript knows these are Patients, so we can access Patient-specific fields
28
+ patients.forEach(patient => {
29
+ expect(patient.resourceType).toBe("Patient");
30
+ // This wouldn't compile if TypeScript didn't narrow the type
31
+ void patient.name; // Patient-specific field accessible due to type narrowing
32
+ });
33
+ // TypeScript knows these are Observations
34
+ observations.forEach(obs => {
35
+ expect(obs.resourceType).toBe("Observation");
36
+ expect(obs.status).toBe("final"); // Observation-specific field accessible
37
+ });
38
+ });
39
+ });
40
+ describe("Type guards with Smart resources", () => {
41
+ test("filters Smart resources with proper type inference", async () => {
42
+ const bundle = {
43
+ resourceType: "Bundle",
44
+ type: "collection",
45
+ entry: [
46
+ { resource: { resourceType: "Patient", id: "patient-1" } },
47
+ {
48
+ resource: {
49
+ resourceType: "Observation",
50
+ id: "obs-1",
51
+ status: "final",
52
+ code: { text: "test" },
53
+ subject: { reference: "Patient/patient-1" },
54
+ },
55
+ },
56
+ { resource: { resourceType: "Patient", id: "patient-2" } },
57
+ {
58
+ resource: {
59
+ resourceType: "Encounter",
60
+ id: "enc-1",
61
+ status: "finished",
62
+ class: { code: "test" },
63
+ },
64
+ },
65
+ {
66
+ resource: {
67
+ resourceType: "Observation",
68
+ id: "obs-2",
69
+ status: "final",
70
+ code: { text: "test" },
71
+ },
72
+ },
73
+ ],
74
+ };
75
+ const sdk = await fhir_bundle_sdk_1.FhirBundleSdk.create(bundle);
76
+ // Test filtering observations directly - this is the main use case
77
+ const allObservations = sdk.getObservations();
78
+ expect(allObservations).toHaveLength(2);
79
+ allObservations.forEach(obs => {
80
+ expect(obs.resourceType).toBe("Observation");
81
+ expect(obs.__isSmartResource).toBe(true);
82
+ // Type guard confirms it's an Observation, so we can access observation-specific fields
83
+ if ((0, type_guards_1.isObservation)(obs)) {
84
+ const subject = obs.getSubject();
85
+ void subject;
86
+ }
87
+ });
88
+ // Test filtering patients
89
+ const allPatients = sdk.getPatients();
90
+ expect(allPatients).toHaveLength(2);
91
+ allPatients.forEach(patient => {
92
+ expect(patient.resourceType).toBe("Patient");
93
+ expect(patient.__isSmartResource).toBe(true);
94
+ });
95
+ });
96
+ test("type guards work in conditional blocks with Smart resources", async () => {
97
+ const bundle = {
98
+ resourceType: "Bundle",
99
+ type: "collection",
100
+ entry: [
101
+ {
102
+ resource: {
103
+ resourceType: "Patient",
104
+ id: "patient-1",
105
+ name: [{ given: ["Jane"], family: "Doe" }],
106
+ },
107
+ },
108
+ {
109
+ resource: {
110
+ resourceType: "Observation",
111
+ id: "obs-1",
112
+ status: "final",
113
+ code: { text: "test" },
114
+ valueQuantity: { value: 120, unit: "mmHg" },
115
+ },
116
+ },
117
+ ],
118
+ };
119
+ const sdk = await fhir_bundle_sdk_1.FhirBundleSdk.create(bundle);
120
+ const resource1 = sdk.getResourceById("patient-1");
121
+ const resource2 = sdk.getResourceById("obs-1");
122
+ // Type guard in conditional - TypeScript should narrow the type
123
+ if (resource1 && (0, type_guards_1.isPatient)(resource1)) {
124
+ expect(resource1.resourceType).toBe("Patient");
125
+ const name = resource1.name?.[0]?.given?.[0];
126
+ expect(name).toBe("Jane");
127
+ }
128
+ if (resource2 && (0, type_guards_1.isObservation)(resource2)) {
129
+ expect(resource2.resourceType).toBe("Observation");
130
+ const value = resource2.valueQuantity?.value;
131
+ expect(value).toBe(120);
132
+ }
133
+ });
134
+ });
135
+ describe("Edge cases", () => {
136
+ test("handles undefined gracefully", () => {
137
+ expect((0, type_guards_1.isPatient)(undefined)).toBe(false);
138
+ expect((0, type_guards_1.isObservation)(undefined)).toBe(false);
139
+ expect((0, type_guards_1.isDiagnosticReport)(undefined)).toBe(false);
140
+ });
141
+ test("filters out undefined values from array", () => {
142
+ const resources = [
143
+ { resourceType: "Patient", id: "1" },
144
+ undefined,
145
+ { resourceType: "Observation", id: "2", status: "final", code: { text: "test" } },
146
+ undefined,
147
+ ];
148
+ const patients = resources.filter(type_guards_1.isPatient);
149
+ const observations = resources.filter(type_guards_1.isObservation);
150
+ expect(patients).toHaveLength(1);
151
+ expect(observations).toHaveLength(1);
152
+ });
153
+ test("returns empty array when no matches found", () => {
154
+ const resources = [
155
+ { resourceType: "Patient", id: "1" },
156
+ { resourceType: "Patient", id: "2" },
157
+ ];
158
+ const observations = resources.filter(type_guards_1.isObservation);
159
+ expect(observations).toHaveLength(0);
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=type-guards.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-guards.test.js","sourceRoot":"","sources":["../../src/__tests__/type-guards.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Resource } from "@medplum/fhirtypes";
2
+ /**
3
+ * Date range extracted from a FHIR resource for use with searchByDateRange()
4
+ */
5
+ export interface ResourceDateRange {
6
+ /** The start date in ISO format */
7
+ startDate: string;
8
+ /** The end date in ISO format (only present for period-based dates) */
9
+ endDate?: string;
10
+ }
11
+ /**
12
+ * Extract the primary clinical date range from a FHIR resource.
13
+ * Returns undefined if the resource has no clinical dates.
14
+ *
15
+ * The returned dates can be passed directly to searchByDateRange():
16
+ * @example
17
+ * const dateRange = getClinicalDateRange(myObservation);
18
+ * if (dateRange) {
19
+ * bundle.searchByDateRange({
20
+ * dateFrom: dateRange.startDate,
21
+ * dateTo: dateRange.endDate
22
+ * });
23
+ * }
24
+ */
25
+ export declare function getClinicalDateRange(resource: Resource): ResourceDateRange | undefined;
26
+ //# sourceMappingURL=clinical-dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clinical-dates.d.ts","sourceRoot":"","sources":["../src/clinical-dates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgDT,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,GAAG,SAAS,CA0iBtF"}