@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/typedoc.json
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
2
|
+
"$schema": "https://typedoc.org/schema.json",
|
|
3
|
+
"entryPoints": ["src/index.ts"],
|
|
4
|
+
"entryPointStrategy": "resolve",
|
|
5
|
+
"out": "docs/api",
|
|
6
|
+
"docsRoot": "docs",
|
|
7
|
+
"plugin": ["typedoc-plugin-markdown", "typedoc-vitepress-theme"],
|
|
8
|
+
"readme": "none",
|
|
9
|
+
"hideGenerator": true,
|
|
10
|
+
"cleanOutputDir": true,
|
|
11
|
+
"excludePrivate": true,
|
|
12
|
+
"excludeProtected": true,
|
|
13
|
+
"excludeExternals": true,
|
|
14
|
+
"excludeInternal": true,
|
|
15
|
+
"entryFileName": "index.md",
|
|
16
|
+
"hidePageHeader": true,
|
|
17
|
+
"hideBreadcrumbs": false,
|
|
18
|
+
"useCodeBlocks": true,
|
|
19
|
+
"expandObjects": true,
|
|
20
|
+
"parametersFormat": "table",
|
|
21
|
+
"propertiesFormat": "table",
|
|
22
|
+
"enumMembersFormat": "table",
|
|
23
|
+
"typeDeclarationFormat": "table",
|
|
24
|
+
"indexFormat": "table",
|
|
25
|
+
"outputFileStrategy": "members",
|
|
26
|
+
"flattenOutputFiles": false,
|
|
27
|
+
"fileExtension": ".md",
|
|
28
|
+
"publicPath": "/api/",
|
|
29
|
+
"textContentMappings": {
|
|
30
|
+
"header.title": "API Reference"
|
|
31
|
+
},
|
|
32
|
+
"externalSymbolLinkMappings": {
|
|
33
|
+
"@ersbeth/picoflow": {
|
|
34
|
+
"FlowObservable._getRaw": "#"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
37
|
}
|
package/vite.config.ts
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
import { defineConfig } from "vite";
|
|
2
2
|
import dts from "vite-plugin-dts";
|
|
3
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
root: "./src",
|
|
7
|
+
build: {
|
|
8
|
+
outDir: "../dist",
|
|
9
|
+
emptyOutDir: true,
|
|
10
|
+
lib: {
|
|
11
|
+
entry: "index.ts",
|
|
12
|
+
formats: ["es"],
|
|
13
|
+
},
|
|
14
|
+
target: "esnext",
|
|
15
|
+
minify: false,
|
|
16
|
+
rollupOptions: {
|
|
17
|
+
external: ["solid-js"],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
plugins: [
|
|
22
|
+
tsconfigPaths(),
|
|
23
|
+
dts({
|
|
24
|
+
include: "**/*",
|
|
25
|
+
outDir: "../dist/types",
|
|
26
|
+
compilerOptions: {
|
|
27
|
+
rootDir: "src",
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
],
|
|
29
31
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { playwright } from "@vitest/browser-playwright";
|
|
2
|
+
import solid from "vite-plugin-solid";
|
|
3
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
4
|
+
import { defineConfig } from "vitest/config";
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [solid(), tsconfigPaths()],
|
|
8
|
+
test: {
|
|
9
|
+
include: ["test/**/*.test.tsx"],
|
|
10
|
+
browser: {
|
|
11
|
+
enabled: true,
|
|
12
|
+
provider: playwright(),
|
|
13
|
+
// https://vitest.dev/config/browser/playwright
|
|
14
|
+
instances: [{ browser: "chromium" }],
|
|
15
|
+
viewport: {
|
|
16
|
+
width: 400,
|
|
17
|
+
height: 600,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
});
|
package/vitest.config.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import solid from "vite-plugin-solid";
|
|
2
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
2
3
|
import { defineConfig } from "vitest/config";
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
6
|
+
plugins: [solid(), tsconfigPaths()],
|
|
7
|
+
resolve: {
|
|
8
|
+
conditions: ["development", "browser"],
|
|
9
|
+
},
|
|
10
|
+
test: {
|
|
11
|
+
include: ["test/**/*.test.ts"],
|
|
12
|
+
coverage: {
|
|
13
|
+
reporter: ["text"],
|
|
14
|
+
include: ["src/**/*"],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
17
|
});
|
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
<!-- c9506e24-37d6-4d95-a937-545ccc76fe61 744135bd-5bf9-4a27-9006-1c9cfd4392d8 -->
|
|
2
|
-
# Plan d'implémentation : Unification FlowResource avec FlowDerivation (approche intégrée)
|
|
3
|
-
|
|
4
|
-
## 1. Modifications d'API
|
|
5
|
-
|
|
6
|
-
### 1.1 FlowDerivation - Option `synchrone` et méthode `refresh()`
|
|
7
|
-
|
|
8
|
-
**Fichier**: `src/basic/derivation.ts`
|
|
9
|
-
|
|
10
|
-
**Modifications du constructeur**:
|
|
11
|
-
|
|
12
|
-
```typescript
|
|
13
|
-
constructor(
|
|
14
|
-
compute: (t: TrackingContext) => T | Promise<T>,
|
|
15
|
-
options?: {
|
|
16
|
-
synchrone?: boolean; // Si true avec fonction async, retourne T | undefined
|
|
17
|
-
}
|
|
18
|
-
)
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
**Nouvelle méthode**:
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
public refresh(): void
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
**Comportement avec `synchrone: true`**:
|
|
28
|
-
|
|
29
|
-
- Quand `synchrone: true` est fourni avec une fonction async (`Promise<T>`):
|
|
30
|
-
- Le type de retour devient `FlowDerivation<T | undefined>` au lieu de `FlowDerivation<Promise<T>>`
|
|
31
|
-
- Retourne `undefined` initialement, puis `T` une fois la Promise résolue
|
|
32
|
-
- Compare les valeurs avec `===` avant de notifier (évite notifications inutiles)
|
|
33
|
-
- Gère les erreurs de Promise (throw)
|
|
34
|
-
- Quand `synchrone: true` est fourni avec une fonction synchrone:
|
|
35
|
-
- Erreur de type TypeScript (incompatibilité de types)
|
|
36
|
-
- `refresh()` marque comme dirty et notifie (même comportement que sans option)
|
|
37
|
-
|
|
38
|
-
**Usage**:
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
// Dérivation async normale
|
|
42
|
-
const $userAsync = derivation(async (t) => await fetchUser());
|
|
43
|
-
const userPromise = $userAsync.pick(); // Promise<User>
|
|
44
|
-
|
|
45
|
-
// Dérivation async synchronisée
|
|
46
|
-
const $user = derivation(async (t) => await fetchUser(), { synchrone: true });
|
|
47
|
-
const user = $user.pick(); // User | undefined
|
|
48
|
-
|
|
49
|
-
// Refresh
|
|
50
|
-
$user.refresh(); // Marque comme dirty
|
|
51
|
-
await $user.pick(); // Déclenche le recalcul et attend
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 1.2 Suppression de FlowSynchronizer
|
|
55
|
-
|
|
56
|
-
**Changement d'approche**:
|
|
57
|
-
|
|
58
|
-
- Plus besoin de classe `FlowSynchronizer` séparée
|
|
59
|
-
- La synchronisation est intégrée directement dans `FlowDerivation`
|
|
60
|
-
|
|
61
|
-
### 1.3 Modifications des creators
|
|
62
|
-
|
|
63
|
-
**Fichier**: `src/creators.ts`
|
|
64
|
-
|
|
65
|
-
**Changements**:
|
|
66
|
-
|
|
67
|
-
1. **`resourceAsync()`** - Simplifié:
|
|
68
|
-
```typescript
|
|
69
|
-
// Avant: retourne FlowResourceAsync
|
|
70
|
-
// Après: retourne FlowDerivation<Promise<T>>
|
|
71
|
-
export function resourceAsync<T>(fn: () => Promise<T>): FlowDerivation<Promise<T>> {
|
|
72
|
-
return derivation(() => fn());
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
2. **`resource()`** - Utilise l'option `synchrone`:
|
|
77
|
-
```typescript
|
|
78
|
-
// Avant: retourne FlowResource
|
|
79
|
-
// Après: retourne FlowDerivation<T | undefined>
|
|
80
|
-
export function resource<T>(fn: () => Promise<T>): FlowDerivation<T | undefined> {
|
|
81
|
-
return derivation(() => fn(), { synchrone: true });
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
### 1.4 Exports
|
|
87
|
-
|
|
88
|
-
**Fichiers**: `src/advanced/index.ts`, `src/index.ts`
|
|
89
|
-
|
|
90
|
-
**Suppressions** (après migration):
|
|
91
|
-
|
|
92
|
-
- `FlowResource` (remplacé par `FlowDerivation` avec `synchrone: true`)
|
|
93
|
-
- `FlowResourceAsync` (remplacé par `FlowDerivation<Promise<T>>`)
|
|
94
|
-
- Plus besoin d'exporter `FlowSynchronizer`
|
|
95
|
-
|
|
96
|
-
### 1.5 Rétrocompatibilité
|
|
97
|
-
|
|
98
|
-
**Impact**:
|
|
99
|
-
|
|
100
|
-
- Les types de retour changent, mais l'API reste compatible fonctionnellement
|
|
101
|
-
- `resource()` et `resourceAsync()` continuent de fonctionner de la même manière
|
|
102
|
-
- Les tests existants doivent continuer de passer (avec ajustements de types si nécessaire)
|
|
103
|
-
|
|
104
|
-
## 2. Implémentations détaillées
|
|
105
|
-
|
|
106
|
-
### 2.1 FlowDerivation - Support de l'option `synchrone`
|
|
107
|
-
|
|
108
|
-
**Fichier**: `src/basic/derivation.ts`
|
|
109
|
-
|
|
110
|
-
**Modifications du constructeur**:
|
|
111
|
-
|
|
112
|
-
```typescript
|
|
113
|
-
constructor(
|
|
114
|
-
compute: (t: TrackingContext) => T | Promise<T>,
|
|
115
|
-
options?: { synchrone?: boolean }
|
|
116
|
-
) {
|
|
117
|
-
super();
|
|
118
|
-
this._compute = compute;
|
|
119
|
-
this._trackedContext = new TrackingContext(this);
|
|
120
|
-
this._synchrone = options?.synchrone ?? false;
|
|
121
|
-
|
|
122
|
-
// Si synchrone est activé, on doit gérer les Promises différemment
|
|
123
|
-
if (this._synchrone) {
|
|
124
|
-
// Initialiser la valeur à undefined pour le mode synchrone
|
|
125
|
-
this._value = undefined as T;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
**Modifications de `_getRaw()`**:
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
protected _getRaw(): T {
|
|
134
|
-
if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
|
|
135
|
-
|
|
136
|
-
this._initLazy();
|
|
137
|
-
this._update();
|
|
138
|
-
|
|
139
|
-
if (this._synchrone) {
|
|
140
|
-
// En mode synchrone, la valeur peut être undefined si la Promise n'est pas encore résolue
|
|
141
|
-
return this._value as T;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return this._value;
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**Modifications de `_update()` pour gérer la synchronisation**:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
private _update(): void {
|
|
152
|
-
if (this._dirty) {
|
|
153
|
-
// Store current dependencies
|
|
154
|
-
const dependencies = [...this._dependencies];
|
|
155
|
-
|
|
156
|
-
// Clear current dependencies, compute and retrack dependencies
|
|
157
|
-
this._dependencies.clear();
|
|
158
|
-
const computedValue = this._compute(this._trackedContext);
|
|
159
|
-
|
|
160
|
-
if (this._synchrone && computedValue instanceof Promise) {
|
|
161
|
-
// Mode synchrone avec Promise
|
|
162
|
-
this._handleSyncPromise(computedValue as Promise<T>);
|
|
163
|
-
} else {
|
|
164
|
-
// Mode normal
|
|
165
|
-
this._value = computedValue;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Unsubscribe from dependencies that are no longer needed
|
|
169
|
-
const dependenciesToRemove = dependencies.filter(
|
|
170
|
-
(dependency) => !this._dependencies.has(dependency),
|
|
171
|
-
);
|
|
172
|
-
dependenciesToRemove.forEach((dependency) => {
|
|
173
|
-
dependency._unregisterDependency(this);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
this._dirty = false;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Nouvelle méthode `_handleSyncPromise()`**:
|
|
182
|
-
|
|
183
|
-
```typescript
|
|
184
|
-
private async _handleSyncPromise(promise: Promise<T>): Promise<void> {
|
|
185
|
-
// Marquer cette Promise comme la Promise courante
|
|
186
|
-
this._currentPromise = promise;
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
const value = await promise;
|
|
190
|
-
|
|
191
|
-
// Vérifier que c'est toujours la Promise courante (éviter les race conditions)
|
|
192
|
-
if (this._currentPromise !== promise) {
|
|
193
|
-
return; // Une nouvelle Promise a été créée, ignorer cette résolution
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Comparer avec la valeur actuelle pour éviter les notifications inutiles
|
|
197
|
-
if (value === this._value) {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Mettre à jour la valeur et notifier
|
|
202
|
-
this._value = value as T;
|
|
203
|
-
this._notify();
|
|
204
|
-
} catch (error) {
|
|
205
|
-
// Vérifier que c'est toujours la Promise courante
|
|
206
|
-
if (this._currentPromise !== promise) {
|
|
207
|
-
return; // Une nouvelle Promise a été créée, ignorer cette erreur
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Throw l'erreur
|
|
211
|
-
throw error;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
**Nouvelle méthode `refresh()`**:
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
public refresh(): void {
|
|
220
|
-
if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
|
|
221
|
-
|
|
222
|
-
// Marquer comme dirty (le recalcul se fera au prochain accès)
|
|
223
|
-
this._dirty = true;
|
|
224
|
-
|
|
225
|
-
// Notifier les dépendants pour qu'ils se marquent aussi comme dirty
|
|
226
|
-
this._notify();
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
**Nouveaux champs privés**:
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
private _synchrone: boolean;
|
|
234
|
-
private _currentPromise?: Promise<T>;
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
**Points d'attention**:
|
|
238
|
-
|
|
239
|
-
1. **Type safety**: Le type de retour doit être `FlowDerivation<T | undefined>` quand `synchrone: true` avec une fonction async
|
|
240
|
-
2. **Gestion des Promises**: En mode synchrone, les Promises sont gérées de manière asynchrone dans `_handleSyncPromise()`
|
|
241
|
-
3. **Comparaison de valeurs**: Utiliser `===` uniquement en mode synchrone
|
|
242
|
-
4. **Race conditions**: Utiliser `_currentPromise` pour tracker la Promise courante
|
|
243
|
-
5. **Initialisation**: En mode synchrone, initialiser `_value` à `undefined`
|
|
244
|
-
6. **Lazy evaluation**: Le comportement lazy reste le même, mais la résolution de Promise est asynchrone
|
|
245
|
-
|
|
246
|
-
### 2.2 Mise à jour des creators
|
|
247
|
-
|
|
248
|
-
**Fichier**: `src/creators.ts`
|
|
249
|
-
|
|
250
|
-
**Implémentation `resourceAsync()`**:
|
|
251
|
-
|
|
252
|
-
```typescript
|
|
253
|
-
export function resourceAsync<T>(fn: () => Promise<T>): FlowDerivation<Promise<T>> {
|
|
254
|
-
return derivation(() => fn());
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Points d'attention**:
|
|
259
|
-
|
|
260
|
-
- La fonction `fn` ne reçoit pas de `TrackingContext` (comportement actuel)
|
|
261
|
-
- Retourne directement une `FlowDerivation<Promise<T>>`
|
|
262
|
-
|
|
263
|
-
**Implémentation `resource()`**:
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
export function resource<T>(fn: () => Promise<T>): FlowDerivation<T | undefined> {
|
|
267
|
-
return derivation(() => fn(), { synchrone: true });
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
**Points d'attention**:
|
|
272
|
-
|
|
273
|
-
- Utilise l'option `synchrone: true` pour activer le mode synchrone
|
|
274
|
-
- Retourne `FlowDerivation<T | undefined>`
|
|
275
|
-
|
|
276
|
-
### 2.3 Mise à jour des exports
|
|
277
|
-
|
|
278
|
-
**Fichier**: `src/advanced/index.ts`
|
|
279
|
-
|
|
280
|
-
**Modifications**:
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
// Supprimer (après migration complète)
|
|
284
|
-
// export { FlowResource } from "./resource";
|
|
285
|
-
// export { FlowResourceAsync } from "./resourceAsync";
|
|
286
|
-
// Plus besoin de FlowSynchronizer
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
**Fichier**: `src/index.ts`
|
|
290
|
-
|
|
291
|
-
**Modifications**:
|
|
292
|
-
|
|
293
|
-
```typescript
|
|
294
|
-
// Supprimer FlowResource et FlowResourceAsync des exports
|
|
295
|
-
export {
|
|
296
|
-
FlowArray,
|
|
297
|
-
type FlowArrayAction,
|
|
298
|
-
FlowMap,
|
|
299
|
-
FlowStream,
|
|
300
|
-
FlowStreamAsync,
|
|
301
|
-
// FlowResource, // À supprimer
|
|
302
|
-
// FlowResourceAsync, // À supprimer
|
|
303
|
-
...
|
|
304
|
-
} from "./advanced/";
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### 2.4 Migration des tests
|
|
308
|
-
|
|
309
|
-
**Fichiers**: `test/resource.test.ts`, `test/resourceAsync.test.ts`
|
|
310
|
-
|
|
311
|
-
**Actions**:
|
|
312
|
-
|
|
313
|
-
1. Mettre à jour les imports pour utiliser `FlowDerivation`
|
|
314
|
-
2. Adapter les types de retour des fonctions `resource()` et `resourceAsync()`
|
|
315
|
-
3. Adapter les appels à `refresh()` : `resource.refresh()` puis `await resource.pick()` si nécessaire
|
|
316
|
-
4. Vérifier que tous les tests passent avec la nouvelle implémentation
|
|
317
|
-
5. Potentiellement fusionner les tests si la logique est similaire
|
|
318
|
-
|
|
319
|
-
**Points d'attention**:
|
|
320
|
-
|
|
321
|
-
- Les tests de `resource()` doivent maintenant tester `FlowDerivation<T | undefined>` avec `synchrone: true`
|
|
322
|
-
- Les tests de `resourceAsync()` doivent tester `FlowDerivation<Promise<T>>`
|
|
323
|
-
- Vérifier que le comportement lazy est toujours correct
|
|
324
|
-
- Vérifier que la comparaison de valeurs fonctionne en mode synchrone
|
|
325
|
-
- Vérifier que les race conditions sont gérées correctement
|
|
326
|
-
|
|
327
|
-
### 2.5 Suppression des anciennes classes
|
|
328
|
-
|
|
329
|
-
**Fichiers**: `src/advanced/resource.ts`, `src/advanced/resourceAsync.ts`
|
|
330
|
-
|
|
331
|
-
**Actions** (après vérification que tout fonctionne):
|
|
332
|
-
|
|
333
|
-
1. Supprimer `src/advanced/resource.ts`
|
|
334
|
-
2. Supprimer `src/advanced/resourceAsync.ts`
|
|
335
|
-
3. Nettoyer les exports dans `src/advanced/index.ts`
|
|
336
|
-
|
|
337
|
-
**Points d'attention**:
|
|
338
|
-
|
|
339
|
-
- Ne supprimer qu'après avoir vérifié que tous les tests passent
|
|
340
|
-
- Vérifier qu'aucun code externe n'importe directement ces classes
|
|
341
|
-
- Mettre à jour la documentation si nécessaire
|
|
342
|
-
|
|
343
|
-
## 3. Ordre d'implémentation recommandé
|
|
344
|
-
|
|
345
|
-
1. **Étape 1**: Ajouter l'option `synchrone` et la méthode `refresh()` à `FlowDerivation` et tester
|
|
346
|
-
2. **Étape 2**: Implémenter la gestion des Promises en mode synchrone avec comparaison de valeurs
|
|
347
|
-
3. **Étape 3**: Mettre à jour les creators `resource()` et `resourceAsync()`
|
|
348
|
-
4. **Étape 4**: Mettre à jour les exports
|
|
349
|
-
5. **Étape 5**: Migrer et adapter les tests
|
|
350
|
-
6. **Étape 6**: Supprimer les anciennes classes `FlowResource` et `FlowResourceAsync`
|
|
351
|
-
|
|
352
|
-
## 4. Cas limites à tester
|
|
353
|
-
|
|
354
|
-
1. **Race conditions**: Appels multiples rapides à `refresh()` avec mode synchrone
|
|
355
|
-
2. **Erreurs async**: Promises rejetées dans les derivations en mode synchrone
|
|
356
|
-
3. **Lazy initialization**: Vérifier que le fetch ne se fait qu'au premier accès
|
|
357
|
-
4. **Comparaison de valeurs**: Vérifier que les notifications ne se déclenchent que si la valeur change (mode synchrone uniquement)
|
|
358
|
-
5. **Disposal**: Vérifier le cleanup correct
|
|
359
|
-
6. **Dérivations sync avec refresh()**: Vérifier que ça fonctionne aussi pour les derivations non-async
|
|
360
|
-
7. **Refresh puis accès**: Vérifier que `refresh()` puis `pick()`/`get()` déclenche bien le recalcul
|
|
361
|
-
8. **Refresh sur dérivation non-initialisée**: Vérifier que `refresh()` fonctionne même si la dérivation n'a pas encore été accédée
|
|
362
|
-
9. **Mode synchrone avec fonction sync**: Vérifier que TypeScript lève une erreur de type
|
|
363
|
-
10. **Plusieurs Promises successives**: Vérifier que seule la dernière Promise résolue met à jour la valeur
|
|
364
|
-
|
|
365
|
-
### To-dos
|
|
366
|
-
|
|
367
|
-
- [ ] Ajouter la méthode refresh() à FlowDerivation dans src/basic/derivation.ts avec gestion des derivations sync et async
|
|
368
|
-
- [ ] Créer la classe FlowSynchronizer dans src/advanced/synchronizer.ts avec lazy initialization, gestion des race conditions, et comparaison de valeurs
|
|
369
|
-
- [ ] Mettre à jour resource() et resourceAsync() dans src/creators.ts pour utiliser FlowDerivation et FlowSynchronizer
|
|
370
|
-
- [ ] Mettre à jour les exports dans src/advanced/index.ts et src/index.ts pour exporter FlowSynchronizer et supprimer FlowResource/FlowResourceAsync
|
|
371
|
-
- [ ] Adapter les tests dans test/resource.test.ts et test/resourceAsync.test.ts pour la nouvelle API
|
|
372
|
-
- [ ] Supprimer src/advanced/resource.ts et src/advanced/resourceAsync.ts après vérification
|