@ersbeth/picoflow 1.1.1 → 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 +857 -1528
- 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 -53
- 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 -139
- 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
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
import { createEffect, createRoot } from "solid-js";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import type { FlowTracker } from "~";
|
|
4
|
+
import { derivation, derivationAsync, from, state, stateAsync } from "~";
|
|
5
|
+
|
|
6
|
+
describe("converters", () => {
|
|
7
|
+
describe("from", () => {
|
|
8
|
+
describe("unit", () => {
|
|
9
|
+
describe("initialization", () => {
|
|
10
|
+
it("should convert synchronous FlowNode to SolidResource", async () => {
|
|
11
|
+
await createRoot(async (dispose) => {
|
|
12
|
+
const $state = state(42);
|
|
13
|
+
const solidResource = from($state);
|
|
14
|
+
|
|
15
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
16
|
+
dispose();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should convert FlowNodeAsync to SolidResource", async () => {
|
|
21
|
+
await createRoot(async (dispose) => {
|
|
22
|
+
const $stateAsync = stateAsync(Promise.resolve(42));
|
|
23
|
+
const solidResource = from($stateAsync);
|
|
24
|
+
|
|
25
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
26
|
+
dispose();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("should convert synchronous getter function to SolidResource", async () => {
|
|
31
|
+
await createRoot(async (dispose) => {
|
|
32
|
+
const $state = state(42);
|
|
33
|
+
const getter = (t: FlowTracker) => $state.get(t);
|
|
34
|
+
const solidResource = from(getter);
|
|
35
|
+
|
|
36
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
37
|
+
dispose();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should return a SolidResource instance", async () => {
|
|
42
|
+
await createRoot(async (dispose) => {
|
|
43
|
+
const $state = state(42);
|
|
44
|
+
const solidResource = from($state);
|
|
45
|
+
|
|
46
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
47
|
+
dispose();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe("conversion from FlowNode (synchronous)", () => {
|
|
53
|
+
it("should convert a FlowState to SolidResource", async () => {
|
|
54
|
+
await createRoot(async (dispose) => {
|
|
55
|
+
const $state = state(42);
|
|
56
|
+
const solidResource = from($state);
|
|
57
|
+
|
|
58
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
59
|
+
dispose();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should convert a FlowDerivation to SolidResource", async () => {
|
|
64
|
+
await createRoot(async (dispose) => {
|
|
65
|
+
const $state = state(5);
|
|
66
|
+
const $derivation = derivation((t) => $state.get(t) * 2);
|
|
67
|
+
const solidResource = from($derivation);
|
|
68
|
+
|
|
69
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
70
|
+
dispose();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should initialize with FlowNode value", async () => {
|
|
75
|
+
await createRoot(async (dispose) => {
|
|
76
|
+
const $state = state(42);
|
|
77
|
+
const solidResource = from($state);
|
|
78
|
+
|
|
79
|
+
// Wait for resource to load
|
|
80
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
81
|
+
dispose();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("should handle number values", async () => {
|
|
86
|
+
await createRoot(async (dispose) => {
|
|
87
|
+
const $state = state(42);
|
|
88
|
+
const solidResource = from($state);
|
|
89
|
+
|
|
90
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
91
|
+
dispose();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("should handle string values", async () => {
|
|
96
|
+
await createRoot(async (dispose) => {
|
|
97
|
+
const $state = state("hello");
|
|
98
|
+
const solidResource = from($state);
|
|
99
|
+
|
|
100
|
+
await vi.waitFor(() => expect(solidResource()).toBe("hello"));
|
|
101
|
+
dispose();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should handle object values", async () => {
|
|
106
|
+
await createRoot(async (dispose) => {
|
|
107
|
+
const obj = { a: 1, b: 2 };
|
|
108
|
+
const $state = state(obj);
|
|
109
|
+
const solidResource = from($state);
|
|
110
|
+
|
|
111
|
+
await vi.waitFor(() => expect(solidResource()).toEqual({ a: 1, b: 2 }));
|
|
112
|
+
dispose();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should handle array values", async () => {
|
|
117
|
+
await createRoot(async (dispose) => {
|
|
118
|
+
const arr = [1, 2, 3];
|
|
119
|
+
const $state = state(arr);
|
|
120
|
+
const solidResource = from($state);
|
|
121
|
+
|
|
122
|
+
await vi.waitFor(() => expect(solidResource()).toEqual([1, 2, 3]));
|
|
123
|
+
dispose();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("should handle null values", async () => {
|
|
128
|
+
await createRoot(async (dispose) => {
|
|
129
|
+
const $stateNull = state(null);
|
|
130
|
+
const solidResourceNull = from($stateNull);
|
|
131
|
+
|
|
132
|
+
await vi.waitFor(() => expect(solidResourceNull()).toBeNull());
|
|
133
|
+
dispose();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("should handle undefined values", async () => {
|
|
138
|
+
await createRoot(async (dispose) => {
|
|
139
|
+
const $stateUndefined = state(undefined);
|
|
140
|
+
const solidResourceUndefined = from($stateUndefined);
|
|
141
|
+
|
|
142
|
+
await vi.waitFor(() => expect(solidResourceUndefined()).toBeUndefined());
|
|
143
|
+
dispose();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe("conversion from FlowNodeAsync (asynchronous)", () => {
|
|
149
|
+
it("should convert a FlowStateAsync to SolidResource", async () => {
|
|
150
|
+
await createRoot(async (dispose) => {
|
|
151
|
+
const $stateAsync = stateAsync(Promise.resolve(42));
|
|
152
|
+
const solidResource = from($stateAsync);
|
|
153
|
+
|
|
154
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
155
|
+
dispose();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("should convert a FlowDerivationAsync to SolidResource", async () => {
|
|
160
|
+
await createRoot(async (dispose) => {
|
|
161
|
+
const $stateAsync = stateAsync(Promise.resolve(5));
|
|
162
|
+
const $derivationAsync = derivationAsync(async (t) => $stateAsync.get(t) * 2);
|
|
163
|
+
const solidResource = from($derivationAsync);
|
|
164
|
+
|
|
165
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
166
|
+
dispose();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("should initialize with FlowNodeAsync value", async () => {
|
|
171
|
+
await createRoot(async (dispose) => {
|
|
172
|
+
const $stateAsync = stateAsync(Promise.resolve(42));
|
|
173
|
+
const solidResource = from($stateAsync);
|
|
174
|
+
|
|
175
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
176
|
+
dispose();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("should handle resolved Promises", async () => {
|
|
181
|
+
await createRoot(async (dispose) => {
|
|
182
|
+
const $stateAsync = stateAsync(Promise.resolve(42));
|
|
183
|
+
const solidResource = from($stateAsync);
|
|
184
|
+
|
|
185
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
186
|
+
dispose();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("should handle rejected Promises", async () => {
|
|
191
|
+
await createRoot(async (dispose) => {
|
|
192
|
+
const error = new Error("Test error");
|
|
193
|
+
const $stateAsync = stateAsync(Promise.reject(error));
|
|
194
|
+
|
|
195
|
+
const solidResource = from($stateAsync);
|
|
196
|
+
await vi.waitFor(() => expect(solidResource.error).toBe(error));
|
|
197
|
+
dispose();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
describe("conversion from getter function", () => {
|
|
203
|
+
it("should convert a synchronous getter to SolidResource", async () => {
|
|
204
|
+
await createRoot(async (dispose) => {
|
|
205
|
+
const $state = state(42);
|
|
206
|
+
const getter = (t: FlowTracker) => $state.get(t);
|
|
207
|
+
const solidResource = from(getter);
|
|
208
|
+
|
|
209
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
210
|
+
dispose();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it("should track dependencies in the getter", async () => {
|
|
215
|
+
await createRoot(async (dispose) => {
|
|
216
|
+
const $state = state(5);
|
|
217
|
+
const getter = (t: FlowTracker) => $state.get(t) * 2;
|
|
218
|
+
const solidResource = from(getter);
|
|
219
|
+
|
|
220
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
221
|
+
|
|
222
|
+
$state.set(6);
|
|
223
|
+
await vi.waitFor(() => expect(solidResource()).toBe(12));
|
|
224
|
+
dispose();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it("should create a FlowNodeSync from the getter", async () => {
|
|
229
|
+
await createRoot(async (dispose) => {
|
|
230
|
+
const $state = state(42);
|
|
231
|
+
const getter = (t: FlowTracker) => $state.get(t);
|
|
232
|
+
const solidResource = from(getter);
|
|
233
|
+
|
|
234
|
+
await vi.waitFor(() => expect(solidResource()).toBe(42));
|
|
235
|
+
dispose();
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
describe("reactivity", () => {
|
|
241
|
+
it("should update SolidResource when FlowState changes", async () => {
|
|
242
|
+
await createRoot(async (dispose) => {
|
|
243
|
+
const $state = state(0);
|
|
244
|
+
const solidResource = from($state);
|
|
245
|
+
|
|
246
|
+
// Wait for initial load
|
|
247
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
248
|
+
const fn = vi.fn();
|
|
249
|
+
|
|
250
|
+
createEffect(() => {
|
|
251
|
+
fn(solidResource());
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Wait for effect to run
|
|
255
|
+
await vi.waitFor(() => {
|
|
256
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
257
|
+
});
|
|
258
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
259
|
+
|
|
260
|
+
// Update FlowState
|
|
261
|
+
$state.set(1);
|
|
262
|
+
|
|
263
|
+
// Wait for update
|
|
264
|
+
await vi.waitFor(() => {
|
|
265
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
266
|
+
});
|
|
267
|
+
expect(fn).toHaveBeenLastCalledWith(1);
|
|
268
|
+
dispose();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it("should update SolidResource when FlowDerivation changes", async () => {
|
|
273
|
+
await createRoot(async (dispose) => {
|
|
274
|
+
const $state = state(5);
|
|
275
|
+
const $derivation = derivation((t) => $state.get(t) * 2);
|
|
276
|
+
const solidResource = from($derivation);
|
|
277
|
+
|
|
278
|
+
// Wait for initial load
|
|
279
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
280
|
+
|
|
281
|
+
const fn = vi.fn();
|
|
282
|
+
createEffect(() => {
|
|
283
|
+
fn(solidResource());
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// Wait for effect to run
|
|
287
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
288
|
+
expect(fn).toHaveBeenLastCalledWith(10);
|
|
289
|
+
|
|
290
|
+
// Update dependency
|
|
291
|
+
$state.set(6);
|
|
292
|
+
|
|
293
|
+
// Wait for update
|
|
294
|
+
await vi.waitFor(() => {
|
|
295
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
296
|
+
});
|
|
297
|
+
expect(fn).toHaveBeenLastCalledWith(12);
|
|
298
|
+
dispose();
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it("should update SolidResource when FlowStateAsync changes", async () => {
|
|
303
|
+
await createRoot(async (dispose) => {
|
|
304
|
+
const $stateAsync = stateAsync(Promise.resolve(0));
|
|
305
|
+
const solidResource = from($stateAsync);
|
|
306
|
+
|
|
307
|
+
// Wait for initial load
|
|
308
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
309
|
+
|
|
310
|
+
const fn = vi.fn();
|
|
311
|
+
createEffect(() => {
|
|
312
|
+
fn(solidResource());
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Wait for effect to run
|
|
316
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
317
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
318
|
+
|
|
319
|
+
// Update FlowStateAsync
|
|
320
|
+
$stateAsync.set(Promise.resolve(1));
|
|
321
|
+
|
|
322
|
+
// Wait for update
|
|
323
|
+
await vi.waitFor(() => {
|
|
324
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
325
|
+
});
|
|
326
|
+
expect(fn).toHaveBeenLastCalledWith(1);
|
|
327
|
+
|
|
328
|
+
dispose();
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it("should update SolidResource when FlowDerivationAsync changes", async () => {
|
|
333
|
+
await createRoot(async (dispose) => {
|
|
334
|
+
const $stateAsync = stateAsync(Promise.resolve(5));
|
|
335
|
+
const $derivationAsync = derivationAsync(async (t) => (await $stateAsync.get(t)) * 2);
|
|
336
|
+
const solidResource = from($derivationAsync);
|
|
337
|
+
|
|
338
|
+
// Wait for initial load
|
|
339
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
340
|
+
|
|
341
|
+
const fn = vi.fn();
|
|
342
|
+
createEffect(() => {
|
|
343
|
+
fn(solidResource());
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// Wait for effect to run
|
|
347
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
348
|
+
expect(fn).toHaveBeenLastCalledWith(10);
|
|
349
|
+
|
|
350
|
+
// Update async dependency
|
|
351
|
+
$stateAsync.set(Promise.resolve(6));
|
|
352
|
+
|
|
353
|
+
// Wait for update
|
|
354
|
+
await vi.waitFor(() => {
|
|
355
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
356
|
+
});
|
|
357
|
+
expect(fn).toHaveBeenLastCalledWith(12);
|
|
358
|
+
dispose();
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it("should update SolidResource when getter dependency changes", async () => {
|
|
363
|
+
await createRoot(async (dispose) => {
|
|
364
|
+
const $state = state(5);
|
|
365
|
+
const getter = (t: FlowTracker) => $state.get(t) * 2;
|
|
366
|
+
const solidResource = from(getter);
|
|
367
|
+
|
|
368
|
+
// Wait for initial load
|
|
369
|
+
await vi.waitFor(() => expect(solidResource()).toBe(10));
|
|
370
|
+
|
|
371
|
+
const fn = vi.fn();
|
|
372
|
+
createEffect(() => {
|
|
373
|
+
fn(solidResource());
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
// Wait for effect to run
|
|
377
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
378
|
+
expect(fn).toHaveBeenLastCalledWith(10);
|
|
379
|
+
|
|
380
|
+
// Update the tracked FlowNode
|
|
381
|
+
$state.set(6);
|
|
382
|
+
|
|
383
|
+
// Wait for update
|
|
384
|
+
await vi.waitFor(() => {
|
|
385
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
386
|
+
});
|
|
387
|
+
expect(fn).toHaveBeenLastCalledWith(12);
|
|
388
|
+
|
|
389
|
+
dispose();
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it("should propagate multiple sequential changes", async () => {
|
|
394
|
+
await createRoot(async (dispose) => {
|
|
395
|
+
const $state = state(0);
|
|
396
|
+
const solidResource = from($state);
|
|
397
|
+
|
|
398
|
+
// Wait for initial load
|
|
399
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
400
|
+
|
|
401
|
+
const fn = vi.fn();
|
|
402
|
+
createEffect(() => {
|
|
403
|
+
fn(solidResource());
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// Wait for initial effect
|
|
407
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
408
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
409
|
+
|
|
410
|
+
// Make multiple changes
|
|
411
|
+
$state.set(1);
|
|
412
|
+
await vi.waitFor(() => expect(solidResource()).toBe(1));
|
|
413
|
+
|
|
414
|
+
$state.set(2);
|
|
415
|
+
await vi.waitFor(() => expect(solidResource()).toBe(2));
|
|
416
|
+
|
|
417
|
+
$state.set(3);
|
|
418
|
+
await vi.waitFor(() => {
|
|
419
|
+
expect(solidResource()).toBe(3);
|
|
420
|
+
});
|
|
421
|
+
dispose();
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it("should be reactive within createRoot", async () => {
|
|
426
|
+
await createRoot(async (dispose) => {
|
|
427
|
+
const $state = state(0);
|
|
428
|
+
const solidResource = from($state);
|
|
429
|
+
|
|
430
|
+
// Wait for initial load
|
|
431
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
432
|
+
|
|
433
|
+
$state.set(1);
|
|
434
|
+
await vi.waitFor(() => expect(solidResource()).toBe(1));
|
|
435
|
+
|
|
436
|
+
$state.set(2);
|
|
437
|
+
await vi.waitFor(() => expect(solidResource()).toBe(2));
|
|
438
|
+
dispose();
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
it("should update SolidResource.get() value when FlowNode changes", async () => {
|
|
443
|
+
await createRoot(async (dispose) => {
|
|
444
|
+
const $state = state(0);
|
|
445
|
+
const solidResource = from($state);
|
|
446
|
+
|
|
447
|
+
// Wait for initial load
|
|
448
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
449
|
+
|
|
450
|
+
$state.set(1);
|
|
451
|
+
await vi.waitFor(() => expect(solidResource()).toBe(1));
|
|
452
|
+
|
|
453
|
+
// Test async updates for FlowNodeAsync
|
|
454
|
+
const $stateAsync = stateAsync(Promise.resolve(10));
|
|
455
|
+
const solidResourceAsync = from($stateAsync);
|
|
456
|
+
|
|
457
|
+
await vi.waitFor(() => expect(solidResourceAsync()).toBe(10));
|
|
458
|
+
|
|
459
|
+
$stateAsync.set(Promise.resolve(20));
|
|
460
|
+
await vi.waitFor(() => expect(solidResourceAsync()).toBe(20));
|
|
461
|
+
dispose();
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it("should trigger createEffect when FlowNode value changes", async () => {
|
|
466
|
+
await createRoot(async (dispose) => {
|
|
467
|
+
const $state = state(0);
|
|
468
|
+
const solidResource = from($state);
|
|
469
|
+
|
|
470
|
+
// Wait for initial load
|
|
471
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
472
|
+
|
|
473
|
+
const fn = vi.fn();
|
|
474
|
+
createEffect(() => {
|
|
475
|
+
fn(solidResource());
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
// Wait for initial effect
|
|
479
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
480
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
481
|
+
|
|
482
|
+
// Change FlowNode
|
|
483
|
+
$state.set(1);
|
|
484
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(2));
|
|
485
|
+
expect(fn).toHaveBeenLastCalledWith(1);
|
|
486
|
+
|
|
487
|
+
// Test with async FlowNode
|
|
488
|
+
const $stateAsync = stateAsync(Promise.resolve(10));
|
|
489
|
+
const solidResourceAsync = from($stateAsync);
|
|
490
|
+
|
|
491
|
+
await vi.waitFor(() => expect(solidResourceAsync()).toBe(10));
|
|
492
|
+
|
|
493
|
+
const fn2 = vi.fn();
|
|
494
|
+
createEffect(() => {
|
|
495
|
+
fn2(solidResourceAsync());
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
await vi.waitFor(() => expect(fn2).toHaveBeenCalledTimes(1));
|
|
499
|
+
expect(fn2).toHaveBeenLastCalledWith(10);
|
|
500
|
+
|
|
501
|
+
$stateAsync.set(Promise.resolve(20));
|
|
502
|
+
await vi.waitFor(() => expect(fn2).toHaveBeenCalledTimes(2));
|
|
503
|
+
expect(fn2).toHaveBeenLastCalledWith(20);
|
|
504
|
+
dispose();
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
describe("cleanup", () => {
|
|
510
|
+
it("should dispose FlowEffect on cleanup", async () => {
|
|
511
|
+
await createRoot(async (dispose) => {
|
|
512
|
+
const $state = state(0);
|
|
513
|
+
const solidResource = from($state);
|
|
514
|
+
|
|
515
|
+
// Wait for initial load
|
|
516
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
517
|
+
|
|
518
|
+
const fn = vi.fn();
|
|
519
|
+
createEffect(() => {
|
|
520
|
+
fn(solidResource());
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
524
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
525
|
+
|
|
526
|
+
// Dispose
|
|
527
|
+
dispose();
|
|
528
|
+
|
|
529
|
+
// Try to update - should not trigger effects after dispose
|
|
530
|
+
$state.set(1);
|
|
531
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
532
|
+
|
|
533
|
+
// Effect count should not have increased after dispose
|
|
534
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
it("should clean up subscriptions on unmount", async () => {
|
|
539
|
+
await createRoot(async (dispose) => {
|
|
540
|
+
const $state = state(0);
|
|
541
|
+
const solidResource = from($state);
|
|
542
|
+
|
|
543
|
+
// Wait for initial load
|
|
544
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
545
|
+
|
|
546
|
+
const fn = vi.fn();
|
|
547
|
+
createEffect(() => {
|
|
548
|
+
fn(solidResource());
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
await vi.waitFor(() => expect(fn).toHaveBeenCalledTimes(1));
|
|
552
|
+
expect(fn).toHaveBeenLastCalledWith(0);
|
|
553
|
+
|
|
554
|
+
// Dispose (unmount)
|
|
555
|
+
dispose();
|
|
556
|
+
|
|
557
|
+
// Update should not trigger after unmount
|
|
558
|
+
$state.set(1);
|
|
559
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
560
|
+
|
|
561
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it("should not update after dispose", async () => {
|
|
566
|
+
await createRoot(async (dispose) => {
|
|
567
|
+
const $state = state(0);
|
|
568
|
+
const solidResource = from($state);
|
|
569
|
+
|
|
570
|
+
// Wait for initial load
|
|
571
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
572
|
+
|
|
573
|
+
const initialValue = solidResource();
|
|
574
|
+
expect(initialValue).toBe(0);
|
|
575
|
+
|
|
576
|
+
// Dispose
|
|
577
|
+
dispose();
|
|
578
|
+
|
|
579
|
+
// Update FlowNode
|
|
580
|
+
$state.set(1);
|
|
581
|
+
|
|
582
|
+
// Wait a bit
|
|
583
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
584
|
+
|
|
585
|
+
// Value should not have changed after dispose
|
|
586
|
+
// Note: The resource might still have the old value cached, but it shouldn't update
|
|
587
|
+
// This test verifies that updates stop after dispose
|
|
588
|
+
expect(solidResource()).toBe(initialValue);
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
describe("integration with SolidJS", () => {
|
|
594
|
+
it("should work with createEffect", async () => {
|
|
595
|
+
await createRoot(async (dispose) => {
|
|
596
|
+
const $state = state(0);
|
|
597
|
+
const solidResource = from($state);
|
|
598
|
+
|
|
599
|
+
// Wait for initial load
|
|
600
|
+
await vi.waitFor(() => expect(solidResource()).toBe(0));
|
|
601
|
+
|
|
602
|
+
const values: number[] = [];
|
|
603
|
+
createEffect(() => {
|
|
604
|
+
values.push(solidResource() ?? 0);
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
await vi.waitFor(() => {
|
|
608
|
+
expect(values.length).toBeGreaterThan(0);
|
|
609
|
+
expect(values[0]).toBe(0);
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
$state.set(1);
|
|
613
|
+
await vi.waitFor(() => {
|
|
614
|
+
expect(solidResource()).toBe(1);
|
|
615
|
+
expect(values.length).toBeGreaterThan(1);
|
|
616
|
+
});
|
|
617
|
+
dispose();
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
it("should handle multiple simultaneous conversions", async () => {
|
|
622
|
+
await createRoot(async (dispose) => {
|
|
623
|
+
const $state1 = state(1);
|
|
624
|
+
const $state2 = state(2);
|
|
625
|
+
const $state3 = state(3);
|
|
626
|
+
|
|
627
|
+
const solidResource1 = from($state1);
|
|
628
|
+
const solidResource2 = from($state2);
|
|
629
|
+
const solidResource3 = from($state3);
|
|
630
|
+
|
|
631
|
+
// Wait for all to load
|
|
632
|
+
await Promise.all([
|
|
633
|
+
vi.waitFor(() => expect(solidResource1()).toBe(1)),
|
|
634
|
+
vi.waitFor(() => expect(solidResource2()).toBe(2)),
|
|
635
|
+
vi.waitFor(() => expect(solidResource3()).toBe(3)),
|
|
636
|
+
]);
|
|
637
|
+
|
|
638
|
+
// Update all
|
|
639
|
+
$state1.set(10);
|
|
640
|
+
$state2.set(20);
|
|
641
|
+
$state3.set(30);
|
|
642
|
+
|
|
643
|
+
await Promise.all([
|
|
644
|
+
vi.waitFor(() => expect(solidResource1()).toBe(10)),
|
|
645
|
+
vi.waitFor(() => expect(solidResource2()).toBe(20)),
|
|
646
|
+
vi.waitFor(() => expect(solidResource3()).toBe(30)),
|
|
647
|
+
]);
|
|
648
|
+
dispose();
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
});
|
|
654
|
+
});
|