@ersbeth/picoflow 2.2.0 → 2.3.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.
Files changed (109) hide show
  1. package/README.md +22 -0
  2. package/SKILL.md +5 -0
  3. package/dist/picoflow.js +252 -131
  4. package/dist/types/api/base/flowConfig.d.ts +0 -1
  5. package/dist/types/api/base/flowDisposable.d.ts +0 -1
  6. package/dist/types/api/base/flowErrors.d.ts +1 -0
  7. package/dist/types/api/base/flowObservable.d.ts +0 -1
  8. package/dist/types/api/base/flowPrimitiveOptions.d.ts +14 -0
  9. package/dist/types/api/base/flowSubscribable.d.ts +0 -1
  10. package/dist/types/api/base/flowTracker.d.ts +0 -1
  11. package/dist/types/api/base/index.d.ts +2 -1
  12. package/dist/types/api/index.d.ts +0 -1
  13. package/dist/types/api/nodes/async/flowConstantAsync.d.ts +4 -3
  14. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +3 -3
  15. package/dist/types/api/nodes/async/flowStateAsync.d.ts +4 -3
  16. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +3 -2
  17. package/dist/types/api/nodes/async/index.d.ts +0 -1
  18. package/dist/types/api/nodes/collections/flowArray.d.ts +3 -2
  19. package/dist/types/api/nodes/collections/flowMap.d.ts +3 -2
  20. package/dist/types/api/nodes/collections/index.d.ts +0 -1
  21. package/dist/types/api/nodes/flowEffect.d.ts +0 -1
  22. package/dist/types/api/nodes/flowSignal.d.ts +3 -2
  23. package/dist/types/api/nodes/flowValue.d.ts +0 -1
  24. package/dist/types/api/nodes/index.d.ts +0 -1
  25. package/dist/types/api/nodes/sync/flowConstant.d.ts +3 -2
  26. package/dist/types/api/nodes/sync/flowDerivation.d.ts +3 -2
  27. package/dist/types/api/nodes/sync/flowState.d.ts +4 -3
  28. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +3 -2
  29. package/dist/types/api/nodes/sync/index.d.ts +0 -1
  30. package/dist/types/api/nodes/utils.d.ts +0 -1
  31. package/dist/types/base/dependenciesRegistry.d.ts +1 -0
  32. package/dist/types/base/dependentsRegistry.d.ts +1 -0
  33. package/dist/types/base/disposable.d.ts +5 -1
  34. package/dist/types/base/errors.d.ts +31 -0
  35. package/dist/types/base/executionStack.d.ts +3 -11
  36. package/dist/types/base/index.d.ts +3 -1
  37. package/dist/types/base/node.d.ts +2 -3
  38. package/dist/types/base/observable.d.ts +1 -2
  39. package/dist/types/base/observer.d.ts +1 -2
  40. package/dist/types/converters/index.d.ts +0 -1
  41. package/dist/types/converters/solid.d.ts +0 -1
  42. package/dist/types/index.d.ts +0 -1
  43. package/dist/types/nodes/actionNode.d.ts +1 -23
  44. package/dist/types/nodes/arrayNode.d.ts +1 -26
  45. package/dist/types/nodes/effectNode.d.ts +1 -32
  46. package/dist/types/nodes/index.d.ts +0 -1
  47. package/dist/types/nodes/mapNode.d.ts +1 -20
  48. package/dist/types/nodes/signalNode.d.ts +1 -10
  49. package/dist/types/nodes/valueAsyncNode.d.ts +1 -23
  50. package/dist/types/nodes/valueNode.d.ts +1 -27
  51. package/dist/types/nodes/valueSyncNode.d.ts +1 -23
  52. package/dist/types/schedulers/asyncResolver.d.ts +1 -19
  53. package/dist/types/schedulers/asyncScheduler.d.ts +1 -21
  54. package/dist/types/schedulers/index.d.ts +0 -1
  55. package/dist/types/schedulers/pendingError.d.ts +1 -9
  56. package/dist/types/schedulers/scheduler.d.ts +1 -10
  57. package/dist/types/schedulers/syncResolver.d.ts +1 -18
  58. package/dist/types/schedulers/syncScheduler.d.ts +1 -19
  59. package/package.json +10 -8
  60. package/dist/types/api/base/flowConfig.d.ts.map +0 -1
  61. package/dist/types/api/base/flowDisposable.d.ts.map +0 -1
  62. package/dist/types/api/base/flowObservable.d.ts.map +0 -1
  63. package/dist/types/api/base/flowSubscribable.d.ts.map +0 -1
  64. package/dist/types/api/base/flowTracker.d.ts.map +0 -1
  65. package/dist/types/api/base/index.d.ts.map +0 -1
  66. package/dist/types/api/index.d.ts.map +0 -1
  67. package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +0 -1
  68. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +0 -1
  69. package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +0 -1
  70. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +0 -1
  71. package/dist/types/api/nodes/async/index.d.ts.map +0 -1
  72. package/dist/types/api/nodes/collections/flowArray.d.ts.map +0 -1
  73. package/dist/types/api/nodes/collections/flowMap.d.ts.map +0 -1
  74. package/dist/types/api/nodes/collections/index.d.ts.map +0 -1
  75. package/dist/types/api/nodes/flowEffect.d.ts.map +0 -1
  76. package/dist/types/api/nodes/flowSignal.d.ts.map +0 -1
  77. package/dist/types/api/nodes/flowValue.d.ts.map +0 -1
  78. package/dist/types/api/nodes/index.d.ts.map +0 -1
  79. package/dist/types/api/nodes/sync/flowConstant.d.ts.map +0 -1
  80. package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +0 -1
  81. package/dist/types/api/nodes/sync/flowState.d.ts.map +0 -1
  82. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +0 -1
  83. package/dist/types/api/nodes/sync/index.d.ts.map +0 -1
  84. package/dist/types/api/nodes/utils.d.ts.map +0 -1
  85. package/dist/types/base/disposable.d.ts.map +0 -1
  86. package/dist/types/base/executionStack.d.ts.map +0 -1
  87. package/dist/types/base/index.d.ts.map +0 -1
  88. package/dist/types/base/node.d.ts.map +0 -1
  89. package/dist/types/base/observable.d.ts.map +0 -1
  90. package/dist/types/base/observer.d.ts.map +0 -1
  91. package/dist/types/converters/index.d.ts.map +0 -1
  92. package/dist/types/converters/solid.d.ts.map +0 -1
  93. package/dist/types/index.d.ts.map +0 -1
  94. package/dist/types/nodes/actionNode.d.ts.map +0 -1
  95. package/dist/types/nodes/arrayNode.d.ts.map +0 -1
  96. package/dist/types/nodes/effectNode.d.ts.map +0 -1
  97. package/dist/types/nodes/index.d.ts.map +0 -1
  98. package/dist/types/nodes/mapNode.d.ts.map +0 -1
  99. package/dist/types/nodes/signalNode.d.ts.map +0 -1
  100. package/dist/types/nodes/valueAsyncNode.d.ts.map +0 -1
  101. package/dist/types/nodes/valueNode.d.ts.map +0 -1
  102. package/dist/types/nodes/valueSyncNode.d.ts.map +0 -1
  103. package/dist/types/schedulers/asyncResolver.d.ts.map +0 -1
  104. package/dist/types/schedulers/asyncScheduler.d.ts.map +0 -1
  105. package/dist/types/schedulers/index.d.ts.map +0 -1
  106. package/dist/types/schedulers/pendingError.d.ts.map +0 -1
  107. package/dist/types/schedulers/scheduler.d.ts.map +0 -1
  108. package/dist/types/schedulers/syncResolver.d.ts.map +0 -1
  109. package/dist/types/schedulers/syncScheduler.d.ts.map +0 -1
package/README.md CHANGED
@@ -4,6 +4,28 @@
4
4
 
5
5
  > **Upgrading from v1.x?** See the [Upgrade Guide](https://ersbeth-web.gitlab.io/picoflow/guide/advanced/migration-v2.html) for migration instructions.
6
6
 
7
+ ```typescript
8
+ import { derivation, state, subscribe } from "@ersbeth/picoflow";
9
+
10
+ const $count = state(0);
11
+ const $isEven = derivation((t) => $count.get(t) % 2 === 0);
12
+
13
+ const effect = subscribe(
14
+ (t) => ({ count: $count.get(t), even: $isEven.get(t) }),
15
+ ({ count, even }) => console.log(`${count} is ${even ? "even" : "odd"}`),
16
+ );
17
+ // logs "0 is even"
18
+
19
+ $count.set(1); // logs "1 is odd"
20
+ effect.dispose(); // stop reacting
21
+ ```
22
+
23
+ Dependencies are tracked explicitly: `$count.get(t)` both reads the value and registers it as a
24
+ dependency of the enclosing `derivation`/`subscribe`, using the `t` (tracker) each one receives. Nothing
25
+ is tracked implicitly and there is no `untrack()` to opt back out of — if a read doesn't go through
26
+ `.get(t)`, it isn't a dependency. That is the library's main departure from most reactive libraries, and
27
+ its main safety property: what an effect depends on is always visible at the call site.
28
+
7
29
  ## Requirements
8
30
 
9
31
  The schedulers use `Promise.withResolvers()`, so picoflow needs **Node ≥ 22**, or Chrome ≥ 119, Safari ≥ 17.4, Firefox ≥ 121 in the browser. There is no fallback: on an older runtime the failure is immediate, on the first primitive you create.
package/SKILL.md CHANGED
@@ -24,6 +24,11 @@ dependency, which is a common source of "why doesn't this update" bugs.
24
24
 
25
25
  Reactive values are named with a `$` prefix (`$count`, `$user`) by convention — keep this when writing
26
26
  new code in a PicoFlow codebase, and use it to tell reactive values apart from plain ones at a glance.
27
+ Every factory also takes an optional trailing `{ name?: string }`, e.g. `state(0, { name: "$count" })` —
28
+ pass the same `$`-prefixed name so it shows up in error messages (`[PicoFlow] Primitive "$count" is
29
+ disposed`) instead of the unnamed generic message. Errors are also typed (`PicoFlowDisposedError`,
30
+ `PicoFlowCycleError`, `PicoFlowInternalError`, all extending `PicoFlowError`), so `catch` blocks can
31
+ discriminate with `instanceof` instead of matching on message text.
27
32
 
28
33
  ## Choosing a primitive
29
34