signalium 0.3.8 → 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.
Files changed (287) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/CHANGELOG.md +15 -0
  3. package/build/react.js +19 -0
  4. package/build/transform.js +19 -0
  5. package/dist/cjs/config.d.ts +8 -3
  6. package/dist/cjs/config.d.ts.map +1 -1
  7. package/dist/cjs/config.js +14 -8
  8. package/dist/cjs/config.js.map +1 -1
  9. package/dist/cjs/debug.d.ts +2 -2
  10. package/dist/cjs/debug.d.ts.map +1 -1
  11. package/dist/cjs/debug.js +3 -3
  12. package/dist/cjs/debug.js.map +1 -1
  13. package/dist/cjs/hooks.d.ts +14 -42
  14. package/dist/cjs/hooks.d.ts.map +1 -1
  15. package/dist/cjs/hooks.js +19 -240
  16. package/dist/cjs/hooks.js.map +1 -1
  17. package/dist/cjs/index.d.ts +5 -3
  18. package/dist/cjs/index.d.ts.map +1 -1
  19. package/dist/cjs/index.js +18 -18
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/internals/async.d.ts +50 -0
  22. package/dist/cjs/internals/async.d.ts.map +1 -0
  23. package/dist/cjs/internals/async.js +390 -0
  24. package/dist/cjs/internals/async.js.map +1 -0
  25. package/dist/cjs/internals/connect.d.ts +4 -0
  26. package/dist/cjs/internals/connect.d.ts.map +1 -0
  27. package/dist/cjs/internals/connect.js +37 -0
  28. package/dist/cjs/internals/connect.js.map +1 -0
  29. package/dist/cjs/internals/consumer.d.ts +6 -0
  30. package/dist/cjs/internals/consumer.d.ts.map +1 -0
  31. package/dist/cjs/internals/consumer.js +13 -0
  32. package/dist/cjs/internals/consumer.js.map +1 -0
  33. package/dist/cjs/internals/contexts.d.ts +33 -0
  34. package/dist/cjs/internals/contexts.d.ts.map +1 -0
  35. package/dist/cjs/internals/contexts.js +103 -0
  36. package/dist/cjs/internals/contexts.js.map +1 -0
  37. package/dist/cjs/internals/derived.d.ts +66 -0
  38. package/dist/cjs/internals/derived.d.ts.map +1 -0
  39. package/dist/cjs/internals/derived.js +128 -0
  40. package/dist/cjs/internals/derived.js.map +1 -0
  41. package/dist/cjs/internals/dirty.d.ts +5 -0
  42. package/dist/cjs/internals/dirty.d.ts.map +1 -0
  43. package/dist/cjs/internals/dirty.js +79 -0
  44. package/dist/cjs/internals/dirty.js.map +1 -0
  45. package/dist/cjs/internals/edge.d.ts +32 -0
  46. package/dist/cjs/internals/edge.d.ts.map +1 -0
  47. package/dist/cjs/internals/edge.js +59 -0
  48. package/dist/cjs/internals/edge.js.map +1 -0
  49. package/dist/cjs/internals/get.d.ts +10 -0
  50. package/dist/cjs/internals/get.d.ts.map +1 -0
  51. package/dist/cjs/internals/get.js +255 -0
  52. package/dist/cjs/internals/get.js.map +1 -0
  53. package/dist/cjs/internals/scheduling.d.ts +12 -0
  54. package/dist/cjs/internals/scheduling.d.ts.map +1 -0
  55. package/dist/cjs/internals/scheduling.js +117 -0
  56. package/dist/cjs/internals/scheduling.js.map +1 -0
  57. package/dist/cjs/internals/state.d.ts +18 -0
  58. package/dist/cjs/internals/state.d.ts.map +1 -0
  59. package/dist/cjs/internals/state.js +88 -0
  60. package/dist/cjs/internals/state.js.map +1 -0
  61. package/dist/cjs/internals/utils/debug-name.d.ts +2 -0
  62. package/dist/cjs/internals/utils/debug-name.d.ts.map +1 -0
  63. package/dist/cjs/internals/utils/debug-name.js +14 -0
  64. package/dist/cjs/internals/utils/debug-name.js.map +1 -0
  65. package/dist/cjs/internals/utils/equals.d.ts +3 -0
  66. package/dist/cjs/internals/utils/equals.d.ts.map +1 -0
  67. package/dist/cjs/internals/utils/equals.js +13 -0
  68. package/dist/cjs/internals/utils/equals.js.map +1 -0
  69. package/dist/cjs/internals/utils/hash.d.ts +7 -0
  70. package/dist/cjs/internals/utils/hash.d.ts.map +1 -0
  71. package/dist/cjs/internals/utils/hash.js +181 -0
  72. package/dist/cjs/internals/utils/hash.js.map +1 -0
  73. package/dist/cjs/internals/utils/stringify.d.ts +3 -0
  74. package/dist/cjs/internals/utils/stringify.d.ts.map +1 -0
  75. package/dist/cjs/{utils.js → internals/utils/stringify.js} +5 -27
  76. package/dist/cjs/internals/utils/stringify.js.map +1 -0
  77. package/dist/cjs/internals/utils/type-utils.d.ts +6 -0
  78. package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -0
  79. package/dist/cjs/internals/utils/type-utils.js +22 -0
  80. package/dist/cjs/internals/utils/type-utils.js.map +1 -0
  81. package/dist/cjs/react/context.d.ts +1 -1
  82. package/dist/cjs/react/context.d.ts.map +1 -1
  83. package/dist/cjs/react/provider.d.ts +4 -3
  84. package/dist/cjs/react/provider.d.ts.map +1 -1
  85. package/dist/cjs/react/provider.js +7 -3
  86. package/dist/cjs/react/provider.js.map +1 -1
  87. package/dist/cjs/react/setup.d.ts.map +1 -1
  88. package/dist/cjs/react/setup.js +2 -1
  89. package/dist/cjs/react/setup.js.map +1 -1
  90. package/dist/cjs/react/signal-value.d.ts +5 -1
  91. package/dist/cjs/react/signal-value.d.ts.map +1 -1
  92. package/dist/cjs/react/signal-value.js +35 -45
  93. package/dist/cjs/react/signal-value.js.map +1 -1
  94. package/dist/cjs/trace.d.ts +32 -28
  95. package/dist/cjs/trace.d.ts.map +1 -1
  96. package/dist/cjs/trace.js +14 -16
  97. package/dist/cjs/trace.js.map +1 -1
  98. package/dist/cjs/transform.d.ts +6 -0
  99. package/dist/cjs/transform.d.ts.map +1 -0
  100. package/dist/cjs/transform.js +92 -0
  101. package/dist/cjs/transform.js.map +1 -0
  102. package/dist/cjs/types.d.ts +32 -40
  103. package/dist/cjs/types.d.ts.map +1 -1
  104. package/dist/esm/config.d.ts +8 -3
  105. package/dist/esm/config.d.ts.map +1 -1
  106. package/dist/esm/config.js +12 -7
  107. package/dist/esm/config.js.map +1 -1
  108. package/dist/esm/debug.d.ts +2 -2
  109. package/dist/esm/debug.d.ts.map +1 -1
  110. package/dist/esm/debug.js +2 -2
  111. package/dist/esm/debug.js.map +1 -1
  112. package/dist/esm/hooks.d.ts +14 -42
  113. package/dist/esm/hooks.d.ts.map +1 -1
  114. package/dist/esm/hooks.js +17 -226
  115. package/dist/esm/hooks.js.map +1 -1
  116. package/dist/esm/index.d.ts +5 -3
  117. package/dist/esm/index.d.ts.map +1 -1
  118. package/dist/esm/index.js +5 -3
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/internals/async.d.ts +50 -0
  121. package/dist/esm/internals/async.d.ts.map +1 -0
  122. package/dist/esm/internals/async.js +383 -0
  123. package/dist/esm/internals/async.js.map +1 -0
  124. package/dist/esm/internals/connect.d.ts +4 -0
  125. package/dist/esm/internals/connect.d.ts.map +1 -0
  126. package/dist/esm/internals/connect.js +33 -0
  127. package/dist/esm/internals/connect.js.map +1 -0
  128. package/dist/esm/internals/consumer.d.ts +6 -0
  129. package/dist/esm/internals/consumer.d.ts.map +1 -0
  130. package/dist/esm/internals/consumer.js +9 -0
  131. package/dist/esm/internals/consumer.js.map +1 -0
  132. package/dist/esm/internals/contexts.d.ts +33 -0
  133. package/dist/esm/internals/contexts.d.ts.map +1 -0
  134. package/dist/esm/internals/contexts.js +92 -0
  135. package/dist/esm/internals/contexts.js.map +1 -0
  136. package/dist/esm/internals/derived.d.ts +66 -0
  137. package/dist/esm/internals/derived.d.ts.map +1 -0
  138. package/dist/esm/internals/derived.js +118 -0
  139. package/dist/esm/internals/derived.js.map +1 -0
  140. package/dist/esm/internals/dirty.d.ts +5 -0
  141. package/dist/esm/internals/dirty.d.ts.map +1 -0
  142. package/dist/esm/internals/dirty.js +75 -0
  143. package/dist/esm/internals/dirty.js.map +1 -0
  144. package/dist/esm/internals/edge.d.ts +32 -0
  145. package/dist/esm/internals/edge.d.ts.map +1 -0
  146. package/dist/esm/internals/edge.js +54 -0
  147. package/dist/esm/internals/edge.js.map +1 -0
  148. package/dist/esm/internals/get.d.ts +10 -0
  149. package/dist/esm/internals/get.d.ts.map +1 -0
  150. package/dist/esm/internals/get.js +247 -0
  151. package/dist/esm/internals/get.js.map +1 -0
  152. package/dist/esm/internals/scheduling.d.ts +12 -0
  153. package/dist/esm/internals/scheduling.d.ts.map +1 -0
  154. package/dist/esm/internals/scheduling.js +106 -0
  155. package/dist/esm/internals/scheduling.js.map +1 -0
  156. package/dist/esm/internals/state.d.ts +18 -0
  157. package/dist/esm/internals/state.d.ts.map +1 -0
  158. package/dist/esm/internals/state.js +82 -0
  159. package/dist/esm/internals/state.js.map +1 -0
  160. package/dist/esm/internals/utils/debug-name.d.ts +2 -0
  161. package/dist/esm/internals/utils/debug-name.d.ts.map +1 -0
  162. package/dist/esm/internals/utils/debug-name.js +11 -0
  163. package/dist/esm/internals/utils/debug-name.js.map +1 -0
  164. package/dist/esm/internals/utils/equals.d.ts +3 -0
  165. package/dist/esm/internals/utils/equals.d.ts.map +1 -0
  166. package/dist/esm/internals/utils/equals.js +9 -0
  167. package/dist/esm/internals/utils/equals.js.map +1 -0
  168. package/dist/esm/internals/utils/hash.d.ts +7 -0
  169. package/dist/esm/internals/utils/hash.d.ts.map +1 -0
  170. package/dist/esm/internals/utils/hash.js +174 -0
  171. package/dist/esm/internals/utils/hash.js.map +1 -0
  172. package/dist/esm/internals/utils/stringify.d.ts +3 -0
  173. package/dist/esm/internals/utils/stringify.d.ts.map +1 -0
  174. package/dist/esm/{utils.js → internals/utils/stringify.js} +4 -25
  175. package/dist/esm/internals/utils/stringify.js.map +1 -0
  176. package/dist/esm/internals/utils/type-utils.d.ts +6 -0
  177. package/dist/esm/internals/utils/type-utils.d.ts.map +1 -0
  178. package/dist/esm/internals/utils/type-utils.js +15 -0
  179. package/dist/esm/internals/utils/type-utils.js.map +1 -0
  180. package/dist/esm/react/context.d.ts +1 -1
  181. package/dist/esm/react/context.d.ts.map +1 -1
  182. package/dist/esm/react/provider.d.ts +4 -3
  183. package/dist/esm/react/provider.d.ts.map +1 -1
  184. package/dist/esm/react/provider.js +6 -2
  185. package/dist/esm/react/provider.js.map +1 -1
  186. package/dist/esm/react/setup.d.ts.map +1 -1
  187. package/dist/esm/react/setup.js +3 -2
  188. package/dist/esm/react/setup.js.map +1 -1
  189. package/dist/esm/react/signal-value.d.ts +5 -1
  190. package/dist/esm/react/signal-value.d.ts.map +1 -1
  191. package/dist/esm/react/signal-value.js +34 -45
  192. package/dist/esm/react/signal-value.js.map +1 -1
  193. package/dist/esm/trace.d.ts +32 -28
  194. package/dist/esm/trace.d.ts.map +1 -1
  195. package/dist/esm/trace.js +13 -15
  196. package/dist/esm/trace.js.map +1 -1
  197. package/dist/esm/transform.d.ts +6 -0
  198. package/dist/esm/transform.d.ts.map +1 -0
  199. package/dist/esm/transform.js +89 -0
  200. package/dist/esm/transform.js.map +1 -0
  201. package/dist/esm/types.d.ts +32 -40
  202. package/dist/esm/types.d.ts.map +1 -1
  203. package/package.json +23 -4
  204. package/src/__tests__/__snapshots__/context.test.ts.snap +2101 -0
  205. package/src/__tests__/__snapshots__/nesting.test.ts.snap +16201 -0
  206. package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +1879 -0
  207. package/src/__tests__/async-task.test.ts +327 -0
  208. package/src/__tests__/context.test.ts +517 -0
  209. package/src/__tests__/nesting.test.ts +298 -0
  210. package/src/__tests__/params-and-state.test.ts +230 -0
  211. package/src/__tests__/reactive-async.test.ts +548 -0
  212. package/src/__tests__/reactive-sync.test.ts +130 -0
  213. package/src/__tests__/subscription.test.ts +510 -0
  214. package/src/__tests__/utils/async.ts +1 -1
  215. package/src/__tests__/utils/instrumented-hooks.ts +229 -124
  216. package/src/__tests__/utils/permute.ts +25 -14
  217. package/src/config.ts +19 -9
  218. package/src/debug.ts +2 -2
  219. package/src/hooks.ts +46 -380
  220. package/src/index.ts +7 -24
  221. package/src/internals/async.ts +556 -0
  222. package/src/internals/connect.ts +41 -0
  223. package/src/internals/consumer.ts +13 -0
  224. package/src/internals/contexts.ts +133 -0
  225. package/src/internals/derived.ts +208 -0
  226. package/src/internals/dirty.ts +91 -0
  227. package/src/internals/edge.ts +109 -0
  228. package/src/internals/get.ts +298 -0
  229. package/src/internals/scheduling.ts +140 -0
  230. package/src/internals/state.ts +111 -0
  231. package/src/internals/utils/debug-name.ts +14 -0
  232. package/src/internals/utils/equals.ts +12 -0
  233. package/src/internals/utils/hash.ts +221 -0
  234. package/src/{utils.ts → internals/utils/stringify.ts} +3 -29
  235. package/src/internals/utils/type-utils.ts +19 -0
  236. package/src/react/__tests__/async.test.tsx +704 -0
  237. package/src/react/__tests__/basic.test.tsx +95 -0
  238. package/src/react/__tests__/contexts.test.tsx +99 -0
  239. package/src/react/__tests__/subscriptions.test.tsx +49 -0
  240. package/src/react/__tests__/utils.tsx +40 -0
  241. package/src/react/context.ts +1 -1
  242. package/src/react/provider.tsx +12 -4
  243. package/src/react/setup.ts +3 -2
  244. package/src/react/signal-value.ts +47 -67
  245. package/src/trace.ts +43 -38
  246. package/src/transform.ts +113 -0
  247. package/src/types.ts +56 -46
  248. package/transform.js +19 -0
  249. package/vitest.workspace.ts +38 -2
  250. package/dist/cjs/scheduling.d.ts +0 -11
  251. package/dist/cjs/scheduling.d.ts.map +0 -1
  252. package/dist/cjs/scheduling.js +0 -108
  253. package/dist/cjs/scheduling.js.map +0 -1
  254. package/dist/cjs/signals.d.ts +0 -73
  255. package/dist/cjs/signals.d.ts.map +0 -1
  256. package/dist/cjs/signals.js +0 -632
  257. package/dist/cjs/signals.js.map +0 -1
  258. package/dist/cjs/utils.d.ts +0 -4
  259. package/dist/cjs/utils.d.ts.map +0 -1
  260. package/dist/cjs/utils.js.map +0 -1
  261. package/dist/esm/scheduling.d.ts +0 -11
  262. package/dist/esm/scheduling.d.ts.map +0 -1
  263. package/dist/esm/scheduling.js +0 -97
  264. package/dist/esm/scheduling.js.map +0 -1
  265. package/dist/esm/signals.d.ts +0 -73
  266. package/dist/esm/signals.d.ts.map +0 -1
  267. package/dist/esm/signals.js +0 -614
  268. package/dist/esm/signals.js.map +0 -1
  269. package/dist/esm/utils.d.ts +0 -4
  270. package/dist/esm/utils.d.ts.map +0 -1
  271. package/dist/esm/utils.js.map +0 -1
  272. package/src/__tests__/hooks/async-computed.test.ts +0 -190
  273. package/src/__tests__/hooks/async-task.test.ts +0 -334
  274. package/src/__tests__/hooks/computed.test.ts +0 -126
  275. package/src/__tests__/hooks/context.test.ts +0 -527
  276. package/src/__tests__/hooks/nesting.test.ts +0 -303
  277. package/src/__tests__/hooks/params-and-state.test.ts +0 -168
  278. package/src/__tests__/hooks/subscription.test.ts +0 -97
  279. package/src/__tests__/signals/async.test.ts +0 -416
  280. package/src/__tests__/signals/basic.test.ts +0 -399
  281. package/src/__tests__/signals/subscription.test.ts +0 -632
  282. package/src/__tests__/signals/watcher.test.ts +0 -253
  283. package/src/__tests__/utils/builders.ts +0 -22
  284. package/src/__tests__/utils/instrumented-signals.ts +0 -291
  285. package/src/react/__tests__/react.test.tsx +0 -227
  286. package/src/scheduling.ts +0 -130
  287. 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
- };