@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.
- package/README.md +169 -79
- package/dist/__tests__/action-hooks.test.d.ts +8 -0
- package/dist/__tests__/action-hooks.test.d.ts.map +1 -0
- package/dist/__tests__/action-hooks.test.js +95 -0
- package/dist/__tests__/action-hooks.test.js.map +1 -0
- package/dist/__tests__/actor-workflow-hooks.test.d.ts +8 -0
- package/dist/__tests__/actor-workflow-hooks.test.d.ts.map +1 -0
- package/dist/__tests__/actor-workflow-hooks.test.js +106 -0
- package/dist/__tests__/actor-workflow-hooks.test.js.map +1 -0
- package/dist/__tests__/lifecycle-logging.test.js +4 -2
- package/dist/__tests__/lifecycle-logging.test.js.map +1 -1
- package/dist/__tests__/plugin-app-narrow.test.d.ts +12 -0
- package/dist/__tests__/plugin-app-narrow.test.d.ts.map +1 -0
- package/dist/__tests__/plugin-app-narrow.test.js +77 -0
- package/dist/__tests__/plugin-app-narrow.test.js.map +1 -0
- package/dist/__tests__/plugin-stress.test.d.ts +21 -0
- package/dist/__tests__/plugin-stress.test.d.ts.map +1 -0
- package/dist/__tests__/plugin-stress.test.js +203 -0
- package/dist/__tests__/plugin-stress.test.js.map +1 -0
- package/dist/__tests__/public-marker.test.js +7 -3
- package/dist/__tests__/public-marker.test.js.map +1 -1
- package/dist/actor-store.d.ts +24 -0
- package/dist/actor-store.d.ts.map +1 -1
- package/dist/actor-store.js +29 -0
- package/dist/actor-store.js.map +1 -1
- package/dist/create-app.d.ts +16 -1
- package/dist/create-app.d.ts.map +1 -1
- package/dist/create-app.js +126 -19
- package/dist/create-app.js.map +1 -1
- package/dist/define-action.d.ts +75 -9
- package/dist/define-action.d.ts.map +1 -1
- package/dist/define-action.js +103 -26
- package/dist/define-action.js.map +1 -1
- package/dist/define-actor.d.ts +3 -1
- package/dist/define-actor.d.ts.map +1 -1
- package/dist/define-actor.js +11 -4
- package/dist/define-actor.js.map +1 -1
- package/dist/define-handler.d.ts +39 -3
- package/dist/define-handler.d.ts.map +1 -1
- package/dist/define-handler.js +10 -1
- package/dist/define-handler.js.map +1 -1
- package/dist/define-module.d.ts +3 -0
- package/dist/define-module.d.ts.map +1 -1
- package/dist/define-module.js +3 -0
- package/dist/define-module.js.map +1 -1
- package/dist/define-plugin.d.ts +25 -1
- package/dist/define-plugin.d.ts.map +1 -1
- package/dist/define-plugin.js +100 -14
- package/dist/define-plugin.js.map +1 -1
- package/dist/define-projection.d.ts +3 -1
- package/dist/define-projection.d.ts.map +1 -1
- package/dist/define-projection.js +3 -0
- package/dist/define-projection.js.map +1 -1
- package/dist/define-query.d.ts +69 -13
- package/dist/define-query.d.ts.map +1 -1
- package/dist/define-query.js +48 -17
- package/dist/define-query.js.map +1 -1
- package/dist/define-workflow.d.ts +19 -1
- package/dist/define-workflow.d.ts.map +1 -1
- package/dist/define-workflow.js +4 -0
- package/dist/define-workflow.js.map +1 -1
- package/dist/dev-logger.d.ts.map +1 -1
- package/dist/dev-logger.js +22 -1
- package/dist/dev-logger.js.map +1 -1
- package/dist/event-message.d.ts +9 -2
- package/dist/event-message.d.ts.map +1 -1
- package/dist/event-message.js +10 -3
- package/dist/event-message.js.map +1 -1
- package/dist/framework-events.d.ts +1 -64
- package/dist/framework-events.d.ts.map +1 -1
- package/dist/framework-events.js +3 -0
- package/dist/framework-events.js.map +1 -1
- package/dist/idempotency-store.d.ts +35 -0
- package/dist/idempotency-store.d.ts.map +1 -0
- package/dist/idempotency-store.js +32 -0
- package/dist/idempotency-store.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +205 -5
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +518 -48
- package/dist/runtime.js.map +1 -1
- 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 —
|
|
3
|
+
> The framework's domain primitives — actions, actors, events, workflows, projections, modules, plugins, and the runtime that fires them.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
##
|
|
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 {
|
|
23
|
-
import { defineAction, defineActor, defineModule, createApp } from "@nwire/forge";
|
|
24
|
+
import { defineSchema } from "@nwire/forge";
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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(
|
|
128
|
+
await app.runtime.dispatch(flagSubmission, { submissionId: "s-1", reason: "off-topic" });
|
|
72
129
|
```
|
|
73
130
|
|
|
74
|
-
##
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
131
|
+
## Surface
|
|
132
|
+
|
|
133
|
+
### Domain primitives
|
|
134
|
+
|
|
135
|
+
| Export | Role |
|
|
136
|
+
| --------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
137
|
+
| `defineAction` | User-visible command — validated 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
|
|
75
|
-
|
|
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":"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"}
|
|
@@ -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"}
|