@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
package/src/solid/converters.ts
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { onCleanup, onMount } from "solid-js";
|
|
2
|
-
import { FlowNode, type FlowReadonly, type FlowReadonlyAsync } from "../flow";
|
|
3
|
-
import { FlowEffect } from "../flow/base";
|
|
4
|
-
import type { FlowTracker } from "../flow/base/flowTracker";
|
|
5
|
-
import { FlowNodeAsync } from "../flow/nodes/async/flowNodeAsync";
|
|
6
|
-
import { SolidResource } from "./primitives";
|
|
7
|
-
import type { NotPromise } from "../flow/base";
|
|
8
|
-
/**
|
|
9
|
-
* Converts an asynchronous FlowNodeAsync (Promise-based) into a SolidJS resource.
|
|
10
|
-
*
|
|
11
|
-
* @param node - The FlowNodeAsync to convert.
|
|
12
|
-
* @returns A SolidResource that wraps the FlowNodeAsync's value.
|
|
13
|
-
*
|
|
14
|
-
* @remarks
|
|
15
|
-
* This internal helper bridges PicoFlow's async reactive system with SolidJS by creating
|
|
16
|
-
* a SolidResource that automatically tracks the FlowNodeAsync and updates when its value changes.
|
|
17
|
-
* The resource is properly cleaned up when the Solid component unmounts.
|
|
18
|
-
*
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
function fromNode<T>(node: FlowNodeAsync<T> | FlowNode<T>): SolidResource<T> {
|
|
22
|
-
let initialized = false;
|
|
23
|
-
|
|
24
|
-
const solidResource = new SolidResource<T>(async () => {
|
|
25
|
-
let value: T;
|
|
26
|
-
if (initialized) {
|
|
27
|
-
value = await node.get(null); // don't request graph read
|
|
28
|
-
} else {
|
|
29
|
-
value = await node.pick();
|
|
30
|
-
initialized = true;
|
|
31
|
-
}
|
|
32
|
-
return value;
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
let fx: FlowEffect;
|
|
36
|
-
|
|
37
|
-
onMount(() => {
|
|
38
|
-
fx = new FlowEffect(async (t) => {
|
|
39
|
-
const watched = node.watch(t);
|
|
40
|
-
if (watched instanceof Promise) {
|
|
41
|
-
await watched;
|
|
42
|
-
}
|
|
43
|
-
solidResource.refetch();
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
onCleanup(() => fx.dispose());
|
|
48
|
-
|
|
49
|
-
return solidResource;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Converts a getter function into a SolidResource.
|
|
54
|
-
*
|
|
55
|
-
* @param getter - A function that computes a value using a FlowTracker.
|
|
56
|
-
* @returns A SolidResource that wraps the computed value.
|
|
57
|
-
*
|
|
58
|
-
* @remarks
|
|
59
|
-
* This internal helper performs "deep" conversion by creating a FlowNodeAsync from
|
|
60
|
-
* the getter function and then converting it to a SolidResource. This allows users
|
|
61
|
-
* to pass computation functions directly to `from()` without manually creating a
|
|
62
|
-
* FlowNodeAsync first.
|
|
63
|
-
*
|
|
64
|
-
* @internal
|
|
65
|
-
*/
|
|
66
|
-
function fromGetter<T>(
|
|
67
|
-
getter: (t: FlowTracker) => T | Promise<T>,
|
|
68
|
-
): SolidResource<T> {
|
|
69
|
-
const derivation = new FlowNodeAsync<T>(async (t) => {
|
|
70
|
-
return getter(t);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
return fromNode(derivation);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Utility type that excludes Promise types from T.
|
|
78
|
-
* Used to ensure type safety for synchronous derivations/resources.
|
|
79
|
-
*
|
|
80
|
-
* @public
|
|
81
|
-
*/
|
|
82
|
-
// export type NotPromise<T> = T extends Promise<unknown> ? never : T;
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Converts a FlowNode, FlowNodeAsync, or getter function into a SolidResource.
|
|
86
|
-
*
|
|
87
|
-
* @param flow - The FlowNode, FlowNodeAsync, or getter function to convert.
|
|
88
|
-
* @returns A SolidResource that wraps the value or computation.
|
|
89
|
-
*
|
|
90
|
-
* @remarks
|
|
91
|
-
* This function bridges PicoFlow's reactive system with SolidJS, allowing you to use
|
|
92
|
-
* PicoFlow nodes and computations within Solid components. All conversions return a
|
|
93
|
-
* `SolidResource`, which can handle both synchronous and asynchronous values seamlessly.
|
|
94
|
-
*
|
|
95
|
-
* The conversion works with:
|
|
96
|
-
* - **FlowNode**: Synchronous reactive nodes (e.g., from `state()` or `derivation()`)
|
|
97
|
-
* - **FlowNodeAsync**: Asynchronous reactive nodes (e.g., from `resourceAsync()`)
|
|
98
|
-
* - **Getter functions**: Computation functions that use a FlowTracker to access reactive values
|
|
99
|
-
*
|
|
100
|
-
* The created SolidResource automatically subscribes to the PicoFlow nodes and updates
|
|
101
|
-
* when their values change. The subscription is properly cleaned up when the Solid
|
|
102
|
-
* component unmounts.
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* ```typescript
|
|
106
|
-
* import { from } from 'picoflow/solid';
|
|
107
|
-
* import { state } from 'picoflow';
|
|
108
|
-
*
|
|
109
|
-
* // Convert a PicoFlow state to a Solid resource
|
|
110
|
-
* const $count = state(0);
|
|
111
|
-
* const solidCount = from($count);
|
|
112
|
-
*
|
|
113
|
-
* // Use in a Solid component
|
|
114
|
-
* function Counter() {
|
|
115
|
-
* return <div>Count: {solidCount.get()}</div>;
|
|
116
|
-
* }
|
|
117
|
-
*
|
|
118
|
-
* // Or convert a computation function
|
|
119
|
-
* const solidDerived = from((t) => {
|
|
120
|
-
* return solidCount.get(t) * 2;
|
|
121
|
-
* });
|
|
122
|
-
* ```
|
|
123
|
-
*
|
|
124
|
-
* @public
|
|
125
|
-
*/
|
|
126
|
-
export function from<T>(flow: FlowReadonlyAsync<T>): SolidResource<T>;
|
|
127
|
-
export function from<T>(flow: FlowReadonly<T>): SolidResource<T>;
|
|
128
|
-
export function from<T>(flow: (t: FlowTracker) => Promise<T>): SolidResource<T>;
|
|
129
|
-
export function from<T>(
|
|
130
|
-
flow: (t: FlowTracker) => NotPromise<T>,
|
|
131
|
-
): SolidResource<T>;
|
|
132
|
-
export function from<T>(
|
|
133
|
-
flow:
|
|
134
|
-
| FlowReadonlyAsync<T>
|
|
135
|
-
| FlowReadonly<T>
|
|
136
|
-
| ((t: FlowTracker) => NotPromise<T>)
|
|
137
|
-
| ((t: FlowTracker) => Promise<T>),
|
|
138
|
-
): SolidResource<T> {
|
|
139
|
-
if (flow instanceof FlowNodeAsync || flow instanceof FlowNode) {
|
|
140
|
-
return fromNode(flow);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (typeof flow === "function") {
|
|
144
|
-
return fromGetter(flow);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
throw new Error("Invalid flow type");
|
|
148
|
-
}
|
package/src/solid/index.ts
DELETED
package/src/solid/primitives.ts
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createMemo,
|
|
3
|
-
createResource,
|
|
4
|
-
createSignal,
|
|
5
|
-
type ResourceFetcher,
|
|
6
|
-
} from "solid-js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A getter function or value for Solid state/derivation.
|
|
10
|
-
*
|
|
11
|
-
* @typeParam T - The value type.
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
14
|
-
export type SolidGetter<T> = ((previous: T) => T) | T;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Interface for a Solid-style observable value.
|
|
18
|
-
*
|
|
19
|
-
* @typeParam T - The value type.
|
|
20
|
-
* @public
|
|
21
|
-
*/
|
|
22
|
-
export interface SolidObservable<T> {
|
|
23
|
-
/**
|
|
24
|
-
* Returns the current value.
|
|
25
|
-
*/
|
|
26
|
-
get: () => T;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Solid-style state container wrapping SolidJS's createSignal, providing a writable reactive signal.
|
|
31
|
-
*
|
|
32
|
-
* @remarks
|
|
33
|
-
* SolidState is a thin wrapper around SolidJS's `createSignal` that provides a class-based
|
|
34
|
-
* interface consistent with PicoFlow's API style. It's used internally by PicoFlow's Solid
|
|
35
|
-
* integration but can also be used directly in Solid components.
|
|
36
|
-
*
|
|
37
|
-
* Unlike PicoFlow's {@link FlowState} which uses explicit tracking context, SolidState
|
|
38
|
-
* relies on SolidJS's automatic dependency tracking within reactive contexts like
|
|
39
|
-
* `createEffect` or component render functions.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```typescript
|
|
43
|
-
* const count = new SolidState(0);
|
|
44
|
-
*
|
|
45
|
-
* // In a Solid component
|
|
46
|
-
* function Counter() {
|
|
47
|
-
* return <div>{count.get()}</div>; // Automatically reactive
|
|
48
|
-
* }
|
|
49
|
-
*
|
|
50
|
-
* // Update the value
|
|
51
|
-
* count.set(1);
|
|
52
|
-
* count.set(prev => prev + 1);
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @typeParam T - The value type.
|
|
56
|
-
* @public
|
|
57
|
-
*/
|
|
58
|
-
export class SolidState<T> implements SolidObservable<T> {
|
|
59
|
-
/**
|
|
60
|
-
* Returns the current value.
|
|
61
|
-
*/
|
|
62
|
-
readonly get: () => T;
|
|
63
|
-
/**
|
|
64
|
-
* Sets the value or updates it using a getter function.
|
|
65
|
-
*/
|
|
66
|
-
readonly set: (param: SolidGetter<T>) => void;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Creates a new SolidState with the given initial value.
|
|
70
|
-
* @param initialValue - The initial value.
|
|
71
|
-
*/
|
|
72
|
-
constructor(initialValue: T) {
|
|
73
|
-
const [get, set] = createSignal<T>(initialValue);
|
|
74
|
-
this.get = get;
|
|
75
|
-
this.set = set;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
type EffectFunction<Prev, Next extends Prev = Prev> = (v: Prev) => Next;
|
|
80
|
-
/**
|
|
81
|
-
* Solid-style derivation wrapping SolidJS's createMemo, providing a computed reactive value.
|
|
82
|
-
*
|
|
83
|
-
* @remarks
|
|
84
|
-
* SolidDerivation is a thin wrapper around SolidJS's `createMemo` that provides a class-based
|
|
85
|
-
* interface consistent with PicoFlow's API style. It creates a memoized computation that
|
|
86
|
-
* automatically tracks its dependencies and recomputes only when they change.
|
|
87
|
-
*
|
|
88
|
-
* Unlike PicoFlow's {@link FlowDerivation} which uses explicit tracking context, SolidDerivation
|
|
89
|
-
* relies on SolidJS's automatic dependency tracking. The computation function runs within
|
|
90
|
-
* SolidJS's reactive scope and automatically subscribes to any signals accessed during execution.
|
|
91
|
-
*
|
|
92
|
-
* **Memoization:**
|
|
93
|
-
* The computed value is cached and only recomputed when tracked dependencies change,
|
|
94
|
-
* providing efficient derived state management.
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```typescript
|
|
98
|
-
* const firstName = new SolidState('John');
|
|
99
|
-
* const lastName = new SolidState('Doe');
|
|
100
|
-
*
|
|
101
|
-
* const fullName = new SolidDerivation(() => {
|
|
102
|
-
* return `${firstName.get()} ${lastName.get()}`;
|
|
103
|
-
* });
|
|
104
|
-
*
|
|
105
|
-
* // In a Solid component
|
|
106
|
-
* function Display() {
|
|
107
|
-
* return <div>{fullName.get()}</div>; // Automatically updates
|
|
108
|
-
* }
|
|
109
|
-
* ```
|
|
110
|
-
*
|
|
111
|
-
* @typeParam T - The value type.
|
|
112
|
-
* @public
|
|
113
|
-
*/
|
|
114
|
-
export class SolidDerivation<T> implements SolidObservable<T> {
|
|
115
|
-
/**
|
|
116
|
-
* Returns the current derived value.
|
|
117
|
-
*/
|
|
118
|
-
readonly get: () => T;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Creates a new SolidDerivation from a getter function or value.
|
|
122
|
-
* @param calculator - The getter function or value.
|
|
123
|
-
*/
|
|
124
|
-
constructor(calculator: SolidGetter<T>) {
|
|
125
|
-
const get = createMemo<T>(calculator as EffectFunction<T | undefined, T>);
|
|
126
|
-
this.get = get;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Solid-style resource wrapping SolidJS's createResource, providing async data loading with reactive state.
|
|
132
|
-
*
|
|
133
|
-
* @remarks
|
|
134
|
-
* SolidResource is a thin wrapper around SolidJS's `createResource` that provides a class-based
|
|
135
|
-
* interface consistent with PicoFlow's API style. It manages asynchronous data fetching with
|
|
136
|
-
* built-in loading states, error handling, and automatic reactivity.
|
|
137
|
-
*
|
|
138
|
-
* Unlike PicoFlow's {@link FlowResource} or {@link FlowResourceAsync}, SolidResource integrates
|
|
139
|
-
* directly with SolidJS's Suspense and ErrorBoundary mechanisms, providing a first-class async
|
|
140
|
-
* data loading experience in Solid applications.
|
|
141
|
-
*
|
|
142
|
-
* **Resource States:**
|
|
143
|
-
* - `unresolved`: Initial state before first fetch
|
|
144
|
-
* - `pending`: Fetch is in progress
|
|
145
|
-
* - `ready`: Data has been successfully loaded
|
|
146
|
-
* - `refreshing`: Refetching while previous data is still available
|
|
147
|
-
* - `errored`: Fetch failed with an error
|
|
148
|
-
*
|
|
149
|
-
* **Properties:**
|
|
150
|
-
* - `get()`: Returns the current value (or undefined if not ready)
|
|
151
|
-
* - `state()`: Returns the current loading state
|
|
152
|
-
* - `latest()`: Returns the most recent successfully loaded value
|
|
153
|
-
* - `refetch()`: Triggers a new fetch operation
|
|
154
|
-
*
|
|
155
|
-
* @example
|
|
156
|
-
* ```typescript
|
|
157
|
-
* const user = new SolidResource(async () => {
|
|
158
|
-
* const res = await fetch('/api/user');
|
|
159
|
-
* return res.json();
|
|
160
|
-
* });
|
|
161
|
-
*
|
|
162
|
-
* // In a Solid component
|
|
163
|
-
* function UserProfile() {
|
|
164
|
-
* return (
|
|
165
|
-
* <div>
|
|
166
|
-
* {user.state() === 'pending' && <p>Loading...</p>}
|
|
167
|
-
* {user.state() === 'ready' && <p>Name: {user.get()?.name}</p>}
|
|
168
|
-
* <button onClick={() => user.refetch()}>Refresh</button>
|
|
169
|
-
* </div>
|
|
170
|
-
* );
|
|
171
|
-
* }
|
|
172
|
-
* ```
|
|
173
|
-
*
|
|
174
|
-
* @typeParam T - The value type.
|
|
175
|
-
* @public
|
|
176
|
-
*/
|
|
177
|
-
export class SolidResource<T> implements SolidObservable<T | undefined> {
|
|
178
|
-
/**
|
|
179
|
-
* Returns the current value (or undefined if not yet loaded).
|
|
180
|
-
*/
|
|
181
|
-
readonly get: () => T | undefined;
|
|
182
|
-
/**
|
|
183
|
-
* Returns the current resource state.
|
|
184
|
-
*/
|
|
185
|
-
readonly state: () =>
|
|
186
|
-
| "unresolved"
|
|
187
|
-
| "pending"
|
|
188
|
-
| "errored"
|
|
189
|
-
| "ready"
|
|
190
|
-
| "refreshing";
|
|
191
|
-
/**
|
|
192
|
-
* Returns the latest successfully loaded value (or undefined).
|
|
193
|
-
*/
|
|
194
|
-
readonly latest: () => T | undefined;
|
|
195
|
-
/**
|
|
196
|
-
* Triggers a refetch of the resource.
|
|
197
|
-
*/
|
|
198
|
-
readonly refetch: () => void;
|
|
199
|
-
|
|
200
|
-
readonly set: (param: SolidGetter<T>) => void;
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Creates a new SolidResource from a fetcher function.
|
|
204
|
-
* @param fetcher - The async fetcher function.
|
|
205
|
-
*/
|
|
206
|
-
constructor(fetcher: ResourceFetcher<true, T, unknown>) {
|
|
207
|
-
const [get, set] = createResource<T>(fetcher);
|
|
208
|
-
this.get = get;
|
|
209
|
-
this.state = () => get.state;
|
|
210
|
-
this.latest = () => get.latest;
|
|
211
|
-
this.refetch = () => set.refetch();
|
|
212
|
-
//@ts-expect-error - SolidGetter is not assignable to parameter of type 'Exclude<T, Function> | ((prev: T | undefined) => T)'
|
|
213
|
-
this.set = (value: SolidGetter<T>) => set.mutate(value);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { effect } from "#package";
|
|
3
|
-
|
|
4
|
-
describe("FlowEffect", () => {
|
|
5
|
-
describe("disposal", () => {
|
|
6
|
-
it("should have disposed property set to false initially and true after disposal", () => {
|
|
7
|
-
const effectFn = vi.fn();
|
|
8
|
-
const $effect = effect(() => {
|
|
9
|
-
effectFn();
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
expect($effect.disposed).toBe(false);
|
|
13
|
-
$effect.dispose();
|
|
14
|
-
expect($effect.disposed).toBe(true);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("should throw error when disposed twice", () => {
|
|
18
|
-
const effectFn = vi.fn();
|
|
19
|
-
const $effect = effect(() => {
|
|
20
|
-
effectFn();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
$effect.dispose();
|
|
24
|
-
expect(() => $effect.dispose()).toThrow("Effect is disposed");
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe("execution", () => {
|
|
29
|
-
it("should execute immediately upon creation", async () => {
|
|
30
|
-
const effectFn = vi.fn();
|
|
31
|
-
effect(() => {
|
|
32
|
-
effectFn();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("should execute callback with tracking context as parameter", async () => {
|
|
39
|
-
const effectFn = vi.fn();
|
|
40
|
-
let receivedContext: unknown = null;
|
|
41
|
-
|
|
42
|
-
const $effect = effect((t) => {
|
|
43
|
-
receivedContext = t;
|
|
44
|
-
effectFn();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
|
|
48
|
-
expect(receivedContext).toBe($effect);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe("async support", () => {
|
|
53
|
-
it("should support async callback functions", async () => {
|
|
54
|
-
const effectFn = vi.fn();
|
|
55
|
-
let asyncCompleted = false;
|
|
56
|
-
|
|
57
|
-
effect(async () => {
|
|
58
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
59
|
-
asyncCompleted = true;
|
|
60
|
-
effectFn();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
|
|
64
|
-
expect(asyncCompleted).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("should await async callback before completing", async () => {
|
|
68
|
-
const executionOrder: string[] = [];
|
|
69
|
-
const effectFn = vi.fn();
|
|
70
|
-
|
|
71
|
-
effect(async () => {
|
|
72
|
-
executionOrder.push("start");
|
|
73
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
74
|
-
executionOrder.push("async-complete");
|
|
75
|
-
effectFn();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
executionOrder.push("after-effect-creation");
|
|
79
|
-
|
|
80
|
-
await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
|
|
81
|
-
expect(executionOrder).toEqual([
|
|
82
|
-
"start",
|
|
83
|
-
"after-effect-creation",
|
|
84
|
-
"async-complete",
|
|
85
|
-
]);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
describe("error handling", () => {
|
|
90
|
-
it("should throw error when trying to execute after disposal", async () => {
|
|
91
|
-
const effectFn = vi.fn();
|
|
92
|
-
const $effect = effect(() => {
|
|
93
|
-
effectFn();
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
|
|
97
|
-
|
|
98
|
-
$effect.dispose();
|
|
99
|
-
|
|
100
|
-
// The internal _exec method should throw when called after disposal
|
|
101
|
-
// This is tested indirectly - if we try to trigger execution after disposal,
|
|
102
|
-
// it should fail. However, since we're testing in isolation without dependencies,
|
|
103
|
-
// we verify that the disposed state prevents further execution
|
|
104
|
-
expect($effect.disposed).toBe(true);
|
|
105
|
-
expect(() => $effect.dispose()).toThrow("Effect is disposed");
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
});
|