@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.js CHANGED
@@ -774,8 +774,8 @@ var Act = class {
774
774
  * @example Reaction triggering another action
775
775
  * ```typescript
776
776
  * const app = act()
777
- * .with(Order)
778
- * .with(Inventory)
777
+ * .withState(Order)
778
+ * .withState(Inventory)
779
779
  * .on("OrderPlaced")
780
780
  * .do(async (event, context) => {
781
781
  * // This action is triggered by an event
@@ -1137,8 +1137,8 @@ var Act = class {
1137
1137
  * @example Dynamic stream creation
1138
1138
  * ```typescript
1139
1139
  * const app = act()
1140
- * .with(User)
1141
- * .with(UserStats)
1140
+ * .withState(User)
1141
+ * .withState(UserStats)
1142
1142
  * .on("UserLoggedIn")
1143
1143
  * .do(async (event) => ["incrementLoginCount", {}])
1144
1144
  * .to((event) => ({
@@ -1379,10 +1379,84 @@ var _this_ = ({ stream }) => ({
1379
1379
  });
1380
1380
  var _void_ = () => void 0;
1381
1381
 
1382
- // src/projection-builder.ts
1383
- function isProjection(x) {
1384
- return x != null && x._tag === "Projection";
1382
+ // src/act-builder.ts
1383
+ function act(states = /* @__PURE__ */ new Map(), registry = {
1384
+ actions: {},
1385
+ events: {}
1386
+ }, pendingProjections = []) {
1387
+ const builder = {
1388
+ withState: (state2) => {
1389
+ registerState(state2, states, registry.actions, registry.events);
1390
+ return act(
1391
+ states,
1392
+ registry,
1393
+ pendingProjections
1394
+ );
1395
+ },
1396
+ withSlice: (input) => {
1397
+ for (const s of input.states.values()) {
1398
+ registerState(s, states, registry.actions, registry.events);
1399
+ }
1400
+ for (const eventName of Object.keys(input.events)) {
1401
+ const sliceRegister = input.events[eventName];
1402
+ for (const [name, reaction] of sliceRegister.reactions) {
1403
+ registry.events[eventName].reactions.set(name, reaction);
1404
+ }
1405
+ }
1406
+ pendingProjections.push(...input.projections);
1407
+ return act(
1408
+ states,
1409
+ registry,
1410
+ pendingProjections
1411
+ );
1412
+ },
1413
+ withProjection: (proj) => {
1414
+ mergeProjection(proj, registry.events);
1415
+ return act(states, registry, pendingProjections);
1416
+ },
1417
+ on: (event) => ({
1418
+ do: (handler, options) => {
1419
+ const reaction = {
1420
+ handler,
1421
+ resolver: _this_,
1422
+ options: {
1423
+ blockOnError: options?.blockOnError ?? true,
1424
+ maxRetries: options?.maxRetries ?? 3
1425
+ }
1426
+ };
1427
+ const name = handler.name || `${String(event)}_${registry.events[event].reactions.size}`;
1428
+ registry.events[event].reactions.set(name, reaction);
1429
+ return {
1430
+ ...builder,
1431
+ to(resolver) {
1432
+ registry.events[event].reactions.set(name, {
1433
+ ...reaction,
1434
+ resolver: typeof resolver === "string" ? { target: resolver } : resolver
1435
+ });
1436
+ return builder;
1437
+ },
1438
+ void() {
1439
+ registry.events[event].reactions.set(name, {
1440
+ ...reaction,
1441
+ resolver: _void_
1442
+ });
1443
+ return builder;
1444
+ }
1445
+ };
1446
+ }
1447
+ }),
1448
+ build: () => {
1449
+ for (const proj of pendingProjections) {
1450
+ mergeProjection(proj, registry.events);
1451
+ }
1452
+ return new Act(registry, states);
1453
+ },
1454
+ events: registry.events
1455
+ };
1456
+ return builder;
1385
1457
  }
1458
+
1459
+ // src/projection-builder.ts
1386
1460
  function projection(target, events = {}) {
1387
1461
  const defaultResolver = target ? { target } : void 0;
1388
1462
  const builder = {
@@ -1444,12 +1518,9 @@ function projection(target, events = {}) {
1444
1518
  }
1445
1519
 
1446
1520
  // src/slice-builder.ts
1447
- function isSlice(x) {
1448
- return x != null && x._tag === "Slice";
1449
- }
1450
1521
  function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, projections = []) {
1451
1522
  const builder = {
1452
- with: (state2) => {
1523
+ withState: (state2) => {
1453
1524
  registerState(state2, states, actions, events);
1454
1525
  return slice(
1455
1526
  states,
@@ -1458,7 +1529,7 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
1458
1529
  projections
1459
1530
  );
1460
1531
  },
1461
- projection: (proj) => {
1532
+ withProjection: (proj) => {
1462
1533
  projections.push(proj);
1463
1534
  return slice(states, actions, events, projections);
1464
1535
  },
@@ -1504,94 +1575,6 @@ function slice(states = /* @__PURE__ */ new Map(), actions = {}, events = {}, pr
1504
1575
  return builder;
1505
1576
  }
1506
1577
 
1507
- // src/act-builder.ts
1508
- function act(states = /* @__PURE__ */ new Map(), registry = {
1509
- actions: {},
1510
- events: {}
1511
- }, pendingProjections = []) {
1512
- const builder = {
1513
- with: ((input) => {
1514
- if (isProjection(input)) {
1515
- mergeProjection(input, registry.events);
1516
- return act(
1517
- states,
1518
- registry,
1519
- pendingProjections
1520
- );
1521
- }
1522
- if (isSlice(input)) {
1523
- for (const s of input.states.values()) {
1524
- registerState(s, states, registry.actions, registry.events);
1525
- }
1526
- for (const eventName of Object.keys(input.events)) {
1527
- const sliceRegister = input.events[eventName];
1528
- for (const [name, reaction] of sliceRegister.reactions) {
1529
- registry.events[eventName].reactions.set(name, reaction);
1530
- }
1531
- }
1532
- pendingProjections.push(...input.projections);
1533
- return act(
1534
- states,
1535
- registry,
1536
- pendingProjections
1537
- );
1538
- }
1539
- registerState(input, states, registry.actions, registry.events);
1540
- return act(
1541
- states,
1542
- registry,
1543
- pendingProjections
1544
- );
1545
- }),
1546
- /**
1547
- * Adds a reaction to an event.
1548
- *
1549
- * @template K The type of event
1550
- * @param event The event to add a reaction to
1551
- * @returns The builder
1552
- */
1553
- on: (event) => ({
1554
- do: (handler, options) => {
1555
- const reaction = {
1556
- handler,
1557
- resolver: _this_,
1558
- options: {
1559
- blockOnError: options?.blockOnError ?? true,
1560
- maxRetries: options?.maxRetries ?? 3
1561
- }
1562
- };
1563
- const name = handler.name || `${String(event)}_${registry.events[event].reactions.size}`;
1564
- registry.events[event].reactions.set(name, reaction);
1565
- return {
1566
- ...builder,
1567
- to(resolver) {
1568
- registry.events[event].reactions.set(name, {
1569
- ...reaction,
1570
- resolver: typeof resolver === "string" ? { target: resolver } : resolver
1571
- });
1572
- return builder;
1573
- },
1574
- void() {
1575
- registry.events[event].reactions.set(name, {
1576
- ...reaction,
1577
- resolver: _void_
1578
- });
1579
- return builder;
1580
- }
1581
- };
1582
- }
1583
- }),
1584
- build: () => {
1585
- for (const proj of pendingProjections) {
1586
- mergeProjection(proj, registry.events);
1587
- }
1588
- return new Act(registry, states);
1589
- },
1590
- events: registry.events
1591
- };
1592
- return builder;
1593
- }
1594
-
1595
1578
  // src/state-builder.ts
1596
1579
  function state(entry) {
1597
1580
  const keys = Object.keys(entry);
@@ -1602,19 +1585,34 @@ function state(entry) {
1602
1585
  init(init) {
1603
1586
  return {
1604
1587
  emits(events) {
1605
- return {
1606
- patch(patch2) {
1588
+ const defaultPatch = Object.fromEntries(
1589
+ Object.keys(events).map((k) => [
1590
+ k,
1591
+ ({ data }) => data
1592
+ ])
1593
+ );
1594
+ const builder = action_builder({
1595
+ events,
1596
+ actions: {},
1597
+ state: stateSchema,
1598
+ name,
1599
+ init,
1600
+ patch: defaultPatch,
1601
+ on: {}
1602
+ });
1603
+ return Object.assign(builder, {
1604
+ patch(customPatch) {
1607
1605
  return action_builder({
1608
1606
  events,
1609
1607
  actions: {},
1610
1608
  state: stateSchema,
1611
1609
  name,
1612
1610
  init,
1613
- patch: patch2,
1611
+ patch: { ...defaultPatch, ...customPatch },
1614
1612
  on: {}
1615
1613
  });
1616
1614
  }
1617
- };
1615
+ });
1618
1616
  }
1619
1617
  };
1620
1618
  }
@@ -1637,7 +1635,12 @@ function action_builder(state2) {
1637
1635
  return { emit };
1638
1636
  }
1639
1637
  function emit(handler) {
1640
- on[action2] = handler;
1638
+ if (typeof handler === "string") {
1639
+ const eventName = handler;
1640
+ on[action2] = ((payload) => [eventName, payload]);
1641
+ } else {
1642
+ on[action2] = handler;
1643
+ }
1641
1644
  return action_builder({
1642
1645
  ...state2,
1643
1646
  actions,
@@ -1679,8 +1682,6 @@ export {
1679
1682
  dispose,
1680
1683
  disposeAndExit,
1681
1684
  extend,
1682
- isProjection,
1683
- isSlice,
1684
1685
  logger,
1685
1686
  patch,
1686
1687
  port,