@rotorsoft/act 0.8.0 → 0.9.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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/act-builder.d.ts +35 -219
- package/dist/@types/act-builder.d.ts.map +1 -1
- package/dist/@types/act.d.ts +2 -2
- package/dist/@types/act.d.ts.map +1 -1
- package/dist/@types/index.d.ts +1 -0
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/@types/merge.d.ts +38 -0
- package/dist/@types/merge.d.ts.map +1 -0
- package/dist/@types/slice-builder.d.ts +107 -0
- package/dist/@types/slice-builder.d.ts.map +1 -0
- package/dist/@types/state-builder.d.ts +1 -1
- package/dist/@types/state-builder.d.ts.map +1 -1
- package/dist/@types/types/action.d.ts +45 -0
- package/dist/@types/types/action.d.ts.map +1 -1
- package/dist/@types/types/reaction.d.ts +1 -1
- package/dist/@types/types/reaction.d.ts.map +1 -1
- package/dist/index.cjs +125 -71
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +123 -71
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module act-builder
|
|
3
|
+
* @category Builders
|
|
4
|
+
*
|
|
5
|
+
* Fluent builder for composing event-sourced applications.
|
|
6
|
+
*/
|
|
1
7
|
import { Act } from "./act.js";
|
|
2
|
-
import
|
|
8
|
+
import { type Slice } from "./slice-builder.js";
|
|
9
|
+
import type { Committed, Dispatcher, EventRegister, ReactionOptions, ReactionResolver, Registry, Schema, SchemaRegister, Schemas, Snapshot, State } from "./types/index.js";
|
|
3
10
|
/**
|
|
4
11
|
* Fluent builder interface for composing event-sourced applications.
|
|
5
12
|
*
|
|
6
13
|
* Provides a chainable API for:
|
|
7
|
-
* - Registering states via `.with()`
|
|
14
|
+
* - Registering states or slices via `.with()`
|
|
8
15
|
* - Defining event reactions via `.on()` → `.do()` → `.to()` or `.void()`
|
|
9
16
|
* - Building the orchestrator via `.build()`
|
|
10
17
|
*
|
|
@@ -15,43 +22,33 @@ import type { EventRegister, ReactionHandler, ReactionOptions, ReactionResolver,
|
|
|
15
22
|
* @see {@link act} for usage examples
|
|
16
23
|
* @see {@link Act} for the built orchestrator API
|
|
17
24
|
*/
|
|
18
|
-
export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends Schemas, M extends Record<string, Schema> =
|
|
25
|
+
export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends Schemas, M extends Record<string, Schema> = {}> = {
|
|
19
26
|
/**
|
|
20
|
-
* Registers a state definition with the builder.
|
|
21
|
-
*
|
|
22
|
-
* States define aggregates that process actions and emit events. Each state
|
|
23
|
-
* registration adds its actions and events to the orchestrator's registry.
|
|
24
|
-
* State names, action names, and event names must be unique across the application.
|
|
27
|
+
* Registers a state definition or a slice with the builder.
|
|
25
28
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* @returns The builder with updated type information for chaining
|
|
29
|
+
* When receiving a State, it registers the state's actions and events.
|
|
30
|
+
* When receiving a Slice, it merges all the slice's states and reactions.
|
|
31
|
+
* State names, action names, and event names must be unique across the application
|
|
32
|
+
* (partial states with the same name are merged automatically).
|
|
31
33
|
*
|
|
32
|
-
* @throws {Error} If
|
|
34
|
+
* @throws {Error} If duplicate action or event names are detected
|
|
33
35
|
*
|
|
34
|
-
* @example Register
|
|
36
|
+
* @example Register a state
|
|
35
37
|
* ```typescript
|
|
36
|
-
* const app = act()
|
|
37
|
-
* .with(Counter)
|
|
38
|
-
* .build();
|
|
38
|
+
* const app = act().with(Counter).build();
|
|
39
39
|
* ```
|
|
40
40
|
*
|
|
41
|
-
* @example Register
|
|
41
|
+
* @example Register a slice
|
|
42
42
|
* ```typescript
|
|
43
|
-
* const
|
|
44
|
-
*
|
|
45
|
-
* .with(Order)
|
|
46
|
-
* .with(Inventory)
|
|
47
|
-
* .build();
|
|
43
|
+
* const CounterSlice = slice().with(Counter).on("Incremented").do(log).void().build();
|
|
44
|
+
* const app = act().with(CounterSlice).build();
|
|
48
45
|
* ```
|
|
49
46
|
*/
|
|
50
|
-
with: <SX extends Schema, EX extends Schemas, AX extends Schemas, NX extends string = string>(state: State<SX, EX, AX, NX>) => ActBuilder<S & {
|
|
47
|
+
with: (<SX extends Schema, EX extends Schemas, AX extends Schemas, NX extends string = string>(state: State<SX, EX, AX, NX>) => ActBuilder<S & {
|
|
51
48
|
[K in keyof AX]: SX;
|
|
52
49
|
}, E & EX, A & AX, M & {
|
|
53
50
|
[K in NX]: SX;
|
|
54
|
-
}
|
|
51
|
+
}>) & (<SX extends SchemaRegister<AX>, EX extends Schemas, AX extends Schemas, MX extends Record<string, Schema>>(slice: Slice<SX, EX, AX, MX>) => ActBuilder<S & SX, E & EX, A & AX, M & MX>);
|
|
55
52
|
/**
|
|
56
53
|
* Begins defining a reaction to a specific event.
|
|
57
54
|
*
|
|
@@ -89,92 +86,19 @@ export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends
|
|
|
89
86
|
* @param options.blockOnError - Block this stream if handler fails (default: true)
|
|
90
87
|
* @param options.maxRetries - Maximum retry attempts on failure (default: 3)
|
|
91
88
|
* @returns The builder with `.to()` and `.void()` methods for routing configuration
|
|
92
|
-
*
|
|
93
|
-
* @example Side effect only (void)
|
|
94
|
-
* ```typescript
|
|
95
|
-
* .on("UserCreated")
|
|
96
|
-
* .do(async (event) => {
|
|
97
|
-
* await analytics.track("user_created", event.data);
|
|
98
|
-
* })
|
|
99
|
-
* .void()
|
|
100
|
-
* ```
|
|
101
|
-
*
|
|
102
|
-
* @example Trigger another action
|
|
103
|
-
* ```typescript
|
|
104
|
-
* .on("OrderPlaced")
|
|
105
|
-
* .do(async (event) => {
|
|
106
|
-
* return ["reduceStock", { amount: event.data.items.length }];
|
|
107
|
-
* })
|
|
108
|
-
* .to("inventory-1")
|
|
109
|
-
* ```
|
|
110
|
-
*
|
|
111
|
-
* @example With retry configuration
|
|
112
|
-
* ```typescript
|
|
113
|
-
* .on("PaymentProcessed")
|
|
114
|
-
* .do(async (event) => {
|
|
115
|
-
* await externalAPI.notify(event.data);
|
|
116
|
-
* }, {
|
|
117
|
-
* blockOnError: false, // Don't block on failure
|
|
118
|
-
* maxRetries: 5 // Retry up to 5 times
|
|
119
|
-
* })
|
|
120
|
-
* .void()
|
|
121
|
-
* ```
|
|
122
89
|
*/
|
|
123
|
-
do: (handler:
|
|
90
|
+
do: (handler: (event: Committed<E, K>, stream: string, app: Dispatcher<A>) => Promise<Snapshot<E, Schema> | void>, options?: Partial<ReactionOptions>) => ActBuilder<S, E, A, M> & {
|
|
124
91
|
/**
|
|
125
92
|
* Routes the reaction to a specific target stream.
|
|
126
93
|
*
|
|
127
|
-
* Use this when the reaction triggers an action on a specific state instance.
|
|
128
|
-
* You can provide either a static stream name (string) or a resolver function
|
|
129
|
-
* that dynamically determines the target based on the event.
|
|
130
|
-
*
|
|
131
94
|
* @param resolver - Target stream name (string) or resolver function
|
|
132
95
|
* @returns The builder for chaining
|
|
133
|
-
*
|
|
134
|
-
* @example Static target stream
|
|
135
|
-
* ```typescript
|
|
136
|
-
* .on("OrderPlaced")
|
|
137
|
-
* .do(async (event) => ["reduceStock", { amount: 10 }])
|
|
138
|
-
* .to("inventory-main")
|
|
139
|
-
* ```
|
|
140
|
-
*
|
|
141
|
-
* @example Dynamic target based on event data
|
|
142
|
-
* ```typescript
|
|
143
|
-
* .on("OrderPlaced")
|
|
144
|
-
* .do(async (event) => ["reduceStock", { amount: 10 }])
|
|
145
|
-
* .to((event) => ({
|
|
146
|
-
* target: `inventory-${event.data.warehouseId}`
|
|
147
|
-
* }))
|
|
148
|
-
* ```
|
|
149
|
-
*
|
|
150
|
-
* @example Source and target routing
|
|
151
|
-
* ```typescript
|
|
152
|
-
* .on("UserLoggedIn")
|
|
153
|
-
* .do(async (event) => ["incrementCount", {}])
|
|
154
|
-
* .to(({ stream }) => ({
|
|
155
|
-
* source: stream, // React to events from this user stream
|
|
156
|
-
* target: `stats-${stream}` // Update corresponding stats stream
|
|
157
|
-
* }))
|
|
158
|
-
* ```
|
|
159
96
|
*/
|
|
160
97
|
to: (resolver: ReactionResolver<E, K> | string) => ActBuilder<S, E, A, M>;
|
|
161
98
|
/**
|
|
162
99
|
* Marks the reaction as void (side-effect only, no target stream).
|
|
163
100
|
*
|
|
164
|
-
* Use this when the reaction doesn't trigger any actions - it only performs
|
|
165
|
-
* side effects like logging, sending notifications, or updating external systems.
|
|
166
|
-
*
|
|
167
101
|
* @returns The builder for chaining
|
|
168
|
-
*
|
|
169
|
-
* @example
|
|
170
|
-
* ```typescript
|
|
171
|
-
* .on("UserCreated")
|
|
172
|
-
* .do(async (event) => {
|
|
173
|
-
* await sendEmail(event.data.email, "Welcome!");
|
|
174
|
-
* await logger.info("User created", event.data);
|
|
175
|
-
* })
|
|
176
|
-
* .void() // No target stream
|
|
177
|
-
* ```
|
|
178
102
|
*/
|
|
179
103
|
void: () => ActBuilder<S, E, A, M>;
|
|
180
104
|
};
|
|
@@ -182,35 +106,14 @@ export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends
|
|
|
182
106
|
/**
|
|
183
107
|
* Builds and returns the Act orchestrator instance.
|
|
184
108
|
*
|
|
185
|
-
* This finalizes the builder configuration and creates the orchestrator that
|
|
186
|
-
* can execute actions, load state, and process reactions.
|
|
187
|
-
*
|
|
188
109
|
* @param drainLimit - Deprecated parameter, no longer used
|
|
189
110
|
* @returns The Act orchestrator instance
|
|
190
111
|
*
|
|
191
|
-
* @example
|
|
192
|
-
* ```typescript
|
|
193
|
-
* const app = act()
|
|
194
|
-
* .with(Counter)
|
|
195
|
-
* .with(User)
|
|
196
|
-
* .on("UserCreated")
|
|
197
|
-
* .do(sendWelcomeEmail)
|
|
198
|
-
* .void()
|
|
199
|
-
* .build();
|
|
200
|
-
*
|
|
201
|
-
* // Now use the app
|
|
202
|
-
* await app.do("createUser", target, payload);
|
|
203
|
-
* await app.drain();
|
|
204
|
-
* ```
|
|
205
|
-
*
|
|
206
112
|
* @see {@link Act} for available orchestrator methods
|
|
207
113
|
*/
|
|
208
114
|
build: (drainLimit?: number) => Act<S, E, A, M>;
|
|
209
115
|
/**
|
|
210
116
|
* The registered event schemas and their reaction maps.
|
|
211
|
-
*
|
|
212
|
-
* This is an internal registry maintained by the builder. Generally, you don't
|
|
213
|
-
* need to access this directly.
|
|
214
117
|
*/
|
|
215
118
|
readonly events: EventRegister<E>;
|
|
216
119
|
};
|
|
@@ -223,8 +126,8 @@ export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends
|
|
|
223
126
|
* - Processing reactions (event handlers)
|
|
224
127
|
* - Coordinating event-driven workflows
|
|
225
128
|
*
|
|
226
|
-
* Use the fluent API to register states with `.with()`, define event
|
|
227
|
-
* and build the orchestrator with `.build()`.
|
|
129
|
+
* Use the fluent API to register states or slices with `.with()`, define event
|
|
130
|
+
* reactions with `.on()`, and build the orchestrator with `.build()`.
|
|
228
131
|
*
|
|
229
132
|
* @template S - State schema register type
|
|
230
133
|
* @template E - Event schemas type
|
|
@@ -247,115 +150,28 @@ export type ActBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends
|
|
|
247
150
|
* const app = act()
|
|
248
151
|
* .with(Counter)
|
|
249
152
|
* .build();
|
|
250
|
-
*
|
|
251
|
-
* // Execute action
|
|
252
|
-
* await app.do("increment",
|
|
253
|
-
* { stream: "counter1", actor: { id: "user1", name: "Alice" } },
|
|
254
|
-
* { by: 5 }
|
|
255
|
-
* );
|
|
256
|
-
*
|
|
257
|
-
* // Load current state
|
|
258
|
-
* const snapshot = await app.load(Counter, "counter1");
|
|
259
|
-
* console.log(snapshot.state.count); // 5
|
|
260
|
-
* ```
|
|
261
|
-
*
|
|
262
|
-
* @example Application with reactions
|
|
263
|
-
* ```typescript
|
|
264
|
-
* const User = state("User", z.object({ name: z.string(), email: z.string() }))
|
|
265
|
-
* .init((data) => data)
|
|
266
|
-
* .emits({ UserCreated: z.object({ name: z.string(), email: z.string() }) })
|
|
267
|
-
* .patch({ UserCreated: (event) => event.data })
|
|
268
|
-
* .on("createUser", z.object({ name: z.string(), email: z.string() }))
|
|
269
|
-
* .emit((action) => ["UserCreated", action])
|
|
270
|
-
* .build();
|
|
271
|
-
*
|
|
272
|
-
* const app = act()
|
|
273
|
-
* .with(User)
|
|
274
|
-
* .on("UserCreated")
|
|
275
|
-
* .do(async (event) => {
|
|
276
|
-
* // Send welcome email
|
|
277
|
-
* await sendEmail(event.data.email, "Welcome!");
|
|
278
|
-
* logger.info(`Sent welcome email to ${event.data.email}`);
|
|
279
|
-
* })
|
|
280
|
-
* .void() // No target stream, just side effects
|
|
281
|
-
* .build();
|
|
282
|
-
*
|
|
283
|
-
* // Create user (triggers email sending via reaction)
|
|
284
|
-
* await app.do("createUser",
|
|
285
|
-
* { stream: "user-123", actor: { id: "admin", name: "Admin" } },
|
|
286
|
-
* { name: "Alice", email: "alice@example.com" }
|
|
287
|
-
* );
|
|
288
|
-
*
|
|
289
|
-
* // Process reactions
|
|
290
|
-
* await app.drain();
|
|
291
|
-
* ```
|
|
292
|
-
*
|
|
293
|
-
* @example Multi-state application with event correlation
|
|
294
|
-
* ```typescript
|
|
295
|
-
* const Order = state("Order", z.object({ items: z.array(z.string()), total: z.number() }))
|
|
296
|
-
* .init((data) => data)
|
|
297
|
-
* .emits({ OrderPlaced: z.object({ items: z.array(z.string()), total: z.number() }) })
|
|
298
|
-
* .patch({ OrderPlaced: (event) => event.data })
|
|
299
|
-
* .on("placeOrder", z.object({ items: z.array(z.string()), total: z.number() }))
|
|
300
|
-
* .emit((action) => ["OrderPlaced", action])
|
|
301
|
-
* .build();
|
|
302
|
-
*
|
|
303
|
-
* const Inventory = state("Inventory", z.object({ stock: z.number() }))
|
|
304
|
-
* .init(() => ({ stock: 100 }))
|
|
305
|
-
* .emits({ StockReduced: z.object({ amount: z.number() }) })
|
|
306
|
-
* .patch({ StockReduced: (event, state) => ({ stock: state.stock - event.data.amount }) })
|
|
307
|
-
* .on("reduceStock", z.object({ amount: z.number() }))
|
|
308
|
-
* .emit((action) => ["StockReduced", { amount: action.amount }])
|
|
309
|
-
* .build();
|
|
310
|
-
*
|
|
311
|
-
* const app = act()
|
|
312
|
-
* .with(Order)
|
|
313
|
-
* .with(Inventory)
|
|
314
|
-
* .on("OrderPlaced")
|
|
315
|
-
* .do(async (event) => {
|
|
316
|
-
* // Reduce inventory for each item
|
|
317
|
-
* return ["reduceStock", { amount: event.data.items.length }];
|
|
318
|
-
* })
|
|
319
|
-
* .to("inventory-1") // Target specific inventory stream
|
|
320
|
-
* .build();
|
|
321
|
-
*
|
|
322
|
-
* await app.do("placeOrder",
|
|
323
|
-
* { stream: "order-1", actor: { id: "user1", name: "Alice" } },
|
|
324
|
-
* { items: ["item1", "item2"], total: 100 }
|
|
325
|
-
* );
|
|
326
|
-
*
|
|
327
|
-
* // Process reaction (reduces inventory)
|
|
328
|
-
* await app.drain();
|
|
329
153
|
* ```
|
|
330
154
|
*
|
|
331
|
-
* @example
|
|
155
|
+
* @example Application with slices (vertical slice architecture)
|
|
332
156
|
* ```typescript
|
|
333
|
-
*
|
|
334
|
-
* .init(() => initialTicket)
|
|
335
|
-
* .emits({ TicketOpened: ..., TicketClosed: ... })
|
|
336
|
-
* .patch({ TicketOpened: ..., TicketClosed: ... })
|
|
337
|
-
* .on("OpenTicket", ...).emit(...)
|
|
338
|
-
* .on("CloseTicket", ...).emit(...)
|
|
339
|
-
* .build();
|
|
157
|
+
* import { act, slice, state } from "@rotorsoft/act";
|
|
340
158
|
*
|
|
341
|
-
* const
|
|
342
|
-
* .
|
|
343
|
-
* .
|
|
344
|
-
*
|
|
345
|
-
*
|
|
159
|
+
* const CounterSlice = slice()
|
|
160
|
+
* .with(Counter)
|
|
161
|
+
* .on("Incremented")
|
|
162
|
+
* .do(async (event) => { console.log("incremented!"); })
|
|
163
|
+
* .void()
|
|
346
164
|
* .build();
|
|
347
165
|
*
|
|
348
|
-
* // Partials with same name are merged automatically
|
|
349
166
|
* const app = act()
|
|
350
|
-
* .with(
|
|
351
|
-
* .with(TicketMessaging)
|
|
167
|
+
* .with(CounterSlice)
|
|
352
168
|
* .build();
|
|
353
169
|
* ```
|
|
354
170
|
*
|
|
355
171
|
* @see {@link ActBuilder} for available builder methods
|
|
356
172
|
* @see {@link Act} for orchestrator API methods
|
|
357
173
|
* @see {@link state} for defining states
|
|
358
|
-
* @see {@link
|
|
174
|
+
* @see {@link slice} for defining slices
|
|
359
175
|
*/
|
|
360
176
|
export declare function act<S extends SchemaRegister<A> = {}, E extends Schemas = {}, A extends Schemas = {}, M extends Record<string, Schema> = {}>(states?: Map<string, State<any, any, any>>, registry?: Registry<S, E, A>): ActBuilder<S, E, A, M>;
|
|
361
177
|
//# sourceMappingURL=act-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act-builder.d.ts","sourceRoot":"","sources":["../../src/act-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"act-builder.d.ts","sourceRoot":"","sources":["../../src/act-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/@types/act.d.ts
CHANGED
|
@@ -156,7 +156,7 @@ export declare class Act<S extends SchemaRegister<A>, E extends Schemas, A exten
|
|
|
156
156
|
* @see {@link Snapshot} for return value structure
|
|
157
157
|
* @see {@link ValidationError}, {@link InvariantError}, {@link ConcurrencyError}
|
|
158
158
|
*/
|
|
159
|
-
do<K extends keyof A>(action: K, target: Target, payload: Readonly<A[K]>, reactingTo?: Committed<E, keyof E>, skipValidation?: boolean): Promise<Snapshot<S[K], E>[]>;
|
|
159
|
+
do<K extends keyof A>(action: K, target: Target, payload: Readonly<A[K]>, reactingTo?: Committed<E, string & keyof E>, skipValidation?: boolean): Promise<Snapshot<S[K], E>[]>;
|
|
160
160
|
/**
|
|
161
161
|
* Loads the current state snapshot for a specific stream.
|
|
162
162
|
*
|
|
@@ -359,7 +359,7 @@ export declare class Act<S extends SchemaRegister<A>, E extends Schemas, A exten
|
|
|
359
359
|
* @see {@link correlate} for dynamic stream discovery
|
|
360
360
|
* @see {@link start_correlations} for automatic correlation
|
|
361
361
|
*/
|
|
362
|
-
drain
|
|
362
|
+
drain({ streamLimit, eventLimit, leaseMillis, }?: DrainOptions): Promise<Drain<E>>;
|
|
363
363
|
/**
|
|
364
364
|
* Discovers and registers new streams dynamically based on reaction resolvers.
|
|
365
365
|
*
|
package/dist/@types/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,EACT,KAAK,EACL,YAAY,EACZ,KAAK,EACL,KAAK,EAEL,QAAQ,EACR,MAAM,EACN,cAAc,EACd,OAAO,EACP,QAAQ,EACR,KAAK,EACL,MAAM,EACP,MAAM,kBAAkB,CAAC;AAI1B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,GAAG,CACd,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;aAgEtC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IA/D1B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAO;IACpC,OAAO,CAAC,qBAAqB,CAAyC;IAEtE;;;;;;OAMG;IACH,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO;IACzD,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO;IAC5C,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO;IAKvE;;;;;;OAMG;IACH,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;IACxE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,IAAI;IAC3D,EAAE,CACA,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,GACzD,IAAI;IAMP;;;;;;OAMG;IACH,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;IACzE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,IAAI;IAC5D,GAAG,CACD,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,GACzD,IAAI;IAMP;;;;;OAKG;gBAEe,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,OAAO,GAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAa;IASzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkFG;IACG,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EACxB,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/act.ts"],"names":[],"mappings":"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"}
|
package/dist/@types/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from "./act-builder.js";
|
|
|
8
8
|
export * from "./act.js";
|
|
9
9
|
export * from "./config.js";
|
|
10
10
|
export * from "./ports.js";
|
|
11
|
+
export * from "./slice-builder.js";
|
|
11
12
|
export * from "./state-builder.js";
|
|
12
13
|
export * from "./types/index.js";
|
|
13
14
|
export * from "./utils.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB;;;;GAIG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB;;;;GAIG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module merge
|
|
3
|
+
* @category Builders
|
|
4
|
+
*
|
|
5
|
+
* Shared utilities for merging partial states across builders.
|
|
6
|
+
*/
|
|
7
|
+
import { type ZodType } from "zod";
|
|
8
|
+
import type { Schema, State } from "./types/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Unwraps wrapper types (ZodOptional, ZodNullable, ZodDefault, ZodReadonly)
|
|
11
|
+
* to find the base type name, e.g. `z.string().optional()` -> `"ZodString"`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function baseTypeName(zodType: ZodType): string;
|
|
14
|
+
/**
|
|
15
|
+
* Merges two Zod schemas. If both are ZodObject instances, checks for
|
|
16
|
+
* overlapping shape keys with incompatible base types (throws descriptive
|
|
17
|
+
* error), then merges via `.extend()`. Falls back to keeping existing
|
|
18
|
+
* schema if either is not a ZodObject.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeSchemas(existing: ZodType, incoming: ZodType, stateName: string): ZodType;
|
|
21
|
+
/**
|
|
22
|
+
* Merges two init functions by spreading both results together.
|
|
23
|
+
* Each partial only provides its own defaults.
|
|
24
|
+
*/
|
|
25
|
+
export declare function mergeInits<S extends Schema>(existing: () => Readonly<S>, incoming: () => Readonly<S>): () => Readonly<S>;
|
|
26
|
+
/**
|
|
27
|
+
* Registers a state into a states map and action/event registries,
|
|
28
|
+
* merging with existing same-name states (partial state support).
|
|
29
|
+
*/
|
|
30
|
+
export declare function registerState(state: State<any, any, any>, states: Map<string, State<any, any, any>>, actions: Record<string, any>, events: Record<string, any>): void;
|
|
31
|
+
export declare const _this_: ({ stream }: {
|
|
32
|
+
stream: string;
|
|
33
|
+
}) => {
|
|
34
|
+
source: string;
|
|
35
|
+
target: string;
|
|
36
|
+
};
|
|
37
|
+
export declare const _void_: () => undefined;
|
|
38
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAMrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAkBT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,QAAQ,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,GAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,CAEnB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,IAAI,CAoDN;AAGD,eAAO,MAAM,MAAM,GAAI,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;;;CAGnD,CAAC;AAGH,eAAO,MAAM,MAAM,iBAAkB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { Committed, Dispatcher, EventRegister, ReactionOptions, ReactionResolver, Schema, SchemaRegister, Schemas, Snapshot, State } from "./types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* A self-contained functional slice grouping partial states with their
|
|
4
|
+
* scoped reactions. Slices are composed into an Act orchestrator via
|
|
5
|
+
* `act().with(slice)`.
|
|
6
|
+
*
|
|
7
|
+
* @template S - Schema register for states
|
|
8
|
+
* @template E - Event schemas from this slice's states
|
|
9
|
+
* @template A - Action schemas from this slice's states
|
|
10
|
+
* @template M - Map of state names to state schemas
|
|
11
|
+
*/
|
|
12
|
+
export type Slice<S extends SchemaRegister<A>, E extends Schemas, A extends Schemas, M extends Record<string, Schema> = {}> = {
|
|
13
|
+
readonly _tag: "Slice";
|
|
14
|
+
readonly states: Map<string, State<any, any, any>>;
|
|
15
|
+
readonly events: EventRegister<E>;
|
|
16
|
+
/** @internal phantom field for type-level state schema tracking */
|
|
17
|
+
readonly _S?: S;
|
|
18
|
+
/** @internal phantom field for type-level state name tracking */
|
|
19
|
+
readonly _M?: M;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Type guard for distinguishing Slice from State objects.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isSlice(x: any): x is Slice<any, any, any, any>;
|
|
25
|
+
/**
|
|
26
|
+
* Fluent builder interface for composing functional slices.
|
|
27
|
+
*
|
|
28
|
+
* Provides a chainable API for registering states and defining reactions,
|
|
29
|
+
* scoped to the slice's own events. Include all states whose actions your
|
|
30
|
+
* handlers need via `.with()` — the `app` parameter in `.do()` handlers
|
|
31
|
+
* is typed with every action registered in the slice.
|
|
32
|
+
*
|
|
33
|
+
* @template S - Schema register for states
|
|
34
|
+
* @template E - Event schemas
|
|
35
|
+
* @template A - Action schemas
|
|
36
|
+
* @template M - Map of state names to state schemas
|
|
37
|
+
*/
|
|
38
|
+
export type SliceBuilder<S extends SchemaRegister<A>, E extends Schemas, A extends Schemas, M extends Record<string, Schema> = {}> = {
|
|
39
|
+
/**
|
|
40
|
+
* Registers a partial state definition with the slice.
|
|
41
|
+
*
|
|
42
|
+
* Include every state whose actions your reaction handlers need to
|
|
43
|
+
* dispatch. Duplicate registrations (same state in multiple slices)
|
|
44
|
+
* are handled automatically at composition time.
|
|
45
|
+
*/
|
|
46
|
+
with: <SX extends Schema, EX extends Schemas, AX extends Schemas, NX extends string = string>(state: State<SX, EX, AX, NX>) => SliceBuilder<S & {
|
|
47
|
+
[K in keyof AX]: SX;
|
|
48
|
+
}, E & EX, A & AX, M & {
|
|
49
|
+
[K in NX]: SX;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Begins defining a reaction scoped to this slice's events.
|
|
53
|
+
*/
|
|
54
|
+
on: <K extends keyof E>(event: K) => {
|
|
55
|
+
do: (handler: (event: Committed<E, K>, stream: string, app: Dispatcher<A>) => Promise<Snapshot<E, Schema> | void>, options?: Partial<ReactionOptions>) => SliceBuilder<S, E, A, M> & {
|
|
56
|
+
to: (resolver: ReactionResolver<E, K> | string) => SliceBuilder<S, E, A, M>;
|
|
57
|
+
void: () => SliceBuilder<S, E, A, M>;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Builds and returns the Slice data structure.
|
|
62
|
+
*/
|
|
63
|
+
build: () => Slice<S, E, A, M>;
|
|
64
|
+
/**
|
|
65
|
+
* The registered event schemas and their reaction maps.
|
|
66
|
+
*/
|
|
67
|
+
readonly events: EventRegister<E>;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Creates a new slice builder for composing partial states with scoped reactions.
|
|
71
|
+
*
|
|
72
|
+
* Slices enable vertical slice architecture by grouping related states and
|
|
73
|
+
* reactions into self-contained feature modules. Reactions defined in a slice
|
|
74
|
+
* are type-scoped to events from that slice's states only.
|
|
75
|
+
*
|
|
76
|
+
* Include all states whose actions your handlers dispatch via `.with()`.
|
|
77
|
+
* When multiple slices share the same state, duplicates are merged
|
|
78
|
+
* automatically at `act().with(slice)` composition time.
|
|
79
|
+
*
|
|
80
|
+
* @example Single-state slice with typed dispatch
|
|
81
|
+
* ```typescript
|
|
82
|
+
* const CounterSlice = slice()
|
|
83
|
+
* .with(Counter)
|
|
84
|
+
* .on("Incremented")
|
|
85
|
+
* .do(async (event, _stream, app) => {
|
|
86
|
+
* await app.do("reset", target, {});
|
|
87
|
+
* })
|
|
88
|
+
* .void()
|
|
89
|
+
* .build();
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @example Cross-state dispatch (include both states)
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const CreationSlice = slice()
|
|
95
|
+
* .with(TicketCreation)
|
|
96
|
+
* .with(TicketOperations) // handler can dispatch AssignTicket
|
|
97
|
+
* .on("TicketOpened").do(async (event, _stream, app) => {
|
|
98
|
+
* await app.do("AssignTicket", target, payload, event);
|
|
99
|
+
* })
|
|
100
|
+
* .build();
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @see {@link SliceBuilder} for builder methods
|
|
104
|
+
* @see {@link Slice} for the output type
|
|
105
|
+
*/
|
|
106
|
+
export declare function slice<S extends SchemaRegister<A> = {}, E extends Schemas = {}, A extends Schemas = {}, M extends Record<string, Schema> = {}>(states?: Map<string, State<any, any, any>>, actions?: Record<string, any>, events?: EventRegister<E>): SliceBuilder<S, E, A, M>;
|
|
107
|
+
//# sourceMappingURL=slice-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice-builder.d.ts","sourceRoot":"","sources":["../../src/slice-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,7 +77,7 @@ export type StateBuilder<S extends Schema, N extends string = string> = {
|
|
|
77
77
|
* })
|
|
78
78
|
* ```
|
|
79
79
|
*/
|
|
80
|
-
patch: (patch: PatchHandlers<S, E>) => ActionBuilder<S, E,
|
|
80
|
+
patch: (patch: PatchHandlers<S, E>) => ActionBuilder<S, E, {}, N>;
|
|
81
81
|
};
|
|
82
82
|
};
|
|
83
83
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../src/state-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAC9B,OAAO,EACL,aAAa,EAGb,SAAS,EACT,aAAa,EACb,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACtE;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK;QACjC;;;;;;;;;;;;;;;;;;WAkBG;QACH,KAAK,EAAE,CAAC,CAAC,SAAS,OAAO,EACvB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAChB;YACH;;;;;;;;;;;;;;;;;;eAkBG;YACH,KAAK,EAAE,CACL,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../src/state-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -285,4 +285,49 @@ export type State<S extends Schema, E extends Schemas, A extends Schemas, N exte
|
|
|
285
285
|
given?: GivenHandlers<S, A>;
|
|
286
286
|
snap?: (snapshot: Snapshot<S, E>) => boolean;
|
|
287
287
|
};
|
|
288
|
+
/**
|
|
289
|
+
* Extracts the raw action schemas from a State definition.
|
|
290
|
+
*
|
|
291
|
+
* Use this to recover the `A` type parameter from a built State object,
|
|
292
|
+
* enabling construction of typed dispatchers without circular imports.
|
|
293
|
+
*
|
|
294
|
+
* @template T - A State object (or any object with `readonly actions: ZodTypes<A>`)
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* type Actions = InferActions<typeof Counter>;
|
|
299
|
+
* // => { increment: { by: number } }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
export type InferActions<T extends {
|
|
303
|
+
readonly actions: Record<string, ZodType>;
|
|
304
|
+
}> = {
|
|
305
|
+
[K in keyof T["actions"]]: T["actions"][K] extends ZodType<infer V> ? V : never;
|
|
306
|
+
};
|
|
307
|
+
/**
|
|
308
|
+
* Typed interface for the `app.do()` method, enabling reaction handlers
|
|
309
|
+
* to dispatch actions with full autocomplete.
|
|
310
|
+
*
|
|
311
|
+
* Construct with {@link InferActions} to avoid circular imports between
|
|
312
|
+
* slice files and the bootstrap module.
|
|
313
|
+
*
|
|
314
|
+
* @template A - Action schemas (maps action names to payload types)
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```typescript
|
|
318
|
+
* import type { Dispatcher, InferActions } from "@rotorsoft/act";
|
|
319
|
+
*
|
|
320
|
+
* type App = Dispatcher<
|
|
321
|
+
* InferActions<typeof StateA> &
|
|
322
|
+
* InferActions<typeof StateB>
|
|
323
|
+
* >;
|
|
324
|
+
*
|
|
325
|
+
* async function myReaction(event: ..., stream: string, app: App) {
|
|
326
|
+
* await app.do("someAction", target, payload, event);
|
|
327
|
+
* }
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
export interface Dispatcher<A extends Schemas> {
|
|
331
|
+
do<K extends keyof A & string>(action: K, target: Target, payload: Readonly<A[K]>, reactingTo?: Committed<Schemas, string>, skipValidation?: boolean): Promise<any>;
|
|
332
|
+
}
|
|
288
333
|
//# sourceMappingURL=action.d.ts.map
|