@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
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Contract for objects that own resources and must be cleaned up explicitly.
|
|
3
|
-
*
|
|
4
|
-
* @remarks
|
|
5
|
-
* Many PicoFlow primitives expose `dispose()` so you can tear down subscriptions,
|
|
6
|
-
* listeners, or reactive links when they are no longer needed (e.g., component
|
|
7
|
-
* unmount, feature teardown, test cleanup).
|
|
8
|
-
*
|
|
9
|
-
* Typical options:
|
|
10
|
-
* - `{ self: true }` — dispose only this instance (dependents decide their own lifecycle).
|
|
11
|
-
* - `{ self: false }` or omitted — also dispose dependents, if the implementation supports it.
|
|
12
|
-
*
|
|
13
|
-
* The exact cascade behavior depends on the concrete primitive; consult its docs.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* const $state = state(0);
|
|
18
|
-
* const fx = effect((t) => console.log($state.get(t)));
|
|
19
|
-
*
|
|
20
|
-
* $state.dispose(); // Common teardown path
|
|
21
|
-
* $state.dispose({ self: true }); // Dispose only this instance if you want dependents to persist
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* @public
|
|
25
|
-
*/
|
|
26
|
-
export interface FlowDisposable {
|
|
27
|
-
/**
|
|
28
|
-
* Disposes resources held by this object.
|
|
29
|
-
*
|
|
30
|
-
* @param options - Optional disposal behavior.
|
|
31
|
-
* @param options.self - When true, dispose only this object. When false or
|
|
32
|
-
* omitted, the implementation may also dispose dependents.
|
|
33
|
-
*
|
|
34
|
-
* @remarks
|
|
35
|
-
* Use `dispose()` during teardown (unmount, test cleanup, feature shutdown).
|
|
36
|
-
* Calling `dispose()` more than once may throw; behavior is defined by the
|
|
37
|
-
* concrete implementation.
|
|
38
|
-
*
|
|
39
|
-
* @throws Error if the object has already been disposed (implementation-specific).
|
|
40
|
-
*/
|
|
41
|
-
dispose(options?: { self: boolean }): void;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Runtime type guard that checks whether an object is disposable.
|
|
46
|
-
*
|
|
47
|
-
* @param obj - Value to test.
|
|
48
|
-
* @returns `true` if `obj` exposes a callable `dispose`; otherwise `false`.
|
|
49
|
-
*
|
|
50
|
-
* @remarks
|
|
51
|
-
* Use this for defensive cleanup in mixed collections or optional resources.
|
|
52
|
-
* It performs a runtime shape check; no assumptions about specific types are made.
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```typescript
|
|
56
|
-
* function cleanup(items: unknown[]) {
|
|
57
|
-
* for (const item of items) {
|
|
58
|
-
* if (isDisposable(item)) item.dispose();
|
|
59
|
-
* }
|
|
60
|
-
* }
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
* @public
|
|
64
|
-
*/
|
|
65
|
-
export function isDisposable(obj: unknown): obj is FlowDisposable {
|
|
66
|
-
return (
|
|
67
|
-
obj !== null &&
|
|
68
|
-
obj !== undefined &&
|
|
69
|
-
typeof (obj as FlowDisposable).dispose === "function"
|
|
70
|
-
);
|
|
71
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { FlowGraph } from "./flowGraph";
|
|
2
|
-
import type { FlowSignal } from "./flowSignal";
|
|
3
|
-
import type { FlowTracker } from "./flowTracker";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Runs side-effect code in response to reactive state changes.
|
|
7
|
-
*
|
|
8
|
-
* @remarks
|
|
9
|
-
* A `FlowEffect` is the bridge between reactive data and the outside world
|
|
10
|
-
* (UI updates, logging, network calls, timers, etc.). It executes a callback
|
|
11
|
-
* with a tracking context so you can choose which observables/signals should
|
|
12
|
-
* re-trigger the effect:
|
|
13
|
-
*
|
|
14
|
-
* - Use `observable.get(t)` or `signal.watch(t)` to create dependencies.
|
|
15
|
-
* - Use `observable.pick()` for untracked reads that should not re-run the effect.
|
|
16
|
-
*
|
|
17
|
-
* The callback runs immediately when the effect is created and re-runs whenever
|
|
18
|
-
* any tracked dependency changes. The effect itself is the tracking context
|
|
19
|
-
* (it implements `FlowTracker`), so `t` in your callback is the effect instance.
|
|
20
|
-
*
|
|
21
|
-
* Async callbacks are supported: if the callback returns a promise, the effect
|
|
22
|
-
* awaits it before finishing the current run. A later change can re-run the
|
|
23
|
-
* effect even if a previous async run is still pending, so write idempotent
|
|
24
|
-
* side effects when working with async flows.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* // Mixed tracked/untracked reads
|
|
29
|
-
* const fx = effect((t) => {
|
|
30
|
-
* const tracked = $stateA.get(t); // tracked -> re-runs when $stateA changes
|
|
31
|
-
* const snapshot = $config.pick(); // untracked -> does not re-run on changes
|
|
32
|
-
* console.log(tracked, snapshot);
|
|
33
|
-
* });
|
|
34
|
-
*
|
|
35
|
-
* // Async work
|
|
36
|
-
* const fxAsync = effect(async (t) => {
|
|
37
|
-
* const userId = $userId.get(t);
|
|
38
|
-
* const profile = await fetchProfile(userId);
|
|
39
|
-
* renderProfile(profile);
|
|
40
|
-
* });
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* @public
|
|
44
|
-
*/
|
|
45
|
-
export class FlowEffect {
|
|
46
|
-
private _disposed = false;
|
|
47
|
-
private _dependencies = new Set<FlowSignal>();
|
|
48
|
-
private _apply: (t: FlowTracker) => void | Promise<void>;
|
|
49
|
-
settled: Promise<void>;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Creates a new effect and runs it once immediately.
|
|
53
|
-
*
|
|
54
|
-
* @param apply - Side-effect function receiving the tracking context (`t`).
|
|
55
|
-
* It can be sync or async (returning `Promise<void>`).
|
|
56
|
-
*
|
|
57
|
-
* @remarks
|
|
58
|
-
* Use `t` to opt-in to reactive tracking:
|
|
59
|
-
* - `observable.get(t)` / `signal.watch(t)` to re-run when they change
|
|
60
|
-
* - `observable.pick()` for reads that should not re-run the effect
|
|
61
|
-
*
|
|
62
|
-
* The effect schedules its first run during construction. Each subsequent
|
|
63
|
-
* change to a tracked dependency queues another run.
|
|
64
|
-
*
|
|
65
|
-
* @public
|
|
66
|
-
*/
|
|
67
|
-
constructor(apply: (t: FlowTracker) => void | Promise<void>) {
|
|
68
|
-
this._apply = apply;
|
|
69
|
-
this.settled = FlowGraph.requestRead(() => this._exec());
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Stops the effect and detaches it from all tracked dependencies.
|
|
74
|
-
*
|
|
75
|
-
* @remarks
|
|
76
|
-
* Call this when the effect's work is no longer needed (e.g., component
|
|
77
|
-
* unmount, teardown of a feature). After disposal:
|
|
78
|
-
* - The effect will not re-run.
|
|
79
|
-
* - All dependency links are removed.
|
|
80
|
-
* - Calling `dispose()` again throws an error.
|
|
81
|
-
*
|
|
82
|
-
* @example
|
|
83
|
-
* ```typescript
|
|
84
|
-
* const fx = effect((t) => $signal.watch(t));
|
|
85
|
-
* // ... later
|
|
86
|
-
* fx.dispose();
|
|
87
|
-
* ```
|
|
88
|
-
*
|
|
89
|
-
* @public
|
|
90
|
-
*/
|
|
91
|
-
public dispose(): void {
|
|
92
|
-
if (this._disposed) throw new Error("[PicoFlow] Effect is disposed");
|
|
93
|
-
Array.from(this._dependencies).forEach((dependency) => {
|
|
94
|
-
this._unregisterDependency(dependency);
|
|
95
|
-
});
|
|
96
|
-
this._disposed = true;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Whether the effect has been disposed.
|
|
101
|
-
*
|
|
102
|
-
* @returns `true` once disposal has run; `false` while the effect is active.
|
|
103
|
-
*
|
|
104
|
-
* @public
|
|
105
|
-
*/
|
|
106
|
-
public get disposed(): boolean {
|
|
107
|
-
return this._disposed;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/** @internal */ async _requestExec(): Promise<void> {
|
|
111
|
-
this.settled = this._exec();
|
|
112
|
-
return this.settled;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/** @internal */ _registerDependency(dependency: FlowSignal): void {
|
|
116
|
-
this._dependencies.add(dependency);
|
|
117
|
-
dependency._registerEffect(this);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** @internal */ _unregisterDependency(dependency: FlowSignal): void {
|
|
121
|
-
this._dependencies.delete(dependency);
|
|
122
|
-
dependency._unregisterEffect(this);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
private async _exec(): Promise<void> {
|
|
126
|
-
if (this._disposed)
|
|
127
|
-
/* v8 ignore next 1 */
|
|
128
|
-
throw new Error("[PicoFlow] Effect is disposed");
|
|
129
|
-
|
|
130
|
-
const result = this._apply(this);
|
|
131
|
-
if (result instanceof Promise) {
|
|
132
|
-
await result;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Creates a reactive effect that runs now and re-runs when its tracked
|
|
139
|
-
* dependencies change.
|
|
140
|
-
*
|
|
141
|
-
* @param fn - Side-effect function that receives the tracking context (`t`).
|
|
142
|
-
* @returns A new {@link FlowEffect}.
|
|
143
|
-
*
|
|
144
|
-
* @remarks
|
|
145
|
-
* Use an effect when you need to react to state changes with side effects
|
|
146
|
-
* (UI updates, logging, network calls, timers). For computing derived values,
|
|
147
|
-
* prefer derivations; for one-off work, use a normal function.
|
|
148
|
-
*
|
|
149
|
-
* - Track dependencies with `observable.get(t)` or `signal.watch(t)`.
|
|
150
|
-
* - Read without tracking using `observable.pick()`.
|
|
151
|
-
* - Async callbacks are supported; return a promise if you `await` inside.
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* const $count = state(0);
|
|
156
|
-
*
|
|
157
|
-
* const fx = effect((t) => {
|
|
158
|
-
* console.log("Count is:", $count.get(t));
|
|
159
|
-
* });
|
|
160
|
-
*
|
|
161
|
-
* $count.set(1); // Logs "Count is: 1"
|
|
162
|
-
* $count.set(2); // Logs "Count is: 2"
|
|
163
|
-
*
|
|
164
|
-
* fx.dispose(); // Stop reacting
|
|
165
|
-
* ```
|
|
166
|
-
*
|
|
167
|
-
* @public
|
|
168
|
-
*/
|
|
169
|
-
export function effect(fn: (t: FlowTracker) => void): FlowEffect {
|
|
170
|
-
return new FlowEffect(fn);
|
|
171
|
-
}
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import type { FlowEffect } from "./flowEffect";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Represents a queued read operation in the reactive system.
|
|
5
|
-
*
|
|
6
|
-
* @remarks
|
|
7
|
-
* This interface is used internally to coordinate read operations. Most users
|
|
8
|
-
* will not interact with it directly.
|
|
9
|
-
*
|
|
10
|
-
* @internal
|
|
11
|
-
*/
|
|
12
|
-
export interface ReadRequest<T> {
|
|
13
|
-
type: "read";
|
|
14
|
-
promise: Promise<T>;
|
|
15
|
-
resolve: (value: T) => void;
|
|
16
|
-
reject: (error: Error) => void;
|
|
17
|
-
read: () => T;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Represents a queued trigger notification in the reactive system.
|
|
22
|
-
*
|
|
23
|
-
* @remarks
|
|
24
|
-
* This interface is used internally to coordinate signal triggers. Most users
|
|
25
|
-
* will not interact with it directly.
|
|
26
|
-
*
|
|
27
|
-
* @internal
|
|
28
|
-
*/
|
|
29
|
-
export interface TriggerRequest {
|
|
30
|
-
type: "trigger";
|
|
31
|
-
promise: Promise<void>;
|
|
32
|
-
resolve: () => void;
|
|
33
|
-
reject: (error: Error) => void;
|
|
34
|
-
notify: () => void;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Represents a queued write operation in the reactive system.
|
|
39
|
-
*
|
|
40
|
-
* @remarks
|
|
41
|
-
* This interface is used internally to coordinate write operations with update
|
|
42
|
-
* logic. Most users will not interact with it directly.
|
|
43
|
-
*
|
|
44
|
-
* @internal
|
|
45
|
-
*/
|
|
46
|
-
export interface WriteRequest {
|
|
47
|
-
type: "write";
|
|
48
|
-
promise: Promise<void>;
|
|
49
|
-
resolve: () => void;
|
|
50
|
-
reject: (error: Error) => void;
|
|
51
|
-
notify: () => void;
|
|
52
|
-
update: () => boolean | Promise<boolean>;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Union type representing any queued operation in the reactive system.
|
|
57
|
-
*
|
|
58
|
-
* @remarks
|
|
59
|
-
* This type is used internally to coordinate different types of reactive
|
|
60
|
-
* operations (reads, writes, triggers). Most users will not interact with it
|
|
61
|
-
* directly.
|
|
62
|
-
*
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
// biome-ignore lint/suspicious/noExplicitAny: we don't need to know the type of the value
|
|
66
|
-
export type ActionRequest = ReadRequest<any> | TriggerRequest | WriteRequest;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Coordinates reactive operations (reads, writes, triggers, effects).
|
|
70
|
-
*
|
|
71
|
-
* @remarks
|
|
72
|
-
* FlowGraph manages the execution order of reactive operations to ensure
|
|
73
|
-
* consistent state updates. It queues operations and processes them in a
|
|
74
|
-
* controlled sequence, executing effects after state changes complete.
|
|
75
|
-
*
|
|
76
|
-
* Most users will not interact with FlowGraph directly; reactive primitives
|
|
77
|
-
* use it internally. The `clear()` method may be useful for testing scenarios
|
|
78
|
-
* where you need to reset the internal state between tests.
|
|
79
|
-
*
|
|
80
|
-
* @public
|
|
81
|
-
*/
|
|
82
|
-
export class FlowGraph {
|
|
83
|
-
private static _effectsQueue: FlowEffect[] = [];
|
|
84
|
-
private static _actionQueue: ActionRequest[] = [];
|
|
85
|
-
private static _processingActionQueue = false;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Resets all internal queues and processing state.
|
|
89
|
-
*
|
|
90
|
-
* @remarks
|
|
91
|
-
* Use this method primarily for testing scenarios where you need to ensure
|
|
92
|
-
* a clean state between test runs. It clears pending effects and queued
|
|
93
|
-
* operations.
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* ```typescript
|
|
97
|
-
* beforeEach(() => {
|
|
98
|
-
* FlowGraph.clear();
|
|
99
|
-
* });
|
|
100
|
-
* ```
|
|
101
|
-
*
|
|
102
|
-
* @public
|
|
103
|
-
*/
|
|
104
|
-
static clear(): void {
|
|
105
|
-
FlowGraph._effectsQueue = [];
|
|
106
|
-
FlowGraph._actionQueue = [];
|
|
107
|
-
FlowGraph._processingActionQueue = false;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Queues a trigger notification for processing.
|
|
112
|
-
*
|
|
113
|
-
* @param notify - Function to call when the trigger is processed.
|
|
114
|
-
* @returns A promise that resolves after the trigger is processed.
|
|
115
|
-
*
|
|
116
|
-
* @remarks
|
|
117
|
-
* This method is used internally by reactive primitives to coordinate
|
|
118
|
-
* signal triggers. The promise resolves after all associated effects
|
|
119
|
-
* have been executed.
|
|
120
|
-
*
|
|
121
|
-
* @public
|
|
122
|
-
*/
|
|
123
|
-
static requestTrigger(notify: () => void): Promise<void> {
|
|
124
|
-
const promiseWithResolvers = Promise.withResolvers<void>();
|
|
125
|
-
FlowGraph._actionQueue.push({
|
|
126
|
-
...promiseWithResolvers,
|
|
127
|
-
type: "trigger",
|
|
128
|
-
notify,
|
|
129
|
-
});
|
|
130
|
-
FlowGraph._processActionQueue();
|
|
131
|
-
return promiseWithResolvers.promise;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Queues a read operation for processing.
|
|
136
|
-
*
|
|
137
|
-
* @param read - Function that performs the read operation.
|
|
138
|
-
* @returns A promise that resolves with the read value.
|
|
139
|
-
*
|
|
140
|
-
* @remarks
|
|
141
|
-
* This method is used internally by reactive primitives to coordinate
|
|
142
|
-
* read operations. The read function is executed and its result (or promise)
|
|
143
|
-
* is returned.
|
|
144
|
-
*
|
|
145
|
-
* @public
|
|
146
|
-
*/
|
|
147
|
-
static requestRead<T>(read: () => T | Promise<T>): Promise<T> {
|
|
148
|
-
const promiseWithResolvers = Promise.withResolvers<T>();
|
|
149
|
-
FlowGraph._actionQueue.push({
|
|
150
|
-
...promiseWithResolvers,
|
|
151
|
-
type: "read",
|
|
152
|
-
read,
|
|
153
|
-
});
|
|
154
|
-
FlowGraph._processActionQueue();
|
|
155
|
-
return promiseWithResolvers.promise;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Queues a write operation with update logic for processing.
|
|
160
|
-
*
|
|
161
|
-
* @param notify - Function to call if the update succeeds.
|
|
162
|
-
* @param update - Function that performs the update and returns whether
|
|
163
|
-
* it changed the value.
|
|
164
|
-
* @returns A promise that resolves after the write is processed.
|
|
165
|
-
*
|
|
166
|
-
* @remarks
|
|
167
|
-
* This method is used internally by reactive primitives to coordinate
|
|
168
|
-
* write operations. The update function is executed, and if it returns true
|
|
169
|
-
* (or a promise resolving to true), the notify function is called to
|
|
170
|
-
* trigger dependent effects.
|
|
171
|
-
*
|
|
172
|
-
* @public
|
|
173
|
-
*/
|
|
174
|
-
static requestWrite(
|
|
175
|
-
notify: () => void,
|
|
176
|
-
update: () => boolean | Promise<boolean>,
|
|
177
|
-
): Promise<void> {
|
|
178
|
-
const promiseWithResolvers = Promise.withResolvers<void>();
|
|
179
|
-
FlowGraph._actionQueue.push({
|
|
180
|
-
...promiseWithResolvers,
|
|
181
|
-
type: "write",
|
|
182
|
-
notify,
|
|
183
|
-
update,
|
|
184
|
-
});
|
|
185
|
-
FlowGraph._processActionQueue();
|
|
186
|
-
return promiseWithResolvers.promise;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Queues effects for execution after the current operation completes.
|
|
191
|
-
*
|
|
192
|
-
* @param effects - Array of effects to queue for execution.
|
|
193
|
-
*
|
|
194
|
-
* @remarks
|
|
195
|
-
* This method is used internally by reactive primitives to schedule effect
|
|
196
|
-
* execution. Effects are executed after the current read/write/trigger
|
|
197
|
-
* operation completes, ensuring proper ordering of reactive updates.
|
|
198
|
-
*
|
|
199
|
-
* @public
|
|
200
|
-
*/
|
|
201
|
-
static pushEffects(effects: FlowEffect[]): void {
|
|
202
|
-
FlowGraph._effectsQueue.push(...effects);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/** @internal */
|
|
206
|
-
private static _processActionQueue = async () => {
|
|
207
|
-
if (FlowGraph._processingActionQueue) return;
|
|
208
|
-
FlowGraph._processingActionQueue = true;
|
|
209
|
-
|
|
210
|
-
while (FlowGraph._actionQueue.length > 0) {
|
|
211
|
-
const actionRequest = FlowGraph._actionQueue.shift();
|
|
212
|
-
if (!actionRequest) break;
|
|
213
|
-
|
|
214
|
-
// Process read operation
|
|
215
|
-
if (actionRequest.type === "read") {
|
|
216
|
-
try {
|
|
217
|
-
const read = actionRequest.read();
|
|
218
|
-
|
|
219
|
-
let value: unknown;
|
|
220
|
-
if (read instanceof Promise) {
|
|
221
|
-
value = await read;
|
|
222
|
-
} else {
|
|
223
|
-
value = read;
|
|
224
|
-
}
|
|
225
|
-
actionRequest.resolve(value);
|
|
226
|
-
} catch (error: unknown) {
|
|
227
|
-
const safeError =
|
|
228
|
-
error instanceof Error ? error : new Error(String(error));
|
|
229
|
-
actionRequest.reject(safeError);
|
|
230
|
-
}
|
|
231
|
-
continue; // stop here
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Process write operation
|
|
235
|
-
if (actionRequest.type === "write") {
|
|
236
|
-
try {
|
|
237
|
-
const updateResult = actionRequest.update();
|
|
238
|
-
|
|
239
|
-
let updated = false;
|
|
240
|
-
if (updateResult instanceof Promise) {
|
|
241
|
-
updated = await updateResult;
|
|
242
|
-
} else {
|
|
243
|
-
updated = updateResult;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (!updated) {
|
|
247
|
-
actionRequest.resolve();
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
actionRequest.notify();
|
|
252
|
-
} catch (error: unknown) {
|
|
253
|
-
const safeError =
|
|
254
|
-
error instanceof Error ? error : new Error(String(error));
|
|
255
|
-
actionRequest.reject(safeError);
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Process trigger operation
|
|
261
|
-
if (actionRequest.type === "trigger") {
|
|
262
|
-
actionRequest.notify();
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Process effects
|
|
266
|
-
let effectError: Error | null = null;
|
|
267
|
-
for (const effect of FlowGraph._effectsQueue) {
|
|
268
|
-
try {
|
|
269
|
-
await effect._requestExec();
|
|
270
|
-
} catch (error: unknown) {
|
|
271
|
-
effectError =
|
|
272
|
-
error instanceof Error ? error : new Error(String(error));
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
FlowGraph._effectsQueue = [];
|
|
278
|
-
|
|
279
|
-
if (effectError) {
|
|
280
|
-
actionRequest.reject(effectError);
|
|
281
|
-
} else {
|
|
282
|
-
actionRequest.resolve();
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
FlowGraph._processingActionQueue = false;
|
|
287
|
-
};
|
|
288
|
-
}
|