@ersbeth/picoflow 2.2.0 → 2.3.1
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/README.md +23 -1
- package/SKILL.md +5 -0
- package/dist/picoflow.js +252 -132
- package/dist/types/api/base/flowConfig.d.ts +0 -1
- package/dist/types/api/base/flowDisposable.d.ts +0 -1
- package/dist/types/api/base/flowErrors.d.ts +1 -0
- package/dist/types/api/base/flowObservable.d.ts +0 -1
- package/dist/types/api/base/flowPrimitiveOptions.d.ts +14 -0
- package/dist/types/api/base/flowSubscribable.d.ts +0 -1
- package/dist/types/api/base/flowTracker.d.ts +0 -1
- package/dist/types/api/base/index.d.ts +2 -1
- package/dist/types/api/index.d.ts +0 -1
- package/dist/types/api/nodes/async/flowConstantAsync.d.ts +4 -3
- package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +3 -3
- package/dist/types/api/nodes/async/flowStateAsync.d.ts +4 -3
- package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +3 -2
- package/dist/types/api/nodes/async/index.d.ts +0 -1
- package/dist/types/api/nodes/collections/flowArray.d.ts +3 -2
- package/dist/types/api/nodes/collections/flowMap.d.ts +3 -2
- package/dist/types/api/nodes/collections/index.d.ts +0 -1
- package/dist/types/api/nodes/flowEffect.d.ts +0 -1
- package/dist/types/api/nodes/flowSignal.d.ts +3 -2
- package/dist/types/api/nodes/flowValue.d.ts +0 -1
- package/dist/types/api/nodes/index.d.ts +0 -1
- package/dist/types/api/nodes/sync/flowConstant.d.ts +3 -2
- package/dist/types/api/nodes/sync/flowDerivation.d.ts +3 -2
- package/dist/types/api/nodes/sync/flowState.d.ts +4 -3
- package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +3 -2
- package/dist/types/api/nodes/sync/index.d.ts +0 -1
- package/dist/types/api/nodes/utils.d.ts +0 -1
- package/dist/types/base/dependenciesRegistry.d.ts +1 -0
- package/dist/types/base/dependentsRegistry.d.ts +1 -0
- package/dist/types/base/disposable.d.ts +5 -1
- package/dist/types/base/errors.d.ts +31 -0
- package/dist/types/base/executionStack.d.ts +3 -11
- package/dist/types/base/index.d.ts +3 -1
- package/dist/types/base/node.d.ts +2 -3
- package/dist/types/base/observable.d.ts +1 -2
- package/dist/types/base/observer.d.ts +1 -2
- package/dist/types/converters/index.d.ts +0 -1
- package/dist/types/converters/solid.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/nodes/actionNode.d.ts +1 -23
- package/dist/types/nodes/arrayNode.d.ts +1 -26
- package/dist/types/nodes/effectNode.d.ts +1 -32
- package/dist/types/nodes/index.d.ts +0 -1
- package/dist/types/nodes/mapNode.d.ts +1 -20
- package/dist/types/nodes/signalNode.d.ts +1 -10
- package/dist/types/nodes/valueAsyncNode.d.ts +1 -23
- package/dist/types/nodes/valueNode.d.ts +1 -27
- package/dist/types/nodes/valueSyncNode.d.ts +1 -23
- package/dist/types/schedulers/asyncResolver.d.ts +1 -19
- package/dist/types/schedulers/asyncScheduler.d.ts +1 -21
- package/dist/types/schedulers/index.d.ts +0 -1
- package/dist/types/schedulers/pendingError.d.ts +1 -9
- package/dist/types/schedulers/scheduler.d.ts +1 -10
- package/dist/types/schedulers/syncResolver.d.ts +1 -18
- package/dist/types/schedulers/syncScheduler.d.ts +1 -19
- package/package.json +11 -23
- package/dist/types/api/base/flowConfig.d.ts.map +0 -1
- package/dist/types/api/base/flowDisposable.d.ts.map +0 -1
- package/dist/types/api/base/flowObservable.d.ts.map +0 -1
- package/dist/types/api/base/flowSubscribable.d.ts.map +0 -1
- package/dist/types/api/base/flowTracker.d.ts.map +0 -1
- package/dist/types/api/base/index.d.ts.map +0 -1
- package/dist/types/api/index.d.ts.map +0 -1
- package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +0 -1
- package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +0 -1
- package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +0 -1
- package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +0 -1
- package/dist/types/api/nodes/async/index.d.ts.map +0 -1
- package/dist/types/api/nodes/collections/flowArray.d.ts.map +0 -1
- package/dist/types/api/nodes/collections/flowMap.d.ts.map +0 -1
- package/dist/types/api/nodes/collections/index.d.ts.map +0 -1
- package/dist/types/api/nodes/flowEffect.d.ts.map +0 -1
- package/dist/types/api/nodes/flowSignal.d.ts.map +0 -1
- package/dist/types/api/nodes/flowValue.d.ts.map +0 -1
- package/dist/types/api/nodes/index.d.ts.map +0 -1
- package/dist/types/api/nodes/sync/flowConstant.d.ts.map +0 -1
- package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +0 -1
- package/dist/types/api/nodes/sync/flowState.d.ts.map +0 -1
- package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +0 -1
- package/dist/types/api/nodes/sync/index.d.ts.map +0 -1
- package/dist/types/api/nodes/utils.d.ts.map +0 -1
- package/dist/types/base/disposable.d.ts.map +0 -1
- package/dist/types/base/executionStack.d.ts.map +0 -1
- package/dist/types/base/index.d.ts.map +0 -1
- package/dist/types/base/node.d.ts.map +0 -1
- package/dist/types/base/observable.d.ts.map +0 -1
- package/dist/types/base/observer.d.ts.map +0 -1
- package/dist/types/converters/index.d.ts.map +0 -1
- package/dist/types/converters/solid.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/nodes/actionNode.d.ts.map +0 -1
- package/dist/types/nodes/arrayNode.d.ts.map +0 -1
- package/dist/types/nodes/effectNode.d.ts.map +0 -1
- package/dist/types/nodes/index.d.ts.map +0 -1
- package/dist/types/nodes/mapNode.d.ts.map +0 -1
- package/dist/types/nodes/signalNode.d.ts.map +0 -1
- package/dist/types/nodes/valueAsyncNode.d.ts.map +0 -1
- package/dist/types/nodes/valueNode.d.ts.map +0 -1
- package/dist/types/nodes/valueSyncNode.d.ts.map +0 -1
- package/dist/types/schedulers/asyncResolver.d.ts.map +0 -1
- package/dist/types/schedulers/asyncScheduler.d.ts.map +0 -1
- package/dist/types/schedulers/index.d.ts.map +0 -1
- package/dist/types/schedulers/pendingError.d.ts.map +0 -1
- package/dist/types/schedulers/scheduler.d.ts.map +0 -1
- package/dist/types/schedulers/syncResolver.d.ts.map +0 -1
- 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.
|
|
@@ -34,7 +56,7 @@ pnpm test # watch Node tests
|
|
|
34
56
|
pnpm test:browser # watch browser tests
|
|
35
57
|
```
|
|
36
58
|
|
|
37
|
-
See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full setup, the conventions and the release procedure. Known issues and their status are tracked in [`audits/FINDINGS.md`](audits/FINDINGS.md); planned breaking changes in [`ROADMAP.md`](ROADMAP.md); vulnerability reporting in [`SECURITY.md`](SECURITY.md).
|
|
59
|
+
See [`CONTRIBUTING.md`](../../CONTRIBUTING.md) for the full setup, the conventions and the release procedure. Known issues and their status are tracked in [`audits/FINDINGS.md`](../../audits/FINDINGS.md); planned breaking changes in [`ROADMAP.md`](../../ROADMAP.md); vulnerability reporting in [`SECURITY.md`](../../SECURITY.md).
|
|
38
60
|
|
|
39
61
|
## AI Coding Agents
|
|
40
62
|
|
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
|
|