@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.
Files changed (208) hide show
  1. package/README.md +430 -0
  2. package/dist/bin/cli.d.ts +1 -0
  3. package/dist/bin/cli.d.ts.map +1 -1
  4. package/dist/bin/cli.js +167 -3
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/plugin.d.ts +5 -2
  7. package/dist/plugin.d.ts.map +1 -1
  8. package/dist/plugin.js +15 -7
  9. package/dist/plugin.js.map +1 -1
  10. package/dist/r4/allergy-intolerance.d.ts +10 -10
  11. package/dist/r4/allergy-intolerance.d.ts.map +1 -1
  12. package/dist/r4/appointment-response.d.ts +16 -0
  13. package/dist/r4/appointment-response.d.ts.map +1 -0
  14. package/dist/r4/appointment-response.js +2 -0
  15. package/dist/r4/appointment-response.js.map +1 -0
  16. package/dist/r4/appointment.d.ts +37 -0
  17. package/dist/r4/appointment.d.ts.map +1 -0
  18. package/dist/r4/appointment.js +2 -0
  19. package/dist/r4/appointment.js.map +1 -0
  20. package/dist/r4/care-plan.d.ts +59 -0
  21. package/dist/r4/care-plan.d.ts.map +1 -0
  22. package/dist/r4/care-plan.js +2 -0
  23. package/dist/r4/care-plan.js.map +1 -0
  24. package/dist/r4/care-team.d.ts +27 -0
  25. package/dist/r4/care-team.d.ts.map +1 -0
  26. package/dist/r4/care-team.js +2 -0
  27. package/dist/r4/care-team.js.map +1 -0
  28. package/dist/r4/claim-response.d.ts +123 -0
  29. package/dist/r4/claim-response.d.ts.map +1 -0
  30. package/dist/r4/claim-response.js +2 -0
  31. package/dist/r4/claim-response.js.map +1 -0
  32. package/dist/r4/claim.d.ts +146 -0
  33. package/dist/r4/claim.d.ts.map +1 -0
  34. package/dist/r4/claim.js +2 -0
  35. package/dist/r4/claim.js.map +1 -0
  36. package/dist/r4/common.d.ts +82 -0
  37. package/dist/r4/common.d.ts.map +1 -1
  38. package/dist/r4/communication-request.d.ts +36 -0
  39. package/dist/r4/communication-request.d.ts.map +1 -0
  40. package/dist/r4/communication-request.js +2 -0
  41. package/dist/r4/communication-request.js.map +1 -0
  42. package/dist/r4/communication.d.ts +36 -0
  43. package/dist/r4/communication.d.ts.map +1 -0
  44. package/dist/r4/communication.js +2 -0
  45. package/dist/r4/communication.js.map +1 -0
  46. package/dist/r4/composition.d.ts +49 -0
  47. package/dist/r4/composition.d.ts.map +1 -0
  48. package/dist/r4/composition.js +2 -0
  49. package/dist/r4/composition.js.map +1 -0
  50. package/dist/r4/condition.d.ts +7 -7
  51. package/dist/r4/condition.d.ts.map +1 -1
  52. package/dist/r4/coverage.d.ts +39 -0
  53. package/dist/r4/coverage.d.ts.map +1 -0
  54. package/dist/r4/coverage.js +2 -0
  55. package/dist/r4/coverage.js.map +1 -0
  56. package/dist/r4/device-request.d.ts +42 -0
  57. package/dist/r4/device-request.d.ts.map +1 -0
  58. package/dist/r4/device-request.js +2 -0
  59. package/dist/r4/device-request.js.map +1 -0
  60. package/dist/r4/device-use-statement.d.ts +23 -0
  61. package/dist/r4/device-use-statement.d.ts.map +1 -0
  62. package/dist/r4/device-use-statement.js +2 -0
  63. package/dist/r4/device-use-statement.js.map +1 -0
  64. package/dist/r4/device.d.ts +60 -0
  65. package/dist/r4/device.d.ts.map +1 -0
  66. package/dist/r4/device.js +2 -0
  67. package/dist/r4/device.js.map +1 -0
  68. package/dist/r4/diagnostic-report.d.ts +4 -4
  69. package/dist/r4/diagnostic-report.d.ts.map +1 -1
  70. package/dist/r4/document-reference.d.ts +41 -0
  71. package/dist/r4/document-reference.d.ts.map +1 -0
  72. package/dist/r4/document-reference.js +2 -0
  73. package/dist/r4/document-reference.js.map +1 -0
  74. package/dist/r4/encounter.d.ts +7 -7
  75. package/dist/r4/encounter.d.ts.map +1 -1
  76. package/dist/r4/episode-of-care.d.ts +29 -0
  77. package/dist/r4/episode-of-care.d.ts.map +1 -0
  78. package/dist/r4/episode-of-care.js +2 -0
  79. package/dist/r4/episode-of-care.js.map +1 -0
  80. package/dist/r4/flag.d.ts +16 -0
  81. package/dist/r4/flag.d.ts.map +1 -0
  82. package/dist/r4/flag.js +2 -0
  83. package/dist/r4/flag.js.map +1 -0
  84. package/dist/r4/goal.d.ts +37 -0
  85. package/dist/r4/goal.d.ts.map +1 -0
  86. package/dist/r4/goal.js +2 -0
  87. package/dist/r4/goal.js.map +1 -0
  88. package/dist/r4/imaging-study.d.ts +50 -0
  89. package/dist/r4/imaging-study.d.ts.map +1 -0
  90. package/dist/r4/imaging-study.js +2 -0
  91. package/dist/r4/imaging-study.js.map +1 -0
  92. package/dist/r4/immunization.d.ts +61 -0
  93. package/dist/r4/immunization.d.ts.map +1 -0
  94. package/dist/r4/immunization.js +2 -0
  95. package/dist/r4/immunization.js.map +1 -0
  96. package/dist/r4/index.d.ts +47 -11
  97. package/dist/r4/index.d.ts.map +1 -1
  98. package/dist/r4/index.js +47 -1
  99. package/dist/r4/index.js.map +1 -1
  100. package/dist/r4/location.d.ts +36 -0
  101. package/dist/r4/location.d.ts.map +1 -0
  102. package/dist/r4/location.js +2 -0
  103. package/dist/r4/location.js.map +1 -0
  104. package/dist/r4/media.d.ts +31 -0
  105. package/dist/r4/media.d.ts.map +1 -0
  106. package/dist/r4/media.js +2 -0
  107. package/dist/r4/media.js.map +1 -0
  108. package/dist/r4/medication-administration.d.ts +42 -0
  109. package/dist/r4/medication-administration.d.ts.map +1 -0
  110. package/dist/r4/medication-administration.js +2 -0
  111. package/dist/r4/medication-administration.js.map +1 -0
  112. package/dist/r4/medication-dispense.d.ts +44 -0
  113. package/dist/r4/medication-dispense.d.ts.map +1 -0
  114. package/dist/r4/medication-dispense.js +2 -0
  115. package/dist/r4/medication-dispense.js.map +1 -0
  116. package/dist/r4/medication-request.d.ts +21 -16
  117. package/dist/r4/medication-request.d.ts.map +1 -1
  118. package/dist/r4/medication-statement.d.ts +27 -0
  119. package/dist/r4/medication-statement.d.ts.map +1 -0
  120. package/dist/r4/medication-statement.js +2 -0
  121. package/dist/r4/medication-statement.js.map +1 -0
  122. package/dist/r4/medication.d.ts +26 -0
  123. package/dist/r4/medication.d.ts.map +1 -0
  124. package/dist/r4/medication.js +2 -0
  125. package/dist/r4/medication.js.map +1 -0
  126. package/dist/r4/observation.d.ts +21 -17
  127. package/dist/r4/observation.d.ts.map +1 -1
  128. package/dist/r4/organization.d.ts +1 -1
  129. package/dist/r4/organization.d.ts.map +1 -1
  130. package/dist/r4/patient.d.ts +15 -15
  131. package/dist/r4/patient.d.ts.map +1 -1
  132. package/dist/r4/person.d.ts +22 -0
  133. package/dist/r4/person.d.ts.map +1 -0
  134. package/dist/r4/person.js +2 -0
  135. package/dist/r4/person.js.map +1 -0
  136. package/dist/r4/practitioner-role.d.ts +32 -0
  137. package/dist/r4/practitioner-role.d.ts.map +1 -0
  138. package/dist/r4/practitioner-role.js +2 -0
  139. package/dist/r4/practitioner-role.js.map +1 -0
  140. package/dist/r4/practitioner.d.ts +2 -2
  141. package/dist/r4/practitioner.d.ts.map +1 -1
  142. package/dist/r4/procedure.d.ts +14 -7
  143. package/dist/r4/procedure.d.ts.map +1 -1
  144. package/dist/r4/related-person.d.ts +24 -0
  145. package/dist/r4/related-person.d.ts.map +1 -0
  146. package/dist/r4/related-person.js +2 -0
  147. package/dist/r4/related-person.js.map +1 -0
  148. package/dist/r4/risk-assessment.d.ts +36 -0
  149. package/dist/r4/risk-assessment.d.ts.map +1 -0
  150. package/dist/r4/risk-assessment.js +2 -0
  151. package/dist/r4/risk-assessment.js.map +1 -0
  152. package/dist/r4/schedule.d.ts +16 -0
  153. package/dist/r4/schedule.d.ts.map +1 -0
  154. package/dist/r4/schedule.js +2 -0
  155. package/dist/r4/schedule.js.map +1 -0
  156. package/dist/r4/service-request.d.ts +46 -0
  157. package/dist/r4/service-request.d.ts.map +1 -0
  158. package/dist/r4/service-request.js +2 -0
  159. package/dist/r4/service-request.js.map +1 -0
  160. package/dist/r4/slot.d.ts +19 -0
  161. package/dist/r4/slot.d.ts.map +1 -0
  162. package/dist/r4/slot.js +2 -0
  163. package/dist/r4/slot.js.map +1 -0
  164. package/dist/r4/specimen.d.ts +48 -0
  165. package/dist/r4/specimen.d.ts.map +1 -0
  166. package/dist/r4/specimen.js +2 -0
  167. package/dist/r4/specimen.js.map +1 -0
  168. package/dist/r4/task.d.ts +150 -0
  169. package/dist/r4/task.d.ts.map +1 -0
  170. package/dist/r4/task.js +2 -0
  171. package/dist/r4/task.js.map +1 -0
  172. package/dist/testing/__tests__/test-harness.test.d.ts +15 -0
  173. package/dist/testing/__tests__/test-harness.test.d.ts.map +1 -0
  174. package/dist/testing/__tests__/test-harness.test.js +416 -0
  175. package/dist/testing/__tests__/test-harness.test.js.map +1 -0
  176. package/dist/testing/index.d.ts +37 -0
  177. package/dist/testing/index.d.ts.map +1 -0
  178. package/dist/testing/index.js +76 -0
  179. package/dist/testing/index.js.map +1 -0
  180. package/dist/testing/mock-fhir.d.ts +38 -0
  181. package/dist/testing/mock-fhir.d.ts.map +1 -0
  182. package/dist/testing/mock-fhir.js +113 -0
  183. package/dist/testing/mock-fhir.js.map +1 -0
  184. package/dist/testing/mock-http.d.ts +31 -0
  185. package/dist/testing/mock-http.d.ts.map +1 -0
  186. package/dist/testing/mock-http.js +52 -0
  187. package/dist/testing/mock-http.js.map +1 -0
  188. package/dist/testing/mock-utils.d.ts +15 -0
  189. package/dist/testing/mock-utils.d.ts.map +1 -0
  190. package/dist/testing/mock-utils.js +17 -0
  191. package/dist/testing/mock-utils.js.map +1 -0
  192. package/dist/testing/simulator.d.ts +21 -0
  193. package/dist/testing/simulator.d.ts.map +1 -0
  194. package/dist/testing/simulator.js +74 -0
  195. package/dist/testing/simulator.js.map +1 -0
  196. package/dist/testing/types.d.ts +81 -0
  197. package/dist/testing/types.d.ts.map +1 -0
  198. package/dist/testing/types.js +8 -0
  199. package/dist/testing/types.js.map +1 -0
  200. package/dist/types.d.ts +10 -7
  201. package/dist/types.d.ts.map +1 -1
  202. package/dist/types.js +0 -22
  203. package/dist/types.js.map +1 -1
  204. package/package.json +7 -1
  205. package/templates/docker-compose.yml +32 -0
  206. package/templates/gitignore +4 -0
  207. package/wit/plugin.wit +4 -16
  208. 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
+ [![npm version](https://badge.fury.io/js/@fhirust%2Fsdk.svg)](https://www.npmjs.com/package/@fhirust/sdk)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
@@ -5,6 +5,7 @@
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
10
  export {};
10
11
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
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.2.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
- npx fhirust-sdk build
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
@@ -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":"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"}