signalium 0.3.7 → 1.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/.turbo/turbo-build.log +3 -3
- package/CHANGELOG.md +21 -0
- package/build/react.js +19 -0
- package/build/transform.js +19 -0
- package/dist/cjs/config.d.ts +8 -3
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +14 -8
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/debug.d.ts +2 -2
- package/dist/cjs/debug.d.ts.map +1 -1
- package/dist/cjs/debug.js +3 -3
- package/dist/cjs/debug.js.map +1 -1
- package/dist/cjs/hooks.d.ts +14 -42
- package/dist/cjs/hooks.d.ts.map +1 -1
- package/dist/cjs/hooks.js +19 -240
- package/dist/cjs/hooks.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -18
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internals/async.d.ts +50 -0
- package/dist/cjs/internals/async.d.ts.map +1 -0
- package/dist/cjs/internals/async.js +390 -0
- package/dist/cjs/internals/async.js.map +1 -0
- package/dist/cjs/internals/connect.d.ts +4 -0
- package/dist/cjs/internals/connect.d.ts.map +1 -0
- package/dist/cjs/internals/connect.js +37 -0
- package/dist/cjs/internals/connect.js.map +1 -0
- package/dist/cjs/internals/consumer.d.ts +6 -0
- package/dist/cjs/internals/consumer.d.ts.map +1 -0
- package/dist/cjs/internals/consumer.js +13 -0
- package/dist/cjs/internals/consumer.js.map +1 -0
- package/dist/cjs/internals/contexts.d.ts +33 -0
- package/dist/cjs/internals/contexts.d.ts.map +1 -0
- package/dist/cjs/internals/contexts.js +103 -0
- package/dist/cjs/internals/contexts.js.map +1 -0
- package/dist/cjs/internals/derived.d.ts +66 -0
- package/dist/cjs/internals/derived.d.ts.map +1 -0
- package/dist/cjs/internals/derived.js +128 -0
- package/dist/cjs/internals/derived.js.map +1 -0
- package/dist/cjs/internals/dirty.d.ts +5 -0
- package/dist/cjs/internals/dirty.d.ts.map +1 -0
- package/dist/cjs/internals/dirty.js +79 -0
- package/dist/cjs/internals/dirty.js.map +1 -0
- package/dist/cjs/internals/edge.d.ts +32 -0
- package/dist/cjs/internals/edge.d.ts.map +1 -0
- package/dist/cjs/internals/edge.js +59 -0
- package/dist/cjs/internals/edge.js.map +1 -0
- package/dist/cjs/internals/get.d.ts +10 -0
- package/dist/cjs/internals/get.d.ts.map +1 -0
- package/dist/cjs/internals/get.js +255 -0
- package/dist/cjs/internals/get.js.map +1 -0
- package/dist/cjs/internals/scheduling.d.ts +12 -0
- package/dist/cjs/internals/scheduling.d.ts.map +1 -0
- package/dist/cjs/internals/scheduling.js +117 -0
- package/dist/cjs/internals/scheduling.js.map +1 -0
- package/dist/cjs/internals/state.d.ts +18 -0
- package/dist/cjs/internals/state.d.ts.map +1 -0
- package/dist/cjs/internals/state.js +88 -0
- package/dist/cjs/internals/state.js.map +1 -0
- package/dist/cjs/internals/utils/debug-name.d.ts +2 -0
- package/dist/cjs/internals/utils/debug-name.d.ts.map +1 -0
- package/dist/cjs/internals/utils/debug-name.js +14 -0
- package/dist/cjs/internals/utils/debug-name.js.map +1 -0
- package/dist/cjs/internals/utils/equals.d.ts +3 -0
- package/dist/cjs/internals/utils/equals.d.ts.map +1 -0
- package/dist/cjs/internals/utils/equals.js +13 -0
- package/dist/cjs/internals/utils/equals.js.map +1 -0
- package/dist/cjs/internals/utils/hash.d.ts +7 -0
- package/dist/cjs/internals/utils/hash.d.ts.map +1 -0
- package/dist/cjs/internals/utils/hash.js +181 -0
- package/dist/cjs/internals/utils/hash.js.map +1 -0
- package/dist/cjs/internals/utils/stringify.d.ts +3 -0
- package/dist/cjs/internals/utils/stringify.d.ts.map +1 -0
- package/dist/cjs/{utils.js → internals/utils/stringify.js} +5 -27
- package/dist/cjs/internals/utils/stringify.js.map +1 -0
- package/dist/cjs/internals/utils/type-utils.d.ts +6 -0
- package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -0
- package/dist/cjs/internals/utils/type-utils.js +22 -0
- package/dist/cjs/internals/utils/type-utils.js.map +1 -0
- package/dist/cjs/react/context.d.ts +1 -1
- package/dist/cjs/react/context.d.ts.map +1 -1
- package/dist/cjs/react/provider.d.ts +4 -3
- package/dist/cjs/react/provider.d.ts.map +1 -1
- package/dist/cjs/react/provider.js +7 -3
- package/dist/cjs/react/provider.js.map +1 -1
- package/dist/cjs/react/setup.d.ts.map +1 -1
- package/dist/cjs/react/setup.js +2 -1
- package/dist/cjs/react/setup.js.map +1 -1
- package/dist/cjs/react/signal-value.d.ts +5 -1
- package/dist/cjs/react/signal-value.d.ts.map +1 -1
- package/dist/cjs/react/signal-value.js +35 -45
- package/dist/cjs/react/signal-value.js.map +1 -1
- package/dist/cjs/trace.d.ts +32 -28
- package/dist/cjs/trace.d.ts.map +1 -1
- package/dist/cjs/trace.js +14 -16
- package/dist/cjs/trace.js.map +1 -1
- package/dist/cjs/transform.d.ts +6 -0
- package/dist/cjs/transform.d.ts.map +1 -0
- package/dist/cjs/transform.js +92 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/types.d.ts +32 -40
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/config.d.ts +8 -3
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +12 -7
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/debug.d.ts +2 -2
- package/dist/esm/debug.d.ts.map +1 -1
- package/dist/esm/debug.js +2 -2
- package/dist/esm/debug.js.map +1 -1
- package/dist/esm/hooks.d.ts +14 -42
- package/dist/esm/hooks.d.ts.map +1 -1
- package/dist/esm/hooks.js +17 -226
- package/dist/esm/hooks.js.map +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals/async.d.ts +50 -0
- package/dist/esm/internals/async.d.ts.map +1 -0
- package/dist/esm/internals/async.js +383 -0
- package/dist/esm/internals/async.js.map +1 -0
- package/dist/esm/internals/connect.d.ts +4 -0
- package/dist/esm/internals/connect.d.ts.map +1 -0
- package/dist/esm/internals/connect.js +33 -0
- package/dist/esm/internals/connect.js.map +1 -0
- package/dist/esm/internals/consumer.d.ts +6 -0
- package/dist/esm/internals/consumer.d.ts.map +1 -0
- package/dist/esm/internals/consumer.js +9 -0
- package/dist/esm/internals/consumer.js.map +1 -0
- package/dist/esm/internals/contexts.d.ts +33 -0
- package/dist/esm/internals/contexts.d.ts.map +1 -0
- package/dist/esm/internals/contexts.js +92 -0
- package/dist/esm/internals/contexts.js.map +1 -0
- package/dist/esm/internals/derived.d.ts +66 -0
- package/dist/esm/internals/derived.d.ts.map +1 -0
- package/dist/esm/internals/derived.js +118 -0
- package/dist/esm/internals/derived.js.map +1 -0
- package/dist/esm/internals/dirty.d.ts +5 -0
- package/dist/esm/internals/dirty.d.ts.map +1 -0
- package/dist/esm/internals/dirty.js +75 -0
- package/dist/esm/internals/dirty.js.map +1 -0
- package/dist/esm/internals/edge.d.ts +32 -0
- package/dist/esm/internals/edge.d.ts.map +1 -0
- package/dist/esm/internals/edge.js +54 -0
- package/dist/esm/internals/edge.js.map +1 -0
- package/dist/esm/internals/get.d.ts +10 -0
- package/dist/esm/internals/get.d.ts.map +1 -0
- package/dist/esm/internals/get.js +247 -0
- package/dist/esm/internals/get.js.map +1 -0
- package/dist/esm/internals/scheduling.d.ts +12 -0
- package/dist/esm/internals/scheduling.d.ts.map +1 -0
- package/dist/esm/internals/scheduling.js +106 -0
- package/dist/esm/internals/scheduling.js.map +1 -0
- package/dist/esm/internals/state.d.ts +18 -0
- package/dist/esm/internals/state.d.ts.map +1 -0
- package/dist/esm/internals/state.js +82 -0
- package/dist/esm/internals/state.js.map +1 -0
- package/dist/esm/internals/utils/debug-name.d.ts +2 -0
- package/dist/esm/internals/utils/debug-name.d.ts.map +1 -0
- package/dist/esm/internals/utils/debug-name.js +11 -0
- package/dist/esm/internals/utils/debug-name.js.map +1 -0
- package/dist/esm/internals/utils/equals.d.ts +3 -0
- package/dist/esm/internals/utils/equals.d.ts.map +1 -0
- package/dist/esm/internals/utils/equals.js +9 -0
- package/dist/esm/internals/utils/equals.js.map +1 -0
- package/dist/esm/internals/utils/hash.d.ts +7 -0
- package/dist/esm/internals/utils/hash.d.ts.map +1 -0
- package/dist/esm/internals/utils/hash.js +174 -0
- package/dist/esm/internals/utils/hash.js.map +1 -0
- package/dist/esm/internals/utils/stringify.d.ts +3 -0
- package/dist/esm/internals/utils/stringify.d.ts.map +1 -0
- package/dist/esm/{utils.js → internals/utils/stringify.js} +4 -25
- package/dist/esm/internals/utils/stringify.js.map +1 -0
- package/dist/esm/internals/utils/type-utils.d.ts +6 -0
- package/dist/esm/internals/utils/type-utils.d.ts.map +1 -0
- package/dist/esm/internals/utils/type-utils.js +15 -0
- package/dist/esm/internals/utils/type-utils.js.map +1 -0
- package/dist/esm/react/context.d.ts +1 -1
- package/dist/esm/react/context.d.ts.map +1 -1
- package/dist/esm/react/provider.d.ts +4 -3
- package/dist/esm/react/provider.d.ts.map +1 -1
- package/dist/esm/react/provider.js +6 -2
- package/dist/esm/react/provider.js.map +1 -1
- package/dist/esm/react/setup.d.ts.map +1 -1
- package/dist/esm/react/setup.js +3 -2
- package/dist/esm/react/setup.js.map +1 -1
- package/dist/esm/react/signal-value.d.ts +5 -1
- package/dist/esm/react/signal-value.d.ts.map +1 -1
- package/dist/esm/react/signal-value.js +34 -45
- package/dist/esm/react/signal-value.js.map +1 -1
- package/dist/esm/trace.d.ts +32 -28
- package/dist/esm/trace.d.ts.map +1 -1
- package/dist/esm/trace.js +13 -15
- package/dist/esm/trace.js.map +1 -1
- package/dist/esm/transform.d.ts +6 -0
- package/dist/esm/transform.d.ts.map +1 -0
- package/dist/esm/transform.js +89 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/types.d.ts +32 -40
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +23 -4
- package/src/__tests__/__snapshots__/context.test.ts.snap +2101 -0
- package/src/__tests__/__snapshots__/nesting.test.ts.snap +16201 -0
- package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +1879 -0
- package/src/__tests__/async-task.test.ts +327 -0
- package/src/__tests__/context.test.ts +517 -0
- package/src/__tests__/nesting.test.ts +298 -0
- package/src/__tests__/params-and-state.test.ts +230 -0
- package/src/__tests__/reactive-async.test.ts +548 -0
- package/src/__tests__/reactive-sync.test.ts +130 -0
- package/src/__tests__/subscription.test.ts +510 -0
- package/src/__tests__/utils/async.ts +1 -1
- package/src/__tests__/utils/instrumented-hooks.ts +229 -124
- package/src/__tests__/utils/permute.ts +25 -14
- package/src/config.ts +19 -9
- package/src/debug.ts +2 -2
- package/src/hooks.ts +46 -380
- package/src/index.ts +7 -24
- package/src/internals/async.ts +556 -0
- package/src/internals/connect.ts +41 -0
- package/src/internals/consumer.ts +13 -0
- package/src/internals/contexts.ts +133 -0
- package/src/internals/derived.ts +208 -0
- package/src/internals/dirty.ts +91 -0
- package/src/internals/edge.ts +109 -0
- package/src/internals/get.ts +298 -0
- package/src/internals/scheduling.ts +140 -0
- package/src/internals/state.ts +111 -0
- package/src/internals/utils/debug-name.ts +14 -0
- package/src/internals/utils/equals.ts +12 -0
- package/src/internals/utils/hash.ts +221 -0
- package/src/{utils.ts → internals/utils/stringify.ts} +3 -29
- package/src/internals/utils/type-utils.ts +19 -0
- package/src/react/__tests__/async.test.tsx +704 -0
- package/src/react/__tests__/basic.test.tsx +95 -0
- package/src/react/__tests__/contexts.test.tsx +99 -0
- package/src/react/__tests__/subscriptions.test.tsx +49 -0
- package/src/react/__tests__/utils.tsx +40 -0
- package/src/react/context.ts +1 -1
- package/src/react/provider.tsx +12 -4
- package/src/react/setup.ts +3 -2
- package/src/react/signal-value.ts +47 -67
- package/src/trace.ts +43 -38
- package/src/transform.ts +113 -0
- package/src/types.ts +56 -46
- package/transform.js +19 -0
- package/vitest.workspace.ts +38 -2
- package/dist/cjs/scheduling.d.ts +0 -11
- package/dist/cjs/scheduling.d.ts.map +0 -1
- package/dist/cjs/scheduling.js +0 -108
- package/dist/cjs/scheduling.js.map +0 -1
- package/dist/cjs/signals.d.ts +0 -73
- package/dist/cjs/signals.d.ts.map +0 -1
- package/dist/cjs/signals.js +0 -632
- package/dist/cjs/signals.js.map +0 -1
- package/dist/cjs/utils.d.ts +0 -4
- package/dist/cjs/utils.d.ts.map +0 -1
- package/dist/cjs/utils.js.map +0 -1
- package/dist/esm/scheduling.d.ts +0 -11
- package/dist/esm/scheduling.d.ts.map +0 -1
- package/dist/esm/scheduling.js +0 -97
- package/dist/esm/scheduling.js.map +0 -1
- package/dist/esm/signals.d.ts +0 -73
- package/dist/esm/signals.d.ts.map +0 -1
- package/dist/esm/signals.js +0 -614
- package/dist/esm/signals.js.map +0 -1
- package/dist/esm/utils.d.ts +0 -4
- package/dist/esm/utils.d.ts.map +0 -1
- package/dist/esm/utils.js.map +0 -1
- package/src/__tests__/hooks/async-computed.test.ts +0 -190
- package/src/__tests__/hooks/async-task.test.ts +0 -334
- package/src/__tests__/hooks/computed.test.ts +0 -126
- package/src/__tests__/hooks/context.test.ts +0 -527
- package/src/__tests__/hooks/nesting.test.ts +0 -303
- package/src/__tests__/hooks/params-and-state.test.ts +0 -168
- package/src/__tests__/hooks/subscription.test.ts +0 -97
- package/src/__tests__/signals/async.test.ts +0 -416
- package/src/__tests__/signals/basic.test.ts +0 -399
- package/src/__tests__/signals/subscription.test.ts +0 -632
- package/src/__tests__/signals/watcher.test.ts +0 -253
- package/src/__tests__/utils/builders.ts +0 -22
- package/src/__tests__/utils/instrumented-signals.ts +0 -291
- package/src/react/__tests__/react.test.tsx +0 -227
- package/src/scheduling.ts +0 -130
- package/src/signals.ts +0 -824
@@ -1,227 +0,0 @@
|
|
1
|
-
import { beforeEach, describe, expect, test } from 'vitest';
|
2
|
-
import { render } from 'vitest-browser-react';
|
3
|
-
import { state, asyncComputed, computed, createContext, useContext } from '../../index.js';
|
4
|
-
import { ContextProvider, setupReact, useStateSignal } from '../index.js';
|
5
|
-
import React, { useState } from 'react';
|
6
|
-
import { userEvent } from '@vitest/browser/context';
|
7
|
-
import { sleep } from '../../__tests__/utils/async.js';
|
8
|
-
|
9
|
-
describe('React', () => {
|
10
|
-
beforeEach(() => {
|
11
|
-
setupReact();
|
12
|
-
});
|
13
|
-
|
14
|
-
test('basic state usage works', async () => {
|
15
|
-
const value = state('Hello');
|
16
|
-
|
17
|
-
function Component(): React.ReactNode {
|
18
|
-
return <div>{value.get()}</div>;
|
19
|
-
}
|
20
|
-
|
21
|
-
const { getByText } = render(<Component />);
|
22
|
-
|
23
|
-
await expect.element(getByText('Hello')).toBeInTheDocument();
|
24
|
-
|
25
|
-
value.set('World');
|
26
|
-
|
27
|
-
await expect.element(getByText('World')).toBeInTheDocument();
|
28
|
-
});
|
29
|
-
|
30
|
-
test('useStateSignal works', async () => {
|
31
|
-
function Component(): React.ReactNode {
|
32
|
-
const value = useStateSignal('Hello');
|
33
|
-
|
34
|
-
return (
|
35
|
-
<div>
|
36
|
-
{value.get()}
|
37
|
-
<button onClick={() => value.set('World')}>Toggle</button>
|
38
|
-
</div>
|
39
|
-
);
|
40
|
-
}
|
41
|
-
|
42
|
-
const { getByText } = render(<Component />);
|
43
|
-
|
44
|
-
await expect.element(getByText('Hello')).toBeInTheDocument();
|
45
|
-
|
46
|
-
await userEvent.click(getByText('Toggle'));
|
47
|
-
|
48
|
-
await expect.element(getByText('World')).toBeInTheDocument();
|
49
|
-
});
|
50
|
-
|
51
|
-
test('basic computed usage works', async () => {
|
52
|
-
const value = state('Hello');
|
53
|
-
|
54
|
-
const derived = computed(() => `${value.get()}, World`);
|
55
|
-
|
56
|
-
function Component(): React.ReactNode {
|
57
|
-
return <div>{derived()}</div>;
|
58
|
-
}
|
59
|
-
|
60
|
-
const { getByText } = render(<Component />);
|
61
|
-
|
62
|
-
await expect.element(getByText('Hello, World')).toBeInTheDocument();
|
63
|
-
|
64
|
-
value.set('Hey');
|
65
|
-
|
66
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
67
|
-
});
|
68
|
-
|
69
|
-
test('computed updates when params change', async () => {
|
70
|
-
const value = state('Hello');
|
71
|
-
|
72
|
-
const derived = computed((universe: boolean) => `${value.get()}, ${universe ? 'Universe' : 'World'}`);
|
73
|
-
|
74
|
-
function Component(): React.ReactNode {
|
75
|
-
const [universe, setUniverse] = useState(true);
|
76
|
-
|
77
|
-
return (
|
78
|
-
<div>
|
79
|
-
{derived(universe)}
|
80
|
-
<button onClick={() => setUniverse(!universe)}>Toggle Universe</button>
|
81
|
-
</div>
|
82
|
-
);
|
83
|
-
}
|
84
|
-
|
85
|
-
const { getByText } = render(<Component />);
|
86
|
-
|
87
|
-
await expect.element(getByText('Hello, Universe')).toBeInTheDocument();
|
88
|
-
|
89
|
-
value.set('Hey');
|
90
|
-
|
91
|
-
await expect.element(getByText('Hey, Universe')).toBeInTheDocument();
|
92
|
-
|
93
|
-
await userEvent.click(getByText('Toggle Universe'));
|
94
|
-
|
95
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
96
|
-
});
|
97
|
-
|
98
|
-
test('works with async computed', async () => {
|
99
|
-
const value = state('Hello');
|
100
|
-
|
101
|
-
const derived = asyncComputed(async (universe: boolean) => {
|
102
|
-
const v = value.get();
|
103
|
-
await sleep(100);
|
104
|
-
return `${v}, ${universe ? 'Universe' : 'World'}`;
|
105
|
-
});
|
106
|
-
|
107
|
-
function Component(): React.ReactNode {
|
108
|
-
const [universe, setUniverse] = useState(true);
|
109
|
-
|
110
|
-
const d = derived(universe);
|
111
|
-
|
112
|
-
return (
|
113
|
-
<div>
|
114
|
-
{d.isSuccess ? d.result : 'Loading...'}
|
115
|
-
<button onClick={() => setUniverse(!universe)}>Toggle Universe</button>
|
116
|
-
</div>
|
117
|
-
);
|
118
|
-
}
|
119
|
-
|
120
|
-
const { getByText } = render(<Component />);
|
121
|
-
|
122
|
-
await expect.element(getByText('Loading...')).toBeInTheDocument();
|
123
|
-
await expect.element(getByText('Hello, Universe')).toBeInTheDocument();
|
124
|
-
|
125
|
-
value.set('Hey');
|
126
|
-
|
127
|
-
await expect.element(getByText('Loading...')).toBeInTheDocument();
|
128
|
-
await expect.element(getByText('Hey, Universe')).toBeInTheDocument();
|
129
|
-
|
130
|
-
await userEvent.click(getByText('Toggle Universe'));
|
131
|
-
|
132
|
-
await expect.element(getByText('Loading...')).toBeInTheDocument();
|
133
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
134
|
-
});
|
135
|
-
|
136
|
-
describe('contexts', () => {
|
137
|
-
test('useContext works inside computed with default value', async () => {
|
138
|
-
const value = state('Hello');
|
139
|
-
const context = createContext(value);
|
140
|
-
|
141
|
-
const derived = computed(() => `${useContext(context).get()}, World`);
|
142
|
-
|
143
|
-
function Component(): React.ReactNode {
|
144
|
-
return <div>{derived()}</div>;
|
145
|
-
}
|
146
|
-
|
147
|
-
const { getByText } = render(<Component />);
|
148
|
-
|
149
|
-
await expect.element(getByText('Hello, World')).toBeInTheDocument();
|
150
|
-
|
151
|
-
value.set('Hey');
|
152
|
-
|
153
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
154
|
-
});
|
155
|
-
|
156
|
-
test('useContext works at root level with default value', async () => {
|
157
|
-
const value = state('Hello');
|
158
|
-
const context = createContext(value);
|
159
|
-
|
160
|
-
function Component(): React.ReactNode {
|
161
|
-
const v = useContext(context);
|
162
|
-
|
163
|
-
return <div>{v.get()}, World</div>;
|
164
|
-
}
|
165
|
-
|
166
|
-
const { getByText } = render(
|
167
|
-
<ContextProvider contexts={{}}>
|
168
|
-
<Component />
|
169
|
-
</ContextProvider>,
|
170
|
-
);
|
171
|
-
|
172
|
-
await expect.element(getByText('Hello, World')).toBeInTheDocument();
|
173
|
-
|
174
|
-
value.set('Hey');
|
175
|
-
|
176
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
177
|
-
});
|
178
|
-
|
179
|
-
test('useContext works inside computed value passed via context provider', async () => {
|
180
|
-
const value = state('Hello');
|
181
|
-
const override = state('Hey');
|
182
|
-
const context = createContext(value);
|
183
|
-
|
184
|
-
const derived = computed(() => `${useContext(context).get()}, World`);
|
185
|
-
|
186
|
-
function Component(): React.ReactNode {
|
187
|
-
return <div>{derived()}</div>;
|
188
|
-
}
|
189
|
-
|
190
|
-
const { getByText } = render(
|
191
|
-
<ContextProvider contexts={{ [context]: override }}>
|
192
|
-
<Component />
|
193
|
-
</ContextProvider>,
|
194
|
-
);
|
195
|
-
|
196
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
197
|
-
|
198
|
-
override.set('Hi');
|
199
|
-
|
200
|
-
await expect.element(getByText('Hi, World')).toBeInTheDocument();
|
201
|
-
});
|
202
|
-
|
203
|
-
test('useContext works at root level with default value', async () => {
|
204
|
-
const value = state('Hello');
|
205
|
-
const override = state('Hey');
|
206
|
-
const context = createContext(value);
|
207
|
-
|
208
|
-
function Component(): React.ReactNode {
|
209
|
-
const v = useContext(context);
|
210
|
-
|
211
|
-
return <div>{v.get()}, World</div>;
|
212
|
-
}
|
213
|
-
|
214
|
-
const { getByText } = render(
|
215
|
-
<ContextProvider contexts={{ [context]: override }}>
|
216
|
-
<Component />
|
217
|
-
</ContextProvider>,
|
218
|
-
);
|
219
|
-
|
220
|
-
await expect.element(getByText('Hey, World')).toBeInTheDocument();
|
221
|
-
|
222
|
-
override.set('Hi');
|
223
|
-
|
224
|
-
await expect.element(getByText('Hi, World')).toBeInTheDocument();
|
225
|
-
});
|
226
|
-
});
|
227
|
-
});
|
package/src/scheduling.ts
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
import { ComputedSignal } from './signals.js';
|
2
|
-
import { scheduleFlush as _scheduleFlush, runBatch } from './config.js';
|
3
|
-
import { Tracer } from './trace.js';
|
4
|
-
|
5
|
-
let PENDING_DIRTIES: ComputedSignal<any>[] = [];
|
6
|
-
let PENDING_PULLS: ComputedSignal<any>[] = [];
|
7
|
-
let PENDING_WATCHERS: ComputedSignal<any>[] = [];
|
8
|
-
let PENDING_CONNECTS = new Map<ComputedSignal<any>, number>();
|
9
|
-
let PENDING_DISCONNECTS = new Map<ComputedSignal<any>, number>();
|
10
|
-
let PENDING_EFFECTS: ComputedSignal<any>[] = [];
|
11
|
-
let PENDING_TRACERS: Tracer[] = [];
|
12
|
-
|
13
|
-
const microtask = () => Promise.resolve();
|
14
|
-
|
15
|
-
let currentFlush: { promise: Promise<void>; resolve: () => void } | null = null;
|
16
|
-
|
17
|
-
const scheduleFlush = (fn: () => void) => {
|
18
|
-
if (currentFlush) return;
|
19
|
-
|
20
|
-
let resolve: () => void;
|
21
|
-
const promise = new Promise<void>(r => (resolve = r));
|
22
|
-
|
23
|
-
currentFlush = { promise, resolve: resolve! };
|
24
|
-
|
25
|
-
_scheduleFlush(flushWatchers);
|
26
|
-
};
|
27
|
-
|
28
|
-
export const scheduleWatcher = (watcher: ComputedSignal<any>) => {
|
29
|
-
PENDING_WATCHERS.push(watcher);
|
30
|
-
|
31
|
-
scheduleFlush(flushWatchers);
|
32
|
-
};
|
33
|
-
|
34
|
-
export const scheduleDirty = (signal: ComputedSignal<any>) => {
|
35
|
-
PENDING_DIRTIES.push(signal);
|
36
|
-
scheduleFlush(flushWatchers);
|
37
|
-
};
|
38
|
-
|
39
|
-
export const schedulePull = (signal: ComputedSignal<any>) => {
|
40
|
-
PENDING_PULLS.push(signal);
|
41
|
-
scheduleFlush(flushWatchers);
|
42
|
-
};
|
43
|
-
|
44
|
-
export const scheduleConnect = (connect: ComputedSignal<any>) => {
|
45
|
-
const current = PENDING_CONNECTS.get(connect) ?? 0;
|
46
|
-
|
47
|
-
PENDING_CONNECTS.set(connect, current + 1);
|
48
|
-
|
49
|
-
scheduleFlush(flushWatchers);
|
50
|
-
};
|
51
|
-
|
52
|
-
export const scheduleDisconnect = (disconnect: ComputedSignal<any>) => {
|
53
|
-
const current = PENDING_DISCONNECTS.get(disconnect) ?? 0;
|
54
|
-
|
55
|
-
PENDING_DISCONNECTS.set(disconnect, current + 1);
|
56
|
-
|
57
|
-
scheduleFlush(flushWatchers);
|
58
|
-
};
|
59
|
-
|
60
|
-
export const scheduleEffect = (signal: ComputedSignal<any>) => {
|
61
|
-
PENDING_EFFECTS.push(signal);
|
62
|
-
scheduleFlush(flushWatchers);
|
63
|
-
};
|
64
|
-
|
65
|
-
export const scheduleTracer = (tracer: Tracer) => {
|
66
|
-
PENDING_TRACERS.push(tracer);
|
67
|
-
scheduleFlush(flushWatchers);
|
68
|
-
};
|
69
|
-
|
70
|
-
const flushWatchers = async () => {
|
71
|
-
const flush = currentFlush!;
|
72
|
-
|
73
|
-
// Flush all the dirty signals and pulls recursively, clearing
|
74
|
-
// the microtask queue until they are all settled
|
75
|
-
while (PENDING_DIRTIES.length > 0 || PENDING_PULLS.length > 0) {
|
76
|
-
for (const dirty of PENDING_DIRTIES) {
|
77
|
-
dirty._dirtyConsumers();
|
78
|
-
}
|
79
|
-
|
80
|
-
for (const pull of PENDING_PULLS) {
|
81
|
-
pull._check();
|
82
|
-
}
|
83
|
-
|
84
|
-
PENDING_DIRTIES = [];
|
85
|
-
PENDING_PULLS = [];
|
86
|
-
|
87
|
-
await microtask();
|
88
|
-
}
|
89
|
-
|
90
|
-
// Clear the flush so that if any more watchers are scheduled,
|
91
|
-
// they will be flushed in the next tick
|
92
|
-
currentFlush = null;
|
93
|
-
|
94
|
-
runBatch(() => {
|
95
|
-
for (const watcher of PENDING_WATCHERS) {
|
96
|
-
watcher._check();
|
97
|
-
}
|
98
|
-
|
99
|
-
for (const [signal, count] of PENDING_CONNECTS) {
|
100
|
-
signal._check(true, count);
|
101
|
-
}
|
102
|
-
|
103
|
-
for (const [signal, count] of PENDING_DISCONNECTS) {
|
104
|
-
signal._disconnect(count);
|
105
|
-
}
|
106
|
-
|
107
|
-
for (const signal of PENDING_EFFECTS) {
|
108
|
-
signal._runEffects();
|
109
|
-
}
|
110
|
-
|
111
|
-
for (const tracer of PENDING_TRACERS) {
|
112
|
-
tracer.flush();
|
113
|
-
}
|
114
|
-
|
115
|
-
PENDING_WATCHERS = [];
|
116
|
-
PENDING_CONNECTS.clear();
|
117
|
-
PENDING_DISCONNECTS.clear();
|
118
|
-
PENDING_EFFECTS = [];
|
119
|
-
PENDING_TRACERS = [];
|
120
|
-
});
|
121
|
-
|
122
|
-
// resolve the flush promise
|
123
|
-
flush.resolve();
|
124
|
-
};
|
125
|
-
|
126
|
-
export const settled = async () => {
|
127
|
-
while (currentFlush) {
|
128
|
-
await currentFlush.promise;
|
129
|
-
}
|
130
|
-
};
|