@fhirust/sdk 0.2.0 → 0.3.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.
- package/README.md +430 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +167 -3
- package/dist/bin/cli.js.map +1 -1
- package/dist/plugin.d.ts +5 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +15 -7
- package/dist/plugin.js.map +1 -1
- package/dist/r4/allergy-intolerance.d.ts +10 -10
- package/dist/r4/allergy-intolerance.d.ts.map +1 -1
- package/dist/r4/appointment-response.d.ts +16 -0
- package/dist/r4/appointment-response.d.ts.map +1 -0
- package/dist/r4/appointment-response.js +2 -0
- package/dist/r4/appointment-response.js.map +1 -0
- package/dist/r4/appointment.d.ts +37 -0
- package/dist/r4/appointment.d.ts.map +1 -0
- package/dist/r4/appointment.js +2 -0
- package/dist/r4/appointment.js.map +1 -0
- package/dist/r4/care-plan.d.ts +59 -0
- package/dist/r4/care-plan.d.ts.map +1 -0
- package/dist/r4/care-plan.js +2 -0
- package/dist/r4/care-plan.js.map +1 -0
- package/dist/r4/care-team.d.ts +27 -0
- package/dist/r4/care-team.d.ts.map +1 -0
- package/dist/r4/care-team.js +2 -0
- package/dist/r4/care-team.js.map +1 -0
- package/dist/r4/claim-response.d.ts +123 -0
- package/dist/r4/claim-response.d.ts.map +1 -0
- package/dist/r4/claim-response.js +2 -0
- package/dist/r4/claim-response.js.map +1 -0
- package/dist/r4/claim.d.ts +146 -0
- package/dist/r4/claim.d.ts.map +1 -0
- package/dist/r4/claim.js +2 -0
- package/dist/r4/claim.js.map +1 -0
- package/dist/r4/common.d.ts +82 -0
- package/dist/r4/common.d.ts.map +1 -1
- package/dist/r4/communication-request.d.ts +36 -0
- package/dist/r4/communication-request.d.ts.map +1 -0
- package/dist/r4/communication-request.js +2 -0
- package/dist/r4/communication-request.js.map +1 -0
- package/dist/r4/communication.d.ts +36 -0
- package/dist/r4/communication.d.ts.map +1 -0
- package/dist/r4/communication.js +2 -0
- package/dist/r4/communication.js.map +1 -0
- package/dist/r4/composition.d.ts +49 -0
- package/dist/r4/composition.d.ts.map +1 -0
- package/dist/r4/composition.js +2 -0
- package/dist/r4/composition.js.map +1 -0
- package/dist/r4/condition.d.ts +7 -7
- package/dist/r4/condition.d.ts.map +1 -1
- package/dist/r4/coverage.d.ts +39 -0
- package/dist/r4/coverage.d.ts.map +1 -0
- package/dist/r4/coverage.js +2 -0
- package/dist/r4/coverage.js.map +1 -0
- package/dist/r4/device-request.d.ts +42 -0
- package/dist/r4/device-request.d.ts.map +1 -0
- package/dist/r4/device-request.js +2 -0
- package/dist/r4/device-request.js.map +1 -0
- package/dist/r4/device-use-statement.d.ts +23 -0
- package/dist/r4/device-use-statement.d.ts.map +1 -0
- package/dist/r4/device-use-statement.js +2 -0
- package/dist/r4/device-use-statement.js.map +1 -0
- package/dist/r4/device.d.ts +60 -0
- package/dist/r4/device.d.ts.map +1 -0
- package/dist/r4/device.js +2 -0
- package/dist/r4/device.js.map +1 -0
- package/dist/r4/diagnostic-report.d.ts +4 -4
- package/dist/r4/diagnostic-report.d.ts.map +1 -1
- package/dist/r4/document-reference.d.ts +41 -0
- package/dist/r4/document-reference.d.ts.map +1 -0
- package/dist/r4/document-reference.js +2 -0
- package/dist/r4/document-reference.js.map +1 -0
- package/dist/r4/encounter.d.ts +7 -7
- package/dist/r4/encounter.d.ts.map +1 -1
- package/dist/r4/episode-of-care.d.ts +29 -0
- package/dist/r4/episode-of-care.d.ts.map +1 -0
- package/dist/r4/episode-of-care.js +2 -0
- package/dist/r4/episode-of-care.js.map +1 -0
- package/dist/r4/flag.d.ts +16 -0
- package/dist/r4/flag.d.ts.map +1 -0
- package/dist/r4/flag.js +2 -0
- package/dist/r4/flag.js.map +1 -0
- package/dist/r4/goal.d.ts +37 -0
- package/dist/r4/goal.d.ts.map +1 -0
- package/dist/r4/goal.js +2 -0
- package/dist/r4/goal.js.map +1 -0
- package/dist/r4/imaging-study.d.ts +50 -0
- package/dist/r4/imaging-study.d.ts.map +1 -0
- package/dist/r4/imaging-study.js +2 -0
- package/dist/r4/imaging-study.js.map +1 -0
- package/dist/r4/immunization.d.ts +61 -0
- package/dist/r4/immunization.d.ts.map +1 -0
- package/dist/r4/immunization.js +2 -0
- package/dist/r4/immunization.js.map +1 -0
- package/dist/r4/index.d.ts +47 -11
- package/dist/r4/index.d.ts.map +1 -1
- package/dist/r4/index.js +47 -1
- package/dist/r4/index.js.map +1 -1
- package/dist/r4/location.d.ts +36 -0
- package/dist/r4/location.d.ts.map +1 -0
- package/dist/r4/location.js +2 -0
- package/dist/r4/location.js.map +1 -0
- package/dist/r4/media.d.ts +31 -0
- package/dist/r4/media.d.ts.map +1 -0
- package/dist/r4/media.js +2 -0
- package/dist/r4/media.js.map +1 -0
- package/dist/r4/medication-administration.d.ts +42 -0
- package/dist/r4/medication-administration.d.ts.map +1 -0
- package/dist/r4/medication-administration.js +2 -0
- package/dist/r4/medication-administration.js.map +1 -0
- package/dist/r4/medication-dispense.d.ts +44 -0
- package/dist/r4/medication-dispense.d.ts.map +1 -0
- package/dist/r4/medication-dispense.js +2 -0
- package/dist/r4/medication-dispense.js.map +1 -0
- package/dist/r4/medication-request.d.ts +21 -16
- package/dist/r4/medication-request.d.ts.map +1 -1
- package/dist/r4/medication-statement.d.ts +27 -0
- package/dist/r4/medication-statement.d.ts.map +1 -0
- package/dist/r4/medication-statement.js +2 -0
- package/dist/r4/medication-statement.js.map +1 -0
- package/dist/r4/medication.d.ts +26 -0
- package/dist/r4/medication.d.ts.map +1 -0
- package/dist/r4/medication.js +2 -0
- package/dist/r4/medication.js.map +1 -0
- package/dist/r4/observation.d.ts +21 -17
- package/dist/r4/observation.d.ts.map +1 -1
- package/dist/r4/organization.d.ts +1 -1
- package/dist/r4/organization.d.ts.map +1 -1
- package/dist/r4/patient.d.ts +15 -15
- package/dist/r4/patient.d.ts.map +1 -1
- package/dist/r4/person.d.ts +22 -0
- package/dist/r4/person.d.ts.map +1 -0
- package/dist/r4/person.js +2 -0
- package/dist/r4/person.js.map +1 -0
- package/dist/r4/practitioner-role.d.ts +32 -0
- package/dist/r4/practitioner-role.d.ts.map +1 -0
- package/dist/r4/practitioner-role.js +2 -0
- package/dist/r4/practitioner-role.js.map +1 -0
- package/dist/r4/practitioner.d.ts +2 -2
- package/dist/r4/practitioner.d.ts.map +1 -1
- package/dist/r4/procedure.d.ts +14 -7
- package/dist/r4/procedure.d.ts.map +1 -1
- package/dist/r4/related-person.d.ts +24 -0
- package/dist/r4/related-person.d.ts.map +1 -0
- package/dist/r4/related-person.js +2 -0
- package/dist/r4/related-person.js.map +1 -0
- package/dist/r4/risk-assessment.d.ts +36 -0
- package/dist/r4/risk-assessment.d.ts.map +1 -0
- package/dist/r4/risk-assessment.js +2 -0
- package/dist/r4/risk-assessment.js.map +1 -0
- package/dist/r4/schedule.d.ts +16 -0
- package/dist/r4/schedule.d.ts.map +1 -0
- package/dist/r4/schedule.js +2 -0
- package/dist/r4/schedule.js.map +1 -0
- package/dist/r4/service-request.d.ts +46 -0
- package/dist/r4/service-request.d.ts.map +1 -0
- package/dist/r4/service-request.js +2 -0
- package/dist/r4/service-request.js.map +1 -0
- package/dist/r4/slot.d.ts +19 -0
- package/dist/r4/slot.d.ts.map +1 -0
- package/dist/r4/slot.js +2 -0
- package/dist/r4/slot.js.map +1 -0
- package/dist/r4/specimen.d.ts +48 -0
- package/dist/r4/specimen.d.ts.map +1 -0
- package/dist/r4/specimen.js +2 -0
- package/dist/r4/specimen.js.map +1 -0
- package/dist/r4/task.d.ts +150 -0
- package/dist/r4/task.d.ts.map +1 -0
- package/dist/r4/task.js +2 -0
- package/dist/r4/task.js.map +1 -0
- package/dist/testing/__tests__/test-harness.test.d.ts +15 -0
- package/dist/testing/__tests__/test-harness.test.d.ts.map +1 -0
- package/dist/testing/__tests__/test-harness.test.js +416 -0
- package/dist/testing/__tests__/test-harness.test.js.map +1 -0
- package/dist/testing/index.d.ts +37 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +76 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-fhir.d.ts +38 -0
- package/dist/testing/mock-fhir.d.ts.map +1 -0
- package/dist/testing/mock-fhir.js +113 -0
- package/dist/testing/mock-fhir.js.map +1 -0
- package/dist/testing/mock-http.d.ts +31 -0
- package/dist/testing/mock-http.d.ts.map +1 -0
- package/dist/testing/mock-http.js +52 -0
- package/dist/testing/mock-http.js.map +1 -0
- package/dist/testing/mock-utils.d.ts +15 -0
- package/dist/testing/mock-utils.d.ts.map +1 -0
- package/dist/testing/mock-utils.js +17 -0
- package/dist/testing/mock-utils.js.map +1 -0
- package/dist/testing/simulator.d.ts +21 -0
- package/dist/testing/simulator.d.ts.map +1 -0
- package/dist/testing/simulator.js +74 -0
- package/dist/testing/simulator.js.map +1 -0
- package/dist/testing/types.d.ts +81 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +8 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/types.d.ts +10 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -22
- package/dist/types.js.map +1 -1
- package/package.json +7 -1
- package/templates/docker-compose.yml +32 -0
- package/templates/gitignore +4 -0
- package/wit/plugin.wit +4 -16
- package/wit/world.wit +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
# @fhirust/sdk
|
|
2
|
+
|
|
3
|
+
> TypeScript SDK for building FHIRust WASM plugins
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@fhirust/sdk)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
Build powerful FHIR resource validation, transformation, and enrichment plugins for [FHIRust](https://github.com/wei6bin/fhirust) using TypeScript and WebAssembly.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 📦 Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @fhirust/sdk @bytecodealliance/componentize-js
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Requirements:**
|
|
19
|
+
- Node.js 18+ or Bun
|
|
20
|
+
- TypeScript 5.0+
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🚀 Quick Start
|
|
25
|
+
|
|
26
|
+
### 1. Create a new plugin
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { FhirPlugin, reject } from "@fhirust/sdk";
|
|
30
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
31
|
+
|
|
32
|
+
const plugin = new FhirPlugin("my-validator", "1.0.0");
|
|
33
|
+
|
|
34
|
+
// Validate Patient before creation
|
|
35
|
+
plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
|
|
36
|
+
if (!patient.name || patient.name.length === 0) {
|
|
37
|
+
return reject("Patient must have at least one name");
|
|
38
|
+
}
|
|
39
|
+
return patient;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Export plugin hooks
|
|
43
|
+
export const { getMetadata, executeHook } = plugin.exports();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Build the plugin
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Using the SDK CLI
|
|
50
|
+
npx fhirust-sdk build
|
|
51
|
+
|
|
52
|
+
# Or manually with componentize-js
|
|
53
|
+
npx jco componentize src/index.ts -o dist/plugin.wasm \
|
|
54
|
+
--wit wit/plugin.wit \
|
|
55
|
+
--world-name fhirust-plugin
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3. Deploy to FHIRust server
|
|
59
|
+
|
|
60
|
+
```toml
|
|
61
|
+
# config/server.toml
|
|
62
|
+
[[plugins.plugins]]
|
|
63
|
+
name = "my-validator"
|
|
64
|
+
path = "./plugins/my-validator.wasm"
|
|
65
|
+
enabled = true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## ✨ Features
|
|
71
|
+
|
|
72
|
+
- **Type-safe FHIR resources** — Full TypeScript types for FHIR R4 resources
|
|
73
|
+
- **Hook-based architecture** — Intercept and modify resources before/after CRUD operations
|
|
74
|
+
- **Built-in FHIR client** — Make authenticated API calls to the FHIR server
|
|
75
|
+
- **HTTP client** — Fetch data from external APIs with allowlist control
|
|
76
|
+
- **Event emission** — Send async events for logging, webhooks, and integrations
|
|
77
|
+
- **WebAssembly runtime** — Sandboxed execution with fine-grained permissions
|
|
78
|
+
- **Testing utilities** — Built-in test harness for unit testing plugins
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 📚 API Reference
|
|
83
|
+
|
|
84
|
+
### Core Classes
|
|
85
|
+
|
|
86
|
+
#### `FhirPlugin`
|
|
87
|
+
|
|
88
|
+
Main plugin class for registering hooks.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { FhirPlugin } from "@fhirust/sdk";
|
|
92
|
+
|
|
93
|
+
const plugin = new FhirPlugin(name: string, version: string);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Methods:**
|
|
97
|
+
|
|
98
|
+
- `beforeCreate<T>(resourceType, handler)` — Hook before resource creation
|
|
99
|
+
- `afterCreate<T>(resourceType, handler)` — Hook after resource creation
|
|
100
|
+
- `beforeRead(resourceType, handler)` — Hook before resource read
|
|
101
|
+
- `afterRead<T>(resourceType, handler)` — Hook after resource read
|
|
102
|
+
- `beforeUpdate<T>(resourceType, handler)` — Hook before resource update
|
|
103
|
+
- `afterUpdate<T>(resourceType, handler)` — Hook after resource update
|
|
104
|
+
- `beforeDelete(resourceType, handler)` — Hook before resource deletion
|
|
105
|
+
- `afterDelete(resourceType, handler)` — Hook after resource deletion
|
|
106
|
+
- `exports()` — Export plugin metadata and hook executor
|
|
107
|
+
|
|
108
|
+
### Helper Functions
|
|
109
|
+
|
|
110
|
+
#### `reject(message: string): never`
|
|
111
|
+
|
|
112
|
+
Reject a hook operation with an error message.
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
if (!patient.birthDate) {
|
|
116
|
+
return reject("Patient birth date is required");
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### `outcome(issues: OperationOutcomeIssue[]): OperationOutcome`
|
|
121
|
+
|
|
122
|
+
Create a FHIR OperationOutcome for complex validation errors.
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
return outcome([
|
|
126
|
+
{ severity: "error", code: "required", diagnostics: "Missing name" },
|
|
127
|
+
{ severity: "warning", code: "business-rule", diagnostics: "Unusual age" }
|
|
128
|
+
]);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### FHIR Client
|
|
132
|
+
|
|
133
|
+
Access the FHIR server from within your plugin.
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
plugin.beforeCreate<Patient>("Patient", async (patient, ctx) => {
|
|
137
|
+
// Search for duplicates
|
|
138
|
+
const bundle = await ctx.fhir.search("Patient", {
|
|
139
|
+
identifier: patient.identifier?.[0]?.value
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (bundle.total > 0) {
|
|
143
|
+
return reject("Duplicate patient identifier");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return patient;
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Methods:**
|
|
151
|
+
- `fhir.search(resourceType, params)` — Search for resources
|
|
152
|
+
- `fhir.read(resourceType, id)` — Read a resource by ID
|
|
153
|
+
- `fhir.create(resourceType, resource)` — Create a new resource
|
|
154
|
+
- `fhir.update(resourceType, id, resource)` — Update a resource
|
|
155
|
+
- `fhir.delete(resourceType, id)` — Delete a resource
|
|
156
|
+
|
|
157
|
+
### HTTP Client
|
|
158
|
+
|
|
159
|
+
Make HTTP requests to external APIs (requires `http.fetch` permission).
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
plugin.beforeCreate<Patient>("Patient", async (patient, ctx) => {
|
|
163
|
+
// Verify insurance eligibility via external API
|
|
164
|
+
const response = await ctx.http.post("https://api.insurance.com/verify", {
|
|
165
|
+
body: { memberId: patient.identifier?.[0]?.value }
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
if (!response.ok) {
|
|
169
|
+
return reject("Insurance verification failed");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return patient;
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Event Emitter
|
|
177
|
+
|
|
178
|
+
Emit events for async processing.
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
plugin.afterCreate<Patient>("Patient", (patient, ctx) => {
|
|
182
|
+
ctx.events.emit("patient.created", {
|
|
183
|
+
id: patient.id,
|
|
184
|
+
name: patient.name?.[0]?.family
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
return patient;
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Logger
|
|
192
|
+
|
|
193
|
+
Structured logging with severity levels.
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
|
|
197
|
+
ctx.logger.info("Validating patient", { id: patient.id });
|
|
198
|
+
ctx.logger.warn("Missing phone number", { id: patient.id });
|
|
199
|
+
ctx.logger.error("Validation failed", { id: patient.id });
|
|
200
|
+
|
|
201
|
+
return patient;
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 💡 Examples
|
|
208
|
+
|
|
209
|
+
### Example 1: Patient Name Validator
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
import { FhirPlugin, reject } from "@fhirust/sdk";
|
|
213
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
214
|
+
|
|
215
|
+
const plugin = new FhirPlugin("name-validator", "1.0.0");
|
|
216
|
+
|
|
217
|
+
plugin.beforeCreate<Patient>("Patient", (patient) => {
|
|
218
|
+
if (!patient.name || patient.name.length === 0) {
|
|
219
|
+
return reject("Patient must have at least one name");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const hasFamily = patient.name.some(n => n.family);
|
|
223
|
+
if (!hasFamily) {
|
|
224
|
+
return reject("At least one name must include a family name");
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return patient;
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
export const { getMetadata, executeHook } = plugin.exports();
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Example 2: Auto-Tag Resources
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { FhirPlugin } from "@fhirust/sdk";
|
|
237
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
238
|
+
|
|
239
|
+
const plugin = new FhirPlugin("auto-tagger", "1.0.0");
|
|
240
|
+
|
|
241
|
+
plugin.beforeCreate<Patient>("Patient", (patient) => {
|
|
242
|
+
// Add validation tag
|
|
243
|
+
patient.meta = patient.meta || {};
|
|
244
|
+
patient.meta.tag = patient.meta.tag || [];
|
|
245
|
+
patient.meta.tag.push({
|
|
246
|
+
system: "http://example.org/tags",
|
|
247
|
+
code: "validated",
|
|
248
|
+
display: "Validated by Plugin"
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
return patient;
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
export const { getMetadata, executeHook } = plugin.exports();
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Example 3: Duplicate Detection
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
import { FhirPlugin, reject } from "@fhirust/sdk";
|
|
261
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
262
|
+
|
|
263
|
+
const plugin = new FhirPlugin("duplicate-detector", "1.0.0");
|
|
264
|
+
|
|
265
|
+
plugin.beforeCreate<Patient>("Patient", async (patient, ctx) => {
|
|
266
|
+
const identifier = patient.identifier?.[0]?.value;
|
|
267
|
+
if (!identifier) return patient;
|
|
268
|
+
|
|
269
|
+
// Search for existing patients with same identifier
|
|
270
|
+
const bundle = await ctx.fhir.search("Patient", {
|
|
271
|
+
identifier: identifier
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
if (bundle.total && bundle.total > 0) {
|
|
275
|
+
return reject(`Duplicate patient found with identifier: ${identifier}`);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return patient;
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
export const { getMetadata, executeHook } = plugin.exports();
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Example 4: External API Integration
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
import { FhirPlugin, reject } from "@fhirust/sdk";
|
|
288
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
289
|
+
|
|
290
|
+
const plugin = new FhirPlugin("insurance-verifier", "1.0.0");
|
|
291
|
+
|
|
292
|
+
plugin.beforeCreate<Patient>("Patient", async (patient, ctx) => {
|
|
293
|
+
const memberId = patient.identifier?.find(
|
|
294
|
+
i => i.system === "http://insurance.org"
|
|
295
|
+
)?.value;
|
|
296
|
+
|
|
297
|
+
if (memberId) {
|
|
298
|
+
// Verify with external insurance API
|
|
299
|
+
const response = await ctx.http.post(
|
|
300
|
+
"https://api.insurance.com/verify",
|
|
301
|
+
{ body: { memberId } }
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
if (!response.ok) {
|
|
305
|
+
return reject("Insurance verification failed");
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
ctx.logger.info("Insurance verified", { memberId });
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return patient;
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
export const { getMetadata, executeHook } = plugin.exports();
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 🧪 Testing
|
|
320
|
+
|
|
321
|
+
Use the built-in testing utilities:
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
import { FhirPlugin } from "@fhirust/sdk";
|
|
325
|
+
import { createTestContext } from "@fhirust/sdk/testing";
|
|
326
|
+
import type { Patient } from "@fhirust/sdk/r4";
|
|
327
|
+
import { test } from "node:test";
|
|
328
|
+
import assert from "node:assert";
|
|
329
|
+
|
|
330
|
+
test("validates patient name", async () => {
|
|
331
|
+
const plugin = new FhirPlugin("test", "1.0.0");
|
|
332
|
+
|
|
333
|
+
plugin.beforeCreate<Patient>("Patient", (patient) => {
|
|
334
|
+
if (!patient.name?.length) {
|
|
335
|
+
return reject("Name required");
|
|
336
|
+
}
|
|
337
|
+
return patient;
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
const ctx = createTestContext();
|
|
341
|
+
const patient: Patient = {
|
|
342
|
+
resourceType: "Patient",
|
|
343
|
+
name: [{ family: "Doe", given: ["John"] }]
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
const handler = plugin.getHandler("beforeCreate", "Patient");
|
|
347
|
+
const result = await handler(patient, ctx);
|
|
348
|
+
|
|
349
|
+
assert.equal(result.name[0].family, "Doe");
|
|
350
|
+
});
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Run tests:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
npm test
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 🔧 CLI Commands
|
|
362
|
+
|
|
363
|
+
The SDK includes a CLI for common tasks:
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
# Create a new plugin from template
|
|
367
|
+
npx fhirust-sdk init my-plugin
|
|
368
|
+
|
|
369
|
+
# Build plugin to WASM
|
|
370
|
+
npx fhirust-sdk build
|
|
371
|
+
|
|
372
|
+
# Run tests
|
|
373
|
+
npx fhirust-sdk test
|
|
374
|
+
|
|
375
|
+
# Validate plugin manifest
|
|
376
|
+
npx fhirust-sdk validate
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## 📝 Configuration
|
|
382
|
+
|
|
383
|
+
### Plugin Permissions
|
|
384
|
+
|
|
385
|
+
Configure plugin permissions in `config/server.toml`:
|
|
386
|
+
|
|
387
|
+
```toml
|
|
388
|
+
[[plugins.plugins]]
|
|
389
|
+
name = "my-plugin"
|
|
390
|
+
path = "./plugins/my-plugin.wasm"
|
|
391
|
+
enabled = true
|
|
392
|
+
permissions = [
|
|
393
|
+
"fhir.read", # Read FHIR resources
|
|
394
|
+
"fhir.write", # Create/update FHIR resources
|
|
395
|
+
"utils.log", # Write to server logs
|
|
396
|
+
"utils.emit-event", # Emit async events
|
|
397
|
+
"http.fetch" # Make HTTP requests
|
|
398
|
+
]
|
|
399
|
+
http_allowlist = [
|
|
400
|
+
"https://api.insurance.com/*",
|
|
401
|
+
"https://api.eligibility.org/*"
|
|
402
|
+
]
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## 🤝 Contributing
|
|
408
|
+
|
|
409
|
+
Contributions are welcome! Please see [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## 📄 License
|
|
414
|
+
|
|
415
|
+
MIT © FHIRust Contributors
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## 🔗 Resources
|
|
420
|
+
|
|
421
|
+
- **Documentation**: https://fhirust.dev/docs/plugins
|
|
422
|
+
- **GitHub**: https://github.com/wei6bin/fhirust
|
|
423
|
+
- **npm**: https://www.npmjs.com/package/@fhirust/sdk
|
|
424
|
+
- **Issues**: https://github.com/wei6bin/fhirust/issues
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## 📌 Version History
|
|
429
|
+
|
|
430
|
+
See [CHANGELOG.md](./CHANGELOG.md) for release notes.
|
package/dist/bin/cli.d.ts
CHANGED
package/dist/bin/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
package/dist/bin/cli.js
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* Commands:
|
|
6
6
|
* fhirust-sdk init <name> — Scaffold a new plugin project
|
|
7
7
|
* fhirust-sdk build — Build plugin to WASM
|
|
8
|
+
* fhirust-sdk dev — Watch src/ and rebuild on changes
|
|
8
9
|
*/
|
|
9
|
-
import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from "node:fs";
|
|
10
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync, watch, copyFileSync, } from "node:fs";
|
|
10
11
|
import { resolve, dirname, join } from "node:path";
|
|
11
12
|
import { execSync } from "node:child_process";
|
|
12
13
|
import { fileURLToPath } from "node:url";
|
|
@@ -22,6 +23,8 @@ function main() {
|
|
|
22
23
|
return cmdInit(args.slice(1));
|
|
23
24
|
case "build":
|
|
24
25
|
return cmdBuild(args.slice(1));
|
|
26
|
+
case "dev":
|
|
27
|
+
return cmdDev(args.slice(1));
|
|
25
28
|
case "help":
|
|
26
29
|
case "--help":
|
|
27
30
|
case "-h":
|
|
@@ -40,10 +43,13 @@ Commands:
|
|
|
40
43
|
init <name> Scaffold a new plugin project
|
|
41
44
|
build Compile TypeScript plugin to WASM
|
|
42
45
|
build --output Specify output filename (default: <package-name>.wasm)
|
|
46
|
+
dev Watch src/ and rebuild on changes
|
|
47
|
+
dev --deploy DIR Watch + rebuild + copy .wasm to DIR
|
|
43
48
|
|
|
44
49
|
Examples:
|
|
45
50
|
npx @fhirust/sdk init my-plugin
|
|
46
51
|
cd my-plugin && npm install && npx @fhirust/sdk build
|
|
52
|
+
npx @fhirust/sdk dev --deploy ./dist
|
|
47
53
|
`);
|
|
48
54
|
}
|
|
49
55
|
function cmdInit(args) {
|
|
@@ -69,7 +75,7 @@ function cmdInit(args) {
|
|
|
69
75
|
build: "fhirust-sdk build",
|
|
70
76
|
},
|
|
71
77
|
devDependencies: {
|
|
72
|
-
"@fhirust/sdk": "^0.
|
|
78
|
+
"@fhirust/sdk": "^0.3.0",
|
|
73
79
|
"@bytecodealliance/componentize-js": "^0.14.0",
|
|
74
80
|
esbuild: "^0.24.0",
|
|
75
81
|
typescript: "^5.5.0",
|
|
@@ -111,13 +117,25 @@ plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
|
|
|
111
117
|
export const { lifecycle, hooks } = plugin.exports();
|
|
112
118
|
`;
|
|
113
119
|
writeFileSync(join(name, "src", "index.ts"), indexTs);
|
|
120
|
+
// docker-compose.yml — from templates
|
|
121
|
+
const templateDir = join(SDK_ROOT, "templates");
|
|
122
|
+
const dockerComposeSrc = join(templateDir, "docker-compose.yml");
|
|
123
|
+
if (existsSync(dockerComposeSrc)) {
|
|
124
|
+
copyFileSync(dockerComposeSrc, join(name, "docker-compose.yml"));
|
|
125
|
+
}
|
|
126
|
+
// .gitignore — from templates
|
|
127
|
+
const gitignoreSrc = join(templateDir, "gitignore");
|
|
128
|
+
if (existsSync(gitignoreSrc)) {
|
|
129
|
+
copyFileSync(gitignoreSrc, join(name, ".gitignore"));
|
|
130
|
+
}
|
|
114
131
|
console.log(`
|
|
115
132
|
Plugin "${name}" created.
|
|
116
133
|
|
|
117
134
|
Next steps:
|
|
118
135
|
cd ${name}
|
|
119
136
|
npm install
|
|
120
|
-
|
|
137
|
+
docker compose up -d # Start FHIRust server + PostgreSQL
|
|
138
|
+
npx fhirust-sdk dev --deploy ./dist # Watch + rebuild + deploy
|
|
121
139
|
`);
|
|
122
140
|
}
|
|
123
141
|
function cmdBuild(args) {
|
|
@@ -213,5 +231,151 @@ function cmdBuild(args) {
|
|
|
213
231
|
console.log(`\nBuilt: ${pluginName}`);
|
|
214
232
|
console.log(`Deploy: cp ${pluginName} /path/to/fhirust/plugins/`);
|
|
215
233
|
}
|
|
234
|
+
/* ------------------------------------------------------------------ */
|
|
235
|
+
/* Dev mode: watch src/ and rebuild on changes */
|
|
236
|
+
/* ------------------------------------------------------------------ */
|
|
237
|
+
function cmdDev(args) {
|
|
238
|
+
// Parse --deploy / -d flag
|
|
239
|
+
let deployDir;
|
|
240
|
+
for (let i = 0; i < args.length; i++) {
|
|
241
|
+
if (args[i] === "--deploy" || args[i] === "-d") {
|
|
242
|
+
deployDir = args[i + 1];
|
|
243
|
+
if (!deployDir) {
|
|
244
|
+
console.error("--deploy requires a directory argument");
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
i++;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const srcDir = resolve("src");
|
|
251
|
+
if (!existsSync(srcDir)) {
|
|
252
|
+
console.error("No src/ directory found. Run this command from your plugin directory.");
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
const timestamp = () => new Date().toLocaleTimeString("en-US", { hour12: false });
|
|
256
|
+
console.log(`[${timestamp()}] Dev mode started — watching src/ for changes`);
|
|
257
|
+
if (deployDir) {
|
|
258
|
+
console.log(`[${timestamp()}] Deploy target: ${resolve(deployDir)}`);
|
|
259
|
+
}
|
|
260
|
+
// Initial build
|
|
261
|
+
runBuild(timestamp, deployDir);
|
|
262
|
+
// Watch src/ recursively with debounce
|
|
263
|
+
let debounceTimer = null;
|
|
264
|
+
watch(srcDir, { recursive: true }, (_event, filename) => {
|
|
265
|
+
// Only react to .ts file changes
|
|
266
|
+
if (!filename || !filename.endsWith(".ts"))
|
|
267
|
+
return;
|
|
268
|
+
if (debounceTimer)
|
|
269
|
+
clearTimeout(debounceTimer);
|
|
270
|
+
debounceTimer = setTimeout(() => {
|
|
271
|
+
console.log(`\n[${timestamp()}] Change detected: ${filename}`);
|
|
272
|
+
runBuild(timestamp, deployDir);
|
|
273
|
+
}, 300);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
function runBuild(timestamp, deployDir) {
|
|
277
|
+
const startTime = Date.now();
|
|
278
|
+
// Read package.json for output name
|
|
279
|
+
const pkgPath = resolve("package.json");
|
|
280
|
+
if (!existsSync(pkgPath)) {
|
|
281
|
+
console.error(`[${timestamp()}] No package.json found.`);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
285
|
+
const pluginName = `${pkg.name.replace(/^@.*\//, "")}.wasm`;
|
|
286
|
+
// Find WIT files — same resolution as cmdBuild
|
|
287
|
+
let witPath = resolve("wit");
|
|
288
|
+
const sdkWitPath = join(SDK_ROOT, "wit");
|
|
289
|
+
if (existsSync(join(sdkWitPath, "plugin.wit"))) {
|
|
290
|
+
witPath = sdkWitPath;
|
|
291
|
+
}
|
|
292
|
+
if (!existsSync(join(witPath, "plugin.wit"))) {
|
|
293
|
+
console.error(`[${timestamp()}] WIT files not found.`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
console.log(`[${timestamp()}] Building ${pluginName}...`);
|
|
297
|
+
// Step 1: Compile TypeScript
|
|
298
|
+
try {
|
|
299
|
+
execSync("npx tsc", { stdio: "pipe" });
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
const stderr = err instanceof Error && "stderr" in err
|
|
303
|
+
? err.stderr?.toString()
|
|
304
|
+
: "";
|
|
305
|
+
console.error(`[${timestamp()}] TypeScript compilation failed`);
|
|
306
|
+
if (stderr)
|
|
307
|
+
console.error(stderr);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Step 2: Bundle
|
|
311
|
+
const entryPoint = resolve("dist", "index.js");
|
|
312
|
+
if (!existsSync(entryPoint)) {
|
|
313
|
+
console.error(`[${timestamp()}] Entry point not found: ${entryPoint}`);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const bundledFile = resolve("dist", "bundle.js");
|
|
317
|
+
try {
|
|
318
|
+
execSync(`npx esbuild ${entryPoint} --bundle --format=esm --outfile=${bundledFile}`, { stdio: "pipe" });
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
const stderr = err instanceof Error && "stderr" in err
|
|
322
|
+
? err.stderr?.toString()
|
|
323
|
+
: "";
|
|
324
|
+
console.error(`[${timestamp()}] Bundling failed`);
|
|
325
|
+
if (stderr)
|
|
326
|
+
console.error(stderr);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
// Step 3: Componentize to WASM
|
|
330
|
+
const tmpScript = resolve("_fhirust_build.mjs");
|
|
331
|
+
const buildScript = [
|
|
332
|
+
`import { componentize } from '@bytecodealliance/componentize-js';`,
|
|
333
|
+
`import { readFile, writeFile } from 'node:fs/promises';`,
|
|
334
|
+
``,
|
|
335
|
+
`const source = await readFile(${JSON.stringify(bundledFile)}, 'utf-8');`,
|
|
336
|
+
``,
|
|
337
|
+
`const { component } = await componentize(source, {`,
|
|
338
|
+
` witPath: ${JSON.stringify(witPath)},`,
|
|
339
|
+
` worldName: 'fhir-plugin',`,
|
|
340
|
+
`});`,
|
|
341
|
+
``,
|
|
342
|
+
`await writeFile(${JSON.stringify(pluginName)}, component);`,
|
|
343
|
+
].join("\n");
|
|
344
|
+
writeFileSync(tmpScript, buildScript);
|
|
345
|
+
try {
|
|
346
|
+
execSync(`node ${tmpScript}`, { stdio: "pipe" });
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
const stderr = err instanceof Error && "stderr" in err
|
|
350
|
+
? err.stderr?.toString()
|
|
351
|
+
: "";
|
|
352
|
+
console.error(`[${timestamp()}] WASM componentization failed`);
|
|
353
|
+
if (stderr)
|
|
354
|
+
console.error(stderr);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
try {
|
|
359
|
+
unlinkSync(tmpScript);
|
|
360
|
+
}
|
|
361
|
+
catch { }
|
|
362
|
+
try {
|
|
363
|
+
unlinkSync(bundledFile);
|
|
364
|
+
}
|
|
365
|
+
catch { }
|
|
366
|
+
}
|
|
367
|
+
const elapsed = Date.now() - startTime;
|
|
368
|
+
console.log(`[${timestamp()}] Built ${pluginName} in ${elapsed}ms`);
|
|
369
|
+
// Optionally deploy the .wasm file
|
|
370
|
+
if (deployDir) {
|
|
371
|
+
const targetDir = resolve(deployDir);
|
|
372
|
+
if (!existsSync(targetDir)) {
|
|
373
|
+
mkdirSync(targetDir, { recursive: true });
|
|
374
|
+
}
|
|
375
|
+
const targetPath = join(targetDir, pluginName);
|
|
376
|
+
copyFileSync(resolve(pluginName), targetPath);
|
|
377
|
+
console.log(`[${timestamp()}] Deployed to ${targetPath}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
216
380
|
main();
|
|
217
381
|
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,UAAU,EACV,KAAK,EACL,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iDAAiD;AACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEhD,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,OAAO,EAAE,CAAC;QACnB;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,kBAAkB,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAExC,6BAA6B;IAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,eAAe;IACf,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,mBAAmB,IAAI,EAAE;QACtC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,mBAAmB;SAC3B;QACD,eAAe,EAAE;YACf,cAAc,EAAE,QAAQ;YACxB,mCAAmC,EAAE,SAAS;YAC9C,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,QAAQ;SACrB;KACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvF,gBAAgB;IAChB,MAAM,QAAQ,GAAG;QACf,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,CAAC,UAAU,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErF,kCAAkC;IAClC,MAAM,OAAO,GAAG;;;iCAGe,IAAI;;;;;;;;;;;;;;CAcpC,CAAC;IACA,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtD,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,8BAA8B;IAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;UACJ,IAAI;;;OAGP,IAAI;;;;CAIV,CAAC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc;IAC9B,sBAAsB;IACtB,IAAI,UAA8B,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,UAAU,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC;IAE1E,wEAAwE;IACxE,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CACX,yFAAyF,CAC1F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,KAAK,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gDAAgD;IAChD,2EAA2E;IAC3E,8DAA8D;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,QAAQ,CACN,eAAe,UAAU,oCAAoC,WAAW,EAAE,EAC1E,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,sEAAsE;IACtE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG;QAClB,mEAAmE;QACnE,yDAAyD;QACzD,EAAE;QACF,iCAAiC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa;QACzE,EAAE;QACF,oDAAoD;QACpD,cAAc,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;QACxC,6BAA6B;QAC7B,KAAK;QACL,EAAE;QACF,mBAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe;QAC5D,0CAA0C,UAAU,KAAK;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACvC,IAAI,CAAC;YAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,4BAA4B,CAAC,CAAC;AACpE,CAAC;AAED,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AAExE,SAAS,MAAM,CAAC,IAAc;IAC5B,2BAA2B;IAC3B,IAAI,SAA6B,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,gDAAgD,CAAC,CAAC;IAC7E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,oBAAoB,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE/B,uCAAuC;IACvC,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtD,iCAAiC;QACjC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QAEnD,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,EAAE,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YAC/D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,SAAuB,EAAE,SAAkB;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,oCAAoC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC;IAE5D,+CAA+C;IAC/C,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,wBAAwB,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,cAAc,UAAU,KAAK,CAAC,CAAC;IAE1D,6BAA6B;IAC7B,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;YACpD,CAAC,CAAE,GAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,iCAAiC,CAAC,CAAC;QAChE,IAAI,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,4BAA4B,UAAU,EAAE,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,QAAQ,CACN,eAAe,UAAU,oCAAoC,WAAW,EAAE,EAC1E,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;YACpD,CAAC,CAAE,GAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAClD,IAAI,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG;QAClB,mEAAmE;QACnE,yDAAyD;QACzD,EAAE;QACF,iCAAiC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa;QACzE,EAAE;QACF,oDAAoD;QACpD,cAAc,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;QACxC,6BAA6B;QAC7B,KAAK;QACL,EAAE;QACF,mBAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe;KAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;YACpD,CAAC,CAAE,GAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,gCAAgC,CAAC,CAAC;QAC/D,IAAI,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACvC,IAAI,CAAC;YAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,WAAW,UAAU,OAAO,OAAO,IAAI,CAAC,CAAC;IAEpE,mCAAmC;IACnC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/C,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|