signalium 1.2.2 → 2.0.1
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/CHANGELOG.md +37 -0
- package/{build/transform.js → config.js} +1 -5
- package/{build/react.js → debug.js} +1 -5
- package/dist/cjs/config.d.ts +1 -21
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +3 -36
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/debug.d.ts +1 -1
- package/dist/cjs/debug.d.ts.map +1 -1
- package/dist/cjs/debug.js +1 -1
- package/dist/cjs/debug.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -6
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +17 -23
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internals/async.d.ts +24 -19
- package/dist/cjs/internals/async.d.ts.map +1 -1
- package/dist/cjs/internals/async.js +264 -137
- package/dist/cjs/internals/async.js.map +1 -1
- package/dist/cjs/internals/callback.d.ts +13 -0
- package/dist/cjs/internals/callback.d.ts.map +1 -0
- package/dist/cjs/internals/callback.js +73 -0
- package/dist/cjs/internals/callback.js.map +1 -0
- package/dist/cjs/internals/config.d.ts +7 -0
- package/dist/cjs/internals/config.d.ts.map +1 -0
- package/dist/cjs/internals/config.js +17 -0
- package/dist/cjs/internals/config.js.map +1 -0
- package/dist/cjs/internals/consumer.d.ts +3 -3
- package/dist/cjs/internals/consumer.d.ts.map +1 -1
- package/dist/cjs/internals/consumer.js.map +1 -1
- package/dist/cjs/internals/contexts.d.ts +15 -14
- package/dist/cjs/internals/contexts.d.ts.map +1 -1
- package/dist/cjs/internals/contexts.js +52 -52
- package/dist/cjs/internals/contexts.js.map +1 -1
- package/dist/cjs/internals/core-api.d.ts +14 -0
- package/dist/cjs/internals/core-api.d.ts.map +1 -0
- package/dist/cjs/internals/core-api.js +83 -0
- package/dist/cjs/internals/core-api.js.map +1 -0
- package/dist/cjs/internals/dirty.d.ts +3 -3
- package/dist/cjs/internals/dirty.d.ts.map +1 -1
- package/dist/cjs/internals/dirty.js +13 -13
- package/dist/cjs/internals/dirty.js.map +1 -1
- package/dist/cjs/internals/edge.d.ts +5 -5
- package/dist/cjs/internals/edge.d.ts.map +1 -1
- package/dist/cjs/internals/edge.js.map +1 -1
- package/dist/cjs/internals/generators.d.ts +5 -0
- package/dist/cjs/internals/generators.d.ts.map +1 -0
- package/dist/cjs/internals/generators.js +83 -0
- package/dist/cjs/internals/generators.js.map +1 -0
- package/dist/cjs/internals/get.d.ts +5 -8
- package/dist/cjs/internals/get.d.ts.map +1 -1
- package/dist/cjs/internals/get.js +48 -107
- package/dist/cjs/internals/get.js.map +1 -1
- package/dist/cjs/internals/reactive.d.ts +77 -0
- package/dist/cjs/internals/reactive.d.ts.map +1 -0
- package/dist/cjs/internals/{derived.js → reactive.js} +45 -33
- package/dist/cjs/internals/reactive.js.map +1 -0
- package/dist/cjs/internals/scheduling.d.ts +7 -7
- package/dist/cjs/internals/scheduling.d.ts.map +1 -1
- package/dist/cjs/internals/scheduling.js +9 -9
- package/dist/cjs/internals/scheduling.js.map +1 -1
- package/dist/cjs/internals/signal.d.ts +20 -0
- package/dist/cjs/internals/signal.d.ts.map +1 -0
- package/dist/cjs/internals/{state.js → signal.js} +31 -27
- package/dist/cjs/internals/signal.js.map +1 -0
- package/dist/{esm → cjs/internals}/trace.d.ts +1 -1
- package/dist/cjs/internals/trace.d.ts.map +1 -0
- package/dist/cjs/{trace.js → internals/trace.js} +1 -1
- package/dist/cjs/internals/trace.js.map +1 -0
- package/dist/cjs/internals/utils/equals.d.ts +4 -4
- package/dist/cjs/internals/utils/equals.d.ts.map +1 -1
- package/dist/cjs/internals/utils/equals.js.map +1 -1
- package/dist/cjs/internals/utils/type-utils.d.ts +0 -2
- package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -1
- package/dist/cjs/internals/utils/type-utils.js +0 -5
- package/dist/cjs/internals/utils/type-utils.js.map +1 -1
- package/dist/cjs/internals/watch.d.ts +4 -0
- package/dist/cjs/internals/watch.d.ts.map +1 -0
- package/dist/cjs/internals/{connect.js → watch.js} +7 -7
- package/dist/cjs/internals/watch.js.map +1 -0
- package/dist/cjs/internals/weakref.d.ts.map +1 -0
- package/dist/cjs/internals/weakref.js.map +1 -0
- package/dist/cjs/react/component.d.ts +2 -0
- package/dist/cjs/react/component.d.ts.map +1 -0
- package/dist/cjs/react/component.js +40 -0
- package/dist/cjs/react/component.js.map +1 -0
- package/dist/cjs/react/context.d.ts +2 -1
- package/dist/cjs/react/context.d.ts.map +1 -1
- package/dist/cjs/react/context.js +10 -5
- package/dist/cjs/react/context.js.map +1 -1
- package/dist/cjs/react/index.d.ts +4 -4
- package/dist/cjs/react/index.d.ts.map +1 -1
- package/dist/cjs/react/index.js +11 -8
- package/dist/cjs/react/index.js.map +1 -1
- package/dist/cjs/react/provider.d.ts.map +1 -1
- package/dist/cjs/react/provider.js +1 -1
- package/dist/cjs/react/provider.js.map +1 -1
- package/dist/cjs/react/rendering.d.ts +0 -6
- package/dist/cjs/react/rendering.d.ts.map +1 -1
- package/dist/cjs/react/rendering.js +1 -19
- package/dist/cjs/react/rendering.js.map +1 -1
- package/dist/cjs/react/use-reactive.d.ts +7 -0
- package/dist/cjs/react/use-reactive.d.ts.map +1 -0
- package/dist/cjs/react/use-reactive.js +67 -0
- package/dist/cjs/react/use-reactive.js.map +1 -0
- package/dist/cjs/react/use-signal.d.ts +3 -0
- package/dist/cjs/react/use-signal.d.ts.map +1 -0
- package/dist/cjs/react/{state.js → use-signal.js} +5 -5
- package/dist/cjs/react/use-signal.js.map +1 -0
- package/dist/cjs/{transform.d.ts → transform/async.d.ts} +1 -1
- package/dist/cjs/transform/async.d.ts.map +1 -0
- package/dist/cjs/{transform.js → transform/async.js} +22 -9
- package/dist/cjs/transform/async.js.map +1 -0
- package/dist/cjs/transform/callback.d.ts +6 -0
- package/dist/cjs/transform/callback.d.ts.map +1 -0
- package/dist/cjs/transform/callback.js +259 -0
- package/dist/cjs/transform/callback.js.map +1 -0
- package/dist/cjs/transform/index.d.ts +5 -0
- package/dist/cjs/transform/index.d.ts.map +1 -0
- package/dist/cjs/transform/index.js +12 -0
- package/dist/cjs/transform/index.js.map +1 -0
- package/dist/cjs/transform/preset.d.ts +7 -0
- package/dist/cjs/transform/preset.d.ts.map +1 -0
- package/dist/cjs/transform/preset.js +20 -0
- package/dist/cjs/transform/preset.js.map +1 -0
- package/dist/cjs/transform/promise.d.ts +6 -0
- package/dist/cjs/transform/promise.d.ts.map +1 -0
- package/dist/cjs/transform/promise.js +129 -0
- package/dist/cjs/transform/promise.js.map +1 -0
- package/dist/cjs/types.d.ts +44 -63
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/utils.d.ts +2 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +7 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/config.d.ts +1 -21
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +1 -29
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/debug.d.ts +1 -1
- package/dist/esm/debug.d.ts.map +1 -1
- package/dist/esm/debug.js +1 -1
- package/dist/esm/debug.js.map +1 -1
- package/dist/esm/index.d.ts +5 -6
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals/async.d.ts +24 -19
- package/dist/esm/internals/async.d.ts.map +1 -1
- package/dist/esm/internals/async.js +253 -128
- package/dist/esm/internals/async.js.map +1 -1
- package/dist/esm/internals/callback.d.ts +13 -0
- package/dist/esm/internals/callback.d.ts.map +1 -0
- package/dist/esm/internals/callback.js +67 -0
- package/dist/esm/internals/callback.js.map +1 -0
- package/dist/esm/internals/config.d.ts +7 -0
- package/dist/esm/internals/config.d.ts.map +1 -0
- package/dist/esm/internals/config.js +11 -0
- package/dist/esm/internals/config.js.map +1 -0
- package/dist/esm/internals/consumer.d.ts +3 -3
- package/dist/esm/internals/consumer.d.ts.map +1 -1
- package/dist/esm/internals/consumer.js.map +1 -1
- package/dist/esm/internals/contexts.d.ts +15 -14
- package/dist/esm/internals/contexts.d.ts.map +1 -1
- package/dist/esm/internals/contexts.js +46 -46
- package/dist/esm/internals/contexts.js.map +1 -1
- package/dist/esm/internals/core-api.d.ts +14 -0
- package/dist/esm/internals/core-api.d.ts.map +1 -0
- package/dist/esm/internals/core-api.js +74 -0
- package/dist/esm/internals/core-api.js.map +1 -0
- package/dist/esm/internals/dirty.d.ts +3 -3
- package/dist/esm/internals/dirty.d.ts.map +1 -1
- package/dist/esm/internals/dirty.js +12 -12
- package/dist/esm/internals/dirty.js.map +1 -1
- package/dist/esm/internals/edge.d.ts +5 -5
- package/dist/esm/internals/edge.d.ts.map +1 -1
- package/dist/esm/internals/edge.js.map +1 -1
- package/dist/esm/internals/generators.d.ts +5 -0
- package/dist/esm/internals/generators.d.ts.map +1 -0
- package/dist/esm/internals/generators.js +79 -0
- package/dist/esm/internals/generators.js.map +1 -0
- package/dist/esm/internals/get.d.ts +5 -8
- package/dist/esm/internals/get.d.ts.map +1 -1
- package/dist/esm/internals/get.js +43 -100
- package/dist/esm/internals/get.js.map +1 -1
- package/dist/esm/internals/reactive.d.ts +77 -0
- package/dist/esm/internals/reactive.d.ts.map +1 -0
- package/dist/esm/internals/{derived.js → reactive.js} +41 -29
- package/dist/esm/internals/reactive.js.map +1 -0
- package/dist/esm/internals/scheduling.d.ts +7 -7
- package/dist/esm/internals/scheduling.d.ts.map +1 -1
- package/dist/esm/internals/scheduling.js +6 -6
- package/dist/esm/internals/scheduling.js.map +1 -1
- package/dist/esm/internals/signal.d.ts +20 -0
- package/dist/esm/internals/signal.d.ts.map +1 -0
- package/dist/esm/internals/{state.js → signal.js} +25 -22
- package/dist/esm/internals/signal.js.map +1 -0
- package/dist/{cjs → esm/internals}/trace.d.ts +1 -1
- package/dist/esm/internals/trace.d.ts.map +1 -0
- package/dist/esm/{trace.js → internals/trace.js} +1 -1
- package/dist/esm/internals/trace.js.map +1 -0
- package/dist/esm/internals/utils/equals.d.ts +4 -4
- package/dist/esm/internals/utils/equals.d.ts.map +1 -1
- package/dist/esm/internals/utils/equals.js.map +1 -1
- package/dist/esm/internals/utils/type-utils.d.ts +0 -2
- package/dist/esm/internals/utils/type-utils.d.ts.map +1 -1
- package/dist/esm/internals/utils/type-utils.js +0 -4
- package/dist/esm/internals/utils/type-utils.js.map +1 -1
- package/dist/esm/internals/watch.d.ts +4 -0
- package/dist/esm/internals/watch.d.ts.map +1 -0
- package/dist/esm/internals/{connect.js → watch.js} +7 -7
- package/dist/esm/internals/watch.js.map +1 -0
- package/dist/esm/internals/weakref.d.ts.map +1 -0
- package/dist/esm/internals/weakref.js.map +1 -0
- package/dist/esm/react/component.d.ts +2 -0
- package/dist/esm/react/component.d.ts.map +1 -0
- package/dist/esm/react/component.js +37 -0
- package/dist/esm/react/component.js.map +1 -0
- package/dist/esm/react/context.d.ts +2 -1
- package/dist/esm/react/context.d.ts.map +1 -1
- package/dist/esm/react/context.js +10 -6
- package/dist/esm/react/context.js.map +1 -1
- package/dist/esm/react/index.d.ts +4 -4
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +4 -4
- package/dist/esm/react/index.js.map +1 -1
- package/dist/esm/react/provider.d.ts.map +1 -1
- package/dist/esm/react/provider.js +2 -2
- package/dist/esm/react/provider.js.map +1 -1
- package/dist/esm/react/rendering.d.ts +0 -6
- package/dist/esm/react/rendering.d.ts.map +1 -1
- package/dist/esm/react/rendering.js +1 -17
- package/dist/esm/react/rendering.js.map +1 -1
- package/dist/esm/react/use-reactive.d.ts +7 -0
- package/dist/esm/react/use-reactive.d.ts.map +1 -0
- package/dist/esm/react/use-reactive.js +64 -0
- package/dist/esm/react/use-reactive.js.map +1 -0
- package/dist/esm/react/use-signal.d.ts +3 -0
- package/dist/esm/react/use-signal.d.ts.map +1 -0
- package/dist/esm/react/use-signal.js +10 -0
- package/dist/esm/react/use-signal.js.map +1 -0
- package/dist/esm/{transform.d.ts → transform/async.d.ts} +1 -1
- package/dist/esm/transform/async.d.ts.map +1 -0
- package/dist/esm/{transform.js → transform/async.js} +22 -9
- package/dist/esm/transform/async.js.map +1 -0
- package/dist/esm/transform/callback.d.ts +6 -0
- package/dist/esm/transform/callback.d.ts.map +1 -0
- package/dist/esm/transform/callback.js +256 -0
- package/dist/esm/transform/callback.js.map +1 -0
- package/dist/esm/transform/index.d.ts +5 -0
- package/dist/esm/transform/index.d.ts.map +1 -0
- package/dist/esm/transform/index.js +5 -0
- package/dist/esm/transform/index.js.map +1 -0
- package/dist/esm/transform/preset.d.ts +7 -0
- package/dist/esm/transform/preset.d.ts.map +1 -0
- package/dist/esm/transform/preset.js +17 -0
- package/dist/esm/transform/preset.js.map +1 -0
- package/dist/esm/transform/promise.d.ts +6 -0
- package/dist/esm/transform/promise.d.ts.map +1 -0
- package/dist/esm/transform/promise.js +126 -0
- package/dist/esm/transform/promise.js.map +1 -0
- package/dist/esm/types.d.ts +44 -63
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/utils.d.ts +2 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +2 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +56 -58
- package/react.js +0 -4
- package/transform.js +1 -5
- package/utils.js +15 -0
- package/.turbo/turbo-build.log +0 -12
- package/dist/cjs/hooks.d.ts +0 -16
- package/dist/cjs/hooks.d.ts.map +0 -1
- package/dist/cjs/hooks.js +0 -44
- package/dist/cjs/hooks.js.map +0 -1
- package/dist/cjs/internals/connect.d.ts +0 -4
- package/dist/cjs/internals/connect.d.ts.map +0 -1
- package/dist/cjs/internals/connect.js.map +0 -1
- package/dist/cjs/internals/derived.d.ts +0 -76
- package/dist/cjs/internals/derived.d.ts.map +0 -1
- package/dist/cjs/internals/derived.js.map +0 -1
- package/dist/cjs/internals/state.d.ts +0 -18
- package/dist/cjs/internals/state.d.ts.map +0 -1
- package/dist/cjs/internals/state.js.map +0 -1
- package/dist/cjs/react/setup.d.ts +0 -2
- package/dist/cjs/react/setup.d.ts.map +0 -1
- package/dist/cjs/react/setup.js +0 -14
- package/dist/cjs/react/setup.js.map +0 -1
- package/dist/cjs/react/signal-value.d.ts +0 -6
- package/dist/cjs/react/signal-value.d.ts.map +0 -1
- package/dist/cjs/react/signal-value.js +0 -37
- package/dist/cjs/react/signal-value.js.map +0 -1
- package/dist/cjs/react/state.d.ts +0 -3
- package/dist/cjs/react/state.d.ts.map +0 -1
- package/dist/cjs/react/state.js.map +0 -1
- package/dist/cjs/trace.d.ts.map +0 -1
- package/dist/cjs/trace.js.map +0 -1
- package/dist/cjs/transform.d.ts.map +0 -1
- package/dist/cjs/transform.js.map +0 -1
- package/dist/cjs/weakref.d.ts.map +0 -1
- package/dist/cjs/weakref.js.map +0 -1
- package/dist/esm/hooks.d.ts +0 -16
- package/dist/esm/hooks.d.ts.map +0 -1
- package/dist/esm/hooks.js +0 -37
- package/dist/esm/hooks.js.map +0 -1
- package/dist/esm/internals/connect.d.ts +0 -4
- package/dist/esm/internals/connect.d.ts.map +0 -1
- package/dist/esm/internals/connect.js.map +0 -1
- package/dist/esm/internals/derived.d.ts +0 -76
- package/dist/esm/internals/derived.d.ts.map +0 -1
- package/dist/esm/internals/derived.js.map +0 -1
- package/dist/esm/internals/state.d.ts +0 -18
- package/dist/esm/internals/state.d.ts.map +0 -1
- package/dist/esm/internals/state.js.map +0 -1
- package/dist/esm/react/setup.d.ts +0 -2
- package/dist/esm/react/setup.d.ts.map +0 -1
- package/dist/esm/react/setup.js +0 -11
- package/dist/esm/react/setup.js.map +0 -1
- package/dist/esm/react/signal-value.d.ts +0 -6
- package/dist/esm/react/signal-value.d.ts.map +0 -1
- package/dist/esm/react/signal-value.js +0 -33
- package/dist/esm/react/signal-value.js.map +0 -1
- package/dist/esm/react/state.d.ts +0 -3
- package/dist/esm/react/state.d.ts.map +0 -1
- package/dist/esm/react/state.js +0 -10
- package/dist/esm/react/state.js.map +0 -1
- package/dist/esm/trace.d.ts.map +0 -1
- package/dist/esm/trace.js.map +0 -1
- package/dist/esm/transform.d.ts.map +0 -1
- package/dist/esm/transform.js.map +0 -1
- package/dist/esm/weakref.d.ts.map +0 -1
- package/dist/esm/weakref.js.map +0 -1
- package/src/__tests__/__snapshots__/context.test.ts.snap +0 -2101
- package/src/__tests__/__snapshots__/nesting.test.ts.snap +0 -16201
- package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +0 -1879
- package/src/__tests__/async-task.test.ts +0 -327
- package/src/__tests__/context.test.ts +0 -619
- package/src/__tests__/gc.test.ts +0 -256
- package/src/__tests__/nesting.test.ts +0 -298
- package/src/__tests__/params-and-state.test.ts +0 -230
- package/src/__tests__/reactive-async.test.ts +0 -548
- package/src/__tests__/reactive-sync.test.ts +0 -130
- package/src/__tests__/subscription.test.ts +0 -510
- package/src/__tests__/utils/async.ts +0 -6
- package/src/__tests__/utils/instrumented-hooks.ts +0 -410
- package/src/__tests__/utils/permute.ts +0 -85
- package/src/config.ts +0 -54
- package/src/debug.ts +0 -14
- package/src/hooks.ts +0 -82
- package/src/index.ts +0 -21
- package/src/internals/async.ts +0 -563
- package/src/internals/connect.ts +0 -49
- package/src/internals/consumer.ts +0 -13
- package/src/internals/contexts.ts +0 -177
- package/src/internals/derived.ts +0 -217
- package/src/internals/dirty.ts +0 -91
- package/src/internals/edge.ts +0 -109
- package/src/internals/get.ts +0 -298
- package/src/internals/scheduling.ts +0 -160
- package/src/internals/state.ts +0 -111
- package/src/internals/utils/debug-name.ts +0 -14
- package/src/internals/utils/equals.ts +0 -12
- package/src/internals/utils/hash.ts +0 -221
- package/src/internals/utils/stringify.ts +0 -57
- package/src/internals/utils/type-utils.ts +0 -19
- package/src/react/__tests__/async.test.tsx +0 -704
- package/src/react/__tests__/basic.test.tsx +0 -95
- package/src/react/__tests__/contexts.test.tsx +0 -181
- package/src/react/__tests__/subscriptions.test.tsx +0 -49
- package/src/react/__tests__/utils.tsx +0 -40
- package/src/react/context.ts +0 -14
- package/src/react/index.ts +0 -6
- package/src/react/provider.tsx +0 -18
- package/src/react/rendering.ts +0 -43
- package/src/react/setup.ts +0 -11
- package/src/react/signal-value.ts +0 -50
- package/src/react/state.ts +0 -13
- package/src/trace.ts +0 -454
- package/src/transform.ts +0 -113
- package/src/types.ts +0 -115
- package/src/weakref.ts +0 -9
- package/tsconfig.json +0 -13
- package/vitest.workspace.ts +0 -61
- /package/dist/cjs/{weakref.d.ts → internals/weakref.d.ts} +0 -0
- /package/dist/cjs/{weakref.js → internals/weakref.js} +0 -0
- /package/dist/esm/{weakref.d.ts → internals/weakref.d.ts} +0 -0
- /package/dist/esm/{weakref.js → internals/weakref.js} +0 -0
package/src/__tests__/gc.test.ts
DELETED
@@ -1,256 +0,0 @@
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
2
|
-
import { reactive, createContext, withContexts, watcher, state } from '../index.js';
|
3
|
-
import { SignalScope, ROOT_SCOPE, forceGc, clearRootContexts } from '../internals/contexts.js';
|
4
|
-
import { nextTick, sleep } from './utils/async.js';
|
5
|
-
|
6
|
-
// Helper to access private properties for testing
|
7
|
-
const getSignalsMap = (scope: SignalScope) => {
|
8
|
-
return (scope as any).signals as Map<number, any>;
|
9
|
-
};
|
10
|
-
|
11
|
-
const getGCCandidates = (scope: SignalScope) => {
|
12
|
-
return (scope as any).gcCandidates as Set<any>;
|
13
|
-
};
|
14
|
-
|
15
|
-
describe('Garbage Collection', () => {
|
16
|
-
beforeEach(() => {
|
17
|
-
clearRootContexts();
|
18
|
-
});
|
19
|
-
|
20
|
-
it('should automatically garbage collect unwatched signals', async () => {
|
21
|
-
const testSignal = reactive(() => 42);
|
22
|
-
|
23
|
-
const w = watcher(() => testSignal());
|
24
|
-
|
25
|
-
// Watch the signal
|
26
|
-
const unwatch = w.addListener(() => {
|
27
|
-
testSignal();
|
28
|
-
});
|
29
|
-
|
30
|
-
await nextTick();
|
31
|
-
|
32
|
-
// Signal should be in the scope
|
33
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
34
|
-
|
35
|
-
// Unwatch the signal
|
36
|
-
unwatch();
|
37
|
-
|
38
|
-
await sleep(50);
|
39
|
-
|
40
|
-
// Signal should be garbage collected
|
41
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(0);
|
42
|
-
});
|
43
|
-
|
44
|
-
it('should not garbage collect signals with shouldGC returning false', async () => {
|
45
|
-
// Create a signal that should not be garbage collected
|
46
|
-
const persistentSignal = reactive(() => 'persist', {
|
47
|
-
shouldGC: () => false,
|
48
|
-
});
|
49
|
-
|
50
|
-
const w = watcher(() => persistentSignal());
|
51
|
-
|
52
|
-
// Watch the signal
|
53
|
-
const unwatch = w.addListener(() => {
|
54
|
-
persistentSignal();
|
55
|
-
});
|
56
|
-
|
57
|
-
await nextTick();
|
58
|
-
|
59
|
-
// Signal should be in the scope
|
60
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
61
|
-
|
62
|
-
// Unwatch the signal
|
63
|
-
unwatch();
|
64
|
-
|
65
|
-
await sleep(50);
|
66
|
-
|
67
|
-
// Signal should still be in the scope
|
68
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
69
|
-
});
|
70
|
-
|
71
|
-
it('should support conditional GC based on signal state', async () => {
|
72
|
-
// Create a signal with conditional GC
|
73
|
-
const shouldAllowGC = state(false);
|
74
|
-
|
75
|
-
const conditionalSignal = reactive(() => shouldAllowGC.get(), {
|
76
|
-
shouldGC: (signal, value) => {
|
77
|
-
// console.log('shouldGC', signal, value);
|
78
|
-
return value;
|
79
|
-
},
|
80
|
-
});
|
81
|
-
|
82
|
-
const w = watcher(() => conditionalSignal());
|
83
|
-
|
84
|
-
// Watch the signal
|
85
|
-
const unwatch = w.addListener(() => {
|
86
|
-
conditionalSignal();
|
87
|
-
});
|
88
|
-
|
89
|
-
await nextTick();
|
90
|
-
|
91
|
-
// Signal should be in the scope
|
92
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
93
|
-
|
94
|
-
// Unwatch the signal
|
95
|
-
unwatch();
|
96
|
-
|
97
|
-
await sleep(50);
|
98
|
-
|
99
|
-
// Signal should still be in the scope because shouldGC returns false
|
100
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
101
|
-
|
102
|
-
// Now allow GC
|
103
|
-
shouldAllowGC.set(true);
|
104
|
-
|
105
|
-
// Watch the signal
|
106
|
-
const unwatch2 = w.addListener(() => {
|
107
|
-
conditionalSignal();
|
108
|
-
});
|
109
|
-
|
110
|
-
await nextTick();
|
111
|
-
|
112
|
-
// Signal should be in GC candidates
|
113
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
114
|
-
|
115
|
-
unwatch2();
|
116
|
-
|
117
|
-
await sleep(50);
|
118
|
-
|
119
|
-
// Signal should be garbage collected
|
120
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(0);
|
121
|
-
});
|
122
|
-
|
123
|
-
it('should support manual garbage collection', async () => {
|
124
|
-
let signalObj: object;
|
125
|
-
|
126
|
-
// Create multiple signals
|
127
|
-
const signal1 = reactive(() => 'signal1');
|
128
|
-
const signal2 = reactive(() => 'signal2', {
|
129
|
-
shouldGC: signal => {
|
130
|
-
signalObj = signal;
|
131
|
-
return false;
|
132
|
-
},
|
133
|
-
});
|
134
|
-
|
135
|
-
const w1 = watcher(() => signal1());
|
136
|
-
const w2 = watcher(() => signal2());
|
137
|
-
|
138
|
-
// Watch both signals
|
139
|
-
const unwatch1 = w1.addListener(() => {
|
140
|
-
signal1();
|
141
|
-
});
|
142
|
-
const unwatch2 = w2.addListener(() => {
|
143
|
-
signal2();
|
144
|
-
});
|
145
|
-
|
146
|
-
await nextTick();
|
147
|
-
|
148
|
-
// Both signals should be in the scope
|
149
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(2);
|
150
|
-
|
151
|
-
// Unwatch both signals
|
152
|
-
unwatch1();
|
153
|
-
unwatch2();
|
154
|
-
|
155
|
-
await sleep(50);
|
156
|
-
|
157
|
-
// Only signal1 should be garbage collected
|
158
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
159
|
-
|
160
|
-
// The remaining signal should be signal2
|
161
|
-
const remainingSignal = Array.from(getSignalsMap(ROOT_SCOPE).values())[0];
|
162
|
-
expect(remainingSignal.get()).toBe('signal2');
|
163
|
-
|
164
|
-
forceGc(signalObj!);
|
165
|
-
|
166
|
-
await sleep(50);
|
167
|
-
|
168
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(0);
|
169
|
-
});
|
170
|
-
|
171
|
-
it('should not garbage collect signals that are still being watched', async () => {
|
172
|
-
// Create a signal
|
173
|
-
const watchedSignal = reactive(() => 'watched');
|
174
|
-
|
175
|
-
const w = watcher(() => watchedSignal());
|
176
|
-
|
177
|
-
// Watch the signal but don't unwatch
|
178
|
-
w.addListener(() => {
|
179
|
-
watchedSignal();
|
180
|
-
});
|
181
|
-
|
182
|
-
await nextTick();
|
183
|
-
|
184
|
-
// Signal should be in the scope
|
185
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
186
|
-
|
187
|
-
await sleep(50);
|
188
|
-
|
189
|
-
// Signal should still be in the scope because it's being watched
|
190
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
191
|
-
});
|
192
|
-
|
193
|
-
it('should handle context-scoped signals correctly', async () => {
|
194
|
-
// Create a context
|
195
|
-
const TestContext = createContext('test');
|
196
|
-
|
197
|
-
// Create signals in context
|
198
|
-
let contextSignal: any;
|
199
|
-
|
200
|
-
withContexts([[TestContext, 'value']], () => {
|
201
|
-
contextSignal = reactive(() => 'context-scoped');
|
202
|
-
|
203
|
-
const w = watcher(() => contextSignal());
|
204
|
-
|
205
|
-
// Watch and unwatch
|
206
|
-
const unwatch = w.addListener(() => {
|
207
|
-
contextSignal();
|
208
|
-
});
|
209
|
-
|
210
|
-
unwatch();
|
211
|
-
});
|
212
|
-
|
213
|
-
await nextTick();
|
214
|
-
|
215
|
-
// Get the context scope (this is a bit hacky for testing)
|
216
|
-
const contextScope = (ROOT_SCOPE as any).children.values().next().value;
|
217
|
-
|
218
|
-
await sleep(50);
|
219
|
-
|
220
|
-
// Signal should be garbage collected from the context scope
|
221
|
-
expect(getSignalsMap(contextScope).size).toBe(0);
|
222
|
-
});
|
223
|
-
|
224
|
-
it('should remove signal from GC candidates if watched again', async () => {
|
225
|
-
// Create a signal
|
226
|
-
const signal = reactive(() => 'rewatch');
|
227
|
-
|
228
|
-
const w = watcher(() => signal());
|
229
|
-
|
230
|
-
// Watch and unwatch
|
231
|
-
const unwatch = w.addListener(() => {
|
232
|
-
signal();
|
233
|
-
});
|
234
|
-
|
235
|
-
await nextTick();
|
236
|
-
|
237
|
-
// Signal should be in the scope
|
238
|
-
expect(getSignalsMap(ROOT_SCOPE).size).toBe(1);
|
239
|
-
|
240
|
-
unwatch();
|
241
|
-
await nextTick();
|
242
|
-
|
243
|
-
// Signal should be in GC candidates
|
244
|
-
expect(getGCCandidates(ROOT_SCOPE).size).toBe(1);
|
245
|
-
|
246
|
-
// Watch again
|
247
|
-
w.addListener(() => {
|
248
|
-
signal();
|
249
|
-
});
|
250
|
-
|
251
|
-
await nextTick();
|
252
|
-
|
253
|
-
// Signal should be removed from GC candidates
|
254
|
-
expect(getGCCandidates(ROOT_SCOPE).size).toBe(0);
|
255
|
-
});
|
256
|
-
});
|
@@ -1,298 +0,0 @@
|
|
1
|
-
import { describe, expect, test, vi } from 'vitest';
|
2
|
-
import { state } from '../index.js';
|
3
|
-
import { nextTick } from './utils/async.js';
|
4
|
-
import { permute } from './utils/permute.js';
|
5
|
-
|
6
|
-
describe('nesting', () => {
|
7
|
-
permute(2, (create1, create2) => {
|
8
|
-
test('simple nesting', async () => {
|
9
|
-
const inner = create2(
|
10
|
-
(a: number, b: number) => {
|
11
|
-
return a + b;
|
12
|
-
},
|
13
|
-
{
|
14
|
-
desc: 'inner',
|
15
|
-
},
|
16
|
-
);
|
17
|
-
|
18
|
-
const outer = create1(
|
19
|
-
(a: number) => {
|
20
|
-
return inner(a, 2);
|
21
|
-
},
|
22
|
-
{
|
23
|
-
desc: 'outer',
|
24
|
-
},
|
25
|
-
);
|
26
|
-
|
27
|
-
outer.withParams(1).watch();
|
28
|
-
outer.withParams(2).watch();
|
29
|
-
|
30
|
-
await nextTick();
|
31
|
-
|
32
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
33
|
-
expect(outer.withParams(2)).toHaveSignalValue(4).toMatchSnapshot();
|
34
|
-
|
35
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
36
|
-
expect(outer.withParams(2)).toHaveSignalValue(4).toMatchSnapshot();
|
37
|
-
});
|
38
|
-
|
39
|
-
test('outer state + params', async () => {
|
40
|
-
const val = state(1);
|
41
|
-
|
42
|
-
const inner = create2((a: number, b: number) => {
|
43
|
-
return a + b;
|
44
|
-
});
|
45
|
-
|
46
|
-
const outer = create1((a: number) => {
|
47
|
-
if (a > 1) {
|
48
|
-
return inner(a, 2)! + val.get();
|
49
|
-
}
|
50
|
-
|
51
|
-
return inner(a, 2);
|
52
|
-
});
|
53
|
-
|
54
|
-
outer.withParams(1).watch();
|
55
|
-
outer.withParams(2).watch();
|
56
|
-
|
57
|
-
await nextTick();
|
58
|
-
|
59
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
60
|
-
expect(outer.withParams(2)).toHaveSignalValue(5).toMatchSnapshot();
|
61
|
-
|
62
|
-
val.set(2);
|
63
|
-
await nextTick();
|
64
|
-
|
65
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
66
|
-
expect(outer.withParams(2)).toHaveSignalValue(6).toMatchSnapshot();
|
67
|
-
});
|
68
|
-
|
69
|
-
test('inner state + params', async () => {
|
70
|
-
const val = state(1);
|
71
|
-
|
72
|
-
const inner = create2((a: number, b: number) => {
|
73
|
-
if (a > 1) {
|
74
|
-
return a + b + val.get();
|
75
|
-
}
|
76
|
-
|
77
|
-
return a + b;
|
78
|
-
});
|
79
|
-
|
80
|
-
const outer = create1((a: number) => {
|
81
|
-
return inner(a, 2);
|
82
|
-
});
|
83
|
-
|
84
|
-
outer.withParams(1).watch();
|
85
|
-
outer.withParams(2).watch();
|
86
|
-
|
87
|
-
await nextTick();
|
88
|
-
|
89
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
90
|
-
expect(outer.withParams(2)).toHaveSignalValue(5).toMatchSnapshot();
|
91
|
-
|
92
|
-
val.set(2);
|
93
|
-
|
94
|
-
await nextTick();
|
95
|
-
|
96
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
97
|
-
expect(outer.withParams(2)).toHaveSignalValue(6).toMatchSnapshot();
|
98
|
-
});
|
99
|
-
});
|
100
|
-
|
101
|
-
permute(3, (create1, create2, create3) => {
|
102
|
-
test('simple nesting', async () => {
|
103
|
-
const inner = create3((a: number, b: number, c: number) => {
|
104
|
-
return a + b + c;
|
105
|
-
});
|
106
|
-
|
107
|
-
const middle = create2((a: number, b: number) => {
|
108
|
-
return inner(a, b, 3);
|
109
|
-
});
|
110
|
-
|
111
|
-
const outer = create1((a: number) => {
|
112
|
-
return middle(a, 2);
|
113
|
-
});
|
114
|
-
|
115
|
-
outer.withParams(1).watch();
|
116
|
-
|
117
|
-
await nextTick();
|
118
|
-
|
119
|
-
expect(outer.withParams(1)).toHaveSignalValue(6).toMatchSnapshot();
|
120
|
-
});
|
121
|
-
|
122
|
-
test('state + params one level deep', async () => {
|
123
|
-
const val = state(1);
|
124
|
-
|
125
|
-
const inner = create3((a: number, b: number, c: number) => {
|
126
|
-
return a + b + c;
|
127
|
-
});
|
128
|
-
|
129
|
-
const middle = create2((a: number, b: number) => {
|
130
|
-
if (a > 1) {
|
131
|
-
return inner(a, b, 3)! + val.get();
|
132
|
-
}
|
133
|
-
|
134
|
-
return inner(a, b, 3);
|
135
|
-
});
|
136
|
-
|
137
|
-
const outer = create1((a: number) => {
|
138
|
-
return middle(a, 2);
|
139
|
-
});
|
140
|
-
|
141
|
-
outer.withParams(1).watch();
|
142
|
-
outer.withParams(2).watch();
|
143
|
-
|
144
|
-
await nextTick();
|
145
|
-
|
146
|
-
expect(outer.withParams(1)).toHaveSignalValue(6).toMatchSnapshot();
|
147
|
-
expect(outer.withParams(2)).toHaveSignalValue(8).toMatchSnapshot();
|
148
|
-
|
149
|
-
val.set(2);
|
150
|
-
await nextTick();
|
151
|
-
|
152
|
-
expect(outer.withParams(1)).toHaveSignalValue(6).toMatchSnapshot();
|
153
|
-
expect(outer.withParams(2)).toHaveSignalValue(9).toMatchSnapshot();
|
154
|
-
});
|
155
|
-
|
156
|
-
test('state + params two levels deep', async () => {
|
157
|
-
const val = state(1);
|
158
|
-
|
159
|
-
const inner = create3((a: number, b: number, c: number) => {
|
160
|
-
if (a > 1) {
|
161
|
-
return a + b + c + val.get();
|
162
|
-
}
|
163
|
-
|
164
|
-
return a + b + c;
|
165
|
-
});
|
166
|
-
|
167
|
-
const middle = create2((a: number, b: number) => {
|
168
|
-
return inner(a, b, 3);
|
169
|
-
});
|
170
|
-
|
171
|
-
const outer = create1((a: number) => {
|
172
|
-
return middle(a, 2);
|
173
|
-
});
|
174
|
-
|
175
|
-
outer.withParams(1).watch();
|
176
|
-
outer.withParams(2).watch();
|
177
|
-
|
178
|
-
await nextTick();
|
179
|
-
|
180
|
-
expect(outer.withParams(1)).toHaveSignalValue(6).toMatchSnapshot();
|
181
|
-
expect(outer.withParams(2)).toHaveSignalValue(8).toMatchSnapshot();
|
182
|
-
|
183
|
-
val.set(2);
|
184
|
-
|
185
|
-
await nextTick();
|
186
|
-
|
187
|
-
expect(outer.withParams(1)).toHaveSignalValue(6).toMatchSnapshot();
|
188
|
-
expect(outer.withParams(2)).toHaveSignalValue(9).toMatchSnapshot();
|
189
|
-
});
|
190
|
-
|
191
|
-
test('params + multiple children', async () => {
|
192
|
-
const inner1 = create3((a: number, b: number, c: number) => {
|
193
|
-
return a + b + c;
|
194
|
-
});
|
195
|
-
|
196
|
-
const inner2 = create2((a: number, b: number) => {
|
197
|
-
return a + b + inner1(a, b, 3)!;
|
198
|
-
});
|
199
|
-
|
200
|
-
const outer = create1((a: number, b: number) => {
|
201
|
-
return inner1(a, 2, 3)! + inner2(b, 2)!;
|
202
|
-
});
|
203
|
-
|
204
|
-
outer.withParams(1, 2).watch();
|
205
|
-
outer.withParams(2, 2).watch();
|
206
|
-
outer.withParams(2, 3).watch();
|
207
|
-
|
208
|
-
await nextTick();
|
209
|
-
await nextTick();
|
210
|
-
|
211
|
-
expect(outer.withParams(1, 2)).toHaveSignalValue(17).toMatchSnapshot();
|
212
|
-
expect(outer.withParams(2, 2)).toHaveSignalValue(18).toMatchSnapshot();
|
213
|
-
expect(outer.withParams(2, 3)).toHaveSignalValue(20).toMatchSnapshot();
|
214
|
-
});
|
215
|
-
|
216
|
-
test('params + state + multiple children', async () => {
|
217
|
-
const val = state(1);
|
218
|
-
|
219
|
-
const inner1 = create3((a: number, b: number, c: number) => {
|
220
|
-
return a + b + c;
|
221
|
-
});
|
222
|
-
|
223
|
-
const inner2 = create2((a: number, b: number) => {
|
224
|
-
if (a > 1) {
|
225
|
-
return a + b + inner1(a, b, 3)! + val.get();
|
226
|
-
}
|
227
|
-
|
228
|
-
return a + b + inner1(a, b, 3)!;
|
229
|
-
});
|
230
|
-
|
231
|
-
const outer = create1((a: number, b: number) => {
|
232
|
-
return inner1(a, 2, 3)! + inner2(b, 2)!;
|
233
|
-
});
|
234
|
-
|
235
|
-
outer.withParams(1, 2).watch();
|
236
|
-
outer.withParams(2, 2).watch();
|
237
|
-
outer.withParams(2, 3).watch();
|
238
|
-
outer.withParams(3, 3).watch();
|
239
|
-
|
240
|
-
await nextTick();
|
241
|
-
|
242
|
-
expect(outer.withParams(1, 2)).toHaveSignalValue(18).toMatchSnapshot();
|
243
|
-
expect(outer.withParams(2, 2)).toHaveSignalValue(19).toMatchSnapshot();
|
244
|
-
expect(outer.withParams(2, 3)).toHaveSignalValue(21).toMatchSnapshot();
|
245
|
-
expect(outer.withParams(3, 3)).toHaveSignalValue(22).toMatchSnapshot();
|
246
|
-
|
247
|
-
val.set(2);
|
248
|
-
|
249
|
-
// Wait for async with subscriptions
|
250
|
-
await nextTick();
|
251
|
-
|
252
|
-
expect(outer.withParams(1, 2)).toHaveSignalValue(19).toMatchSnapshot();
|
253
|
-
expect(outer.withParams(2, 2)).toHaveSignalValue(20).toMatchSnapshot();
|
254
|
-
expect(outer.withParams(2, 3)).toHaveSignalValue(22).toMatchSnapshot();
|
255
|
-
expect(outer.withParams(3, 3)).toHaveSignalValue(23).toMatchSnapshot();
|
256
|
-
});
|
257
|
-
|
258
|
-
test('passing state as params + multiple children', async () => {
|
259
|
-
const stateA = state(1);
|
260
|
-
const stateB = state(2);
|
261
|
-
|
262
|
-
const inner1 = create2((a: number, s: typeof stateA) => {
|
263
|
-
return a + s.get();
|
264
|
-
});
|
265
|
-
|
266
|
-
const inner2 = create3((b: number, s: typeof stateB) => {
|
267
|
-
return b * s.get();
|
268
|
-
});
|
269
|
-
|
270
|
-
const outer = create1((x: number) => {
|
271
|
-
if (x > 2) {
|
272
|
-
return inner1(x, stateA)! + inner2(x, stateB)!;
|
273
|
-
}
|
274
|
-
return inner1(x, stateA);
|
275
|
-
});
|
276
|
-
|
277
|
-
outer.withParams(1).watch();
|
278
|
-
outer.withParams(3).watch();
|
279
|
-
|
280
|
-
await nextTick();
|
281
|
-
|
282
|
-
expect(outer.withParams(1)).toHaveSignalValue(2).toMatchSnapshot();
|
283
|
-
expect(outer.withParams(3)).toHaveSignalValue(10).toMatchSnapshot();
|
284
|
-
|
285
|
-
stateA.set(2);
|
286
|
-
await nextTick();
|
287
|
-
|
288
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
289
|
-
expect(outer.withParams(3)).toHaveSignalValue(11).toMatchSnapshot();
|
290
|
-
|
291
|
-
stateB.set(3);
|
292
|
-
|
293
|
-
await nextTick();
|
294
|
-
expect(outer.withParams(1)).toHaveSignalValue(3).toMatchSnapshot();
|
295
|
-
expect(outer.withParams(3)).toHaveSignalValue(14).toMatchSnapshot();
|
296
|
-
});
|
297
|
-
});
|
298
|
-
});
|