@ersbeth/picoflow 1.1.2 → 2.0.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/.vscode/settings.json +3 -3
- package/CHANGELOG.md +43 -0
- package/README.md +2 -18
- package/biome.json +45 -35
- package/dist/picoflow.js +856 -1530
- package/dist/types/api/base/flowDisposable.d.ts +41 -0
- package/dist/types/api/base/flowDisposable.d.ts.map +1 -0
- package/dist/types/api/base/flowObservable.d.ts +27 -0
- package/dist/types/api/base/flowObservable.d.ts.map +1 -0
- package/dist/types/api/base/flowSubscribable.d.ts +79 -0
- package/dist/types/api/base/flowSubscribable.d.ts.map +1 -0
- package/dist/types/api/base/flowTracker.d.ts +8 -0
- package/dist/types/api/base/flowTracker.d.ts.map +1 -0
- package/dist/types/api/base/index.d.ts +5 -0
- package/dist/types/api/base/index.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +3 -0
- package/dist/types/api/index.d.ts.map +1 -0
- package/dist/types/api/nodes/async/flowConstantAsync.d.ts +31 -0
- package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +1 -0
- package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +37 -0
- package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +1 -0
- package/dist/types/api/nodes/async/flowStateAsync.d.ts +41 -0
- package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +1 -0
- package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +30 -0
- package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +1 -0
- package/dist/types/{flow → api}/nodes/async/index.d.ts +1 -2
- package/dist/types/api/nodes/async/index.d.ts.map +1 -0
- package/dist/types/api/nodes/collections/flowArray.d.ts +134 -0
- package/dist/types/api/nodes/collections/flowArray.d.ts.map +1 -0
- package/dist/types/api/nodes/collections/flowMap.d.ts +98 -0
- package/dist/types/api/nodes/collections/flowMap.d.ts.map +1 -0
- package/dist/types/api/nodes/collections/index.d.ts.map +1 -0
- package/dist/types/api/nodes/flowEffect.d.ts +28 -0
- package/dist/types/api/nodes/flowEffect.d.ts.map +1 -0
- package/dist/types/api/nodes/flowSignal.d.ts +25 -0
- package/dist/types/api/nodes/flowSignal.d.ts.map +1 -0
- package/dist/types/api/nodes/flowValue.d.ts +35 -0
- package/dist/types/api/nodes/flowValue.d.ts.map +1 -0
- package/dist/types/api/nodes/index.d.ts +8 -0
- package/dist/types/api/nodes/index.d.ts.map +1 -0
- package/dist/types/api/nodes/sync/flowConstant.d.ts +29 -0
- package/dist/types/api/nodes/sync/flowConstant.d.ts.map +1 -0
- package/dist/types/api/nodes/sync/flowDerivation.d.ts +36 -0
- package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +1 -0
- package/dist/types/api/nodes/sync/flowState.d.ts +39 -0
- package/dist/types/api/nodes/sync/flowState.d.ts.map +1 -0
- package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +28 -0
- package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +1 -0
- package/dist/types/{flow → api}/nodes/sync/index.d.ts +1 -2
- package/dist/types/api/nodes/sync/index.d.ts.map +1 -0
- package/dist/types/api/nodes/utils.d.ts +22 -0
- package/dist/types/api/nodes/utils.d.ts.map +1 -0
- package/dist/types/base/disposable.d.ts +11 -0
- package/dist/types/base/disposable.d.ts.map +1 -0
- package/dist/types/base/executionStack.d.ts +14 -0
- package/dist/types/base/executionStack.d.ts.map +1 -0
- package/dist/types/base/index.d.ts +6 -0
- package/dist/types/base/index.d.ts.map +1 -0
- package/dist/types/base/node.d.ts +27 -0
- package/dist/types/base/node.d.ts.map +1 -0
- package/dist/types/base/observable.d.ts +37 -0
- package/dist/types/base/observable.d.ts.map +1 -0
- package/dist/types/base/observer.d.ts +25 -0
- package/dist/types/base/observer.d.ts.map +1 -0
- package/dist/types/converters/index.d.ts +2 -0
- package/dist/types/converters/index.d.ts.map +1 -0
- package/dist/types/converters/solid.d.ts +46 -0
- package/dist/types/converters/solid.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -63
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/nodes/arrayNode.d.ts +2 -0
- package/dist/types/nodes/arrayNode.d.ts.map +1 -0
- package/dist/types/nodes/effectNode.d.ts +2 -0
- package/dist/types/nodes/effectNode.d.ts.map +1 -0
- package/dist/types/nodes/index.d.ts +9 -0
- package/dist/types/nodes/index.d.ts.map +1 -0
- package/dist/types/nodes/mapNode.d.ts +2 -0
- package/dist/types/nodes/mapNode.d.ts.map +1 -0
- package/dist/types/nodes/signalNode.d.ts +2 -0
- package/dist/types/nodes/signalNode.d.ts.map +1 -0
- package/dist/types/nodes/valueAsyncNode.d.ts +2 -0
- package/dist/types/nodes/valueAsyncNode.d.ts.map +1 -0
- package/dist/types/nodes/valueNode.d.ts +2 -0
- package/dist/types/nodes/valueNode.d.ts.map +1 -0
- package/dist/types/nodes/valueSyncNode.d.ts +2 -0
- package/dist/types/nodes/valueSyncNode.d.ts.map +1 -0
- package/dist/types/schedulers/asyncResolver.d.ts +2 -0
- package/dist/types/schedulers/asyncResolver.d.ts.map +1 -0
- package/dist/types/schedulers/asyncScheduler.d.ts +2 -0
- package/dist/types/schedulers/asyncScheduler.d.ts.map +1 -0
- package/dist/types/schedulers/index.d.ts +5 -0
- package/dist/types/schedulers/index.d.ts.map +1 -0
- package/dist/types/schedulers/pendingError.d.ts +2 -0
- package/dist/types/schedulers/pendingError.d.ts.map +1 -0
- package/dist/types/schedulers/scheduler.d.ts +2 -0
- package/dist/types/schedulers/scheduler.d.ts.map +1 -0
- package/dist/types/schedulers/syncResolver.d.ts +2 -0
- package/dist/types/schedulers/syncResolver.d.ts.map +1 -0
- package/dist/types/schedulers/syncScheduler.d.ts +2 -0
- package/dist/types/schedulers/syncScheduler.d.ts.map +1 -0
- package/docs/.vitepress/config.mts +128 -93
- package/docs/api/functions/array.md +14 -37
- package/docs/api/functions/constant.md +13 -25
- package/docs/api/functions/constantAsync.md +69 -0
- package/docs/api/functions/derivation.md +14 -33
- package/docs/api/functions/derivationAsync.md +34 -0
- package/docs/api/functions/from.md +62 -153
- package/docs/api/functions/isDisposable.md +8 -30
- package/docs/api/functions/map.md +15 -36
- package/docs/api/functions/signal.md +8 -23
- package/docs/api/functions/state.md +43 -23
- package/docs/api/functions/stateAsync.md +69 -0
- package/docs/api/functions/subscribe.md +40 -0
- package/docs/api/functions/writableDerivation.md +33 -0
- package/docs/api/functions/writableDerivationAsync.md +34 -0
- package/docs/api/index.md +45 -102
- package/docs/api/interfaces/FlowArray.md +439 -0
- package/docs/api/interfaces/FlowConstant.md +220 -0
- package/docs/api/interfaces/FlowConstantAsync.md +221 -0
- package/docs/api/interfaces/FlowDerivation.md +241 -0
- package/docs/api/interfaces/FlowDerivationAsync.md +242 -0
- package/docs/api/interfaces/FlowDisposable.md +32 -38
- package/docs/api/interfaces/FlowEffect.md +64 -0
- package/docs/api/interfaces/FlowMap.md +374 -0
- package/docs/api/interfaces/FlowObservable.md +155 -0
- package/docs/api/interfaces/FlowSignal.md +156 -0
- package/docs/api/interfaces/FlowState.md +269 -0
- package/docs/api/interfaces/FlowStateAsync.md +268 -0
- package/docs/api/interfaces/FlowSubscribable.md +55 -0
- package/docs/api/interfaces/FlowTracker.md +61 -0
- package/docs/api/interfaces/FlowValue.md +222 -0
- package/docs/api/interfaces/FlowWritableDerivation.md +292 -0
- package/docs/api/interfaces/FlowWritableDerivationAsync.md +293 -0
- package/docs/api/type-aliases/DerivationFunction.md +28 -0
- package/docs/api/type-aliases/DerivationFunctionAsync.md +28 -0
- package/docs/api/type-aliases/FlowArrayAction.md +19 -8
- package/docs/api/type-aliases/FlowDataTracker.md +33 -0
- package/docs/api/type-aliases/FlowMapAction.md +48 -0
- package/docs/api/type-aliases/FlowOnDataListener.md +33 -0
- package/docs/api/type-aliases/FlowOnErrorListener.md +27 -0
- package/docs/api/type-aliases/FlowOnPendingListener.md +21 -0
- package/docs/api/type-aliases/FlowReadonly.md +22 -0
- package/docs/api/type-aliases/InitFunction.md +21 -0
- package/docs/api/type-aliases/InitFunctionAsync.md +21 -0
- package/docs/api/type-aliases/NotPromise.md +6 -3
- package/docs/api/type-aliases/UpdateFunction.md +27 -0
- package/docs/api/type-aliases/UpdateFunctionAsync.md +27 -0
- package/docs/api/typedoc-sidebar.json +1 -81
- package/docs/examples/examples.md +0 -2
- package/docs/guide/advanced/architecture.md +1234 -0
- package/docs/guide/advanced/migration-v2.md +204 -0
- package/docs/guide/advanced/solidjs.md +2 -88
- package/docs/guide/introduction/concepts.md +4 -3
- package/docs/guide/introduction/conventions.md +2 -33
- package/docs/guide/introduction/getting-started.md +28 -23
- package/docs/guide/introduction/lifecycle.md +16 -19
- package/docs/guide/primitives/array.md +102 -216
- package/docs/guide/primitives/constant.md +39 -212
- package/docs/guide/primitives/derivations.md +55 -122
- package/docs/guide/primitives/effects.md +155 -241
- package/docs/guide/primitives/map.md +64 -186
- package/docs/guide/primitives/overview.md +45 -128
- package/docs/guide/primitives/signal.md +51 -88
- package/docs/guide/primitives/state.md +34 -130
- package/package.json +56 -60
- package/src/api/base/flowDisposable.ts +44 -0
- package/src/api/base/flowObservable.ts +28 -0
- package/src/api/base/flowSubscribable.ts +87 -0
- package/src/api/base/flowTracker.ts +7 -0
- package/src/api/base/index.ts +4 -0
- package/src/{flow → api}/index.ts +0 -1
- package/src/api/nodes/async/flowConstantAsync.ts +36 -0
- package/src/api/nodes/async/flowDerivationAsync.ts +42 -0
- package/src/api/nodes/async/flowStateAsync.ts +47 -0
- package/src/api/nodes/async/flowWritableDerivationAsync.ts +33 -0
- package/src/{flow → api}/nodes/async/index.ts +1 -2
- package/src/api/nodes/collections/flowArray.ts +155 -0
- package/src/api/nodes/collections/flowMap.ts +115 -0
- package/src/api/nodes/flowEffect.ts +42 -0
- package/src/api/nodes/flowSignal.ts +28 -0
- package/src/api/nodes/flowValue.ts +36 -0
- package/src/api/nodes/index.ts +7 -0
- package/src/api/nodes/sync/flowConstant.ts +33 -0
- package/src/api/nodes/sync/flowDerivation.ts +41 -0
- package/src/api/nodes/sync/flowState.ts +45 -0
- package/src/api/nodes/sync/flowWritableDerivation.ts +31 -0
- package/src/{flow → api}/nodes/sync/index.ts +1 -2
- package/src/api/nodes/utils.ts +22 -0
- package/src/base/disposable.ts +18 -0
- package/src/base/executionStack.ts +42 -0
- package/src/base/index.ts +5 -0
- package/src/base/node.ts +98 -0
- package/src/base/observable.ts +87 -0
- package/src/base/observer.ts +51 -0
- package/src/converters/index.ts +1 -0
- package/src/converters/solid.ts +109 -0
- package/src/index.ts +2 -64
- package/src/nodes/arrayNode.ts +172 -0
- package/src/nodes/effectNode.ts +59 -0
- package/src/nodes/index.ts +8 -0
- package/src/nodes/mapNode.ts +127 -0
- package/src/nodes/signalNode.ts +21 -0
- package/src/nodes/valueAsyncNode.ts +88 -0
- package/src/nodes/valueNode.ts +144 -0
- package/src/nodes/valueSyncNode.ts +128 -0
- package/src/schedulers/asyncResolver.ts +78 -0
- package/src/schedulers/asyncScheduler.ts +66 -0
- package/src/schedulers/index.ts +4 -0
- package/src/schedulers/pendingError.ts +13 -0
- package/src/schedulers/scheduler.ts +9 -0
- package/src/schedulers/syncResolver.ts +69 -0
- package/src/schedulers/syncScheduler.ts +55 -0
- package/test/base/pendingError.test.ts +67 -0
- package/test/converters/solid.derivation.browser.test.tsx +69 -0
- package/test/converters/solid.node.test.ts +654 -0
- package/test/converters/solid.state.browser.test.tsx +1592 -0
- package/test/reactivity/flowSignal.test.ts +226 -0
- package/test/reactivity/nodes/async/asyncScheduler/asyncResolver.test.ts +593 -0
- package/test/reactivity/nodes/async/asyncScheduler/asyncScheduler.test.ts +317 -0
- package/test/reactivity/nodes/async/flowConstantAsync.test.ts +652 -0
- package/test/reactivity/nodes/async/flowDerivation.test.ts +898 -0
- package/test/reactivity/nodes/async/flowDerivationAsync.test.ts +1716 -0
- package/test/reactivity/nodes/async/flowStateAsync.test.ts +708 -0
- package/test/reactivity/nodes/async/flowWritableDerivationAsync.test.ts +614 -0
- package/test/reactivity/nodes/collections/flowArray.asyncStates.test.ts +1289 -0
- package/test/reactivity/nodes/collections/flowArray.scalars.test.ts +961 -0
- package/test/reactivity/nodes/collections/flowArray.states.test.ts +1035 -0
- package/test/reactivity/nodes/collections/flowMap.asyncStates.test.ts +960 -0
- package/test/reactivity/nodes/collections/flowMap.scalars.test.ts +775 -0
- package/test/reactivity/nodes/collections/flowMap.states.test.ts +958 -0
- package/test/reactivity/nodes/sync/flowConstant.test.ts +377 -0
- package/test/reactivity/nodes/sync/flowDerivation.test.ts +896 -0
- package/test/reactivity/nodes/sync/flowState.test.ts +341 -0
- package/test/reactivity/nodes/sync/flowWritableDerivation.test.ts +603 -0
- package/test/vitest.d.ts +10 -0
- package/tsconfig.json +31 -20
- package/typedoc.json +35 -35
- package/vite.config.ts +25 -23
- package/vitest.browser.config.ts +21 -0
- package/vitest.config.ts +12 -12
- package/.cursor/plans/unifier-flowresource-avec-flowderivation-c9506e24.plan.md +0 -372
- package/.cursor/plans/update-js-e795d61b.plan.md +0 -567
- package/dist/types/flow/base/flowDisposable.d.ts +0 -67
- package/dist/types/flow/base/flowDisposable.d.ts.map +0 -1
- package/dist/types/flow/base/flowEffect.d.ts +0 -127
- package/dist/types/flow/base/flowEffect.d.ts.map +0 -1
- package/dist/types/flow/base/flowGraph.d.ts +0 -97
- package/dist/types/flow/base/flowGraph.d.ts.map +0 -1
- package/dist/types/flow/base/flowSignal.d.ts +0 -134
- package/dist/types/flow/base/flowSignal.d.ts.map +0 -1
- package/dist/types/flow/base/flowTracker.d.ts +0 -15
- package/dist/types/flow/base/flowTracker.d.ts.map +0 -1
- package/dist/types/flow/base/index.d.ts +0 -7
- package/dist/types/flow/base/index.d.ts.map +0 -1
- package/dist/types/flow/base/utils.d.ts +0 -20
- package/dist/types/flow/base/utils.d.ts.map +0 -1
- package/dist/types/flow/collections/flowArray.d.ts +0 -148
- package/dist/types/flow/collections/flowArray.d.ts.map +0 -1
- package/dist/types/flow/collections/flowMap.d.ts +0 -224
- package/dist/types/flow/collections/flowMap.d.ts.map +0 -1
- package/dist/types/flow/collections/index.d.ts.map +0 -1
- package/dist/types/flow/index.d.ts +0 -4
- package/dist/types/flow/index.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/flowConstantAsync.d.ts +0 -137
- package/dist/types/flow/nodes/async/flowConstantAsync.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts +0 -137
- package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/flowNodeAsync.d.ts +0 -343
- package/dist/types/flow/nodes/async/flowNodeAsync.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts +0 -81
- package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/flowStateAsync.d.ts +0 -111
- package/dist/types/flow/nodes/async/flowStateAsync.d.ts.map +0 -1
- package/dist/types/flow/nodes/async/index.d.ts.map +0 -1
- package/dist/types/flow/nodes/index.d.ts +0 -3
- package/dist/types/flow/nodes/index.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/flowConstant.d.ts +0 -108
- package/dist/types/flow/nodes/sync/flowConstant.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/flowDerivation.d.ts +0 -100
- package/dist/types/flow/nodes/sync/flowDerivation.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/flowNode.d.ts +0 -314
- package/dist/types/flow/nodes/sync/flowNode.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/flowReadonly.d.ts +0 -57
- package/dist/types/flow/nodes/sync/flowReadonly.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/flowState.d.ts +0 -96
- package/dist/types/flow/nodes/sync/flowState.d.ts.map +0 -1
- package/dist/types/flow/nodes/sync/index.d.ts.map +0 -1
- package/dist/types/solid/converters.d.ts +0 -57
- package/dist/types/solid/converters.d.ts.map +0 -1
- package/dist/types/solid/index.d.ts +0 -3
- package/dist/types/solid/index.d.ts.map +0 -1
- package/dist/types/solid/primitives.d.ts +0 -181
- package/dist/types/solid/primitives.d.ts.map +0 -1
- package/docs/api/classes/FlowArray.md +0 -489
- package/docs/api/classes/FlowConstant.md +0 -350
- package/docs/api/classes/FlowDerivation.md +0 -334
- package/docs/api/classes/FlowEffect.md +0 -100
- package/docs/api/classes/FlowMap.md +0 -512
- package/docs/api/classes/FlowObservable.md +0 -306
- package/docs/api/classes/FlowResource.md +0 -380
- package/docs/api/classes/FlowResourceAsync.md +0 -362
- package/docs/api/classes/FlowSignal.md +0 -160
- package/docs/api/classes/FlowState.md +0 -368
- package/docs/api/classes/FlowStream.md +0 -367
- package/docs/api/classes/FlowStreamAsync.md +0 -364
- package/docs/api/classes/SolidDerivation.md +0 -75
- package/docs/api/classes/SolidResource.md +0 -91
- package/docs/api/classes/SolidState.md +0 -71
- package/docs/api/classes/TrackingContext.md +0 -33
- package/docs/api/functions/effect.md +0 -49
- package/docs/api/functions/resource.md +0 -52
- package/docs/api/functions/resourceAsync.md +0 -50
- package/docs/api/functions/stream.md +0 -53
- package/docs/api/functions/streamAsync.md +0 -50
- package/docs/api/interfaces/SolidObservable.md +0 -19
- package/docs/api/type-aliases/FlowStreamDisposer.md +0 -15
- package/docs/api/type-aliases/FlowStreamSetter.md +0 -27
- package/docs/api/type-aliases/FlowStreamUpdater.md +0 -32
- package/docs/api/type-aliases/SolidGetter.md +0 -17
- package/docs/guide/primitives/resources.md +0 -858
- package/docs/guide/primitives/streams.md +0 -931
- package/src/flow/base/flowDisposable.ts +0 -71
- package/src/flow/base/flowEffect.ts +0 -171
- package/src/flow/base/flowGraph.ts +0 -288
- package/src/flow/base/flowSignal.ts +0 -207
- package/src/flow/base/flowTracker.ts +0 -17
- package/src/flow/base/index.ts +0 -6
- package/src/flow/base/utils.ts +0 -19
- package/src/flow/collections/flowArray.ts +0 -409
- package/src/flow/collections/flowMap.ts +0 -398
- package/src/flow/nodes/async/flowConstantAsync.ts +0 -142
- package/src/flow/nodes/async/flowDerivationAsync.ts +0 -143
- package/src/flow/nodes/async/flowNodeAsync.ts +0 -474
- package/src/flow/nodes/async/flowReadonlyAsync.ts +0 -81
- package/src/flow/nodes/async/flowStateAsync.ts +0 -116
- package/src/flow/nodes/await/advanced/index.ts +0 -5
- package/src/flow/nodes/await/advanced/resource.ts +0 -134
- package/src/flow/nodes/await/advanced/resourceAsync.ts +0 -109
- package/src/flow/nodes/await/advanced/stream.ts +0 -188
- package/src/flow/nodes/await/advanced/streamAsync.ts +0 -176
- package/src/flow/nodes/await/flowConstantAwait.ts +0 -154
- package/src/flow/nodes/await/flowDerivationAwait.ts +0 -154
- package/src/flow/nodes/await/flowNodeAwait.ts +0 -508
- package/src/flow/nodes/await/flowReadonlyAwait.ts +0 -89
- package/src/flow/nodes/await/flowStateAwait.ts +0 -130
- package/src/flow/nodes/await/index.ts +0 -5
- package/src/flow/nodes/index.ts +0 -3
- package/src/flow/nodes/sync/flowConstant.ts +0 -111
- package/src/flow/nodes/sync/flowDerivation.ts +0 -105
- package/src/flow/nodes/sync/flowNode.ts +0 -439
- package/src/flow/nodes/sync/flowReadonly.ts +0 -57
- package/src/flow/nodes/sync/flowState.ts +0 -101
- package/src/solid/converters.ts +0 -148
- package/src/solid/index.ts +0 -2
- package/src/solid/primitives.ts +0 -215
- package/test/base/flowEffect.test.ts +0 -108
- package/test/base/flowGraph.test.ts +0 -485
- package/test/base/flowSignal.test.ts +0 -372
- package/test/collections/flowArray.asyncStates.test.ts +0 -1553
- package/test/collections/flowArray.scalars.test.ts +0 -1129
- package/test/collections/flowArray.states.test.ts +0 -1365
- package/test/collections/flowMap.asyncStates.test.ts +0 -1105
- package/test/collections/flowMap.scalars.test.ts +0 -877
- package/test/collections/flowMap.states.test.ts +0 -1097
- package/test/nodes/async/flowConstantAsync.test.ts +0 -860
- package/test/nodes/async/flowDerivationAsync.test.ts +0 -1517
- package/test/nodes/async/flowStateAsync.test.ts +0 -1387
- package/test/nodes/await/advanced/resource.test.ts +0 -129
- package/test/nodes/await/advanced/resourceAsync.test.ts +0 -108
- package/test/nodes/await/advanced/stream.test.ts +0 -198
- package/test/nodes/await/advanced/streamAsync.test.ts +0 -196
- package/test/nodes/await/flowConstantAwait.test.ts +0 -643
- package/test/nodes/await/flowDerivationAwait.test.ts +0 -1583
- package/test/nodes/await/flowStateAwait.test.ts +0 -999
- package/test/nodes/mixed/derivation.test.ts +0 -1527
- package/test/nodes/sync/flowConstant.test.ts +0 -620
- package/test/nodes/sync/flowDerivation.test.ts +0 -1373
- package/test/nodes/sync/flowState.test.ts +0 -945
- package/test/solid/converters.test.ts +0 -721
- package/test/solid/primitives.test.ts +0 -1031
- /package/dist/types/{flow → api/nodes}/collections/index.d.ts +0 -0
- /package/docs/guide/advanced/{upgrading.md → migration-v1.md} +0 -0
- /package/src/{flow → api/nodes}/collections/index.ts +0 -0
|
@@ -2,15 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
PicoFlow provides reactive arrays with **fine-grained tracking**. Instead of reacting to the entire array changing, you can react to specific operations like pushing, popping, or splicing individual items.
|
|
4
4
|
|
|
5
|
-
Imagine you have a list of 1000 todos. In a naive reactive system, every time you add, remove, or update a single todo, the entire list re-renders. **Inefficient!** With PicoFlow's reactive arrays, you can track specific operations and only update what changed.
|
|
6
|
-
|
|
7
|
-
### Key Characteristics
|
|
8
|
-
|
|
9
|
-
- **Fine-grained reactivity**: Track individual operations (push, pop, splice, etc.) separately
|
|
10
|
-
- **Multiple tracking levels**: Track the whole array or specific operations
|
|
11
|
-
- **Native Array**: Uses JavaScript's native `Array<T>` internally
|
|
12
|
-
- **Operation-specific signal**: `$lastAction` for granular tracking of all operations
|
|
13
|
-
- **Disposable**: Can be disposed to clean up resources
|
|
14
5
|
|
|
15
6
|
## When to Use Arrays
|
|
16
7
|
|
|
@@ -18,16 +9,12 @@ Use arrays when you need to:
|
|
|
18
9
|
|
|
19
10
|
- ✅ Track large collections with fine-grained updates
|
|
20
11
|
- ✅ React to specific operations (additions, removals, updates) separately
|
|
21
|
-
- ✅ Manage ordered collections where individual item operations matter
|
|
22
12
|
- ✅ Optimize performance by avoiding full array re-processing
|
|
23
|
-
- ✅ Animate or handle UI updates for specific changes
|
|
24
13
|
|
|
25
14
|
Don't use arrays when:
|
|
26
15
|
|
|
27
|
-
- ❌ You have a small, simple list (use `state` instead)
|
|
28
16
|
- ❌ You don't need fine-grained tracking (use `state` with an array)
|
|
29
17
|
- ❌ You need key-value operations (use `map` instead)
|
|
30
|
-
- ❌ The collection is rarely modified (regular state might be simpler)
|
|
31
18
|
|
|
32
19
|
## Creating Arrays
|
|
33
20
|
|
|
@@ -52,7 +39,7 @@ Arrays provide multiple ways to track changes and perform operations.
|
|
|
52
39
|
|
|
53
40
|
### Array Operations
|
|
54
41
|
|
|
55
|
-
Arrays provide several operations: `set()`, `
|
|
42
|
+
Arrays provide several operations: `set()`, `update()`, `push()`, `pop()`, `unshift()`, `shift()`, `splice()`, and `clear()`.
|
|
56
43
|
|
|
57
44
|
```typescript
|
|
58
45
|
const $list = array<number>([])
|
|
@@ -61,7 +48,7 @@ const $list = array<number>([])
|
|
|
61
48
|
$list.set([1, 2, 3])
|
|
62
49
|
|
|
63
50
|
// Replace item at index
|
|
64
|
-
$list.
|
|
51
|
+
$list.update(0, 10)
|
|
65
52
|
|
|
66
53
|
// Add to end
|
|
67
54
|
$list.push(4)
|
|
@@ -82,9 +69,9 @@ $list.splice(1, 1, 99) // Remove 1 item at index 1, add 99
|
|
|
82
69
|
$list.clear()
|
|
83
70
|
|
|
84
71
|
// Read (reactive)
|
|
85
|
-
|
|
86
|
-
const items = $list.get(t)
|
|
72
|
+
$list.subscribe((items) => {
|
|
87
73
|
// Track entire array
|
|
74
|
+
console.log(items)
|
|
88
75
|
})
|
|
89
76
|
|
|
90
77
|
// Read (non-reactive)
|
|
@@ -92,21 +79,18 @@ const snapshot = $list.pick()
|
|
|
92
79
|
```
|
|
93
80
|
|
|
94
81
|
**Important**:
|
|
95
|
-
- `
|
|
82
|
+
- `update(index, item)` throws an error if the index is out of bounds
|
|
96
83
|
- `push(item)` only accepts a single item
|
|
97
84
|
- `splice(start, deleteCount, ...items)` accepts multiple items to add
|
|
98
85
|
|
|
99
|
-
### Whole Array Tracking
|
|
86
|
+
### Whole Array Tracking
|
|
100
87
|
|
|
101
88
|
Track when the entire array changes (any operation):
|
|
102
89
|
|
|
103
90
|
```typescript
|
|
104
|
-
import { array, effect } from '@ersbeth/picoflow'
|
|
105
|
-
|
|
106
91
|
const $items = array([1, 2, 3])
|
|
107
92
|
|
|
108
|
-
|
|
109
|
-
const items = $items.get(t) // Track all changes
|
|
93
|
+
$items.subscribe((items) => {
|
|
110
94
|
console.log('Array changed:', items)
|
|
111
95
|
})
|
|
112
96
|
|
|
@@ -117,33 +101,34 @@ $items.splice(1, 1) // Logs: "Array changed: [1,3]"
|
|
|
117
101
|
|
|
118
102
|
Use `.get(t)` when you need the entire array's current state. It returns a copy of the array.
|
|
119
103
|
|
|
120
|
-
### Fine-Grained
|
|
104
|
+
### Fine-Grained Tracking
|
|
121
105
|
|
|
122
106
|
Track specific operations with `$lastAction`:
|
|
123
107
|
|
|
124
108
|
```typescript
|
|
125
109
|
const $items = array<number>([])
|
|
126
110
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
111
|
+
$items.$lastAction.subscribe(
|
|
112
|
+
(action) => {
|
|
113
|
+
if (!action) return
|
|
114
|
+
|
|
115
|
+
switch (action.type) {
|
|
116
|
+
case 'push':
|
|
117
|
+
console.log('Pushed:', action.item)
|
|
118
|
+
break
|
|
119
|
+
case 'pop':
|
|
120
|
+
console.log('Popped')
|
|
121
|
+
break
|
|
122
|
+
case 'splice':
|
|
123
|
+
console.log('Splice at', action.start, ':', action.deleteCount, 'deleted,', action.items.length, 'added')
|
|
124
|
+
break
|
|
125
|
+
case 'update':
|
|
126
|
+
console.log('Set item at', action.index, 'to', action.item)
|
|
127
|
+
break
|
|
128
|
+
// ... other operations
|
|
129
|
+
}
|
|
145
130
|
}
|
|
146
|
-
|
|
131
|
+
)
|
|
147
132
|
|
|
148
133
|
$items.push(1) // Logs: "Pushed: 1"
|
|
149
134
|
$items.push(2) // Logs: "Pushed: 2"
|
|
@@ -151,190 +136,121 @@ $items.pop() // Logs: "Popped"
|
|
|
151
136
|
$items.splice(0, 1) // Logs: "Splice at 0: 1 deleted, 0 added"
|
|
152
137
|
```
|
|
153
138
|
|
|
154
|
-
## Array Action Types
|
|
155
|
-
|
|
156
|
-
The `$lastAction` signal contains information about the last operation:
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
type FlowArrayAction<T> =
|
|
160
|
-
| { type: 'set'; items: T[] }
|
|
161
|
-
| { type: 'setItem'; index: number; item: T }
|
|
162
|
-
| { type: 'push'; item: T }
|
|
163
|
-
| { type: 'pop' }
|
|
164
|
-
| { type: 'shift' }
|
|
165
|
-
| { type: 'unshift'; item: T }
|
|
166
|
-
| { type: 'splice'; start: number; deleteCount: number; items: T[] }
|
|
167
|
-
| { type: 'clear' }
|
|
168
|
-
```
|
|
169
|
-
|
|
170
139
|
## Lifecycle
|
|
171
140
|
|
|
172
|
-
When you create
|
|
141
|
+
When you create a subscription that tracks an array:
|
|
173
142
|
|
|
174
|
-
1. **Registration**: The array registers the
|
|
143
|
+
1. **Registration**: The array registers the subscription as a watcher
|
|
175
144
|
2. **Operation**: When you call `push()`, `pop()`, `splice()`, etc., the array updates internally
|
|
176
145
|
3. **Signal Update**: The `$lastAction` signal is updated with the operation details
|
|
177
|
-
4. **Notification**: All watching
|
|
178
|
-
5. **Re-execution**: Each watching
|
|
146
|
+
4. **Notification**: All watching subscriptions are scheduled to run
|
|
147
|
+
5. **Re-execution**: Each watching subscription re-executes its function
|
|
179
148
|
|
|
180
149
|
```mermaid
|
|
181
150
|
sequenceDiagram
|
|
182
151
|
participant User
|
|
183
152
|
participant Array as $todos (Array)
|
|
184
153
|
participant Signal as $lastAction
|
|
185
|
-
participant
|
|
154
|
+
participant Subscription
|
|
186
155
|
|
|
187
|
-
Note over User,
|
|
188
|
-
User->>
|
|
189
|
-
activate
|
|
190
|
-
|
|
191
|
-
Note over Array: Register
|
|
192
|
-
|
|
193
|
-
Note over Signal: Register
|
|
194
|
-
|
|
195
|
-
Note over
|
|
196
|
-
deactivate
|
|
156
|
+
Note over User,Subscription: 1. Setup Phase
|
|
157
|
+
User->>Subscription: Create subscription
|
|
158
|
+
activate Subscription
|
|
159
|
+
Subscription->>Array: get(t)
|
|
160
|
+
Note over Array: Register Subscription as watcher
|
|
161
|
+
Subscription->>Signal: get(t)
|
|
162
|
+
Note over Signal: Register Subscription as watcher
|
|
163
|
+
Subscription->>Subscription: Execute function
|
|
164
|
+
Note over Subscription: Initial render
|
|
165
|
+
deactivate Subscription
|
|
197
166
|
|
|
198
|
-
Note over User,
|
|
167
|
+
Note over User,Subscription: 2. Operation Phase
|
|
199
168
|
User->>Array: push(todo)
|
|
200
169
|
activate Array
|
|
201
170
|
Note over Array: Update internal array
|
|
202
171
|
Array->>Signal: set({ type: 'push', item: todo })
|
|
203
172
|
activate Signal
|
|
204
173
|
Note over Signal: Notify watchers
|
|
205
|
-
Signal->>
|
|
174
|
+
Signal->>Subscription: Schedule execution
|
|
206
175
|
deactivate Signal
|
|
207
176
|
Array->>Array: Notify whole array watchers
|
|
208
|
-
Array->>
|
|
177
|
+
Array->>Subscription: Schedule execution
|
|
209
178
|
deactivate Array
|
|
210
179
|
|
|
211
|
-
activate
|
|
212
|
-
Note over
|
|
213
|
-
|
|
214
|
-
Signal-->>
|
|
215
|
-
|
|
216
|
-
Note over
|
|
217
|
-
deactivate
|
|
180
|
+
activate Subscription
|
|
181
|
+
Note over Subscription: Re-execute function
|
|
182
|
+
Subscription->>Signal: get(t)
|
|
183
|
+
Signal-->>Subscription: { type: 'push', item: todo }
|
|
184
|
+
Subscription->>Subscription: Handle new todo
|
|
185
|
+
Note over Subscription: Update UI
|
|
186
|
+
deactivate Subscription
|
|
218
187
|
```
|
|
219
188
|
|
|
220
189
|
## Best Practices
|
|
221
190
|
|
|
222
|
-
### Choose the Right Granularity
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
// ✅ Use fine-grained for large arrays
|
|
226
|
-
const $todos = array<Todo>([...1000 todos...])
|
|
227
|
-
effect((t) => {
|
|
228
|
-
const action = $todos.$lastAction.get(t)
|
|
229
|
-
if (action) {
|
|
230
|
-
// Handle specific change
|
|
231
|
-
}
|
|
232
|
-
})
|
|
233
|
-
|
|
234
|
-
// ✅ Use coarse-grained for small arrays
|
|
235
|
-
const $settings = state(['dark', 'en', 'large'])
|
|
236
|
-
effect((t) => {
|
|
237
|
-
const settings = $settings.get(t)
|
|
238
|
-
// Re-apply all settings (cheap for 3 items)
|
|
239
|
-
})
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### Combine for Best Results
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
// Fine-grained for UI updates
|
|
246
|
-
effect((t) => {
|
|
247
|
-
const action = $items.$lastAction.get(t)
|
|
248
|
-
if (action) {
|
|
249
|
-
updateUIIncremental(action)
|
|
250
|
-
}
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
// Coarse-grained for totals
|
|
254
|
-
const $total = derivation((t) => {
|
|
255
|
-
return $items.get(t).reduce((sum, item) => sum + item.value, 0)
|
|
256
|
-
})
|
|
257
|
-
```
|
|
258
|
-
|
|
259
191
|
### Handle All Action Types
|
|
260
192
|
|
|
261
193
|
```typescript
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
194
|
+
subscribe(
|
|
195
|
+
(t) => $items.$lastAction.get(t),
|
|
196
|
+
(action) => {
|
|
197
|
+
if (!action) return
|
|
198
|
+
|
|
199
|
+
switch (action.type) {
|
|
200
|
+
case 'push':
|
|
201
|
+
// Handle push
|
|
202
|
+
break
|
|
203
|
+
case 'pop':
|
|
204
|
+
// Handle pop
|
|
205
|
+
break
|
|
206
|
+
case 'splice':
|
|
207
|
+
// Handle splice
|
|
208
|
+
break
|
|
209
|
+
case 'update':
|
|
210
|
+
// Handle update
|
|
211
|
+
break
|
|
212
|
+
case 'clear':
|
|
213
|
+
// Handle clear
|
|
214
|
+
break
|
|
215
|
+
case 'unshift':
|
|
216
|
+
// Handle unshift
|
|
217
|
+
break
|
|
218
|
+
case 'shift':
|
|
219
|
+
// Handle shift
|
|
220
|
+
break
|
|
221
|
+
case 'set':
|
|
222
|
+
// Handle set (replace entire array)
|
|
223
|
+
break
|
|
224
|
+
}
|
|
283
225
|
}
|
|
284
|
-
|
|
226
|
+
)
|
|
285
227
|
```
|
|
286
228
|
|
|
287
229
|
### Dispose Items Properly
|
|
288
230
|
|
|
289
231
|
```typescript
|
|
290
232
|
// When removing disposable items
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
233
|
+
subscribe(
|
|
234
|
+
(t) => $resources.$lastAction.get(t),
|
|
235
|
+
(action) => {
|
|
236
|
+
if (action && action.type === 'splice') {
|
|
237
|
+
// Dispose removed items
|
|
238
|
+
}
|
|
296
239
|
}
|
|
297
|
-
|
|
240
|
+
)
|
|
298
241
|
```
|
|
299
242
|
|
|
300
|
-
Arrays automatically dispose disposable items when they are removed, but you can add additional cleanup logic if needed.
|
|
301
|
-
|
|
302
243
|
## Common Pitfalls
|
|
303
244
|
|
|
304
|
-
### Forgetting to Handle Nulls
|
|
305
|
-
|
|
306
|
-
**Problem**: The `$lastAction` signal can be `null` initially or after certain operations.
|
|
307
|
-
|
|
308
|
-
```typescript
|
|
309
|
-
// ❌ Can be null initially
|
|
310
|
-
effect((t) => {
|
|
311
|
-
const action = $items.$lastAction.get(t)
|
|
312
|
-
console.log(action.type) // Error if null!
|
|
313
|
-
})
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
**Solution**: Always check for null:
|
|
317
|
-
|
|
318
|
-
```typescript
|
|
319
|
-
// ✅ Check for null
|
|
320
|
-
effect((t) => {
|
|
321
|
-
const action = $items.$lastAction.get(t)
|
|
322
|
-
if (action) {
|
|
323
|
-
console.log(action.type)
|
|
324
|
-
}
|
|
325
|
-
})
|
|
326
|
-
```
|
|
327
|
-
|
|
328
245
|
### Using Wrong Tracking
|
|
329
246
|
|
|
330
247
|
**Problem**: Tracking the entire array when you only need specific operations.
|
|
331
248
|
|
|
332
249
|
```typescript
|
|
333
250
|
// ❌ Tracks entire array when you only need additions
|
|
334
|
-
|
|
335
|
-
const items = $items.get(t) // Runs on ALL changes
|
|
251
|
+
$items.subscribe((items) => {
|
|
336
252
|
const lastItem = items[items.length - 1]
|
|
337
|
-
animateNewItem(lastItem)
|
|
253
|
+
animateNewItem(lastItem) // Runs on ALL changes
|
|
338
254
|
})
|
|
339
255
|
```
|
|
340
256
|
|
|
@@ -342,12 +258,14 @@ effect((t) => {
|
|
|
342
258
|
|
|
343
259
|
```typescript
|
|
344
260
|
// ✅ Track only pushes
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
261
|
+
subscribe(
|
|
262
|
+
(t) => $items.$lastAction.get(t),
|
|
263
|
+
(action) => {
|
|
264
|
+
if (action && action.type === 'push') {
|
|
265
|
+
animateNewItem(action.item)
|
|
266
|
+
}
|
|
349
267
|
}
|
|
350
|
-
|
|
268
|
+
)
|
|
351
269
|
```
|
|
352
270
|
|
|
353
271
|
### Mutating Retrieved Arrays
|
|
@@ -365,36 +283,4 @@ items.push(newItem) // Doesn't update reactive array!
|
|
|
365
283
|
```typescript
|
|
366
284
|
// ✅ Use reactive methods
|
|
367
285
|
$items.push(newItem)
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
### Using Wrong Action Properties
|
|
371
|
-
|
|
372
|
-
**Problem**: Using incorrect property names from action objects.
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
// ❌ Wrong property names
|
|
376
|
-
effect((t) => {
|
|
377
|
-
const action = $items.$lastAction.get(t)
|
|
378
|
-
if (action && action.type === 'push') {
|
|
379
|
-
console.log(action.value) // Error! Should be action.item
|
|
380
|
-
}
|
|
381
|
-
if (action && action.type === 'splice') {
|
|
382
|
-
console.log(action.index) // Error! Should be action.start
|
|
383
|
-
}
|
|
384
|
-
})
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
**Solution**: Use correct property names:
|
|
388
|
-
|
|
389
|
-
```typescript
|
|
390
|
-
// ✅ Correct property names
|
|
391
|
-
effect((t) => {
|
|
392
|
-
const action = $items.$lastAction.get(t)
|
|
393
|
-
if (action && action.type === 'push') {
|
|
394
|
-
console.log(action.item) // Correct
|
|
395
|
-
}
|
|
396
|
-
if (action && action.type === 'splice') {
|
|
397
|
-
console.log(action.start) // Correct
|
|
398
|
-
}
|
|
399
|
-
})
|
|
400
|
-
```
|
|
286
|
+
```
|