@metriport/fhir-sdk 1.2.7 → 1.3.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 (84) hide show
  1. package/README.md +207 -0
  2. package/dist/__tests__/date-range-performance.test.d.ts +2 -0
  3. package/dist/__tests__/date-range-performance.test.d.ts.map +1 -0
  4. package/dist/__tests__/date-range-performance.test.js +218 -0
  5. package/dist/__tests__/date-range-performance.test.js.map +1 -0
  6. package/dist/__tests__/date-range-search.test.d.ts +2 -0
  7. package/dist/__tests__/date-range-search.test.d.ts.map +1 -0
  8. package/dist/__tests__/date-range-search.test.js +215 -0
  9. package/dist/__tests__/date-range-search.test.js.map +1 -0
  10. package/dist/__tests__/fhir-bundle-sdk.test.js +467 -0
  11. package/dist/__tests__/fhir-bundle-sdk.test.js.map +1 -1
  12. package/dist/__tests__/reverse-references.test.d.ts +2 -0
  13. package/dist/__tests__/reverse-references.test.d.ts.map +1 -0
  14. package/dist/__tests__/reverse-references.test.js +241 -0
  15. package/dist/__tests__/reverse-references.test.js.map +1 -0
  16. package/dist/demo-reverse-references.d.ts +7 -0
  17. package/dist/demo-reverse-references.d.ts.map +1 -0
  18. package/dist/demo-reverse-references.js +207 -0
  19. package/dist/demo-reverse-references.js.map +1 -0
  20. package/dist/fhir-bundle-sdk.d.ts +222 -0
  21. package/dist/fhir-bundle-sdk.d.ts.map +1 -0
  22. package/dist/fhir-bundle-sdk.js +527 -0
  23. package/dist/fhir-bundle-sdk.js.map +1 -0
  24. package/dist/index.d.ts +2 -242
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -677
  27. package/dist/index.js.map +1 -1
  28. package/dist/internal/bundle-operations.d.ts +14 -0
  29. package/dist/internal/bundle-operations.d.ts.map +1 -0
  30. package/dist/internal/bundle-operations.js +55 -0
  31. package/dist/internal/bundle-operations.js.map +1 -0
  32. package/dist/internal/date-extraction.d.ts +12 -0
  33. package/dist/internal/date-extraction.d.ts.map +1 -0
  34. package/dist/internal/date-extraction.js +206 -0
  35. package/dist/internal/date-extraction.js.map +1 -0
  36. package/dist/internal/graph-traversal.d.ts +13 -0
  37. package/dist/internal/graph-traversal.d.ts.map +1 -0
  38. package/dist/internal/graph-traversal.js +89 -0
  39. package/dist/internal/graph-traversal.js.map +1 -0
  40. package/dist/internal/indexing.d.ts +17 -0
  41. package/dist/internal/indexing.d.ts.map +1 -0
  42. package/dist/internal/indexing.js +118 -0
  43. package/dist/internal/indexing.js.map +1 -0
  44. package/dist/internal/llm-context.d.ts +39 -0
  45. package/dist/internal/llm-context.d.ts.map +1 -0
  46. package/dist/internal/llm-context.js +188 -0
  47. package/dist/internal/llm-context.js.map +1 -0
  48. package/dist/internal/reference-resolution.d.ts +25 -0
  49. package/dist/internal/reference-resolution.d.ts.map +1 -0
  50. package/dist/internal/reference-resolution.js +133 -0
  51. package/dist/internal/reference-resolution.js.map +1 -0
  52. package/dist/internal/reference-utils.d.ts +26 -0
  53. package/dist/internal/reference-utils.d.ts.map +1 -0
  54. package/dist/internal/reference-utils.js +89 -0
  55. package/dist/internal/reference-utils.js.map +1 -0
  56. package/dist/internal/validation.d.ts +16 -0
  57. package/dist/internal/validation.d.ts.map +1 -0
  58. package/dist/internal/validation.js +45 -0
  59. package/dist/internal/validation.js.map +1 -0
  60. package/dist/types/sdk-types.d.ts +107 -0
  61. package/dist/types/sdk-types.d.ts.map +1 -0
  62. package/dist/types/sdk-types.js +17 -0
  63. package/dist/types/sdk-types.js.map +1 -0
  64. package/dist/types/smart-resources.d.ts +97 -4
  65. package/dist/types/smart-resources.d.ts.map +1 -1
  66. package/dist/types/smart-resources.js +82 -5
  67. package/dist/types/smart-resources.js.map +1 -1
  68. package/dist/utils/interval-tree/index.d.ts +87 -0
  69. package/dist/utils/interval-tree/index.d.ts.map +1 -0
  70. package/dist/utils/interval-tree/index.js +774 -0
  71. package/dist/utils/interval-tree/index.js.map +1 -0
  72. package/dist/utils/interval-tree/shallowequal/arrays.d.ts +3 -0
  73. package/dist/utils/interval-tree/shallowequal/arrays.d.ts.map +1 -0
  74. package/dist/utils/interval-tree/shallowequal/arrays.js +25 -0
  75. package/dist/utils/interval-tree/shallowequal/arrays.js.map +1 -0
  76. package/dist/utils/interval-tree/shallowequal/index.d.ts +6 -0
  77. package/dist/utils/interval-tree/shallowequal/index.d.ts.map +1 -0
  78. package/dist/utils/interval-tree/shallowequal/index.js +28 -0
  79. package/dist/utils/interval-tree/shallowequal/index.js.map +1 -0
  80. package/dist/utils/interval-tree/shallowequal/objects.d.ts +3 -0
  81. package/dist/utils/interval-tree/shallowequal/objects.d.ts.map +1 -0
  82. package/dist/utils/interval-tree/shallowequal/objects.js +28 -0
  83. package/dist/utils/interval-tree/shallowequal/objects.js.map +1 -0
  84. package/package.json +1 -1
@@ -0,0 +1,241 @@
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(3);
16
+ const resourceTypes = referencingResources.map(r => r.resourceType).sort();
17
+ expect(resourceTypes).toEqual(["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(3);
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(3);
127
+ const resourceTypes = referencingResources.map((r) => r.resourceType).sort();
128
+ expect(resourceTypes).toEqual(["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(3);
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
+ });
241
+ //# 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,7 @@
1
+ /**
2
+ * Demo script showcasing reverse reference functionality in FHIR SDK
3
+ *
4
+ * Run with: npx ts-node src/demo-reverse-references.ts
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=demo-reverse-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-reverse-references.d.ts","sourceRoot":"","sources":["../src/demo-reverse-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ /**
3
+ * Demo script showcasing reverse reference functionality in FHIR SDK
4
+ *
5
+ * Run with: npx ts-node src/demo-reverse-references.ts
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const index_1 = require("./index");
9
+ const fhir_bundles_1 = require("./__tests__/fixtures/fhir-bundles");
10
+ async function demonstrateReverseReferences() {
11
+ console.log("=".repeat(80));
12
+ console.log("FHIR SDK - Reverse Reference Lookup Demo");
13
+ console.log("=".repeat(80));
14
+ console.log();
15
+ // Create SDK instance with sample bundle
16
+ const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
17
+ console.log(`📦 Loaded bundle with ${sdk.total} resources`);
18
+ console.log();
19
+ // ============================================================================
20
+ // DEMO 1: Find all resources that reference a patient
21
+ // ============================================================================
22
+ console.log("─".repeat(80));
23
+ console.log("DEMO 1: Find all resources that reference a specific patient");
24
+ console.log("─".repeat(80));
25
+ const patientId = "patient-123";
26
+ console.log(`\n🔍 Finding all resources that reference Patient/${patientId}...\n`);
27
+ const referencingPatient = sdk.getResourcesReferencingId(patientId);
28
+ console.log(`Found ${referencingPatient.length} resources:\n`);
29
+ for (const resource of referencingPatient) {
30
+ console.log(` ✓ ${resource.resourceType}/${resource.id}`);
31
+ }
32
+ console.log();
33
+ // ============================================================================
34
+ // DEMO 2: Filter by resource type
35
+ // ============================================================================
36
+ console.log("─".repeat(80));
37
+ console.log("DEMO 2: Filter reverse references by resource type");
38
+ console.log("─".repeat(80));
39
+ console.log(`\n🔍 Finding only Observations that reference Patient/${patientId}...\n`);
40
+ const observations = sdk.getResourcesReferencingId(patientId, {
41
+ resourceType: "Observation",
42
+ });
43
+ console.log(`Found ${observations.length} Observation(s):\n`);
44
+ for (const obs of observations) {
45
+ const obsData = obs;
46
+ console.log(` ✓ Observation/${obs.id}`);
47
+ console.log(` Code: ${obsData.code?.text || "N/A"}`);
48
+ console.log(
49
+ ` Value: ${obsData.valueQuantity?.value || "N/A"} ${obsData.valueQuantity?.unit || ""}`
50
+ );
51
+ }
52
+ console.log();
53
+ // ============================================================================
54
+ // DEMO 3: Filter by reference field
55
+ // ============================================================================
56
+ console.log("─".repeat(80));
57
+ console.log("DEMO 3: Filter reverse references by field name");
58
+ console.log("─".repeat(80));
59
+ console.log(
60
+ `\n🔍 Finding resources that reference Patient/${patientId} via 'subject' field...\n`
61
+ );
62
+ const subjectReferences = sdk.getResourcesReferencingId(patientId, {
63
+ referenceField: "subject",
64
+ });
65
+ console.log(`Found ${subjectReferences.length} resource(s) with 'subject' reference:\n`);
66
+ for (const resource of subjectReferences) {
67
+ console.log(` ✓ ${resource.resourceType}/${resource.id}`);
68
+ }
69
+ console.log();
70
+ // ============================================================================
71
+ // DEMO 4: Combined filters
72
+ // ============================================================================
73
+ console.log("─".repeat(80));
74
+ console.log("DEMO 4: Combine resource type and field filters");
75
+ console.log("─".repeat(80));
76
+ const practitionerId = "practitioner-456";
77
+ console.log(
78
+ `\n🔍 Finding Observations that reference Practitioner/${practitionerId} via 'performer'...\n`
79
+ );
80
+ const performerObs = sdk.getResourcesReferencingId(practitionerId, {
81
+ resourceType: "Observation",
82
+ referenceField: "performer",
83
+ });
84
+ console.log(`Found ${performerObs.length} Observation(s):\n`);
85
+ for (const obs of performerObs) {
86
+ console.log(` ✓ Observation/${obs.id}`);
87
+ console.log(` Performed by: Practitioner/${practitionerId}`);
88
+ }
89
+ console.log();
90
+ // ============================================================================
91
+ // DEMO 5: Smart resource method
92
+ // ============================================================================
93
+ console.log("─".repeat(80));
94
+ console.log("DEMO 5: Using smart resource getReferencingResources() method");
95
+ console.log("─".repeat(80));
96
+ const patient = sdk.getPatientById(patientId);
97
+ if (patient) {
98
+ console.log(`\n👤 Patient: ${patient.name?.[0]?.family}, ${patient.name?.[0]?.given?.[0]}`);
99
+ console.log(` Gender: ${patient.gender}`);
100
+ console.log(` Birth Date: ${patient.birthDate}\n`);
101
+ // Use the smart resource method
102
+ const referencingResources = patient.getReferencingResources();
103
+ console.log(`📊 This patient is referenced by ${referencingResources.length} resources:\n`);
104
+ // Group by resource type
105
+ const byType = referencingResources.reduce((acc, r) => {
106
+ acc[r.resourceType] = (acc[r.resourceType] || 0) + 1;
107
+ return acc;
108
+ }, {});
109
+ for (const [type, count] of Object.entries(byType)) {
110
+ console.log(` • ${type}: ${count}`);
111
+ }
112
+ }
113
+ console.log();
114
+ // ============================================================================
115
+ // DEMO 6: Discover related encounters
116
+ // ============================================================================
117
+ console.log("─".repeat(80));
118
+ console.log("DEMO 6: Discover what happened during an encounter");
119
+ console.log("─".repeat(80));
120
+ const encounterId = "encounter-789";
121
+ console.log(`\n🏥 Finding all clinical activities during Encounter/${encounterId}...\n`);
122
+ const encounterReferences = sdk.getResourcesReferencingId(encounterId, {
123
+ referenceField: "encounter",
124
+ });
125
+ console.log(`Found ${encounterReferences.length} clinical record(s) from this encounter:\n`);
126
+ for (const resource of encounterReferences) {
127
+ const data = resource;
128
+ console.log(` 📋 ${resource.resourceType}/${resource.id}`);
129
+ if (resource.resourceType === "Observation") {
130
+ console.log(` Type: ${data.code?.text || "N/A"}`);
131
+ console.log(` Status: ${data.status}`);
132
+ } else if (resource.resourceType === "DiagnosticReport") {
133
+ console.log(` Type: ${data.code?.text || "N/A"}`);
134
+ console.log(` Status: ${data.status}`);
135
+ console.log(` Results: ${data.result?.length || 0} observation(s)`);
136
+ }
137
+ }
138
+ console.log();
139
+ // ============================================================================
140
+ // DEMO 7: Performance comparison
141
+ // ============================================================================
142
+ console.log("─".repeat(80));
143
+ console.log("DEMO 7: Performance - O(1) reverse lookup");
144
+ console.log("─".repeat(80));
145
+ console.log("\n⚡ Running 1000 reverse reference lookups...\n");
146
+ const iterations = 1000;
147
+ const startTime = performance.now();
148
+ for (let i = 0; i < iterations; i++) {
149
+ sdk.getResourcesReferencingId(patientId);
150
+ }
151
+ const endTime = performance.now();
152
+ const avgTime = (endTime - startTime) / iterations;
153
+ console.log(` Total time: ${(endTime - startTime).toFixed(2)}ms`);
154
+ console.log(` Average per lookup: ${avgTime.toFixed(4)}ms`);
155
+ console.log(
156
+ ` Performance: ${
157
+ avgTime < 0.1
158
+ ? "✅ Excellent (< 0.1ms)"
159
+ : avgTime < 1
160
+ ? "✅ Good (< 1ms)"
161
+ : "⚠️ Could be better"
162
+ }`
163
+ );
164
+ console.log();
165
+ // ============================================================================
166
+ // DEMO 8: Bi-directional reference navigation
167
+ // ============================================================================
168
+ console.log("─".repeat(80));
169
+ console.log("DEMO 8: Bi-directional reference navigation");
170
+ console.log("─".repeat(80));
171
+ console.log("\n🔄 Demonstrating forward and reverse reference navigation...\n");
172
+ const observation = sdk.getObservationById("observation-001");
173
+ if (observation) {
174
+ console.log(`Starting from: Observation/${observation.id}`);
175
+ console.log();
176
+ // Forward reference: Get the patient
177
+ console.log("➡️ Forward: observation.getSubject()");
178
+ const subject = observation.getSubject();
179
+ if (subject) {
180
+ console.log(` Found: ${subject.resourceType}/${subject.id}`);
181
+ console.log();
182
+ // Reverse reference: Get all resources referencing this patient
183
+ console.log("⬅️ Reverse: patient.getReferencingResources()");
184
+ const backReferences = subject.getReferencingResources();
185
+ console.log(` Found ${backReferences.length} resources referencing this patient:`);
186
+ for (const ref of backReferences) {
187
+ console.log(` • ${ref.resourceType}/${ref.id}`);
188
+ }
189
+ }
190
+ }
191
+ console.log();
192
+ // ============================================================================
193
+ console.log("=".repeat(80));
194
+ console.log("✨ Demo complete! All reverse reference features showcased.");
195
+ console.log("=".repeat(80));
196
+ }
197
+ // Run the demo
198
+ demonstrateReverseReferences()
199
+ .then(() => {
200
+ console.log("\n✅ Demo completed successfully\n");
201
+ process.exit(0);
202
+ })
203
+ .catch(error => {
204
+ console.error("\n❌ Demo failed:", error);
205
+ process.exit(1);
206
+ });
207
+ //# sourceMappingURL=demo-reverse-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-reverse-references.js","sourceRoot":"","sources":["../src/demo-reverse-references.ts"],"names":[],"mappings":"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"}