@metriport/fhir-sdk 1.3.7 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +173 -8
  2. package/dist/__tests__/careplan.test.d.ts +2 -0
  3. package/dist/__tests__/careplan.test.d.ts.map +1 -0
  4. package/dist/__tests__/careplan.test.js +544 -0
  5. package/dist/__tests__/careplan.test.js.map +1 -0
  6. package/dist/__tests__/coding-utilities.test.d.ts +2 -0
  7. package/dist/__tests__/coding-utilities.test.d.ts.map +1 -0
  8. package/dist/__tests__/coding-utilities.test.js +450 -0
  9. package/dist/__tests__/coding-utilities.test.js.map +1 -0
  10. package/dist/__tests__/type-guards.test.d.ts +2 -0
  11. package/dist/__tests__/type-guards.test.d.ts.map +1 -0
  12. package/dist/__tests__/type-guards.test.js +163 -0
  13. package/dist/__tests__/type-guards.test.js.map +1 -0
  14. package/dist/demo-reverse-references.d.ts +7 -0
  15. package/dist/demo-reverse-references.d.ts.map +1 -0
  16. package/dist/demo-reverse-references.js +207 -0
  17. package/dist/demo-reverse-references.js.map +1 -0
  18. package/dist/fhir-bundle-sdk.d.ts +50 -47
  19. package/dist/fhir-bundle-sdk.d.ts.map +1 -1
  20. package/dist/fhir-bundle-sdk.js +10 -2
  21. package/dist/fhir-bundle-sdk.js.map +1 -1
  22. package/dist/index.d.ts +4 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +15 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/internal/coding-systems.d.ts +42 -0
  27. package/dist/internal/coding-systems.d.ts.map +1 -0
  28. package/dist/internal/coding-systems.js +47 -0
  29. package/dist/internal/coding-systems.js.map +1 -0
  30. package/dist/internal/coding-utilities.d.ts +11 -0
  31. package/dist/internal/coding-utilities.d.ts.map +1 -0
  32. package/dist/internal/coding-utilities.js +254 -0
  33. package/dist/internal/coding-utilities.js.map +1 -0
  34. package/dist/internal/graph-traversal.js +1 -1
  35. package/dist/internal/graph-traversal.js.map +1 -1
  36. package/dist/internal/llm-context.d.ts.map +1 -1
  37. package/dist/internal/llm-context.js +3 -1
  38. package/dist/internal/llm-context.js.map +1 -1
  39. package/dist/internal/reference-resolution.d.ts.map +1 -1
  40. package/dist/internal/reference-resolution.js +123 -11
  41. package/dist/internal/reference-resolution.js.map +1 -1
  42. package/dist/internal/transparent-proxy.d.ts +12 -0
  43. package/dist/internal/transparent-proxy.d.ts.map +1 -0
  44. package/dist/internal/transparent-proxy.js +105 -0
  45. package/dist/internal/transparent-proxy.js.map +1 -0
  46. package/dist/type-guards.d.ts +183 -0
  47. package/dist/type-guards.d.ts.map +1 -0
  48. package/dist/type-guards.js +108 -0
  49. package/dist/type-guards.js.map +1 -0
  50. package/dist/types/coding-fields.d.ts +292 -0
  51. package/dist/types/coding-fields.d.ts.map +1 -0
  52. package/dist/types/coding-fields.js +3 -0
  53. package/dist/types/coding-fields.js.map +1 -0
  54. package/dist/types/smart-resources.d.ts +152 -6
  55. package/dist/types/smart-resources.d.ts.map +1 -1
  56. package/dist/types/smart-resources.js +35 -3
  57. package/dist/types/smart-resources.js.map +1 -1
  58. package/package.json +2 -3
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const index_1 = require("../index");
6
+ /**
7
+ * Tests for coding system utilities
8
+ * Note: Runtime proxies wrap CodeableConcept and Coding properties.
9
+ * Type assertions (as any) are used where TypeScript doesn't infer the wrapper.
10
+ */
11
+ describe("Coding System Utilities", () => {
12
+ describe("SmartCoding - Individual Coding Methods", () => {
13
+ const loincCoding = {
14
+ system: "http://loinc.org",
15
+ code: "8867-4",
16
+ display: "Heart rate",
17
+ };
18
+ const snomedCoding = {
19
+ system: "http://snomed.info/sct",
20
+ code: "73211009",
21
+ display: "Diabetes mellitus",
22
+ };
23
+ const bundle = {
24
+ resourceType: "Bundle",
25
+ type: "collection",
26
+ entry: [
27
+ {
28
+ resource: {
29
+ resourceType: "Observation",
30
+ id: "obs1",
31
+ status: "final",
32
+ code: {
33
+ coding: [loincCoding, snomedCoding],
34
+ },
35
+ },
36
+ },
37
+ ],
38
+ };
39
+ let sdk;
40
+ beforeAll(async () => {
41
+ sdk = await index_1.FhirBundleSdk.create(bundle);
42
+ });
43
+ describe("System checking methods", () => {
44
+ it("should correctly identify LOINC coding", () => {
45
+ const obs = sdk.getObservationById("obs1");
46
+ expect(obs).toBeDefined();
47
+ expect(obs?.code?.coding).toBeDefined();
48
+ const coding = obs.code.coding[0];
49
+ expect(coding).toBeDefined();
50
+ expect(coding.isLoinc()).toBe(true);
51
+ expect(coding.isIcd10()).toBe(false);
52
+ expect(coding.isSnomed()).toBe(false);
53
+ expect(coding.isRxNorm()).toBe(false);
54
+ expect(coding.isNdc()).toBe(false);
55
+ });
56
+ it("should correctly identify SNOMED coding", () => {
57
+ const obs = sdk.getObservationById("obs1");
58
+ expect(obs).toBeDefined();
59
+ expect(obs?.code?.coding).toBeDefined();
60
+ const coding = obs.code.coding[1];
61
+ expect(coding).toBeDefined();
62
+ expect(coding.isSnomed()).toBe(true);
63
+ expect(coding.isLoinc()).toBe(false);
64
+ });
65
+ });
66
+ describe("Code matching methods", () => {
67
+ it("should match specific code", () => {
68
+ const obs = sdk.getObservationById("obs1");
69
+ expect(obs).toBeDefined();
70
+ expect(obs?.code?.coding).toBeDefined();
71
+ const coding = obs.code.coding[0];
72
+ expect(coding).toBeDefined();
73
+ expect(coding.matchesCode("8867-4")).toBe(true);
74
+ expect(coding.matchesCode("wrong-code")).toBe(false);
75
+ });
76
+ it("should match codes from array", () => {
77
+ const obs = sdk.getObservationById("obs1");
78
+ expect(obs).toBeDefined();
79
+ expect(obs?.code?.coding).toBeDefined();
80
+ const coding = obs.code.coding[0];
81
+ expect(coding).toBeDefined();
82
+ expect(coding.matchesCodes(["8867-4", "other-code"])).toBe(true);
83
+ expect(coding.matchesCodes(["wrong-1", "wrong-2"])).toBe(false);
84
+ });
85
+ });
86
+ });
87
+ describe("SmartCodeableConcept - CodeableConcept Methods", () => {
88
+ const bundle = {
89
+ resourceType: "Bundle",
90
+ type: "collection",
91
+ entry: [
92
+ {
93
+ resource: {
94
+ resourceType: "Condition",
95
+ id: "cond1",
96
+ subject: { reference: "Patient/1" },
97
+ code: {
98
+ coding: [
99
+ {
100
+ system: "http://hl7.org/fhir/sid/icd-10-cm",
101
+ code: "E11.9",
102
+ display: "Type 2 diabetes mellitus",
103
+ },
104
+ {
105
+ system: "http://snomed.info/sct",
106
+ code: "73211009",
107
+ display: "Diabetes mellitus",
108
+ },
109
+ ],
110
+ text: "Type 2 Diabetes",
111
+ },
112
+ },
113
+ },
114
+ {
115
+ resource: {
116
+ resourceType: "Observation",
117
+ id: "obs1",
118
+ status: "final",
119
+ code: {
120
+ coding: [
121
+ {
122
+ system: "http://loinc.org",
123
+ code: "8867-4",
124
+ display: "Heart rate",
125
+ },
126
+ {
127
+ system: "http://loinc.org",
128
+ code: "8310-5",
129
+ display: "Body temperature",
130
+ },
131
+ ],
132
+ },
133
+ },
134
+ },
135
+ {
136
+ resource: {
137
+ resourceType: "Observation",
138
+ id: "obs2",
139
+ status: "final",
140
+ code: {
141
+ text: "No coding array",
142
+ },
143
+ },
144
+ },
145
+ ],
146
+ };
147
+ let sdk;
148
+ beforeAll(async () => {
149
+ sdk = await index_1.FhirBundleSdk.create(bundle);
150
+ });
151
+ describe("LOINC methods", () => {
152
+ it("should get first LOINC coding", () => {
153
+ const obs = sdk.getObservationById("obs1");
154
+ expect(obs?.code).toBeDefined();
155
+ const loinc = obs.code.getLoinc();
156
+ expect(loinc).toBeDefined();
157
+ expect(loinc.code).toBe("8867-4");
158
+ });
159
+ it("should get all LOINC codings", () => {
160
+ const obs = sdk.getObservationById("obs1");
161
+ expect(obs?.code).toBeDefined();
162
+ const loincCodings = obs.code.getLoincCodings();
163
+ expect(loincCodings).toHaveLength(2);
164
+ expect(loincCodings[0].code).toBe("8867-4");
165
+ expect(loincCodings[1].code).toBe("8310-5");
166
+ });
167
+ it("should get first LOINC code value", () => {
168
+ const obs = sdk.getObservationById("obs1");
169
+ expect(obs?.code).toBeDefined();
170
+ const code = obs.code.getLoincCode();
171
+ expect(code).toBe("8867-4");
172
+ });
173
+ it("should get all LOINC code values", () => {
174
+ const obs = sdk.getObservationById("obs1");
175
+ expect(obs?.code).toBeDefined();
176
+ const codes = obs.code.getLoincCodes();
177
+ expect(codes).toEqual(["8867-4", "8310-5"]);
178
+ });
179
+ it("should check if has any LOINC", () => {
180
+ const obs = sdk.getObservationById("obs1");
181
+ expect(obs?.code).toBeDefined();
182
+ expect(obs.code.hasLoinc()).toBe(true);
183
+ const cond = sdk.getConditionById("cond1");
184
+ expect(cond?.code).toBeDefined();
185
+ expect(cond.code.hasLoinc()).toBe(false);
186
+ });
187
+ it("should check if has specific LOINC code", () => {
188
+ const obs = sdk.getObservationById("obs1");
189
+ expect(obs?.code).toBeDefined();
190
+ expect(obs.code.hasLoincCode("8867-4")).toBe(true);
191
+ expect(obs.code.hasLoincCode("wrong-code")).toBe(false);
192
+ });
193
+ it("should check if has some LOINC codes", () => {
194
+ const obs = sdk.getObservationById("obs1");
195
+ expect(obs?.code).toBeDefined();
196
+ expect(obs.code.hasSomeLoinc(["8867-4", "other"])).toBe(true);
197
+ expect(obs.code.hasSomeLoinc(["8310-5", "other"])).toBe(true);
198
+ expect(obs.code.hasSomeLoinc(["wrong-1", "wrong-2"])).toBe(false);
199
+ });
200
+ it("should find LOINC coding with predicate", () => {
201
+ const obs = sdk.getObservationById("obs1");
202
+ expect(obs?.code).toBeDefined();
203
+ const found = obs.code.findLoincCoding((code) => code === "8310-5");
204
+ expect(found).toBeDefined();
205
+ expect(found.code).toBe("8310-5");
206
+ const notFound = obs.code.findLoincCoding((code) => code === "wrong");
207
+ expect(notFound).toBeUndefined();
208
+ });
209
+ });
210
+ describe("ICD-10 methods", () => {
211
+ it("should get first ICD-10 coding", () => {
212
+ const cond = sdk.getConditionById("cond1");
213
+ expect(cond?.code).toBeDefined();
214
+ const icd10 = cond.code.getIcd10();
215
+ expect(icd10).toBeDefined();
216
+ expect(icd10.code).toBe("E11.9");
217
+ });
218
+ it("should get all ICD-10 codings", () => {
219
+ const cond = sdk.getConditionById("cond1");
220
+ expect(cond?.code).toBeDefined();
221
+ const icd10Codings = cond.code.getIcd10Codings();
222
+ expect(icd10Codings).toHaveLength(1);
223
+ expect(icd10Codings[0].code).toBe("E11.9");
224
+ });
225
+ it("should check if has ICD-10", () => {
226
+ const cond = sdk.getConditionById("cond1");
227
+ expect(cond?.code).toBeDefined();
228
+ expect(cond.code.hasIcd10()).toBe(true);
229
+ const obs = sdk.getObservationById("obs1");
230
+ expect(obs?.code).toBeDefined();
231
+ expect(obs.code.hasIcd10()).toBe(false);
232
+ });
233
+ it("should check if has specific ICD-10 code", () => {
234
+ const cond = sdk.getConditionById("cond1");
235
+ expect(cond?.code).toBeDefined();
236
+ expect(cond.code.hasIcd10Code("E11.9")).toBe(true);
237
+ expect(cond.code.hasIcd10Code("wrong")).toBe(false);
238
+ });
239
+ it("should check if has some ICD-10 codes", () => {
240
+ const cond = sdk.getConditionById("cond1");
241
+ expect(cond?.code).toBeDefined();
242
+ expect(cond.code.hasSomeIcd10(["E11.9", "other"])).toBe(true);
243
+ expect(cond.code.hasSomeIcd10(["wrong-1", "wrong-2"])).toBe(false);
244
+ });
245
+ });
246
+ describe("SNOMED methods", () => {
247
+ it("should get first SNOMED coding", () => {
248
+ const cond = sdk.getConditionById("cond1");
249
+ expect(cond?.code).toBeDefined();
250
+ const snomed = cond.code.getSnomed();
251
+ expect(snomed).toBeDefined();
252
+ expect(snomed.code).toBe("73211009");
253
+ });
254
+ it("should check if has SNOMED", () => {
255
+ const cond = sdk.getConditionById("cond1");
256
+ expect(cond?.code).toBeDefined();
257
+ expect(cond.code.hasSnomed()).toBe(true);
258
+ });
259
+ it("should check if has specific SNOMED code", () => {
260
+ const cond = sdk.getConditionById("cond1");
261
+ expect(cond?.code).toBeDefined();
262
+ expect(cond.code.hasSnomedCode("73211009")).toBe(true);
263
+ expect(cond.code.hasSnomedCode("wrong")).toBe(false);
264
+ });
265
+ });
266
+ describe("Edge cases", () => {
267
+ it("should handle undefined coding array", () => {
268
+ const obs = sdk.getObservationById("obs2");
269
+ expect(obs?.code).toBeDefined();
270
+ expect(obs.code.getLoinc()).toBeUndefined();
271
+ expect(obs.code.getLoincCodings()).toEqual([]);
272
+ expect(obs.code.getLoincCode()).toBeUndefined();
273
+ expect(obs.code.getLoincCodes()).toEqual([]);
274
+ expect(obs.code.hasLoinc()).toBe(false);
275
+ expect(obs.code.hasLoincCode("any")).toBe(false);
276
+ expect(obs.code.hasSomeLoinc(["any"])).toBe(false);
277
+ });
278
+ it("should handle empty coding array", () => {
279
+ const emptyBundle = {
280
+ resourceType: "Bundle",
281
+ type: "collection",
282
+ entry: [
283
+ {
284
+ resource: {
285
+ resourceType: "Observation",
286
+ id: "obs-empty",
287
+ status: "final",
288
+ code: {
289
+ coding: [],
290
+ text: "Empty codings",
291
+ },
292
+ },
293
+ },
294
+ ],
295
+ };
296
+ const emptySdk = index_1.FhirBundleSdk.createSync(emptyBundle);
297
+ const obs = emptySdk.getObservationById("obs-empty");
298
+ expect(obs?.code).toBeDefined();
299
+ expect(obs.code.hasLoinc()).toBe(false);
300
+ });
301
+ });
302
+ });
303
+ describe("Deep nesting - Transparent Proxy", () => {
304
+ const bundle = {
305
+ resourceType: "Bundle",
306
+ type: "collection",
307
+ entry: [
308
+ {
309
+ resource: {
310
+ resourceType: "Observation",
311
+ id: "obs1",
312
+ status: "final",
313
+ code: {
314
+ coding: [
315
+ {
316
+ system: "http://loinc.org",
317
+ code: "8867-4",
318
+ display: "Heart rate",
319
+ },
320
+ ],
321
+ },
322
+ component: [
323
+ {
324
+ code: {
325
+ coding: [
326
+ {
327
+ system: "http://loinc.org",
328
+ code: "8310-5",
329
+ display: "Body temperature",
330
+ },
331
+ ],
332
+ },
333
+ },
334
+ ],
335
+ },
336
+ },
337
+ ],
338
+ };
339
+ let sdk;
340
+ beforeAll(async () => {
341
+ sdk = await index_1.FhirBundleSdk.create(bundle);
342
+ });
343
+ it("should wrap CodeableConcept in nested component arrays", () => {
344
+ const obs = sdk.getObservationById("obs1");
345
+ expect(obs?.component).toBeDefined();
346
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
347
+ const component = obs.component[0];
348
+ expect(component?.code).toBeDefined();
349
+ // Should have smart methods on nested CodeableConcept
350
+ expect(component.code.hasLoinc()).toBe(true);
351
+ expect(component.code.hasLoincCode("8310-5")).toBe(true);
352
+ });
353
+ it("should wrap Coding in deeply nested structures", () => {
354
+ const obs = sdk.getObservationById("obs1");
355
+ expect(obs?.component).toBeDefined();
356
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
357
+ const component = obs.component[0];
358
+ expect(component?.code?.coding).toBeDefined();
359
+ const componentCoding = component.code.coding[0];
360
+ expect(componentCoding).toBeDefined();
361
+ // Should have smart methods on nested Coding
362
+ expect(componentCoding.isLoinc()).toBe(true);
363
+ expect(componentCoding.matchesCode("8310-5")).toBe(true);
364
+ });
365
+ });
366
+ describe("Integration - Filtering by coding", () => {
367
+ const bundle = {
368
+ resourceType: "Bundle",
369
+ type: "collection",
370
+ entry: [
371
+ {
372
+ resource: {
373
+ resourceType: "Observation",
374
+ id: "obs1",
375
+ status: "final",
376
+ code: {
377
+ coding: [
378
+ {
379
+ system: "http://loinc.org",
380
+ code: "8867-4",
381
+ display: "Heart rate",
382
+ },
383
+ ],
384
+ },
385
+ },
386
+ },
387
+ {
388
+ resource: {
389
+ resourceType: "Observation",
390
+ id: "obs2",
391
+ status: "final",
392
+ code: {
393
+ coding: [
394
+ {
395
+ system: "http://loinc.org",
396
+ code: "8310-5",
397
+ display: "Body temperature",
398
+ },
399
+ ],
400
+ },
401
+ },
402
+ },
403
+ {
404
+ resource: {
405
+ resourceType: "Observation",
406
+ id: "obs3",
407
+ status: "final",
408
+ code: {
409
+ coding: [
410
+ {
411
+ system: "http://snomed.info/sct",
412
+ code: "271649006",
413
+ display: "Systolic blood pressure",
414
+ },
415
+ ],
416
+ },
417
+ },
418
+ },
419
+ ],
420
+ };
421
+ let sdk;
422
+ beforeAll(async () => {
423
+ sdk = await index_1.FhirBundleSdk.create(bundle);
424
+ });
425
+ it("should filter observations by LOINC codes", () => {
426
+ const vitals = sdk
427
+ .getObservations()
428
+ .filter(obs => obs.code?.hasSomeLoinc(["8867-4", "8310-5"]) ?? false);
429
+ expect(vitals).toHaveLength(2);
430
+ expect(vitals[0]?.id).toBe("obs1");
431
+ expect(vitals[1]?.id).toBe("obs2");
432
+ });
433
+ it("should filter observations by specific coding system", () => {
434
+ const loincObs = sdk.getObservations().filter(obs => obs.code?.hasLoinc() ?? false);
435
+ expect(loincObs).toHaveLength(2);
436
+ const snomedObs = sdk.getObservations().filter(obs => obs.code?.hasSnomed() ?? false);
437
+ expect(snomedObs).toHaveLength(1);
438
+ expect(snomedObs[0]?.id).toBe("obs3");
439
+ });
440
+ it("should filter and map to extract codes", () => {
441
+ const loincCodes = sdk
442
+ .getObservations()
443
+ .filter(obs => obs.code?.hasLoinc() ?? false)
444
+ .map(obs => obs.code.getLoincCode())
445
+ .filter((code) => code !== undefined);
446
+ expect(loincCodes).toEqual(["8867-4", "8310-5"]);
447
+ });
448
+ });
449
+ });
450
+ //# sourceMappingURL=coding-utilities.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coding-utilities.test.js","sourceRoot":"","sources":["../../src/__tests__/coding-utilities.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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"}