@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,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../index");
4
+ const fhir_bundles_1 = require("./fixtures/fhir-bundles");
5
+ describe("Phase 1 Verification - Bundle Initialization & Resource Retrieval", () => {
6
+ describe("Bundle Initialization", () => {
7
+ it("should initialize with valid bundle and build indexes", async () => {
8
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
9
+ expect(sdk).toBeDefined();
10
+ });
11
+ it("should handle empty bundle", async () => {
12
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.emptyBundle);
13
+ expect(sdk).toBeDefined();
14
+ });
15
+ });
16
+ describe("Resource Retrieval by ID - FR-3.1 to FR-3.5", () => {
17
+ let sdk;
18
+ beforeEach(async () => {
19
+ sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
20
+ });
21
+ describe("FR-3.1: getResourceById<T>(id: string): T | undefined returns resource matching the ID", () => {
22
+ it("should return resource by ID with proper typing", () => {
23
+ const patient = sdk.getResourceById("patient-123");
24
+ expect(patient).toBeDefined();
25
+ expect(patient?.id).toBe("patient-123");
26
+ expect(patient?.resourceType).toBe("Patient");
27
+ expect(patient?.name?.[0]?.family).toBe("Doe");
28
+ });
29
+ it("should return practitioner by ID", () => {
30
+ const practitioner = sdk.getResourceById("practitioner-456");
31
+ expect(practitioner).toBeDefined();
32
+ expect(practitioner?.id).toBe("practitioner-456");
33
+ expect(practitioner?.resourceType).toBe("Practitioner");
34
+ expect(practitioner?.name?.[0]?.family).toBe("Smith");
35
+ });
36
+ it("should return observation by ID", () => {
37
+ const observation = sdk.getResourceById("observation-001");
38
+ expect(observation).toBeDefined();
39
+ expect(observation?.id).toBe("observation-001");
40
+ expect(observation?.resourceType).toBe("Observation");
41
+ expect(observation?.code?.text).toBe("Glucose");
42
+ });
43
+ });
44
+ describe("FR-3.2: Method searches both resource.id and entry.fullUrl for matches", () => {
45
+ it("should find resource by resource.id", () => {
46
+ const patient = sdk.getResourceById("patient-123");
47
+ expect(patient?.id).toBe("patient-123");
48
+ });
49
+ it("should find resource by fullUrl", () => {
50
+ const patient = sdk.getResourceById("urn:uuid:patient-123");
51
+ expect(patient?.id).toBe("patient-123");
52
+ });
53
+ });
54
+ describe("FR-3.3: Method supports type parameter for proper TypeScript return typing", () => {
55
+ it("should return properly typed resource", () => {
56
+ const patient = sdk.getResourceById("patient-123");
57
+ // TypeScript should infer this as Patient | undefined
58
+ // These properties should be available without type errors
59
+ expect(patient?.name).toBeDefined();
60
+ expect(patient?.birthDate).toBeDefined();
61
+ expect(patient?.gender).toBe("female");
62
+ });
63
+ });
64
+ describe("FR-3.4: Method returns undefined if resource not found", () => {
65
+ it("should return undefined for nonexistent resource", () => {
66
+ const result = sdk.getResourceById("nonexistent-id");
67
+ expect(result).toBeUndefined();
68
+ });
69
+ it("should return undefined for empty string", () => {
70
+ const result = sdk.getResourceById("");
71
+ expect(result).toBeUndefined();
72
+ });
73
+ });
74
+ describe("FR-3.5: Lookup operates in O(1) time complexity", () => {
75
+ it("should perform lookup in O(1) time", () => {
76
+ const start = performance.now();
77
+ const patient = sdk.getResourceById("patient-123");
78
+ const end = performance.now();
79
+ expect(patient).toBeDefined();
80
+ // O(1) lookup should be very fast (under 1ms)
81
+ expect(end - start).toBeLessThan(fhir_bundles_1.CONSTANT_TIME_EXPECTED_THRESHOLD_MS);
82
+ });
83
+ it("should maintain O(1) performance for multiple lookups", () => {
84
+ const start = performance.now();
85
+ // Perform multiple lookups
86
+ sdk.getResourceById("patient-123");
87
+ sdk.getResourceById("practitioner-456");
88
+ sdk.getResourceById("observation-001");
89
+ sdk.getResourceById("nonexistent-id");
90
+ const end = performance.now();
91
+ // Multiple O(1) lookups should still be very fast
92
+ expect(end - start).toBeLessThan(fhir_bundles_1.CONSTANT_TIME_EXPECTED_THRESHOLD_MS);
93
+ });
94
+ });
95
+ });
96
+ describe("FullUrl Reference Handling", () => {
97
+ it("should handle fullUrl references correctly", async () => {
98
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithFullUrlReferences);
99
+ // Should find by resource.id
100
+ const patient1 = sdk.getResourceById("patient-fullurl");
101
+ expect(patient1).toBeDefined();
102
+ expect(patient1?.id).toBe("patient-fullurl");
103
+ // Should find by fullUrl
104
+ const patient2 = sdk.getResourceById("urn:uuid:patient-fullurl");
105
+ expect(patient2).toBeDefined();
106
+ expect(patient2?.id).toBe("patient-fullurl");
107
+ // Should be the same object
108
+ expect(patient1).toBe(patient2);
109
+ });
110
+ });
111
+ describe("Edge Cases", () => {
112
+ it("should handle bundle with no entries", async () => {
113
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.emptyBundle);
114
+ const result = sdk.getResourceById("any-id");
115
+ expect(result).toBeUndefined();
116
+ });
117
+ it("should handle resources without IDs", async () => {
118
+ const bundleWithoutIds = {
119
+ resourceType: "Bundle",
120
+ type: "collection",
121
+ total: 1,
122
+ entry: [
123
+ {
124
+ fullUrl: "urn:uuid:no-id-resource",
125
+ resource: {
126
+ resourceType: "Patient",
127
+ // No id field
128
+ name: [{ family: "NoId", given: ["Patient"] }],
129
+ },
130
+ },
131
+ ],
132
+ };
133
+ const sdk = await index_1.FhirBundleSdk.create(bundleWithoutIds);
134
+ // Should find by fullUrl even without resource.id
135
+ const patient = sdk.getResourceById("urn:uuid:no-id-resource");
136
+ expect(patient).toBeDefined();
137
+ expect(patient?.name?.[0]?.family).toBe("NoId");
138
+ });
139
+ });
140
+ });
141
+ //# sourceMappingURL=phase1-verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase1-verification.test.js","sourceRoot":"","sources":["../../src/__tests__/phase1-verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase2-verification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase2-verification.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/phase2-verification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../index");
4
+ const fhir_bundles_1 = require("./fixtures/fhir-bundles");
5
+ describe("Phase 2 Verification - Type-Specific Resource Getters", () => {
6
+ describe("Type-Specific Resource Getters - FR-4.1 to FR-4.7", () => {
7
+ let sdk;
8
+ beforeEach(async () => {
9
+ sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
10
+ });
11
+ describe("FR-4.1: getPatients(): Patient[] returns all Patient resources", () => {
12
+ it("should return all patients from validCompleteBundle", async () => {
13
+ const patients = sdk.getPatients();
14
+ expect(Array.isArray(patients)).toBe(true);
15
+ expect(patients).toHaveLength(1);
16
+ expect(patients[0]?.resourceType).toBe("Patient");
17
+ expect(patients[0]?.id).toBe("patient-123");
18
+ expect(patients[0]?.name?.[0]?.family).toBe("Doe");
19
+ expect(patients[0]?.name?.[0]?.given?.[0]).toBe("Jane");
20
+ });
21
+ it("should return multiple patients from mixedResourceTypesBundle", async () => {
22
+ const mixedSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
23
+ const patients = mixedSdk.getPatients();
24
+ expect(patients).toHaveLength(2);
25
+ expect(patients[0]?.id).toBe("patient-mix-1");
26
+ expect(patients[1]?.id).toBe("patient-mix-2");
27
+ expect(patients.every(p => p.resourceType === "Patient")).toBe(true);
28
+ });
29
+ });
30
+ describe("FR-4.2: getObservations(): Observation[] returns all Observation resources", () => {
31
+ it("should return all observations", async () => {
32
+ const observations = sdk.getObservations();
33
+ expect(Array.isArray(observations)).toBe(true);
34
+ expect(observations).toHaveLength(1);
35
+ expect(observations[0]?.resourceType).toBe("Observation");
36
+ expect(observations[0]?.id).toBe("observation-001");
37
+ expect(observations[0]?.code?.text).toBe("Glucose");
38
+ expect(observations[0]?.status).toBe("final");
39
+ });
40
+ it("should return multiple observations from mixedResourceTypesBundle", async () => {
41
+ const mixedSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
42
+ const observations = mixedSdk.getObservations();
43
+ expect(observations).toHaveLength(2);
44
+ expect(observations[0]?.id).toBe("observation-mix-1");
45
+ expect(observations[1]?.id).toBe("observation-mix-2");
46
+ expect(observations.every(o => o.resourceType === "Observation")).toBe(true);
47
+ });
48
+ });
49
+ describe("FR-4.3: getEncounters(): Encounter[] returns all Encounter resources", () => {
50
+ it("should return all encounters", async () => {
51
+ const encounters = sdk.getEncounters();
52
+ expect(Array.isArray(encounters)).toBe(true);
53
+ expect(encounters).toHaveLength(1);
54
+ expect(encounters[0]?.resourceType).toBe("Encounter");
55
+ expect(encounters[0]?.id).toBe("encounter-789");
56
+ expect(encounters[0]?.status).toBe("finished");
57
+ expect(encounters[0]?.class?.code).toBe("AMB");
58
+ });
59
+ });
60
+ describe("FR-4.4: getPractitioners(): Practitioner[] returns all Practitioner resources", () => {
61
+ it("should return all practitioners", async () => {
62
+ const practitioners = sdk.getPractitioners();
63
+ expect(Array.isArray(practitioners)).toBe(true);
64
+ expect(practitioners).toHaveLength(1);
65
+ expect(practitioners[0]?.resourceType).toBe("Practitioner");
66
+ expect(practitioners[0]?.id).toBe("practitioner-456");
67
+ expect(practitioners[0]?.name?.[0]?.family).toBe("Smith");
68
+ expect(practitioners[0]?.name?.[0]?.given?.[0]).toBe("John");
69
+ });
70
+ });
71
+ describe("FR-4.5: getDiagnosticReports(): DiagnosticReport[] returns all DiagnosticReport resources", () => {
72
+ it("should return all diagnostic reports", async () => {
73
+ const reports = sdk.getDiagnosticReports();
74
+ expect(Array.isArray(reports)).toBe(true);
75
+ expect(reports).toHaveLength(1);
76
+ expect(reports[0]?.resourceType).toBe("DiagnosticReport");
77
+ expect(reports[0]?.id).toBe("diagnostic-report-002");
78
+ expect(reports[0]?.status).toBe("final");
79
+ expect(reports[0]?.code?.text).toBe("Lab Results");
80
+ });
81
+ });
82
+ describe("FR-4.6: All type-specific getters return empty array if no resources of that type exist", () => {
83
+ it("should return empty arrays for empty bundle", async () => {
84
+ const emptySdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.emptyBundle);
85
+ expect(emptySdk.getPatients()).toEqual([]);
86
+ expect(emptySdk.getObservations()).toEqual([]);
87
+ expect(emptySdk.getEncounters()).toEqual([]);
88
+ expect(emptySdk.getPractitioners()).toEqual([]);
89
+ expect(emptySdk.getDiagnosticReports()).toEqual([]);
90
+ });
91
+ it("should return empty arrays for missing resource types in patientsOnlyBundle", async () => {
92
+ const patientsSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.patientsOnlyBundle);
93
+ expect(patientsSdk.getPatients()).toHaveLength(3); // Has patients
94
+ expect(patientsSdk.getObservations()).toEqual([]);
95
+ expect(patientsSdk.getEncounters()).toEqual([]);
96
+ expect(patientsSdk.getPractitioners()).toEqual([]);
97
+ expect(patientsSdk.getDiagnosticReports()).toEqual([]);
98
+ });
99
+ });
100
+ describe("FR-4.7: All methods use @medplum/fhirtypes for return type definitions", () => {
101
+ it("should return properly typed resources with TypeScript compilation", async () => {
102
+ const patients = sdk.getPatients();
103
+ const observations = sdk.getObservations();
104
+ const encounters = sdk.getEncounters();
105
+ const practitioners = sdk.getPractitioners();
106
+ const reports = sdk.getDiagnosticReports();
107
+ // TypeScript compilation will enforce correct typing
108
+ // These properties should be available without type errors
109
+ expect(patients[0]?.name).toBeDefined();
110
+ expect(patients[0]?.birthDate).toBeDefined();
111
+ expect(observations[0]?.status).toBeDefined();
112
+ expect(observations[0]?.code).toBeDefined();
113
+ expect(encounters[0]?.status).toBeDefined();
114
+ expect(encounters[0]?.class).toBeDefined();
115
+ expect(practitioners[0]?.name).toBeDefined();
116
+ expect(practitioners[0]?.qualification).toBeDefined();
117
+ expect(reports[0]?.status).toBeDefined();
118
+ expect(reports[0]?.code).toBeDefined();
119
+ });
120
+ });
121
+ });
122
+ describe("Performance Requirements", () => {
123
+ describe("FR-9.2: Type-specific getters complete in O(n) time where n is number of resources of that type", () => {
124
+ it("should perform type-specific queries efficiently", async () => {
125
+ const mixedSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
126
+ const start = performance.now();
127
+ const patients = mixedSdk.getPatients();
128
+ const end = performance.now();
129
+ expect(patients).toHaveLength(2);
130
+ // Should be fast for small bundles (O(n) where n=2)
131
+ expect(end - start).toBeLessThan(fhir_bundles_1.CONSTANT_TIME_EXPECTED_THRESHOLD_MS);
132
+ });
133
+ it("should handle multiple type queries efficiently", async () => {
134
+ const mixedSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
135
+ const start = performance.now();
136
+ // Perform multiple type-specific queries
137
+ const patients = mixedSdk.getPatients();
138
+ const observations = mixedSdk.getObservations();
139
+ const practitioners = mixedSdk.getPractitioners();
140
+ const encounters = mixedSdk.getEncounters();
141
+ const reports = mixedSdk.getDiagnosticReports();
142
+ const end = performance.now();
143
+ expect(patients).toHaveLength(2);
144
+ expect(observations).toHaveLength(2);
145
+ expect(practitioners).toHaveLength(1);
146
+ expect(encounters).toHaveLength(1);
147
+ expect(reports).toHaveLength(0);
148
+ // Multiple O(n) queries should still be fast
149
+ expect(end - start).toBeLessThan(50);
150
+ });
151
+ });
152
+ });
153
+ describe("Memory Management - FR-10.1 and FR-10.2", () => {
154
+ it("should return references to cached objects, not copies", async () => {
155
+ const testSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
156
+ const patients1 = testSdk.getPatients();
157
+ const patients2 = testSdk.getPatients();
158
+ // Should return the same array reference
159
+ expect(patients1).toBe(patients2);
160
+ // Should return the same patient object
161
+ expect(patients1[0]).toBe(patients2[0]);
162
+ });
163
+ it("should maintain object identity across different access methods", async () => {
164
+ const testSdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
165
+ const patient1 = testSdk.getResourceById("patient-123");
166
+ const patients = testSdk.getPatients();
167
+ const patient2 = patients[0];
168
+ // Should be the same object instance
169
+ expect(patient1).toBe(patient2);
170
+ });
171
+ });
172
+ describe("Edge Cases and Robustness", () => {
173
+ it("should handle bundle with undefined entries gracefully", async () => {
174
+ const bundleWithUndefinedEntries = {
175
+ resourceType: "Bundle",
176
+ type: "collection",
177
+ total: 2,
178
+ entry: [
179
+ {
180
+ fullUrl: "urn:uuid:patient-valid",
181
+ resource: {
182
+ resourceType: "Patient",
183
+ id: "patient-valid",
184
+ name: [{ family: "Valid", given: ["Patient"] }],
185
+ },
186
+ },
187
+ {
188
+ fullUrl: "urn:uuid:entry-without-resource",
189
+ // No resource field
190
+ },
191
+ ],
192
+ };
193
+ const testSdk = await index_1.FhirBundleSdk.create(bundleWithUndefinedEntries);
194
+ const patients = testSdk.getPatients();
195
+ expect(patients).toHaveLength(1);
196
+ expect(patients[0]?.id).toBe("patient-valid");
197
+ });
198
+ it("should handle resources with same type but different structures", async () => {
199
+ const bundleWithVariedPatients = {
200
+ resourceType: "Bundle",
201
+ type: "collection",
202
+ total: 2,
203
+ entry: [
204
+ {
205
+ fullUrl: "urn:uuid:patient-full",
206
+ resource: {
207
+ resourceType: "Patient",
208
+ id: "patient-full",
209
+ name: [{ family: "Full", given: ["Patient"] }],
210
+ gender: "female",
211
+ birthDate: "1990-01-01",
212
+ },
213
+ },
214
+ {
215
+ fullUrl: "urn:uuid:patient-minimal",
216
+ resource: {
217
+ resourceType: "Patient",
218
+ id: "patient-minimal",
219
+ // Minimal patient with only required fields
220
+ },
221
+ },
222
+ ],
223
+ };
224
+ const testSdk = await index_1.FhirBundleSdk.create(bundleWithVariedPatients);
225
+ const patients = testSdk.getPatients();
226
+ expect(patients).toHaveLength(2);
227
+ expect(patients[0]?.id).toBe("patient-full");
228
+ expect(patients[1]?.id).toBe("patient-minimal");
229
+ expect(patients[0]?.name).toBeDefined();
230
+ expect(patients[1]?.name).toBeUndefined();
231
+ });
232
+ });
233
+ });
234
+ //# sourceMappingURL=phase2-verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase2-verification.test.js","sourceRoot":"","sources":["../../src/__tests__/phase2-verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase3-verification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase3-verification.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/phase3-verification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../index");
4
+ const fhir_bundles_1 = require("./fixtures/fhir-bundles");
5
+ describe("Phase 3 Verification - Reference Validation", () => {
6
+ describe("FR-2.1: lookForBrokenReferences() method returns validation result", () => {
7
+ it("should return validation result for valid bundle", async () => {
8
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
9
+ const result = sdk.lookForBrokenReferences();
10
+ expect(result).toBeDefined();
11
+ expect(typeof result.hasBrokenReferences).toBe("boolean");
12
+ expect(Array.isArray(result.brokenReferences)).toBe(true);
13
+ });
14
+ it("should return true for valid references", async () => {
15
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
16
+ const result = sdk.lookForBrokenReferences();
17
+ expect(result.hasBrokenReferences).toBe(false);
18
+ expect(result.brokenReferences).toHaveLength(0);
19
+ });
20
+ it("should return false for invalid references", async () => {
21
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithBrokenReferences);
22
+ const result = sdk.lookForBrokenReferences();
23
+ expect(result.hasBrokenReferences).toBe(true);
24
+ expect(result.brokenReferences.length).toBeGreaterThan(0);
25
+ });
26
+ });
27
+ describe("FR-2.2: Validation identifies references by Resource/id pattern and fullUrl references", () => {
28
+ it("should identify Resource/id pattern references", async () => {
29
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithBrokenReferences);
30
+ const result = sdk.lookForBrokenReferences();
31
+ const brokenSubjectRef = result.brokenReferences.find(ref => ref.reference === "Patient/nonexistent-patient");
32
+ expect(brokenSubjectRef).toBeDefined();
33
+ });
34
+ it("should validate fullUrl references", async () => {
35
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithFullUrlReferences);
36
+ const result = sdk.lookForBrokenReferences();
37
+ expect(result.hasBrokenReferences).toBe(false);
38
+ });
39
+ });
40
+ describe("FR-2.3: Validation handles both relative and absolute references", () => {
41
+ it("should handle relative references (Patient/123)", async () => {
42
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
43
+ const result = sdk.lookForBrokenReferences();
44
+ expect(result.hasBrokenReferences).toBe(false);
45
+ });
46
+ it("should handle absolute references (urn:uuid:123)", async () => {
47
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithFullUrlReferences);
48
+ const result = sdk.lookForBrokenReferences();
49
+ expect(result.hasBrokenReferences).toBe(false);
50
+ });
51
+ });
52
+ describe("FR-2.4: Validation result includes list of broken references with details", () => {
53
+ it("should provide detailed broken reference information", async () => {
54
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithBrokenReferences);
55
+ const result = sdk.lookForBrokenReferences();
56
+ expect(result.brokenReferences.length).toBeGreaterThan(0);
57
+ const brokenRef = result.brokenReferences[0];
58
+ expect(brokenRef).toBeDefined();
59
+ if (brokenRef) {
60
+ expect(brokenRef.sourceResourceId).toBeDefined();
61
+ expect(brokenRef.sourceResourceType).toBeDefined();
62
+ expect(brokenRef.referenceField).toBeDefined();
63
+ expect(brokenRef.reference).toBeDefined();
64
+ }
65
+ });
66
+ it("should identify specific broken reference details", async () => {
67
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithBrokenReferences);
68
+ const result = sdk.lookForBrokenReferences();
69
+ const brokenSubjectRef = result.brokenReferences.find(ref => ref.reference === "Patient/nonexistent-patient");
70
+ expect(brokenSubjectRef).toBeDefined();
71
+ expect(brokenSubjectRef?.sourceResourceType).toBe("Observation");
72
+ expect(brokenSubjectRef?.referenceField).toContain("subject");
73
+ expect(brokenSubjectRef?.reference).toBe("Patient/nonexistent-patient");
74
+ });
75
+ });
76
+ describe("Edge Cases and Advanced Validation", () => {
77
+ it("should handle empty bundle gracefully", async () => {
78
+ const emptyBundle = { resourceType: "Bundle", type: "collection" };
79
+ const sdk = await index_1.FhirBundleSdk.create(emptyBundle);
80
+ const result = sdk.lookForBrokenReferences();
81
+ expect(result.hasBrokenReferences).toBe(false);
82
+ expect(result.brokenReferences).toHaveLength(0);
83
+ });
84
+ it("should handle resources without references", async () => {
85
+ const bundleWithoutRefs = {
86
+ resourceType: "Bundle",
87
+ type: "collection",
88
+ entry: [
89
+ {
90
+ resource: {
91
+ resourceType: "Patient",
92
+ id: "test-patient",
93
+ name: [{ family: "Test" }],
94
+ },
95
+ },
96
+ ],
97
+ };
98
+ const sdk = await index_1.FhirBundleSdk.create(bundleWithoutRefs);
99
+ const result = sdk.lookForBrokenReferences();
100
+ expect(result.hasBrokenReferences).toBe(false);
101
+ expect(result.brokenReferences).toHaveLength(0);
102
+ });
103
+ it("should handle bundles with some valid and some broken references", async () => {
104
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.bundleWithBrokenReferences);
105
+ const result = sdk.lookForBrokenReferences();
106
+ expect(result.hasBrokenReferences).toBe(true);
107
+ expect(result.brokenReferences.length).toBeGreaterThan(0);
108
+ });
109
+ });
110
+ describe("Performance Requirements", () => {
111
+ it("should validate references efficiently for large bundles", async () => {
112
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
113
+ const start = performance.now();
114
+ const result = sdk.lookForBrokenReferences();
115
+ const end = performance.now();
116
+ expect(result).toBeDefined();
117
+ expect(end - start).toBeLessThan(50); // Should be very fast even for complex bundles
118
+ });
119
+ });
120
+ });
121
+ //# sourceMappingURL=phase3-verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase3-verification.test.js","sourceRoot":"","sources":["../../src/__tests__/phase3-verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase4-verification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase4-verification.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/phase4-verification.test.ts"],"names":[],"mappings":""}