@fhirust/sdk 0.2.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 (87) hide show
  1. package/dist/bin/cli.d.ts +10 -0
  2. package/dist/bin/cli.d.ts.map +1 -0
  3. package/dist/bin/cli.js +217 -0
  4. package/dist/bin/cli.js.map +1 -0
  5. package/dist/events.d.ts +18 -0
  6. package/dist/events.d.ts.map +1 -0
  7. package/dist/events.js +22 -0
  8. package/dist/events.js.map +1 -0
  9. package/dist/fhir-client.d.ts +80 -0
  10. package/dist/fhir-client.d.ts.map +1 -0
  11. package/dist/fhir-client.js +65 -0
  12. package/dist/fhir-client.js.map +1 -0
  13. package/dist/helpers.d.ts +19 -0
  14. package/dist/helpers.d.ts.map +1 -0
  15. package/dist/helpers.js +38 -0
  16. package/dist/helpers.js.map +1 -0
  17. package/dist/http-client.d.ts +63 -0
  18. package/dist/http-client.d.ts.map +1 -0
  19. package/dist/http-client.js +98 -0
  20. package/dist/http-client.js.map +1 -0
  21. package/dist/index.d.ts +27 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +28 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/logger.d.ts +22 -0
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/logger.js +27 -0
  28. package/dist/logger.js.map +1 -0
  29. package/dist/plugin.d.ts +70 -0
  30. package/dist/plugin.d.ts.map +1 -0
  31. package/dist/plugin.js +219 -0
  32. package/dist/plugin.js.map +1 -0
  33. package/dist/r4/allergy-intolerance.d.ts +37 -0
  34. package/dist/r4/allergy-intolerance.d.ts.map +1 -0
  35. package/dist/r4/allergy-intolerance.js +2 -0
  36. package/dist/r4/allergy-intolerance.js.map +1 -0
  37. package/dist/r4/common.d.ts +148 -0
  38. package/dist/r4/common.d.ts.map +1 -0
  39. package/dist/r4/common.js +5 -0
  40. package/dist/r4/common.js.map +1 -0
  41. package/dist/r4/condition.d.ts +42 -0
  42. package/dist/r4/condition.d.ts.map +1 -0
  43. package/dist/r4/condition.js +2 -0
  44. package/dist/r4/condition.js.map +1 -0
  45. package/dist/r4/diagnostic-report.d.ts +31 -0
  46. package/dist/r4/diagnostic-report.d.ts.map +1 -0
  47. package/dist/r4/diagnostic-report.js +2 -0
  48. package/dist/r4/diagnostic-report.js.map +1 -0
  49. package/dist/r4/encounter.d.ts +66 -0
  50. package/dist/r4/encounter.d.ts.map +1 -0
  51. package/dist/r4/encounter.js +2 -0
  52. package/dist/r4/encounter.js.map +1 -0
  53. package/dist/r4/index.d.ts +19 -0
  54. package/dist/r4/index.d.ts.map +1 -0
  55. package/dist/r4/index.js +9 -0
  56. package/dist/r4/index.js.map +1 -0
  57. package/dist/r4/medication-request.d.ts +54 -0
  58. package/dist/r4/medication-request.d.ts.map +1 -0
  59. package/dist/r4/medication-request.js +2 -0
  60. package/dist/r4/medication-request.js.map +1 -0
  61. package/dist/r4/observation.d.ts +65 -0
  62. package/dist/r4/observation.d.ts.map +1 -0
  63. package/dist/r4/observation.js +2 -0
  64. package/dist/r4/observation.js.map +1 -0
  65. package/dist/r4/organization.d.ts +24 -0
  66. package/dist/r4/organization.d.ts.map +1 -0
  67. package/dist/r4/organization.js +2 -0
  68. package/dist/r4/organization.js.map +1 -0
  69. package/dist/r4/patient.d.ts +43 -0
  70. package/dist/r4/patient.d.ts.map +1 -0
  71. package/dist/r4/patient.js +2 -0
  72. package/dist/r4/patient.js.map +1 -0
  73. package/dist/r4/practitioner.d.ts +24 -0
  74. package/dist/r4/practitioner.d.ts.map +1 -0
  75. package/dist/r4/practitioner.js +2 -0
  76. package/dist/r4/practitioner.js.map +1 -0
  77. package/dist/r4/procedure.d.ts +42 -0
  78. package/dist/r4/procedure.d.ts.map +1 -0
  79. package/dist/r4/procedure.js +2 -0
  80. package/dist/r4/procedure.js.map +1 -0
  81. package/dist/types.d.ts +99 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +30 -0
  84. package/dist/types.js.map +1 -0
  85. package/package.json +53 -0
  86. package/wit/plugin.wit +114 -0
  87. package/wit/world.wit +12 -0
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Ergonomic HTTP client wrapper over the WIT http.fetch import.
3
+ *
4
+ * Usage inside hooks:
5
+ * const resp = plugin.http.post("https://example.com/webhook", {
6
+ * body: { event: "patient-created", id: "123" },
7
+ * timeout: 3000,
8
+ * });
9
+ * if (resp.ok) { ... }
10
+ */
11
+ export class HttpResponse {
12
+ status;
13
+ headers;
14
+ body;
15
+ constructor(status, headers, body) {
16
+ this.status = status;
17
+ this.headers = headers;
18
+ this.body = body;
19
+ }
20
+ /** True if status is 200-299 */
21
+ get ok() {
22
+ return this.status >= 200 && this.status < 300;
23
+ }
24
+ /** Parse body as JSON */
25
+ json() {
26
+ return JSON.parse(this.body);
27
+ }
28
+ }
29
+ export class HttpClientError extends Error {
30
+ constructor(message) {
31
+ super(message);
32
+ this.name = "HttpClientError";
33
+ }
34
+ }
35
+ export class HttpClient {
36
+ http = null;
37
+ /** @internal Called by FhirPlugin to inject WIT bindings */
38
+ _bind(http) {
39
+ this.http = http;
40
+ }
41
+ ensureBound() {
42
+ if (!this.http) {
43
+ throw new Error("HTTP client not available — host did not provide http bindings");
44
+ }
45
+ return this.http;
46
+ }
47
+ doFetch(url, method, options = {}) {
48
+ const headers = [];
49
+ if (options.headers) {
50
+ for (const [k, v] of Object.entries(options.headers)) {
51
+ headers.push([k, v]);
52
+ }
53
+ }
54
+ let body;
55
+ if (options.body !== undefined) {
56
+ if (typeof options.body === "string") {
57
+ body = options.body;
58
+ }
59
+ else {
60
+ body = JSON.stringify(options.body);
61
+ // Auto-add Content-Type if not set
62
+ if (!headers.some(([k]) => k.toLowerCase() === "content-type")) {
63
+ headers.push(["Content-Type", "application/json"]);
64
+ }
65
+ }
66
+ }
67
+ const timeout = options.timeout ?? 5000;
68
+ const result = this.ensureBound().fetch(url, method, headers, body, timeout);
69
+ if (result.tag === "err") {
70
+ throw new HttpClientError(result.val);
71
+ }
72
+ const respHeaders = {};
73
+ for (const [k, v] of result.val.headers) {
74
+ respHeaders[k] = v;
75
+ }
76
+ return new HttpResponse(result.val.status, respHeaders, result.val.body);
77
+ }
78
+ get(url, options) {
79
+ return this.doFetch(url, "GET", options);
80
+ }
81
+ post(url, options) {
82
+ return this.doFetch(url, "POST", options);
83
+ }
84
+ put(url, options) {
85
+ return this.doFetch(url, "PUT", options);
86
+ }
87
+ delete(url, options) {
88
+ return this.doFetch(url, "DELETE", options);
89
+ }
90
+ patch(url, options) {
91
+ return this.doFetch(url, "PATCH", options);
92
+ }
93
+ /** Raw fetch matching the WIT signature more closely */
94
+ fetch(url, options) {
95
+ return this.doFetch(url, options.method, options);
96
+ }
97
+ }
98
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fhirust/sdk — TypeScript SDK for building FHIRust WASM plugins.
3
+ *
4
+ * Usage:
5
+ * import { FhirPlugin, reject } from "@fhirust/sdk";
6
+ * import type { Patient } from "@fhirust/sdk/r4";
7
+ *
8
+ * const plugin = new FhirPlugin("my-plugin", "1.0.0");
9
+ *
10
+ * plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
11
+ * if (!patient.name?.length) return reject("Patient must have at least one name");
12
+ * patient.meta.tag.push({ system: "http://example.com", code: "validated" });
13
+ * return patient;
14
+ * });
15
+ *
16
+ * export const { getMetadata, executeHook } = plugin.exports();
17
+ */
18
+ export { FhirPlugin } from "./plugin.js";
19
+ export { reject, outcome } from "./helpers.js";
20
+ export { FhirClient, FhirClientError } from "./fhir-client.js";
21
+ export { HttpClient, HttpResponse, HttpClientError } from "./http-client.js";
22
+ export { Logger } from "./logger.js";
23
+ export { EventEmitter } from "./events.js";
24
+ export type { HookType, HookContext, BeforeHook, AfterHook, BeforeReadHook, BeforeDeleteHook, AfterDeleteHook, OperationOutcome, OperationOutcomeIssue, Bundle, BundleEntry, BundleLink, } from "./types.js";
25
+ export { Rejection } from "./types.js";
26
+ export type { RequestOptions } from "./http-client.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,MAAM,EACN,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fhirust/sdk — TypeScript SDK for building FHIRust WASM plugins.
3
+ *
4
+ * Usage:
5
+ * import { FhirPlugin, reject } from "@fhirust/sdk";
6
+ * import type { Patient } from "@fhirust/sdk/r4";
7
+ *
8
+ * const plugin = new FhirPlugin("my-plugin", "1.0.0");
9
+ *
10
+ * plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
11
+ * if (!patient.name?.length) return reject("Patient must have at least one name");
12
+ * patient.meta.tag.push({ system: "http://example.com", code: "validated" });
13
+ * return patient;
14
+ * });
15
+ *
16
+ * export const { getMetadata, executeHook } = plugin.exports();
17
+ */
18
+ // Main class
19
+ export { FhirPlugin } from "./plugin.js";
20
+ // Helpers
21
+ export { reject, outcome } from "./helpers.js";
22
+ // Client wrappers (also accessible via plugin.fhir, plugin.http, etc.)
23
+ export { FhirClient, FhirClientError } from "./fhir-client.js";
24
+ export { HttpClient, HttpResponse, HttpClientError } from "./http-client.js";
25
+ export { Logger } from "./logger.js";
26
+ export { EventEmitter } from "./events.js";
27
+ export { Rejection } from "./types.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,UAAU;AACV,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE/C,uEAAuE;AACvE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkB3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Typed wrapper around the WIT utils.log function.
3
+ *
4
+ * Usage inside hooks:
5
+ * plugin.log.info("Patient created");
6
+ * plugin.log.warn("Missing identifier");
7
+ */
8
+ /** Raw WIT utils interface */
9
+ export interface WitUtils {
10
+ log(level: string, message: string): void;
11
+ emitEvent(eventType: string, payload: string): void;
12
+ }
13
+ export declare class Logger {
14
+ private utils;
15
+ /** @internal Called by FhirPlugin to inject WIT bindings */
16
+ _bind(utils: WitUtils): void;
17
+ debug(message: string): void;
18
+ info(message: string): void;
19
+ warn(message: string): void;
20
+ error(message: string): void;
21
+ }
22
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAyB;IAEtC,4DAA4D;IAC5D,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG7B"}
package/dist/logger.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Typed wrapper around the WIT utils.log function.
3
+ *
4
+ * Usage inside hooks:
5
+ * plugin.log.info("Patient created");
6
+ * plugin.log.warn("Missing identifier");
7
+ */
8
+ export class Logger {
9
+ utils = null;
10
+ /** @internal Called by FhirPlugin to inject WIT bindings */
11
+ _bind(utils) {
12
+ this.utils = utils;
13
+ }
14
+ debug(message) {
15
+ this.utils?.log("debug", message);
16
+ }
17
+ info(message) {
18
+ this.utils?.log("info", message);
19
+ }
20
+ warn(message) {
21
+ this.utils?.log("warn", message);
22
+ }
23
+ error(message) {
24
+ this.utils?.log("error", message);
25
+ }
26
+ }
27
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,OAAO,MAAM;IACT,KAAK,GAAoB,IAAI,CAAC;IAEtC,4DAA4D;IAC5D,KAAK,CAAC,KAAe;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * FhirPlugin — the main entry point for writing FHIRust plugins.
3
+ *
4
+ * Usage:
5
+ * const plugin = new FhirPlugin("my-plugin", "1.0.0");
6
+ *
7
+ * plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
8
+ * if (!patient.name?.length) return reject("Patient must have at least one name");
9
+ * return patient;
10
+ * });
11
+ *
12
+ * export const { getMetadata, executeHook } = plugin.exports();
13
+ */
14
+ import { FhirClient } from "./fhir-client.js";
15
+ import { HttpClient } from "./http-client.js";
16
+ import { Logger } from "./logger.js";
17
+ import { EventEmitter } from "./events.js";
18
+ import { type HookType, type WitHookContext, type WitPluginMetadata, type WitResourceType, type WitResult, type BeforeHook, type AfterHook, type BeforeReadHook, type BeforeDeleteHook, type AfterDeleteHook } from "./types.js";
19
+ export declare class FhirPlugin {
20
+ private readonly name;
21
+ private readonly version;
22
+ private readonly handlers;
23
+ /** Typed FHIR data access client */
24
+ readonly fhir: FhirClient;
25
+ /** Typed HTTP client */
26
+ readonly http: HttpClient;
27
+ /** Structured logger */
28
+ readonly log: Logger;
29
+ /** Fire-and-forget event emitter */
30
+ readonly events: EventEmitter;
31
+ private bound;
32
+ constructor(name: string, version: string);
33
+ /** Register a before-create hook. Return the resource to modify, reject() to fail, or void to pass through. */
34
+ beforeCreate<T = any>(resourceType: string, handler: BeforeHook<T>): void;
35
+ /** Register an after-create hook. Observe only — return value is ignored. */
36
+ afterCreate<T = any>(resourceType: string, handler: AfterHook<T>): void;
37
+ /** Register a before-read hook. Can reject() to deny the read. */
38
+ beforeRead(resourceType: string, handler: BeforeReadHook): void;
39
+ /** Register an after-read hook. Observe or transform the returned resource. */
40
+ afterRead<T = any>(resourceType: string, handler: AfterHook<T>): void;
41
+ /** Register a before-update hook. Return the resource to modify, reject() to fail, or void to pass through. */
42
+ beforeUpdate<T = any>(resourceType: string, handler: BeforeHook<T>): void;
43
+ /** Register an after-update hook. Observe only. */
44
+ afterUpdate<T = any>(resourceType: string, handler: AfterHook<T>): void;
45
+ /** Register a before-delete hook. Can reject() to deny the delete. */
46
+ beforeDelete(resourceType: string, handler: BeforeDeleteHook): void;
47
+ /** Register an after-delete hook. Observe only. */
48
+ afterDelete(resourceType: string, handler: AfterDeleteHook): void;
49
+ /**
50
+ * Returns the WIT-compatible exports that the user must re-export.
51
+ *
52
+ * The WIT world exports two interfaces: `lifecycle` and `hooks`.
53
+ * componentize-js expects these as named JS exports:
54
+ *
55
+ * export const { lifecycle, hooks } = plugin.exports();
56
+ */
57
+ exports(): {
58
+ lifecycle: {
59
+ getMetadata: () => WitPluginMetadata;
60
+ };
61
+ hooks: {
62
+ executeHook: (hookType: HookType, resourceType: WitResourceType, resourceJson: string, context: WitHookContext) => WitResult;
63
+ };
64
+ };
65
+ /** Lazily bind host services on first dispatch */
66
+ private bindIfNeeded;
67
+ private buildMetadata;
68
+ private dispatch;
69
+ }
70
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAUpB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C,oCAAoC;IACpC,QAAQ,CAAC,IAAI,aAAoB;IACjC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,aAAoB;IACjC,wBAAwB;IACxB,QAAQ,CAAC,GAAG,SAAgB;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,eAAsB;IAErC,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IASzC,+GAA+G;IAC/G,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIzE,6EAA6E;IAC7E,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvE,kEAAkE;IAClE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/D,+EAA+E;IAC/E,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrE,+GAA+G;IAC/G,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIzE,mDAAmD;IACnD,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvE,sEAAsE;IACtE,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAInE,mDAAmD;IACnD,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAQjE;;;;;;;OAOG;IACH,OAAO,IAAI;QACT,SAAS,EAAE;YACT,WAAW,EAAE,MAAM,iBAAiB,CAAC;SACtC,CAAC;QACF,KAAK,EAAE;YACL,WAAW,EAAE,CACX,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,eAAe,EAC7B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,KACpB,SAAS,CAAC;SAChB,CAAC;KACH;IAkBD,kDAAkD;IAClD,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,QAAQ;CAwFjB"}
package/dist/plugin.js ADDED
@@ -0,0 +1,219 @@
1
+ /**
2
+ * FhirPlugin — the main entry point for writing FHIRust plugins.
3
+ *
4
+ * Usage:
5
+ * const plugin = new FhirPlugin("my-plugin", "1.0.0");
6
+ *
7
+ * plugin.beforeCreate<Patient>("Patient", (patient, ctx) => {
8
+ * if (!patient.name?.length) return reject("Patient must have at least one name");
9
+ * return patient;
10
+ * });
11
+ *
12
+ * export const { getMetadata, executeHook } = plugin.exports();
13
+ */
14
+ import { FhirClient } from "./fhir-client.js";
15
+ import { HttpClient } from "./http-client.js";
16
+ import { Logger } from "./logger.js";
17
+ import { EventEmitter } from "./events.js";
18
+ import { Rejection, toWitResourceType, fromWitResourceType, } from "./types.js";
19
+ export class FhirPlugin {
20
+ name;
21
+ version;
22
+ handlers = [];
23
+ /** Typed FHIR data access client */
24
+ fhir = new FhirClient();
25
+ /** Typed HTTP client */
26
+ http = new HttpClient();
27
+ /** Structured logger */
28
+ log = new Logger();
29
+ /** Fire-and-forget event emitter */
30
+ events = new EventEmitter();
31
+ bound = false;
32
+ constructor(name, version) {
33
+ this.name = name;
34
+ this.version = version;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Hook registration
38
+ // ---------------------------------------------------------------------------
39
+ /** Register a before-create hook. Return the resource to modify, reject() to fail, or void to pass through. */
40
+ beforeCreate(resourceType, handler) {
41
+ this.handlers.push({ resourceType, hookType: "before-create", handler });
42
+ }
43
+ /** Register an after-create hook. Observe only — return value is ignored. */
44
+ afterCreate(resourceType, handler) {
45
+ this.handlers.push({ resourceType, hookType: "after-create", handler });
46
+ }
47
+ /** Register a before-read hook. Can reject() to deny the read. */
48
+ beforeRead(resourceType, handler) {
49
+ this.handlers.push({ resourceType, hookType: "before-read", handler });
50
+ }
51
+ /** Register an after-read hook. Observe or transform the returned resource. */
52
+ afterRead(resourceType, handler) {
53
+ this.handlers.push({ resourceType, hookType: "after-read", handler });
54
+ }
55
+ /** Register a before-update hook. Return the resource to modify, reject() to fail, or void to pass through. */
56
+ beforeUpdate(resourceType, handler) {
57
+ this.handlers.push({ resourceType, hookType: "before-update", handler });
58
+ }
59
+ /** Register an after-update hook. Observe only. */
60
+ afterUpdate(resourceType, handler) {
61
+ this.handlers.push({ resourceType, hookType: "after-update", handler });
62
+ }
63
+ /** Register a before-delete hook. Can reject() to deny the delete. */
64
+ beforeDelete(resourceType, handler) {
65
+ this.handlers.push({ resourceType, hookType: "before-delete", handler });
66
+ }
67
+ /** Register an after-delete hook. Observe only. */
68
+ afterDelete(resourceType, handler) {
69
+ this.handlers.push({ resourceType, hookType: "after-delete", handler });
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // WIT export wiring
73
+ // ---------------------------------------------------------------------------
74
+ /**
75
+ * Returns the WIT-compatible exports that the user must re-export.
76
+ *
77
+ * The WIT world exports two interfaces: `lifecycle` and `hooks`.
78
+ * componentize-js expects these as named JS exports:
79
+ *
80
+ * export const { lifecycle, hooks } = plugin.exports();
81
+ */
82
+ exports() {
83
+ const self = this;
84
+ return {
85
+ lifecycle: {
86
+ getMetadata: () => self.buildMetadata(),
87
+ },
88
+ hooks: {
89
+ executeHook: (hookType, resourceType, resourceJson, context) => self.dispatch(hookType, resourceType, resourceJson, context),
90
+ },
91
+ };
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Internal
95
+ // ---------------------------------------------------------------------------
96
+ /** Lazily bind host services on first dispatch */
97
+ bindIfNeeded() {
98
+ if (this.bound)
99
+ return;
100
+ this.bound = true;
101
+ // componentize-js makes WIT imports available via the fhirust:plugin/ specifier.
102
+ // At runtime inside the WASM component, these are injected by the host.
103
+ // We access them through a try/catch since they may not be available during
104
+ // unit testing outside the WASM runtime.
105
+ try {
106
+ // The WIT imports are available as ambient globals injected by componentize-js.
107
+ // Different versions of componentize-js expose them differently, so we try
108
+ // multiple access patterns.
109
+ const g = globalThis;
110
+ // Pattern 1: componentize-js >= 0.14 puts imports on globalThis
111
+ const fhir = g.fhir ?? g["fhirust:plugin/fhir"];
112
+ const utils = g.utils ?? g["fhirust:plugin/utils"];
113
+ const http = g.http ?? g["fhirust:plugin/http"];
114
+ if (fhir)
115
+ this.fhir._bind(fhir);
116
+ if (utils) {
117
+ this.log._bind(utils);
118
+ this.events._bind(utils);
119
+ }
120
+ if (http)
121
+ this.http._bind(http);
122
+ }
123
+ catch {
124
+ // Running outside WASM — host services won't be available
125
+ }
126
+ }
127
+ buildMetadata() {
128
+ // Group handlers by resource type
129
+ const hooksByResource = new Map();
130
+ for (const entry of this.handlers) {
131
+ let hooks = hooksByResource.get(entry.resourceType);
132
+ if (!hooks) {
133
+ hooks = new Set();
134
+ hooksByResource.set(entry.resourceType, hooks);
135
+ }
136
+ hooks.add(entry.hookType);
137
+ }
138
+ const hooks = [];
139
+ for (const [resourceType, hookSet] of hooksByResource) {
140
+ hooks.push([toWitResourceType(resourceType), [...hookSet]]);
141
+ }
142
+ return {
143
+ name: this.name,
144
+ version: this.version,
145
+ hooks,
146
+ };
147
+ }
148
+ dispatch(hookType, witResourceType, resourceJson, witContext) {
149
+ this.bindIfNeeded();
150
+ const resourceTypeName = fromWitResourceType(witResourceType);
151
+ // Find matching handler
152
+ const entry = this.handlers.find((h) => h.hookType === hookType && toWitResourceType(h.resourceType) === witResourceType);
153
+ if (!entry) {
154
+ // No handler — pass through
155
+ return { tag: "ok", val: { json: resourceJson } };
156
+ }
157
+ const ctx = {
158
+ requestId: witContext["request-id"],
159
+ userId: witContext["user-id"] ?? undefined,
160
+ timestamp: witContext.timestamp,
161
+ operation: witContext.operation,
162
+ };
163
+ try {
164
+ // Dispatch based on hook category
165
+ if (hookType === "before-read" || hookType === "before-delete") {
166
+ // These hooks get resource type + id (extracted from the JSON)
167
+ const parsed = JSON.parse(resourceJson);
168
+ const params = { resourceType: resourceTypeName, id: parsed.id ?? "" };
169
+ const result = entry.handler(params, ctx);
170
+ if (result instanceof Rejection) {
171
+ return { tag: "err", val: { json: JSON.stringify(result.outcome) } };
172
+ }
173
+ return { tag: "ok", val: { json: resourceJson } };
174
+ }
175
+ if (hookType === "after-delete") {
176
+ const parsed = JSON.parse(resourceJson);
177
+ const params = { resourceType: resourceTypeName, id: parsed.id ?? "" };
178
+ entry.handler(params, ctx);
179
+ return { tag: "ok", val: { json: resourceJson } };
180
+ }
181
+ if (hookType.startsWith("after-")) {
182
+ // After hooks: observe only, return value ignored
183
+ const resource = JSON.parse(resourceJson);
184
+ entry.handler(resource, ctx);
185
+ return { tag: "ok", val: { json: resourceJson } };
186
+ }
187
+ // Before hooks (before-create, before-update): can modify or reject
188
+ const resource = JSON.parse(resourceJson);
189
+ const result = entry.handler(resource, ctx);
190
+ if (result === undefined || result === null) {
191
+ // Pass-through
192
+ return { tag: "ok", val: { json: resourceJson } };
193
+ }
194
+ if (result instanceof Rejection) {
195
+ return { tag: "err", val: { json: JSON.stringify(result.outcome) } };
196
+ }
197
+ // Modified resource
198
+ return { tag: "ok", val: { json: JSON.stringify(result) } };
199
+ }
200
+ catch (err) {
201
+ return {
202
+ tag: "err",
203
+ val: {
204
+ json: JSON.stringify({
205
+ resourceType: "OperationOutcome",
206
+ issue: [
207
+ {
208
+ severity: "error",
209
+ code: "exception",
210
+ diagnostics: `Plugin "${this.name}" error: ${err?.message ?? String(err)}`,
211
+ },
212
+ ],
213
+ }),
214
+ },
215
+ };
216
+ }
217
+ }
218
+ }
219
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Meta, Narrative, Identifier, CodeableConcept, Reference, Period, Age, Range, Annotation } from "./common.js";
2
+ export interface AllergyIntolerance {
3
+ resourceType: "AllergyIntolerance";
4
+ id?: string;
5
+ meta?: Meta;
6
+ text?: Narrative;
7
+ identifier?: Identifier[];
8
+ clinicalStatus?: CodeableConcept;
9
+ verificationStatus?: CodeableConcept;
10
+ type?: "allergy" | "intolerance";
11
+ category?: ("food" | "medication" | "environment" | "biologic")[];
12
+ criticality?: "low" | "high" | "unable-to-assess";
13
+ code?: CodeableConcept;
14
+ patient: Reference;
15
+ encounter?: Reference;
16
+ onsetDateTime?: string;
17
+ onsetAge?: Age;
18
+ onsetPeriod?: Period;
19
+ onsetRange?: Range;
20
+ onsetString?: string;
21
+ recordedDate?: string;
22
+ recorder?: Reference;
23
+ asserter?: Reference;
24
+ lastOccurrence?: string;
25
+ note?: Annotation[];
26
+ reaction?: AllergyIntoleranceReaction[];
27
+ }
28
+ export interface AllergyIntoleranceReaction {
29
+ substance?: CodeableConcept;
30
+ manifestation: CodeableConcept[];
31
+ description?: string;
32
+ onset?: string;
33
+ severity?: "mild" | "moderate" | "severe";
34
+ exposureRoute?: CodeableConcept;
35
+ note?: Annotation[];
36
+ }
37
+ //# sourceMappingURL=allergy-intolerance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allergy-intolerance.d.ts","sourceRoot":"","sources":["../../src/r4/allergy-intolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,SAAS,EACT,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,GAAG,EACH,KAAK,EACL,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,oBAAoB,CAAC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,kBAAkB,CAAC,EAAE,eAAe,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC;IAClE,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,kBAAkB,CAAC;IAClD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,0BAA0B,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=allergy-intolerance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allergy-intolerance.js","sourceRoot":"","sources":["../../src/r4/allergy-intolerance.ts"],"names":[],"mappings":""}