@rotorsoft/act 0.10.0 → 0.11.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.
@@ -81,6 +81,10 @@ export type StateBuilder<S extends Schema, N extends string = string> = {
81
81
  };
82
82
  };
83
83
  };
84
+ /** Helper: a single-key record mapping a state name to its Zod schema. */
85
+ type StateEntry<K extends string = string, S extends Schema = Schema> = {
86
+ [P in K]: ZodType<S>;
87
+ };
84
88
  /** Helper: a single-key record mapping an action name to its Zod schema. */
85
89
  type ActionEntry<K extends string = string, AX extends Schema = Schema> = {
86
90
  [P in K]: ZodType<AX>;
@@ -265,7 +269,7 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
265
269
  *
266
270
  * @example
267
271
  * ```typescript
268
- * const Counter = state("Counter", schema)
272
+ * const Counter = state({ Counter: schema })
269
273
  * .init(() => ({ count: 0 }))
270
274
  * .emits({ Incremented: z.object({ amount: z.number() }) })
271
275
  * .patch({ Incremented: (event, state) => ({ count: state.count + event.data.amount }) })
@@ -293,8 +297,7 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
293
297
  * 6. Snapshotting strategy via `.snap()`
294
298
  *
295
299
  * @template S - Zod schema type defining the shape of the state
296
- * @param name - Unique identifier for this state type (e.g., "Counter", "User", "Order")
297
- * @param state - Zod schema defining the structure of the state
300
+ * @param entry - Single-key record mapping state name to Zod schema (e.g., `{ Counter: z.object({ count: z.number() }) }`)
298
301
  * @returns A StateBuilder instance for fluent API configuration
299
302
  *
300
303
  * @example Basic counter state
@@ -302,7 +305,7 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
302
305
  * import { state } from "@rotorsoft/act";
303
306
  * import { z } from "zod";
304
307
  *
305
- * const Counter = state("Counter", z.object({ count: z.number() }))
308
+ * const Counter = state({ Counter: z.object({ count: z.number() }) })
306
309
  * .init(() => ({ count: 0 }))
307
310
  * .emits({
308
311
  * Incremented: z.object({ amount: z.number() })
@@ -317,11 +320,11 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
317
320
  *
318
321
  * @example State with multiple events and invariants
319
322
  * ```typescript
320
- * const BankAccount = state("BankAccount", z.object({
323
+ * const BankAccount = state({ BankAccount: z.object({
321
324
  * balance: z.number(),
322
325
  * currency: z.string(),
323
326
  * status: z.enum(["open", "closed"])
324
- * }))
327
+ * }) })
325
328
  * .init(() => ({ balance: 0, currency: "USD", status: "open" }))
326
329
  * .emits({
327
330
  * Deposited: z.object({ amount: z.number() }),
@@ -356,11 +359,11 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
356
359
  *
357
360
  * @example State with snapshotting
358
361
  * ```typescript
359
- * const User = state("User", z.object({
362
+ * const User = state({ User: z.object({
360
363
  * name: z.string(),
361
364
  * email: z.string(),
362
365
  * loginCount: z.number()
363
- * }))
366
+ * }) })
364
367
  * .init((data) => ({ ...data, loginCount: 0 }))
365
368
  * .emits({
366
369
  * UserCreated: z.object({ name: z.string(), email: z.string() }),
@@ -383,6 +386,6 @@ export type ActionBuilder<S extends Schema, E extends Schemas, A extends Schemas
383
386
  * @see {@link https://rotorsoft.github.io/act-root/docs/intro | Getting Started Guide}
384
387
  * @see {@link https://rotorsoft.github.io/act-root/docs/examples/calculator | Calculator Example}
385
388
  */
386
- export declare function state<N extends string, S extends Schema>(name: N, state: ZodType<S>): StateBuilder<S, N>;
389
+ export declare function state<N extends string, S extends Schema>(entry: StateEntry<N, S>): StateBuilder<S, N>;
387
390
  export {};
388
391
  //# sourceMappingURL=state-builder.d.ts.map
@@ -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,KAEvB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;CACH,CAAC;AAEF,4EAA4E;AAC5E,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI;KACvE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,CACvB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,MAAM,GAAG,MAAM,IACvB;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,MAAM,EACtC,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,KACtB;QACH;;;;;;;;;;;;;;;;;WAiBG;QACH,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK;YAChC;;;;;;;;;;;;;;;;;eAiBG;YACH,IAAI,EAAE,CACJ,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE;iBAAG,CAAC,IAAI,CAAC,GAAG,EAAE;aAAE,EAAE,CAAC,CAAC,KAC9C,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;iBAAG,CAAC,IAAI,CAAC,GAAG,EAAE;aAAE,EAAE,CAAC,CAAC,CAAC;SACnD,CAAC;QACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCG;QACH,IAAI,EAAE,CACJ,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE;aAAG,CAAC,IAAI,CAAC,GAAG,EAAE;SAAE,EAAE,CAAC,CAAC,KAC9C,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;aAAG,CAAC,IAAI,CAAC,GAAG,EAAE;SAAE,EAAE,CAAC,CAAC,CAAC;KACnD,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,IAAI,EAAE,CACJ,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,KACxC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0GG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACtD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAChB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAuBpB"}
1
+ {"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../src/state-builder.ts"],"names":[],"mappings":"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"}
@@ -83,7 +83,7 @@ import type { Patch, Schema } from "./types/index.js";
83
83
  * import { state } from "@rotorsoft/act";
84
84
  * import { z } from "zod";
85
85
  *
86
- * const Counter = state("Counter", z.object({ count: z.number() }))
86
+ * const Counter = state({ Counter: z.object({ count: z.number() }) })
87
87
  * .init(() => ({ count: 0 }))
88
88
  * .emits({ Incremented: z.object({ by: z.number() }) })
89
89
  * .patch({
@@ -166,7 +166,7 @@ export declare const patch: <S extends Schema>(original: Readonly<S>, patches: R
166
166
  * import { state } from "@rotorsoft/act";
167
167
  * import { z } from "zod";
168
168
  *
169
- * const Counter = state("Counter", z.object({ count: z.number() }))
169
+ * const Counter = state({ Counter: z.object({ count: z.number() }) })
170
170
  * .init(() => ({ count: 0 }))
171
171
  * .emits({ Incremented: z.object({ by: z.number().positive() }) })
172
172
  * .on({ increment: z.object({ by: z.number() }) })
package/dist/index.cjs CHANGED
@@ -1631,7 +1631,11 @@ function act(states = /* @__PURE__ */ new Map(), registry = {
1631
1631
  }
1632
1632
 
1633
1633
  // src/state-builder.ts
1634
- function state(name, state2) {
1634
+ function state(entry) {
1635
+ const keys = Object.keys(entry);
1636
+ if (keys.length !== 1) throw new Error("state() requires exactly one key");
1637
+ const name = keys[0];
1638
+ const stateSchema = entry[name];
1635
1639
  return {
1636
1640
  init(init) {
1637
1641
  return {
@@ -1641,7 +1645,7 @@ function state(name, state2) {
1641
1645
  return action_builder({
1642
1646
  events,
1643
1647
  actions: {},
1644
- state: state2,
1648
+ state: stateSchema,
1645
1649
  name,
1646
1650
  init,
1647
1651
  patch: patch2,