@rotorsoft/act 0.12.2 → 0.14.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/index.cjs CHANGED
@@ -53,8 +53,6 @@ __export(index_exports, {
53
53
  dispose: () => dispose,
54
54
  disposeAndExit: () => disposeAndExit,
55
55
  extend: () => extend,
56
- isProjection: () => isProjection,
57
- isSlice: () => isSlice,
58
56
  logger: () => logger,
59
57
  patch: () => patch,
60
58
  port: () => port,
@@ -843,8 +841,8 @@ var Act = class {
843
841
  * @example Reaction triggering another action
844
842
  * ```typescript
845
843
  * const app = act()
846
- * .with(Order)
847
- * .with(Inventory)
844
+ * .withState(Order)
845
+ * .withState(Inventory)
848
846
  * .on("OrderPlaced")
849
847
  * .do(async (event, context) => {
850
848
  * // This action is triggered by an event
@@ -1206,8 +1204,8 @@ var Act = class {
1206
1204
  * @example Dynamic stream creation
1207
1205
  * ```typescript
1208
1206
  * const app = act()
1209
- * .with(User)
1210
- * .with(UserStats)
1207
+ * .withState(User)
1208
+ * .withState(UserStats)
1211
1209
  * .on("UserLoggedIn")
1212
1210
  * .do(async (event) => ["incrementLoginCount", {}])
1213
1211
  * .to((event) => ({
@@ -1448,10 +1446,84 @@ var _this_ = ({ stream }) => ({
1448
1446
  });
1449
1447
  var _void_ = () => void 0;
1450
1448
 
1451
- // src/projection-builder.ts
1452
- function isProjection(x) {
1453
- return x != null && x._tag === "Projection";
1449
+ // src/act-builder.ts
1450
+ function act(states = /* @__PURE__ */ new Map(), registry = {
1451
+ actions: {},
1452
+ events: {}
1453
+ }, pendingProjections = []) {
1454
+ const builder = {
1455
+ withState: (state2) => {
1456
+ registerState(state2, states, registry.actions, registry.events);
1457
+ return act(
1458
+ states,
1459
+ registry,
1460
+ pendingProjections
1461
+ );
1462
+ },
1463
+ withSlice: (input) => {
1464
+ for (const s of input.states.values()) {
1465
+ registerState(s, states, registry.actions, registry.events);
1466
+ }
1467
+ for (const eventName of Object.keys(input.events)) {
1468
+ const sliceRegister = input.events[eventName];
1469
+ for (const [name, reaction] of sliceRegister.reactions) {
1470
+ registry.events[eventName].reactions.set(name, reaction);
1471
+ }
1472
+ }
1473
+ pendingProjections.push(...input.projections);
1474
+ return act(
1475
+ states,
1476
+ registry,
1477
+ pendingProjections
1478
+ );
1479
+ },
1480
+ withProjection: (proj) => {
1481
+ mergeProjection(proj, registry.events);
1482
+ return act(states, registry, pendingProjections);
1483
+ },
1484
+ on: (event) => ({
1485
+ do: (handler, options) => {
1486
+ const reaction = {
1487
+ handler,
1488
+ resolver: _this_,
1489
+ options: {
1490
+ blockOnError: options?.blockOnError ?? true,
1491
+ maxRetries: options?.maxRetries ?? 3
1492
+ }
1493
+ };
1494
+ const name = handler.name || `${String(event)}_${registry.events[event].reactions.size}`;
1495
+ registry.events[event].reactions.set(name, reaction);
1496
+ return {
1497
+ ...builder,
1498
+ to(resolver) {
1499
+ registry.events[event].reactions.set(name, {
1500
+ ...reaction,
1501
+ resolver: typeof resolver === "string" ? { target: resolver } : resolver
1502
+ });
1503
+ return builder;
1504
+ },
1505
+ void() {
1506
+ registry.events[event].reactions.set(name, {
1507
+ ...reaction,
1508
+ resolver: _void_
1509
+ });
1510
+ return builder;
1511
+ }
1512
+ };
1513
+ }
1514
+ }),
1515
+ build: () => {
1516
+ for (const proj of pendingProjections) {
1517
+ mergeProjection(proj, registry.events);
1518
+ }
1519
+ return new Act(registry, states);
1520
+ },
1521
+ events: registry.events
1522
+ };
1523
+ return builder;
1454
1524
  }
1525
+
1526
+ // src/projection-builder.ts
1455
1527
  function projection(target, events = {}) {
1456
1528
  const defaultResolver = target ? { target } : void 0;
1457
1529
  const builder = {
@@ -1513,12 +1585,9 @@ function projection(target, events = {}) {
1513
1585
  }
1514
1586
 
1515
1587
  // src/slice-builder.ts
1516
- function isSlice(x) {
1517
- return x != null && x._tag === "Slice";
1518
- }
1519
1588
  function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, projections = []) {
1520
1589
  const builder = {
1521
- with: (state2) => {
1590
+ withState: (state2) => {
1522
1591
  registerState(state2, states, actions, events);
1523
1592
  return slice(
1524
1593
  states,
@@ -1527,7 +1596,7 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
1527
1596
  projections
1528
1597
  );
1529
1598
  },
1530
- projection: (proj) => {
1599
+ withProjection: (proj) => {
1531
1600
  projections.push(proj);
1532
1601
  return slice(states, actions, events, projections);
1533
1602
  },
@@ -1573,94 +1642,6 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
1573
1642
  return builder;
1574
1643
  }
1575
1644
 
1576
- // src/act-builder.ts
1577
- function act(states = /* @__PURE__ */ new Map(), registry = {
1578
- actions: {},
1579
- events: {}
1580
- }, pendingProjections = []) {
1581
- const builder = {
1582
- with: ((input) => {
1583
- if (isProjection(input)) {
1584
- mergeProjection(input, registry.events);
1585
- return act(
1586
- states,
1587
- registry,
1588
- pendingProjections
1589
- );
1590
- }
1591
- if (isSlice(input)) {
1592
- for (const s of input.states.values()) {
1593
- registerState(s, states, registry.actions, registry.events);
1594
- }
1595
- for (const eventName of Object.keys(input.events)) {
1596
- const sliceRegister = input.events[eventName];
1597
- for (const [name, reaction] of sliceRegister.reactions) {
1598
- registry.events[eventName].reactions.set(name, reaction);
1599
- }
1600
- }
1601
- pendingProjections.push(...input.projections);
1602
- return act(
1603
- states,
1604
- registry,
1605
- pendingProjections
1606
- );
1607
- }
1608
- registerState(input, states, registry.actions, registry.events);
1609
- return act(
1610
- states,
1611
- registry,
1612
- pendingProjections
1613
- );
1614
- }),
1615
- /**
1616
- * Adds a reaction to an event.
1617
- *
1618
- * @template K The type of event
1619
- * @param event The event to add a reaction to
1620
- * @returns The builder
1621
- */
1622
- on: (event) => ({
1623
- do: (handler, options) => {
1624
- const reaction = {
1625
- handler,
1626
- resolver: _this_,
1627
- options: {
1628
- blockOnError: options?.blockOnError ?? true,
1629
- maxRetries: options?.maxRetries ?? 3
1630
- }
1631
- };
1632
- const name = handler.name || `${String(event)}_${registry.events[event].reactions.size}`;
1633
- registry.events[event].reactions.set(name, reaction);
1634
- return {
1635
- ...builder,
1636
- to(resolver) {
1637
- registry.events[event].reactions.set(name, {
1638
- ...reaction,
1639
- resolver: typeof resolver === "string" ? { target: resolver } : resolver
1640
- });
1641
- return builder;
1642
- },
1643
- void() {
1644
- registry.events[event].reactions.set(name, {
1645
- ...reaction,
1646
- resolver: _void_
1647
- });
1648
- return builder;
1649
- }
1650
- };
1651
- }
1652
- }),
1653
- build: () => {
1654
- for (const proj of pendingProjections) {
1655
- mergeProjection(proj, registry.events);
1656
- }
1657
- return new Act(registry, states);
1658
- },
1659
- events: registry.events
1660
- };
1661
- return builder;
1662
- }
1663
-
1664
1645
  // src/state-builder.ts
1665
1646
  function state(entry) {
1666
1647
  const keys = Object.keys(entry);
@@ -1671,19 +1652,34 @@ function state(entry) {
1671
1652
  init(init) {
1672
1653
  return {
1673
1654
  emits(events) {
1674
- return {
1675
- patch(patch2) {
1655
+ const defaultPatch = Object.fromEntries(
1656
+ Object.keys(events).map((k) => [
1657
+ k,
1658
+ ({ data }) => data
1659
+ ])
1660
+ );
1661
+ const builder = action_builder({
1662
+ events,
1663
+ actions: {},
1664
+ state: stateSchema,
1665
+ name,
1666
+ init,
1667
+ patch: defaultPatch,
1668
+ on: {}
1669
+ });
1670
+ return Object.assign(builder, {
1671
+ patch(customPatch) {
1676
1672
  return action_builder({
1677
1673
  events,
1678
1674
  actions: {},
1679
1675
  state: stateSchema,
1680
1676
  name,
1681
1677
  init,
1682
- patch: patch2,
1678
+ patch: { ...defaultPatch, ...customPatch },
1683
1679
  on: {}
1684
1680
  });
1685
1681
  }
1686
- };
1682
+ });
1687
1683
  }
1688
1684
  };
1689
1685
  }
@@ -1706,7 +1702,12 @@ function action_builder(state2) {
1706
1702
  return { emit };
1707
1703
  }
1708
1704
  function emit(handler) {
1709
- on[action2] = handler;
1705
+ if (typeof handler === "string") {
1706
+ const eventName = handler;
1707
+ on[action2] = ((payload) => [eventName, payload]);
1708
+ } else {
1709
+ on[action2] = handler;
1710
+ }
1710
1711
  return action_builder({
1711
1712
  ...state2,
1712
1713
  actions,
@@ -1749,8 +1750,6 @@ function action_builder(state2) {
1749
1750
  dispose,
1750
1751
  disposeAndExit,
1751
1752
  extend,
1752
- isProjection,
1753
- isSlice,
1754
1753
  logger,
1755
1754
  patch,
1756
1755
  port,