@nwire/forge 0.7.1 → 0.8.17

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 (85) hide show
  1. package/README.md +169 -79
  2. package/dist/__tests__/action-hooks.test.d.ts +8 -0
  3. package/dist/__tests__/action-hooks.test.d.ts.map +1 -0
  4. package/dist/__tests__/action-hooks.test.js +95 -0
  5. package/dist/__tests__/action-hooks.test.js.map +1 -0
  6. package/dist/__tests__/actor-workflow-hooks.test.d.ts +8 -0
  7. package/dist/__tests__/actor-workflow-hooks.test.d.ts.map +1 -0
  8. package/dist/__tests__/actor-workflow-hooks.test.js +106 -0
  9. package/dist/__tests__/actor-workflow-hooks.test.js.map +1 -0
  10. package/dist/__tests__/lifecycle-logging.test.js +4 -2
  11. package/dist/__tests__/lifecycle-logging.test.js.map +1 -1
  12. package/dist/__tests__/plugin-app-narrow.test.d.ts +12 -0
  13. package/dist/__tests__/plugin-app-narrow.test.d.ts.map +1 -0
  14. package/dist/__tests__/plugin-app-narrow.test.js +77 -0
  15. package/dist/__tests__/plugin-app-narrow.test.js.map +1 -0
  16. package/dist/__tests__/plugin-stress.test.d.ts +21 -0
  17. package/dist/__tests__/plugin-stress.test.d.ts.map +1 -0
  18. package/dist/__tests__/plugin-stress.test.js +203 -0
  19. package/dist/__tests__/plugin-stress.test.js.map +1 -0
  20. package/dist/__tests__/public-marker.test.js +7 -3
  21. package/dist/__tests__/public-marker.test.js.map +1 -1
  22. package/dist/actor-store.d.ts +24 -0
  23. package/dist/actor-store.d.ts.map +1 -1
  24. package/dist/actor-store.js +29 -0
  25. package/dist/actor-store.js.map +1 -1
  26. package/dist/create-app.d.ts +16 -1
  27. package/dist/create-app.d.ts.map +1 -1
  28. package/dist/create-app.js +126 -19
  29. package/dist/create-app.js.map +1 -1
  30. package/dist/define-action.d.ts +75 -9
  31. package/dist/define-action.d.ts.map +1 -1
  32. package/dist/define-action.js +103 -26
  33. package/dist/define-action.js.map +1 -1
  34. package/dist/define-actor.d.ts +3 -1
  35. package/dist/define-actor.d.ts.map +1 -1
  36. package/dist/define-actor.js +11 -4
  37. package/dist/define-actor.js.map +1 -1
  38. package/dist/define-handler.d.ts +39 -3
  39. package/dist/define-handler.d.ts.map +1 -1
  40. package/dist/define-handler.js +10 -1
  41. package/dist/define-handler.js.map +1 -1
  42. package/dist/define-module.d.ts +3 -0
  43. package/dist/define-module.d.ts.map +1 -1
  44. package/dist/define-module.js +3 -0
  45. package/dist/define-module.js.map +1 -1
  46. package/dist/define-plugin.d.ts +25 -1
  47. package/dist/define-plugin.d.ts.map +1 -1
  48. package/dist/define-plugin.js +100 -14
  49. package/dist/define-plugin.js.map +1 -1
  50. package/dist/define-projection.d.ts +3 -1
  51. package/dist/define-projection.d.ts.map +1 -1
  52. package/dist/define-projection.js +3 -0
  53. package/dist/define-projection.js.map +1 -1
  54. package/dist/define-query.d.ts +69 -13
  55. package/dist/define-query.d.ts.map +1 -1
  56. package/dist/define-query.js +48 -17
  57. package/dist/define-query.js.map +1 -1
  58. package/dist/define-workflow.d.ts +19 -1
  59. package/dist/define-workflow.d.ts.map +1 -1
  60. package/dist/define-workflow.js +4 -0
  61. package/dist/define-workflow.js.map +1 -1
  62. package/dist/dev-logger.d.ts.map +1 -1
  63. package/dist/dev-logger.js +22 -1
  64. package/dist/dev-logger.js.map +1 -1
  65. package/dist/event-message.d.ts +9 -2
  66. package/dist/event-message.d.ts.map +1 -1
  67. package/dist/event-message.js +10 -3
  68. package/dist/event-message.js.map +1 -1
  69. package/dist/framework-events.d.ts +1 -64
  70. package/dist/framework-events.d.ts.map +1 -1
  71. package/dist/framework-events.js +3 -0
  72. package/dist/framework-events.js.map +1 -1
  73. package/dist/idempotency-store.d.ts +35 -0
  74. package/dist/idempotency-store.d.ts.map +1 -0
  75. package/dist/idempotency-store.js +32 -0
  76. package/dist/idempotency-store.js.map +1 -0
  77. package/dist/index.d.ts +3 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +2 -1
  80. package/dist/index.js.map +1 -1
  81. package/dist/runtime.d.ts +205 -5
  82. package/dist/runtime.d.ts.map +1 -1
  83. package/dist/runtime.js +518 -48
  84. package/dist/runtime.js.map +1 -1
  85. package/package.json +11 -10
package/README.md CHANGED
@@ -1,104 +1,194 @@
1
1
  # @nwire/forge
2
2
 
3
- > The framework's domain primitives — one import for actions, actors, events, workflows, projections, modules, and the runtime that ties them together.
3
+ > The framework's domain primitives — actions, actors, events, workflows, projections, modules, plugins, and the runtime that fires them.
4
4
 
5
- ## What it does
6
-
7
- Provides the `define*` surface that domain code uses every day, plus the
8
- runtime that fires them. Forge composes lower packages (`@nwire/messages`,
9
- `@nwire/handler`, `@nwire/app`) into one ergonomic API; you can also use
10
- the lower packages directly when you want a narrower surface.
11
-
12
- ## Install
5
+ Forge composes the lower packages (`@nwire/messages`, `@nwire/handler`,
6
+ `@nwire/app`) into one ergonomic surface. You can drop down to any of
7
+ them when you want a narrower import; forge stays the default for app code.
13
8
 
14
9
  ```bash
15
10
  pnpm add @nwire/forge zod
16
11
  ```
17
12
 
18
- ## Quick start
13
+ ## 5-minute tour
14
+
15
+ Two primitives carry most of an app: `defineSchema` declares the data shape +
16
+ lifecycle, `defineActor` (closure form) declares the methods + transitions
17
+ against it. Everything else (`defineAction`, `defineModule`, `createApp`)
18
+ plugs in around them.
19
+
20
+ ### 1. Declare the data + lifecycle with `defineSchema`
19
21
 
20
22
  ```ts
21
23
  import { z } from "zod";
22
- import { defineEvent } from "@nwire/messages";
23
- import { defineAction, defineActor, defineModule, createApp } from "@nwire/forge";
24
+ import { defineSchema } from "@nwire/forge";
24
25
 
25
- // 1. A past-tense fact the domain cares about.
26
- export const StudentWasEnrolled = defineEvent({
27
- name: "enrollments.student-was-enrolled",
28
- schema: z.object({ studentId: z.string(), courseId: z.string() }),
29
- });
30
-
31
- // 2. An aggregate that holds state + invariants.
32
- export const Student = defineActor("Student", {
33
- schema: z.object({
26
+ export const SubmissionData = defineSchema({
27
+ name: "submission",
28
+ key: "submissionId",
29
+ fields: {
30
+ submissionId: z.string(),
34
31
  studentId: z.string(),
35
- enrolments: z.array(z.string()),
36
- }),
37
- initial: (id: string) => ({ studentId: id, enrolments: [] }),
38
- methods: {
39
- enrol(state, courseId: string) {
40
- if (state.enrolments.includes(courseId)) return state;
41
- return { ...state, enrolments: [...state.enrolments, courseId] };
42
- },
32
+ answer: z.string(),
33
+ verdict: z.string().optional(),
34
+ gradedAt: z.string().datetime().optional(),
35
+ },
36
+ states: {
37
+ submitted: { initial: true },
38
+ "under-review": {},
39
+ graded: { final: true },
43
40
  },
44
41
  });
42
+ ```
45
43
 
46
- // 3. A user-visible command that emits the event.
47
- export const enrolStudent = defineAction({
48
- name: "enrollments.enrol-student",
49
- schema: z.object({ studentId: z.string(), courseId: z.string() }),
50
- emits: [StudentWasEnrolled],
51
- handler: async (input, { use }) => {
52
- const student = await use(Student, input.studentId);
53
- student.enrol(input.courseId);
54
- return StudentWasEnrolled({
55
- studentId: input.studentId,
56
- courseId: input.courseId,
44
+ The schema is the single source of truth for the data model and the set of
45
+ valid lifecycle states Studio renders it, persistent stores (`@nwire/store-mongo`,
46
+ `@nwire/store-prisma`) read `storage.indexes` / `storage.unique` from it, and
47
+ `defineActor` borrows `key` + `initial` + the state names off it.
48
+
49
+ ### 2. Bind methods + transitions with `defineActor` (closure form)
50
+
51
+ ```ts
52
+ import { defineActor } from "@nwire/forge";
53
+ import { SubmissionData } from "./submission.schema";
54
+ import { SubmissionWasFlagged, SubmissionWasGraded } from "./events";
55
+
56
+ export const Submission = defineActor(
57
+ SubmissionData,
58
+ ({ data, id, validate, recordThat, when, methods, states }) => {
59
+ const { underReview, graded } = states;
60
+
61
+ // Methods enforce invariants and `recordThat` the events. They don't
62
+ // mutate state directly — `when(...)` below folds the recorded events
63
+ // into state.
64
+ const flag = (input: { reason: string }) => {
65
+ validate(input, [(i) => i.reason.length > 0 || "reason required"]);
66
+ recordThat(SubmissionWasFlagged({ submissionId: id, reason: input.reason }));
67
+ };
68
+ const grade = (input: { verdict: string }) => {
69
+ recordThat(SubmissionWasGraded({ submissionId: id, verdict: input.verdict }));
70
+ };
71
+
72
+ when(SubmissionWasFlagged, (_e, { assign }) => {
73
+ assign({}); // no field changes — state move only
74
+ return underReview; // transition: submitted → under-review
75
+ });
76
+ when(SubmissionWasGraded, (e, { assign }) => {
77
+ assign({ verdict: e.verdict, gradedAt: new Date().toISOString() });
78
+ return graded; // transition into the final state
57
79
  });
80
+
81
+ return methods({ flag, grade });
82
+ },
83
+ );
84
+ ```
85
+
86
+ The closure runs once at define time (to capture transitions + method names)
87
+ and again per `ctx.use(Submission, id)` call (to bind methods over the live
88
+ `data`). `recordThat` collects events the runtime publishes after the method
89
+ returns; `when` is the matching fold — methods never write to state directly,
90
+ so the actor's history is always the event log.
91
+
92
+ > See: [write paths (actor xor direct-DB)](https://nwire.dev/concepts/write-paths) — a handler picks one path per write; never both.
93
+
94
+ **Object form vs. closure form** — both exist. Use the closure form when you
95
+ want typed `states.<name>` refs, want methods and folds in the same file, and
96
+ want invariants on the input shape (`validate(...)`); use the object form
97
+ (`defineActor(name, { schema, key, initial, states, methods })`) when the
98
+ state machine is the whole story and you don't need per-method input
99
+ validation.
100
+
101
+ ### 3. Wire it into a module + app
102
+
103
+ ```ts
104
+ import { defineAction, defineModule, createApp, AppBooted, ActionCompleted } from "@nwire/forge";
105
+ import { z } from "zod";
106
+
107
+ export const flagSubmission = defineAction({
108
+ name: "submissions.flag",
109
+ schema: z.object({ submissionId: z.string(), reason: z.string() }),
110
+ emits: [SubmissionWasFlagged],
111
+ handler: async (input, { use }) => {
112
+ const sub = await use(Submission, input.submissionId);
113
+ sub.flag({ reason: input.reason }); // recorded event(s) published by runtime
58
114
  },
59
115
  });
60
116
 
61
- // 4. A module bundles the bounded context.
62
- export const enrollmentsModule = defineModule("enrollments", {
63
- events: [StudentWasEnrolled],
64
- actors: [Student],
65
- actions: [enrolStudent.public()],
117
+ export const submissions = defineModule("submissions", {
118
+ events: [SubmissionWasFlagged, SubmissionWasGraded],
119
+ actors: [Submission],
120
+ actions: [flagSubmission.public()],
66
121
  });
67
122
 
68
- // 5. createApp wires the modules into a runnable app.
69
- export const app = createApp({ modules: [enrollmentsModule] });
123
+ const app = createApp({ modules: [submissions] });
124
+ app.bus.on(AppBooted, ({ appName }) => console.log("booted:", appName));
125
+ app.bus.on(ActionCompleted, ({ action }) => console.log("ran:", action.name));
126
+
70
127
  await app.start();
71
- await app.runtime.dispatch(enrolStudent, { studentId: "avi", courseId: "heb-1" });
128
+ await app.runtime.dispatch(flagSubmission, { submissionId: "s-1", reason: "off-topic" });
72
129
  ```
73
130
 
74
- ## API surface
75
-
76
- | Primitive | Purpose |
77
- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
78
- | `defineAction` | User-visible command — validated input, emits events |
79
- | `defineEvent` | Past-tense fact (re-exported from `@nwire/messages`) |
80
- | `defineHandler` | Operation primitivetransport-agnostic |
81
- | `defineActor` | Aggregate with state, methods, optional state machine |
82
- | `defineSchema` | Data shape + lifecycle states + storage hints |
83
- | `defineProjection` | Read-model fold over events |
84
- | `defineQuery` | Projection-backed read function |
85
- | `defineWorkflow` | Reaction + saga unified — stateful or stateless |
86
- | `defineModule` | Bundle of actors + actions + events + projections + queries |
87
- | `defineApp` | App declaration (multi-wire instantiation) |
88
- | `createApp` | App runtime boots modules, owns the bus |
89
- | `definePlugin` | Cross-cutting: provide bindings, hook lifecycle, intercept dispatch |
90
- | `defineResource` | Public response shape (field allowlist + OpenAPI schema) |
91
- | `defineError` | Typed throwable with status code |
92
- | `defineMiddleware` | Reusable handler middleware step |
93
- | `defineCron`, `defineInbox`, `defineOutbox`, `defineExternalCall`, `defineInboundWebhook` | Orchestrator primitives |
94
- | `runCli(app, argv)` | Argv dispatcher operator CLI without HTTP |
95
-
96
- Forge also re-exports `MessageEnvelope`, `seedEnvelope`, `deriveEnvelope`
97
- from `@nwire/envelope` and the `Logger` contract from `@nwire/logger`.
98
-
99
- ## When to use forge
100
-
101
- When you want the full framework DX in one import. If you only need typed
102
- handlers without the actor/event machinery, pull `@nwire/handler` instead;
103
- if you only need lifecycle + plugins, pull `@nwire/app`. Forge is the
104
- default for app code; the smaller packages are the standalone path.
131
+ ## Surface
132
+
133
+ ### Domain primitives
134
+
135
+ | Export | Role |
136
+ | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
137
+ | `defineAction` | User-visible commandvalidated input, emits events |
138
+ | `defineEvent` | Past-tense fact (re-exported from `@nwire/messages`) |
139
+ | `defineHandler` | Operation primitive transport-agnostic |
140
+ | `defineActor` | Aggregate with state, methods, optional state machine |
141
+ | `defineSchema` | Data shape + lifecycle states + storage hints |
142
+ | `defineProjection` | Read-model fold over events |
143
+ | `defineQuery` | Projection-backed read function |
144
+ | `defineWorkflow` | Reaction + saga unified — stateless or stateful |
145
+ | `defineModule` | Bundle of actors + actions + events + projections + queries |
146
+ | `defineApp` | App declaration (multi-wire instantiation) |
147
+ | `createApp` | App runtime boots modules, owns the bus and runtime |
148
+ | `definePlugin` | Forge-richer plugin: middleware + actor hooks + before/after |
149
+ | `defineResource` | Public response shape (field allowlist + OpenAPI schema) |
150
+ | `defineError` | Typed throwable with status code |
151
+ | `defineMiddleware` / `defineHook` / `pipe` | Reusable resolver chain pieces |
152
+ | `defineCron` / `defineInbox` / `defineOutbox` / `defineExternalCall` / `defineInboundWebhook` | Orchestrator primitives |
153
+ | `runCli(app, argv)` | Argv dispatcher — operator CLI without HTTP |
154
+
155
+ ### Framework events
156
+
157
+ Forge re-exports the app-lifecycle events from `@nwire/app`
158
+ (`AppRegistering` / `AppBooting` / `AppBooted` / `AppReady` /
159
+ `AppShuttingDown` / `AppShutdown`, `PluginRegistered` …, `WireMounting` …)
160
+ and adds its own forge-local events:
161
+
162
+ | Event | Mode | When |
163
+ | ------------------------ | ----------- | ----------------------------------------------------- |
164
+ | `ActionDispatching` | series-bail | Before handler runs. Return `false` to short-circuit. |
165
+ | `ActionCompleted` | parallel | After handler returns successfully. |
166
+ | `ActionFailed` | parallel | After handler throws. |
167
+ | `EventRecording` | series-bail | Before an event is appended to the store. |
168
+ | `EventRecorded` | parallel | After append succeeds. |
169
+ | `builtInFrameworkEvents` | — | Catalog of every built-in (lifecycle + forge-local). |
170
+
171
+ ### Re-exports
172
+
173
+ - `MessageEnvelope`, `seedEnvelope`, `deriveEnvelope` from `@nwire/envelope`
174
+ - `Logger` contract + `NoopLogger` / `ConsoleLogger` from `@nwire/logger`
175
+ - `DeadLetterSink` + `InMemoryDeadLetterSink` from `@nwire/dead-letter`
176
+
177
+ ## Picking the right entry point
178
+
179
+ | You want… | Import from |
180
+ | --------------------------------------- | ----------------- |
181
+ | Full framework DX in one import | `@nwire/forge` |
182
+ | Just operations (handlers / middleware) | `@nwire/handler` |
183
+ | Just lifecycle + plugins | `@nwire/app` |
184
+ | Just events + envelope | `@nwire/messages` |
185
+
186
+ ## Related
187
+
188
+ - `@nwire/endpoint` — wraps the runtime in a process (graceful shutdown, probes).
189
+ - `@nwire/http` — HTTP transport over the runtime.
190
+ - `@nwire/hooks` — the dispatch substrate that powers `runtime.use(...)` and every framework event.
191
+
192
+ ## Status
193
+
194
+ v0.x — public surface is stable; `createApp` will extract to `@nwire/app` in a follow-up phase but imports won't change (re-exports preserved).
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Per-action `action.before:<name>` and `action.after:<name>` hooks —
3
+ * proves the named-hook surface that plugin `before()`/`after()` sugar
4
+ * registers chain steps on, AND that the dispatcher honors veto + observes
5
+ * after-success.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=action-hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-hooks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/action-hooks.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Per-action `action.before:<name>` and `action.after:<name>` hooks —
3
+ * proves the named-hook surface that plugin `before()`/`after()` sugar
4
+ * registers chain steps on, AND that the dispatcher honors veto + observes
5
+ * after-success.
6
+ */
7
+ import { describe, it, expect } from "vitest";
8
+ import { z } from "zod";
9
+ import { listHooks } from "@nwire/hooks";
10
+ import { createApp, defineAction, defineHandler, defineModule, definePlugin } from "../foundation.js";
11
+ const Ping = defineAction({
12
+ name: "test/action-hooks-ping",
13
+ schema: z.object({ n: z.number() }),
14
+ });
15
+ const pingHandler = defineHandler(Ping, async (input) => undefined);
16
+ const mod = defineModule("test-action-hooks", {
17
+ actions: [Ping],
18
+ handlers: [pingHandler],
19
+ });
20
+ describe("per-action hooks", () => {
21
+ it("registers action.before:<name> + action.after:<name> on handler register", async () => {
22
+ const app = createApp({ appName: "action-hooks-test", modules: [mod] });
23
+ await app.start();
24
+ const names = listHooks().map((h) => h.name);
25
+ expect(names).toContain("action.before:test/action-hooks-ping");
26
+ expect(names).toContain("action.after:test/action-hooks-ping");
27
+ await app.stop();
28
+ });
29
+ it("plugin.before chain step that returns false vetoes the dispatch", async () => {
30
+ let handlerRan = false;
31
+ let beforeRan = false;
32
+ let afterRan = false;
33
+ const ping2 = defineHandler(defineAction({ name: "test/veto-ping", schema: z.object({}) }), async () => {
34
+ handlerRan = true;
35
+ return undefined;
36
+ });
37
+ const m = defineModule("test-veto", { actions: [ping2.action], handlers: [ping2] });
38
+ const vetoer = definePlugin("vetoer", ({ before, after }) => {
39
+ before("test/veto-ping", () => {
40
+ beforeRan = true;
41
+ return false;
42
+ });
43
+ after("test/veto-ping", () => {
44
+ afterRan = true;
45
+ });
46
+ });
47
+ const app = createApp({ appName: "veto-test", modules: [m], plugins: [vetoer] });
48
+ await app.start();
49
+ await app.runtime.dispatch(ping2.action, {});
50
+ expect(beforeRan).toBe(true);
51
+ expect(handlerRan).toBe(false);
52
+ expect(afterRan).toBe(false);
53
+ await app.stop();
54
+ });
55
+ it("plugin.after observes the result + durationMs of a successful dispatch", async () => {
56
+ let captured = null;
57
+ const ping3 = defineHandler(defineAction({ name: "test/observe-ping", schema: z.object({}) }), async () => undefined);
58
+ const m = defineModule("test-observe", { actions: [ping3.action], handlers: [ping3] });
59
+ const observer = definePlugin("observer", ({ after }) => {
60
+ after("test/observe-ping", ({ result, durationMs }) => {
61
+ captured = { result, durationMs };
62
+ });
63
+ });
64
+ const app = createApp({ appName: "observe-test", modules: [m], plugins: [observer] });
65
+ await app.start();
66
+ await app.runtime.dispatch(ping3.action, {});
67
+ expect(captured).not.toBeNull();
68
+ expect(typeof captured.durationMs).toBe("number");
69
+ await app.stop();
70
+ });
71
+ it("multiple plugins.before steps stack as named chain steps on the same hook", async () => {
72
+ const callOrder = [];
73
+ const ping4 = defineHandler(defineAction({ name: "test/stack-ping", schema: z.object({}) }), async () => {
74
+ callOrder.push("handler");
75
+ return undefined;
76
+ });
77
+ const m = defineModule("test-stack", { actions: [ping4.action], handlers: [ping4] });
78
+ const pluginA = definePlugin("a", ({ before }) => {
79
+ before("test/stack-ping", () => {
80
+ callOrder.push("a.before");
81
+ });
82
+ });
83
+ const pluginB = definePlugin("b", ({ before }) => {
84
+ before("test/stack-ping", () => {
85
+ callOrder.push("b.before");
86
+ });
87
+ });
88
+ const app = createApp({ appName: "stack-test", modules: [m], plugins: [pluginA, pluginB] });
89
+ await app.start();
90
+ await app.runtime.dispatch(ping4.action, {});
91
+ expect(callOrder).toEqual(["a.before", "b.before", "handler"]);
92
+ await app.stop();
93
+ });
94
+ });
95
+ //# sourceMappingURL=action-hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-hooks.test.js","sourceRoot":"","sources":["../../src/__tests__/action-hooks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Per-actor `actor.transition:<name>` and per-workflow `workflow.fire:<name>`
3
+ * hooks (A7). Proves both:
4
+ * - hooks appear in listHooks() right after registerActor/Workflow
5
+ * - chain steps observe transitions / fires during real dispatch
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=actor-workflow-hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-workflow-hooks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/actor-workflow-hooks.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Per-actor `actor.transition:<name>` and per-workflow `workflow.fire:<name>`
3
+ * hooks (A7). Proves both:
4
+ * - hooks appear in listHooks() right after registerActor/Workflow
5
+ * - chain steps observe transitions / fires during real dispatch
6
+ */
7
+ import { describe, it, expect } from "vitest";
8
+ import { z } from "zod";
9
+ import { defineEvent } from "@nwire/messages";
10
+ import { listHooks } from "@nwire/hooks";
11
+ import { createApp, defineAction, defineActor, defineModule, defineWorkflow, eventFactory, } from "../foundation.js";
12
+ // ─── Domain ────────────────────────────────────────────────────────
13
+ const OrderState = z.object({ orderId: z.string(), total: z.number() });
14
+ const Placed = defineEvent({
15
+ name: "orders.placed",
16
+ schema: z.object({ orderId: z.string(), total: z.number() }),
17
+ });
18
+ const Confirmed = defineEvent({
19
+ name: "orders.confirmed",
20
+ schema: z.object({ orderId: z.string() }),
21
+ });
22
+ const PlacedEvent = eventFactory(Placed);
23
+ const ConfirmedEvent = eventFactory(Confirmed);
24
+ const Order = defineActor("order", {
25
+ schema: OrderState,
26
+ key: "orderId",
27
+ initial: "draft",
28
+ states: {
29
+ draft: {
30
+ on: { [Placed.name]: { target: "placed", assign: (_, e) => ({ ...e }) } },
31
+ },
32
+ placed: { on: { [Confirmed.name]: { target: "confirmed" } } },
33
+ confirmed: {},
34
+ },
35
+ });
36
+ const placeOrder = defineAction({
37
+ name: "orders.place",
38
+ schema: z.object({ orderId: z.string(), total: z.number() }),
39
+ handler: async (input) => PlacedEvent(input),
40
+ });
41
+ const confirmOrder = defineAction({
42
+ name: "orders.confirm",
43
+ schema: z.object({ orderId: z.string() }),
44
+ handler: async (input) => ConfirmedEvent({ orderId: input.orderId }),
45
+ });
46
+ let workflowFiredCount = 0;
47
+ const notifyOnPlace = defineWorkflow("notify-on-place", ({ on }) => {
48
+ on(Placed, async () => {
49
+ workflowFiredCount++;
50
+ });
51
+ });
52
+ const mod = defineModule("orders", {
53
+ actors: [Order],
54
+ actions: [placeOrder, confirmOrder],
55
+ events: [Placed, Confirmed],
56
+ workflows: [notifyOnPlace],
57
+ });
58
+ // ─── Tests ─────────────────────────────────────────────────────────
59
+ describe("per-actor + per-workflow hooks", () => {
60
+ it("registerActor + registerWorkflow create named hooks visible in listHooks", async () => {
61
+ const app = createApp({ appName: "actor-workflow-hooks-list", modules: [mod] });
62
+ await app.start();
63
+ const names = listHooks().map((h) => h.name);
64
+ expect(names).toContain("actor.transition:order");
65
+ expect(names).toContain("workflow.fire:notify-on-place");
66
+ await app.stop();
67
+ });
68
+ it("actor.transition hook observes state changes during real dispatch", async () => {
69
+ const transitions = [];
70
+ const app = createApp({ appName: "actor-transition-test", modules: [mod] });
71
+ await app.start();
72
+ app.runtime.ensureActorTransitionHook("order").use(async (hctx, next) => {
73
+ transitions.push({ from: hctx.fromState, to: hctx.toState });
74
+ await next();
75
+ }, { name: "observer" });
76
+ await app.runtime.dispatch(placeOrder, { orderId: "o1", total: 100 });
77
+ expect(transitions).toEqual([{ from: "draft", to: "placed" }]);
78
+ await app.runtime.dispatch(confirmOrder, { orderId: "o1" });
79
+ expect(transitions).toEqual([
80
+ { from: "draft", to: "placed" },
81
+ { from: "placed", to: "confirmed" },
82
+ ]);
83
+ await app.stop();
84
+ });
85
+ it("workflow.fire hook observes saga invocations", async () => {
86
+ const fires = [];
87
+ workflowFiredCount = 0;
88
+ const app = createApp({ appName: "workflow-fire-test", modules: [mod] });
89
+ await app.start();
90
+ app.runtime.ensureWorkflowFireHook("notify-on-place").use(async (hctx, next) => {
91
+ fires.push({
92
+ workflow: hctx.workflow.name,
93
+ event: hctx.event.eventName,
94
+ correlationKey: hctx.correlationKey,
95
+ });
96
+ await next();
97
+ }, { name: "observer" });
98
+ await app.runtime.dispatch(placeOrder, { orderId: "o2", total: 50 });
99
+ expect(fires).toHaveLength(1);
100
+ expect(fires[0].workflow).toBe("notify-on-place");
101
+ expect(fires[0].event).toBe("orders.placed");
102
+ expect(workflowFiredCount).toBe(1);
103
+ await app.stop();
104
+ });
105
+ });
106
+ //# sourceMappingURL=actor-workflow-hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-workflow-hooks.test.js","sourceRoot":"","sources":["../../src/__tests__/actor-workflow-hooks.test.ts"],"names":[],"mappings":"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"}
@@ -71,8 +71,10 @@ describe("framework events → telemetry → dev logger", () => {
71
71
  // Multiple lifecycle lines should be present.
72
72
  const lifecycleLines = lines.filter((l) => l.includes("nwire:"));
73
73
  expect(lifecycleLines.length).toBeGreaterThan(5);
74
- // Plugin-booted line should include the plugin name (`trace`).
75
- const booted = lifecycleLines.find((l) => l.includes("plugin.booted"));
74
+ // Plugin-booted line for the `trace` plugin specifically. Modules now
75
+ // also fire PluginBooted with `kind:"module"` first, so we need to find
76
+ // the booted line that names the `trace` plugin — not just the first.
77
+ const booted = lifecycleLines.find((l) => l.includes("plugin.booted") && l.includes("trace"));
76
78
  expect(booted).toBeTruthy();
77
79
  expect(booted).toContain("trace");
78
80
  });
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-logging.test.js","sourceRoot":"","sources":["../../src/__tests__/lifecycle-logging.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle-logging.test.js","sourceRoot":"","sources":["../../src/__tests__/lifecycle-logging.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,+GAA+G,EAAE,KAAK,IAAI,EAAE;QAC7H,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;SAClE,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/F,yDAAyD;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACrC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO;aACJ,MAAM,CAAC,CAAC,CAAC,EAAkD,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;aACrF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAC3B,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,KAAK,EAAE,2DAA2D;SAC5E,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE;YAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,8CAA8C;QAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,sEAAsE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAA8C;YACrD,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAC9B,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,MAAM;YACf,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC7B,CAAC;QACF,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,OAAO,GAAgD,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YACjD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC,OAAO,CAAC;SACnB,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,uBAAuB,CAAC,CAAC;QAC3E,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * createApp accepts the narrow `@nwire/app` plugin shape as well as the
3
+ * rich forge `definePlugin`. Verifies the adaptation at the boundary:
4
+ *
5
+ * - `provide(name, lifecycle)` produces a container binding whose value
6
+ * comes from `lifecycle.boot()`.
7
+ * - `boot(fn)` fires during app start.
8
+ * - `shutdown(fn)` fires during app stop.
9
+ * - `lifecycle.shutdown(value)` fires for materialized bindings.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=plugin-app-narrow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-app-narrow.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/plugin-app-narrow.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}