rexfect 0.0.7

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 (190) hide show
  1. package/README.md +1756 -0
  2. package/dist/abortableContext.d.ts +3 -0
  3. package/dist/abortableContext.d.ts.map +1 -0
  4. package/dist/abortableContext.js +48 -0
  5. package/dist/abortableContext.js.map +1 -0
  6. package/dist/action.d.ts +64 -0
  7. package/dist/action.d.ts.map +1 -0
  8. package/dist/action.js +208 -0
  9. package/dist/action.js.map +1 -0
  10. package/dist/action.test.d.ts +2 -0
  11. package/dist/action.test.d.ts.map +1 -0
  12. package/dist/action.test.js +189 -0
  13. package/dist/action.test.js.map +1 -0
  14. package/dist/async/abortable-guard.d.ts +25 -0
  15. package/dist/async/abortable-guard.d.ts.map +1 -0
  16. package/dist/async/abortable-guard.js +33 -0
  17. package/dist/async/abortable-guard.js.map +1 -0
  18. package/dist/async/abortable.d.ts +331 -0
  19. package/dist/async/abortable.d.ts.map +1 -0
  20. package/dist/async/abortable.js +410 -0
  21. package/dist/async/abortable.js.map +1 -0
  22. package/dist/async/abortable.test.d.ts +2 -0
  23. package/dist/async/abortable.test.d.ts.map +1 -0
  24. package/dist/async/abortable.test.js +535 -0
  25. package/dist/async/abortable.test.js.map +1 -0
  26. package/dist/async/abortable.typeCheck.d.ts +8 -0
  27. package/dist/async/abortable.typeCheck.d.ts.map +1 -0
  28. package/dist/async/abortable.typeCheck.js +138 -0
  29. package/dist/async/abortable.typeCheck.js.map +1 -0
  30. package/dist/async/async.d.ts +18 -0
  31. package/dist/async/async.d.ts.map +1 -0
  32. package/dist/async/async.js +20 -0
  33. package/dist/async/async.js.map +1 -0
  34. package/dist/async/index.d.ts +15 -0
  35. package/dist/async/index.d.ts.map +1 -0
  36. package/dist/async/index.js +13 -0
  37. package/dist/async/index.js.map +1 -0
  38. package/dist/async/loadable.d.ts +7 -0
  39. package/dist/async/loadable.d.ts.map +1 -0
  40. package/dist/async/loadable.js +52 -0
  41. package/dist/async/loadable.js.map +1 -0
  42. package/dist/async/loadable.test.d.ts +2 -0
  43. package/dist/async/loadable.test.d.ts.map +1 -0
  44. package/dist/async/loadable.test.js +322 -0
  45. package/dist/async/loadable.test.js.map +1 -0
  46. package/dist/async/promiseCache.d.ts +14 -0
  47. package/dist/async/promiseCache.d.ts.map +1 -0
  48. package/dist/async/promiseCache.js +29 -0
  49. package/dist/async/promiseCache.js.map +1 -0
  50. package/dist/async/read.d.ts +120 -0
  51. package/dist/async/read.d.ts.map +1 -0
  52. package/dist/async/read.js +286 -0
  53. package/dist/async/read.js.map +1 -0
  54. package/dist/async/read.test.d.ts +2 -0
  55. package/dist/async/read.test.d.ts.map +1 -0
  56. package/dist/async/read.test.js +419 -0
  57. package/dist/async/read.test.js.map +1 -0
  58. package/dist/async/read.typeCheck.d.ts +6 -0
  59. package/dist/async/read.typeCheck.d.ts.map +1 -0
  60. package/dist/async/read.typeCheck.js +101 -0
  61. package/dist/async/read.typeCheck.js.map +1 -0
  62. package/dist/async/safe.d.ts +230 -0
  63. package/dist/async/safe.d.ts.map +1 -0
  64. package/dist/async/safe.js +247 -0
  65. package/dist/async/safe.js.map +1 -0
  66. package/dist/async/safe.test.d.ts +2 -0
  67. package/dist/async/safe.test.d.ts.map +1 -0
  68. package/dist/async/safe.test.js +447 -0
  69. package/dist/async/safe.test.js.map +1 -0
  70. package/dist/async/utils.d.ts +17 -0
  71. package/dist/async/utils.d.ts.map +1 -0
  72. package/dist/async/utils.js +38 -0
  73. package/dist/async/utils.js.map +1 -0
  74. package/dist/async/wait.d.ts +120 -0
  75. package/dist/async/wait.d.ts.map +1 -0
  76. package/dist/async/wait.js +112 -0
  77. package/dist/async/wait.js.map +1 -0
  78. package/dist/async/wait.test.d.ts +2 -0
  79. package/dist/async/wait.test.d.ts.map +1 -0
  80. package/dist/async/wait.test.js +122 -0
  81. package/dist/async/wait.test.js.map +1 -0
  82. package/dist/async/wait.typeCheck.d.ts +6 -0
  83. package/dist/async/wait.typeCheck.d.ts.map +1 -0
  84. package/dist/async/wait.typeCheck.js +104 -0
  85. package/dist/async/wait.typeCheck.js.map +1 -0
  86. package/dist/atom.d.ts +46 -0
  87. package/dist/atom.d.ts.map +1 -0
  88. package/dist/atom.js +86 -0
  89. package/dist/atom.js.map +1 -0
  90. package/dist/atom.test.d.ts +2 -0
  91. package/dist/atom.test.d.ts.map +1 -0
  92. package/dist/atom.test.js +75 -0
  93. package/dist/atom.test.js.map +1 -0
  94. package/dist/batch.d.ts +15 -0
  95. package/dist/batch.d.ts.map +1 -0
  96. package/dist/batch.js +45 -0
  97. package/dist/batch.js.map +1 -0
  98. package/dist/defer.d.ts +56 -0
  99. package/dist/defer.d.ts.map +1 -0
  100. package/dist/defer.js +49 -0
  101. package/dist/defer.js.map +1 -0
  102. package/dist/effect.d.ts +91 -0
  103. package/dist/effect.d.ts.map +1 -0
  104. package/dist/effect.js +311 -0
  105. package/dist/effect.js.map +1 -0
  106. package/dist/effect.test.d.ts +2 -0
  107. package/dist/effect.test.d.ts.map +1 -0
  108. package/dist/effect.test.js +123 -0
  109. package/dist/effect.test.js.map +1 -0
  110. package/dist/emitter.d.ts +129 -0
  111. package/dist/emitter.d.ts.map +1 -0
  112. package/dist/emitter.js +164 -0
  113. package/dist/emitter.js.map +1 -0
  114. package/dist/emitter.test.d.ts +2 -0
  115. package/dist/emitter.test.d.ts.map +1 -0
  116. package/dist/emitter.test.js +259 -0
  117. package/dist/emitter.test.js.map +1 -0
  118. package/dist/equality.d.ts +66 -0
  119. package/dist/equality.d.ts.map +1 -0
  120. package/dist/equality.js +145 -0
  121. package/dist/equality.js.map +1 -0
  122. package/dist/event.d.ts +18 -0
  123. package/dist/event.d.ts.map +1 -0
  124. package/dist/event.js +166 -0
  125. package/dist/event.js.map +1 -0
  126. package/dist/event.test.d.ts +2 -0
  127. package/dist/event.test.d.ts.map +1 -0
  128. package/dist/event.test.js +167 -0
  129. package/dist/event.test.js.map +1 -0
  130. package/dist/hooks.d.ts +152 -0
  131. package/dist/hooks.d.ts.map +1 -0
  132. package/dist/hooks.js +122 -0
  133. package/dist/hooks.js.map +1 -0
  134. package/dist/hooks.test.d.ts +2 -0
  135. package/dist/hooks.test.d.ts.map +1 -0
  136. package/dist/hooks.test.js +99 -0
  137. package/dist/hooks.test.js.map +1 -0
  138. package/dist/index.d.ts +33 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +35 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/isPromiseLike.d.ts +10 -0
  143. package/dist/isPromiseLike.d.ts.map +1 -0
  144. package/dist/isPromiseLike.js +15 -0
  145. package/dist/isPromiseLike.js.map +1 -0
  146. package/dist/pick.d.ts +22 -0
  147. package/dist/pick.d.ts.map +1 -0
  148. package/dist/pick.js +46 -0
  149. package/dist/pick.js.map +1 -0
  150. package/dist/react/index.d.ts +8 -0
  151. package/dist/react/index.d.ts.map +1 -0
  152. package/dist/react/index.js +8 -0
  153. package/dist/react/index.js.map +1 -0
  154. package/dist/react/useRx.d.ts +14 -0
  155. package/dist/react/useRx.d.ts.map +1 -0
  156. package/dist/react/useRx.js +110 -0
  157. package/dist/react/useRx.js.map +1 -0
  158. package/dist/react/useRx.test.d.ts +2 -0
  159. package/dist/react/useRx.test.d.ts.map +1 -0
  160. package/dist/react/useRx.test.js +457 -0
  161. package/dist/react/useRx.test.js.map +1 -0
  162. package/dist/strictModeTest.d.ts +11 -0
  163. package/dist/strictModeTest.d.ts.map +1 -0
  164. package/dist/strictModeTest.js +41 -0
  165. package/dist/strictModeTest.js.map +1 -0
  166. package/dist/types.d.ts +606 -0
  167. package/dist/types.d.ts.map +1 -0
  168. package/dist/types.js +5 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/untrack.d.ts +14 -0
  171. package/dist/untrack.d.ts.map +1 -0
  172. package/dist/untrack.js +17 -0
  173. package/dist/untrack.js.map +1 -0
  174. package/dist/utils/withUse.d.ts +10 -0
  175. package/dist/utils/withUse.d.ts.map +1 -0
  176. package/dist/utils/withUse.js +21 -0
  177. package/dist/utils/withUse.js.map +1 -0
  178. package/dist/utils/withUse.test.d.ts +2 -0
  179. package/dist/utils/withUse.test.d.ts.map +1 -0
  180. package/dist/utils/withUse.test.js +233 -0
  181. package/dist/utils/withUse.test.js.map +1 -0
  182. package/dist/utils.d.ts +7 -0
  183. package/dist/utils.d.ts.map +1 -0
  184. package/dist/utils.js +7 -0
  185. package/dist/utils.js.map +1 -0
  186. package/dist/utils.test.d.ts +2 -0
  187. package/dist/utils.test.d.ts.map +1 -0
  188. package/dist/utils.test.js +119 -0
  189. package/dist/utils.test.js.map +1 -0
  190. package/package.json +64 -0
@@ -0,0 +1,457 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Suspense, useState, Component } from "react";
3
+ import { describe, it, expect } from "vitest";
4
+ import { act, waitFor } from "@testing-library/react";
5
+ import { wrappers } from "../strictModeTest";
6
+ import { useRx } from "./useRx";
7
+ import { atom } from "../atom";
8
+ import { read } from "../async/read";
9
+ import { loadable } from "../async/loadable";
10
+ // Helper to create a controllable promise
11
+ function createDeferred() {
12
+ let resolve;
13
+ let reject;
14
+ const promise = new Promise((res, rej) => {
15
+ resolve = res;
16
+ reject = rej;
17
+ });
18
+ return { promise, resolve, reject };
19
+ }
20
+ // ErrorBoundary for testing
21
+ class ErrorBoundary extends Component {
22
+ state = { error: null };
23
+ static getDerivedStateFromError(error) {
24
+ return { error };
25
+ }
26
+ render() {
27
+ if (this.state.error) {
28
+ return this.props.fallback(this.state.error);
29
+ }
30
+ return this.props.children;
31
+ }
32
+ }
33
+ describe.each(wrappers)("useRx ($mode)", ({ render, renderHook }) => {
34
+ it("should return computed value from signal", () => {
35
+ const [count] = atom(42);
36
+ const { result } = renderHook(() => useRx(() => count()));
37
+ expect(result.current).toBe(42);
38
+ });
39
+ it("should re-render when signal changes", async () => {
40
+ const [count, setCount] = atom(0);
41
+ const { result } = renderHook(() => useRx(() => count()));
42
+ expect(result.current).toBe(0);
43
+ act(() => {
44
+ setCount(1);
45
+ });
46
+ await waitFor(() => {
47
+ expect(result.current).toBe(1);
48
+ });
49
+ });
50
+ it("should track multiple signals", async () => {
51
+ const [a, setA] = atom(1);
52
+ const [b, setB] = atom(2);
53
+ const { result } = renderHook(() => useRx(() => a() + b()));
54
+ expect(result.current).toBe(3);
55
+ act(() => {
56
+ setA(10);
57
+ });
58
+ await waitFor(() => {
59
+ expect(result.current).toBe(12);
60
+ });
61
+ act(() => {
62
+ setB(20);
63
+ });
64
+ await waitFor(() => {
65
+ expect(result.current).toBe(30);
66
+ });
67
+ });
68
+ it("should handle conditional signal tracking", async () => {
69
+ const [flag, setFlag] = atom(true);
70
+ const [a] = atom("A");
71
+ const [b] = atom("B");
72
+ const { result } = renderHook(() => useRx(() => (flag() ? a() : b())));
73
+ expect(result.current).toBe("A");
74
+ act(() => {
75
+ setFlag(false);
76
+ });
77
+ await waitFor(() => {
78
+ expect(result.current).toBe("B");
79
+ });
80
+ });
81
+ it("should not re-render when signal value is the same", async () => {
82
+ const [count, setCount] = atom(0);
83
+ const renderCount = { current: 0 };
84
+ renderHook(() => {
85
+ renderCount.current++;
86
+ return useRx(() => count());
87
+ });
88
+ const initialRenderCount = renderCount.current;
89
+ act(() => {
90
+ setCount(0); // Same value
91
+ });
92
+ // Wait a bit to ensure no re-render happens
93
+ await new Promise((r) => setTimeout(r, 50));
94
+ expect(renderCount.current).toBe(initialRenderCount);
95
+ });
96
+ it("should unsubscribe on unmount", async () => {
97
+ const [count, setCount] = atom(0);
98
+ const renderCount = { current: 0 };
99
+ const { unmount } = renderHook(() => {
100
+ renderCount.current++;
101
+ return useRx(() => count());
102
+ });
103
+ const countAfterMount = renderCount.current;
104
+ unmount();
105
+ act(() => {
106
+ setCount(1);
107
+ });
108
+ // Wait a bit to ensure no re-render happens
109
+ await new Promise((r) => setTimeout(r, 50));
110
+ expect(renderCount.current).toBe(countAfterMount);
111
+ });
112
+ it("should work with derived computations", async () => {
113
+ const [firstName, setFirstName] = atom("John");
114
+ const [lastName] = atom("Doe");
115
+ const { result } = renderHook(() => useRx(() => `${firstName()} ${lastName()}`));
116
+ expect(result.current).toBe("John Doe");
117
+ act(() => {
118
+ setFirstName("Jane");
119
+ });
120
+ await waitFor(() => {
121
+ expect(result.current).toBe("Jane Doe");
122
+ });
123
+ });
124
+ it("should handle signal value changing between render and commit", async () => {
125
+ const [count, setCount] = atom(0);
126
+ const { result } = renderHook(() => useRx(() => count()));
127
+ expect(result.current).toBe(0);
128
+ // Simulate value change between render and commit by changing immediately
129
+ act(() => {
130
+ setCount(5);
131
+ });
132
+ await waitFor(() => {
133
+ expect(result.current).toBe(5);
134
+ });
135
+ });
136
+ it("should render component with signal value", async () => {
137
+ const [message, setMessage] = atom("Hello");
138
+ function TestComponent() {
139
+ const msg = useRx(() => message());
140
+ return _jsx("div", { "data-testid": "message", children: msg });
141
+ }
142
+ const { container } = render(_jsx(TestComponent, {}));
143
+ expect(container.querySelector('[data-testid="message"]')?.textContent).toBe("Hello");
144
+ act(() => {
145
+ setMessage("World");
146
+ });
147
+ await waitFor(() => {
148
+ expect(container.querySelector('[data-testid="message"]')?.textContent).toBe("World");
149
+ });
150
+ });
151
+ it("should handle rapid signal updates", async () => {
152
+ const [count, setCount] = atom(0);
153
+ const { result } = renderHook(() => useRx(() => count()));
154
+ act(() => {
155
+ setCount(1);
156
+ setCount(2);
157
+ setCount(3);
158
+ });
159
+ await waitFor(() => {
160
+ expect(result.current).toBe(3);
161
+ });
162
+ });
163
+ it("should track signals accessed in nested function calls", async () => {
164
+ const [value, setValue] = atom(10);
165
+ const getDoubled = () => value() * 2;
166
+ const { result } = renderHook(() => useRx(() => getDoubled()));
167
+ expect(result.current).toBe(20);
168
+ act(() => {
169
+ setValue(5);
170
+ });
171
+ await waitFor(() => {
172
+ expect(result.current).toBe(10);
173
+ });
174
+ });
175
+ it("should handle object values with reference equality", async () => {
176
+ const obj1 = { id: 1 };
177
+ const obj2 = { id: 1 }; // Same content, different reference
178
+ const [obj, setObj] = atom(obj1);
179
+ const renderCount = { current: 0 };
180
+ const { result } = renderHook(() => {
181
+ renderCount.current++;
182
+ return useRx(() => obj());
183
+ });
184
+ expect(result.current).toBe(obj1);
185
+ const countAfterMount = renderCount.current;
186
+ act(() => {
187
+ setObj(obj2); // Different reference
188
+ });
189
+ await waitFor(() => {
190
+ expect(result.current).toBe(obj2);
191
+ });
192
+ expect(renderCount.current).toBeGreaterThan(countAfterMount);
193
+ });
194
+ it("should handle switching between signals", async () => {
195
+ const [flag, setFlag] = atom(true);
196
+ const [a, setA] = atom("A");
197
+ const [b, setB] = atom("B");
198
+ const { result } = renderHook(() => useRx(() => (flag() ? a() : b())));
199
+ expect(result.current).toBe("A");
200
+ // Update a - should trigger re-render
201
+ act(() => {
202
+ setA("A2");
203
+ });
204
+ await waitFor(() => {
205
+ expect(result.current).toBe("A2");
206
+ });
207
+ // Switch to b
208
+ act(() => {
209
+ setFlag(false);
210
+ });
211
+ await waitFor(() => {
212
+ expect(result.current).toBe("B");
213
+ });
214
+ // Now update b - should trigger re-render
215
+ act(() => {
216
+ setB("B2");
217
+ });
218
+ await waitFor(() => {
219
+ expect(result.current).toBe("B2");
220
+ });
221
+ });
222
+ // ==========================================================================
223
+ // Suspense Tests
224
+ // ==========================================================================
225
+ it("should suspend and show fallback while loading", async () => {
226
+ const deferred = createDeferred();
227
+ const [asyncSignal] = atom(deferred.promise);
228
+ function AsyncComponent() {
229
+ const value = useRx(() => read(asyncSignal));
230
+ return _jsx("div", { "data-testid": "content", children: value });
231
+ }
232
+ const { container } = render(_jsx(Suspense, { fallback: _jsx("div", { "data-testid": "loading", children: "Loading..." }), children: _jsx(AsyncComponent, {}) }));
233
+ // Should show loading fallback
234
+ expect(container.querySelector('[data-testid="loading"]')?.textContent).toBe("Loading...");
235
+ expect(container.querySelector('[data-testid="content"]')).toBeNull();
236
+ // Resolve the promise
237
+ await act(async () => {
238
+ deferred.resolve("Hello Async!");
239
+ await deferred.promise;
240
+ });
241
+ // Should show content
242
+ await waitFor(() => {
243
+ expect(container.querySelector('[data-testid="content"]')?.textContent).toBe("Hello Async!");
244
+ });
245
+ });
246
+ it("should preserve sibling state when Suspense resolves", async () => {
247
+ const deferred = createDeferred();
248
+ const [asyncSignal] = atom(deferred.promise);
249
+ function AsyncComponent() {
250
+ const value = useRx(() => read(asyncSignal));
251
+ return _jsx("div", { "data-testid": "async-content", children: value });
252
+ }
253
+ // Component with local state that should be preserved
254
+ function StatefulSibling() {
255
+ const [count, setCount] = useState(0);
256
+ return (_jsxs("div", { children: [_jsx("span", { "data-testid": "count", children: count }), _jsx("button", { "data-testid": "increment", onClick: () => setCount((c) => c + 1), children: "+" })] }));
257
+ }
258
+ const { container } = render(_jsxs("div", { children: [_jsx(StatefulSibling, {}), _jsx(Suspense, { fallback: _jsx("div", { "data-testid": "loading", children: "Loading..." }), children: _jsx(AsyncComponent, {}) })] }));
259
+ // Increment the counter while loading
260
+ const button = container.querySelector('[data-testid="increment"]');
261
+ act(() => {
262
+ button.click();
263
+ button.click();
264
+ });
265
+ expect(container.querySelector('[data-testid="count"]')?.textContent).toBe("2");
266
+ // Resolve the promise
267
+ await act(async () => {
268
+ deferred.resolve("Loaded!");
269
+ await deferred.promise;
270
+ });
271
+ // Content should show
272
+ await waitFor(() => {
273
+ expect(container.querySelector('[data-testid="async-content"]')?.textContent).toBe("Loaded!");
274
+ });
275
+ // State should still be preserved after suspense resolves
276
+ expect(container.querySelector('[data-testid="count"]')?.textContent).toBe("2");
277
+ // Can still interact with sibling after resolve
278
+ act(() => {
279
+ button.click();
280
+ });
281
+ expect(container.querySelector('[data-testid="count"]')?.textContent).toBe("3");
282
+ });
283
+ it("should preserve state inside Suspense boundary after resolve", async () => {
284
+ const deferred = createDeferred();
285
+ const [asyncSignal] = atom(deferred.promise);
286
+ const [syncSignal, setSyncSignal] = atom("initial");
287
+ function AsyncComponentWithState() {
288
+ const asyncValue = useRx(() => read(asyncSignal));
289
+ const syncValue = useRx(() => syncSignal());
290
+ const [localCount, setLocalCount] = useState(0);
291
+ return (_jsxs("div", { children: [_jsx("span", { "data-testid": "async", children: asyncValue }), _jsx("span", { "data-testid": "sync", children: syncValue }), _jsx("span", { "data-testid": "local", children: localCount }), _jsx("button", { "data-testid": "inc-local", onClick: () => setLocalCount((c) => c + 1), children: "+" })] }));
292
+ }
293
+ const { container } = render(_jsx(Suspense, { fallback: _jsx("div", { "data-testid": "loading", children: "Loading..." }), children: _jsx(AsyncComponentWithState, {}) }));
294
+ // Should be loading
295
+ expect(container.querySelector('[data-testid="loading"]')).not.toBeNull();
296
+ // Resolve
297
+ await act(async () => {
298
+ deferred.resolve("async-data");
299
+ await deferred.promise;
300
+ });
301
+ await waitFor(() => {
302
+ expect(container.querySelector('[data-testid="async"]')?.textContent).toBe("async-data");
303
+ });
304
+ // Increment local state
305
+ const button = container.querySelector('[data-testid="inc-local"]');
306
+ act(() => {
307
+ button.click();
308
+ button.click();
309
+ button.click();
310
+ });
311
+ expect(container.querySelector('[data-testid="local"]')?.textContent).toBe("3");
312
+ // Update sync signal - should NOT cause suspend, just re-render
313
+ act(() => {
314
+ setSyncSignal("updated");
315
+ });
316
+ await waitFor(() => {
317
+ expect(container.querySelector('[data-testid="sync"]')?.textContent).toBe("updated");
318
+ });
319
+ // Local state should be preserved
320
+ expect(container.querySelector('[data-testid="local"]')?.textContent).toBe("3");
321
+ });
322
+ // ==========================================================================
323
+ // ErrorBoundary Tests
324
+ // ==========================================================================
325
+ it("should catch errors thrown during render in ErrorBoundary", async () => {
326
+ const [shouldError, setShouldError] = atom(false);
327
+ function ErrorComponent() {
328
+ const error = useRx(() => {
329
+ if (shouldError()) {
330
+ throw new Error("Test error!");
331
+ }
332
+ return "No error";
333
+ });
334
+ return _jsx("div", { "data-testid": "content", children: error });
335
+ }
336
+ const { container } = render(_jsx(ErrorBoundary, { fallback: (error) => (_jsxs("div", { "data-testid": "error", children: ["Error: ", error.message] })), children: _jsx(ErrorComponent, {}) }));
337
+ // Should show content initially
338
+ expect(container.querySelector('[data-testid="content"]')?.textContent).toBe("No error");
339
+ // Trigger error
340
+ act(() => {
341
+ setShouldError(true);
342
+ });
343
+ // Should show error boundary
344
+ await waitFor(() => {
345
+ expect(container.querySelector('[data-testid="error"]')?.textContent).toBe("Error: Test error!");
346
+ });
347
+ });
348
+ it("should catch rejected promise errors in ErrorBoundary", async () => {
349
+ const deferred = createDeferred();
350
+ const [asyncSignal] = atom(deferred.promise);
351
+ function AsyncComponent() {
352
+ const value = useRx(() => read(asyncSignal));
353
+ return _jsx("div", { "data-testid": "content", children: value });
354
+ }
355
+ const { container } = render(_jsx(ErrorBoundary, { fallback: (error) => (_jsxs("div", { "data-testid": "error", children: ["Error: ", error.message] })), children: _jsx(Suspense, { fallback: _jsx("div", { "data-testid": "loading", children: "Loading..." }), children: _jsx(AsyncComponent, {}) }) }));
356
+ // Should show loading
357
+ expect(container.querySelector('[data-testid="loading"]')).not.toBeNull();
358
+ // Reject the promise
359
+ await act(async () => {
360
+ deferred.reject(new Error("Async failure!"));
361
+ try {
362
+ await deferred.promise;
363
+ }
364
+ catch {
365
+ // Expected
366
+ }
367
+ });
368
+ // Should show error boundary
369
+ await waitFor(() => {
370
+ expect(container.querySelector('[data-testid="error"]')?.textContent).toBe("Error: Async failure!");
371
+ });
372
+ });
373
+ it("should preserve sibling state when error is caught", async () => {
374
+ const [shouldError, setShouldError] = atom(false);
375
+ function ErrorComponent() {
376
+ useRx(() => {
377
+ if (shouldError()) {
378
+ throw new Error("Boom!");
379
+ }
380
+ return null;
381
+ });
382
+ return _jsx("div", { "data-testid": "risky", children: "OK" });
383
+ }
384
+ function StatefulSibling() {
385
+ const [count, setCount] = useState(0);
386
+ return (_jsxs("div", { children: [_jsx("span", { "data-testid": "count", children: count }), _jsx("button", { "data-testid": "increment", onClick: () => setCount((c) => c + 1), children: "+" })] }));
387
+ }
388
+ const { container } = render(_jsxs("div", { children: [_jsx(StatefulSibling, {}), _jsx(ErrorBoundary, { fallback: (error) => _jsx("div", { "data-testid": "error", children: error.message }), children: _jsx(ErrorComponent, {}) })] }));
389
+ // Increment sibling state
390
+ const button = container.querySelector('[data-testid="increment"]');
391
+ act(() => {
392
+ button.click();
393
+ button.click();
394
+ });
395
+ expect(container.querySelector('[data-testid="count"]')?.textContent).toBe("2");
396
+ expect(container.querySelector('[data-testid="risky"]')?.textContent).toBe("OK");
397
+ // Trigger error
398
+ act(() => {
399
+ setShouldError(true);
400
+ });
401
+ // Error should be caught
402
+ await waitFor(() => {
403
+ expect(container.querySelector('[data-testid="error"]')?.textContent).toBe("Boom!");
404
+ });
405
+ // Sibling state should be preserved
406
+ expect(container.querySelector('[data-testid="count"]')?.textContent).toBe("2");
407
+ });
408
+ it("should re-render when signal value changes between render and commit", async () => {
409
+ const [count, setCount] = atom(0);
410
+ let renderCount = 0;
411
+ function TestComponent() {
412
+ renderCount++;
413
+ const value = useRx(() => count());
414
+ return _jsx("div", { "data-testid": "value", children: value });
415
+ }
416
+ const { container } = render(_jsx(TestComponent, {}));
417
+ const initialRenderCount = renderCount;
418
+ expect(container.querySelector('[data-testid="value"]')?.textContent).toBe("0");
419
+ // Update signal - this simulates value changing between render and commit
420
+ act(() => {
421
+ setCount(5);
422
+ });
423
+ // Should re-render with new value
424
+ await waitFor(() => {
425
+ expect(container.querySelector('[data-testid="value"]')?.textContent).toBe("5");
426
+ });
427
+ expect(renderCount).toBeGreaterThan(initialRenderCount);
428
+ });
429
+ it("should call onCleanup for tracked signals when unmounting", async () => {
430
+ // This tests that useRx properly calls the onCleanup callback
431
+ // which is needed for loadable() to properly dispose its internal atom (lines 42-43)
432
+ const deferred = createDeferred();
433
+ const [asyncSignal] = atom(deferred.promise);
434
+ let loadableCallCount = 0;
435
+ function AsyncComponent() {
436
+ const state = useRx(() => {
437
+ loadableCallCount++;
438
+ return loadable(asyncSignal);
439
+ });
440
+ return (_jsx("div", { "data-testid": "loading", children: state?.loading ? "loading" : "done" }));
441
+ }
442
+ const { container, unmount } = render(_jsx(AsyncComponent, {}));
443
+ // Should be loading
444
+ expect(container.querySelector('[data-testid="loading"]')?.textContent).toBe("loading");
445
+ const callCountBeforeUnmount = loadableCallCount;
446
+ // Unmount the component - this should trigger cleanup which calls onCleanup
447
+ // In loadable.ts, this triggers lines 42-43: disposed = true; dispose();
448
+ unmount();
449
+ // Resolve the promise after unmount
450
+ deferred.resolve("done");
451
+ await new Promise((r) => setTimeout(r, 20));
452
+ // loadable should NOT have been called again after unmount
453
+ // because the cleanup properly disposed the tracking
454
+ expect(loadableCallCount).toBe(callCountBeforeUnmount);
455
+ });
456
+ });
457
+ //# sourceMappingURL=useRx.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRx.test.js","sourceRoot":"","sources":["../../src/react/useRx.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { render, renderHook, RenderHookOptions } from "@testing-library/react";
3
+ export declare const wrappers: {
4
+ mode: "normal" | "strict";
5
+ Wrapper: React.FC<{
6
+ children: React.ReactNode;
7
+ }>;
8
+ render: (ui: React.ReactElement) => ReturnType<typeof render>;
9
+ renderHook: <TResult, TProps>(render: (props: TProps) => TResult, options?: RenderHookOptions<TProps>) => ReturnType<typeof renderHook<TResult, TProps>>;
10
+ }[];
11
+ //# sourceMappingURL=strictModeTest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strictModeTest.d.ts","sourceRoot":"","sources":["../src/strictModeTest.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA6B/E,eAAO,MAAM,QAAQ,EAAE;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,KAAK,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;IAC9D,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EAClC,OAAO,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAChC,UAAU,CAAC,OAAO,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,EA+BA,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { StrictMode } from "react";
3
+ import { render, renderHook } from "@testing-library/react";
4
+ const DefaultWrapper = ({ children }) => _jsx(_Fragment, { children: children });
5
+ /**
6
+ * Composes two React wrapper components.
7
+ * OuterWrapper wraps InnerWrapper which wraps children.
8
+ */
9
+ function composeWrappers(OuterWrapper, InnerWrapper) {
10
+ if (!InnerWrapper) {
11
+ return OuterWrapper;
12
+ }
13
+ return function ComposedWrapper({ children }) {
14
+ return (_jsx(OuterWrapper, { children: _jsx(InnerWrapper, { children: children }) }));
15
+ };
16
+ }
17
+ const StrictModeWrapper = ({ children }) => (_jsx(StrictMode, { children: children }));
18
+ export const wrappers = [
19
+ {
20
+ mode: "normal",
21
+ Wrapper: DefaultWrapper,
22
+ render: (ui) => {
23
+ return render(ui, { wrapper: DefaultWrapper });
24
+ },
25
+ renderHook: (callback, options) => {
26
+ return renderHook(callback, options);
27
+ },
28
+ },
29
+ {
30
+ mode: "strict",
31
+ Wrapper: StrictModeWrapper,
32
+ render: (ui) => {
33
+ return render(ui, { wrapper: StrictModeWrapper });
34
+ },
35
+ renderHook: (callback, options) => {
36
+ const composedWrapper = composeWrappers(StrictModeWrapper, options?.wrapper);
37
+ return renderHook(callback, { ...options, wrapper: composedWrapper });
38
+ },
39
+ },
40
+ ];
41
+ //# sourceMappingURL=strictModeTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strictModeTest.js","sourceRoot":"","sources":["../src/strictModeTest.tsx"],"names":[],"mappings":";AACA,OAAO,EAAqB,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAqB,MAAM,wBAAwB,CAAC;AAE/E,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAqB,EAAE,EAAE,CAAC,4BAAG,QAAQ,GAAI,CAAC;AAE5E;;;GAGG;AACH,SAAS,eAAe,CACtB,YAAgE,EAChE,YAAiE;IAEjE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,SAAS,eAAe,CAAC,EAAE,QAAQ,EAAiC;QACzE,OAAO,CACL,KAAC,YAAY,cACX,KAAC,YAAY,cAAE,QAAQ,GAAgB,GAC1B,CAChB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAAqB,EAAE,EAAE,CAAC,CAC7D,KAAC,UAAU,cAAE,QAAQ,GAAc,CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAQf;IACJ;QACE,IAAI,EAAE,QAAiB;QACvB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,CAAC,EAAsB,EAAE,EAAE;YACjC,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,UAAU,EAAE,CACV,QAAoC,EACpC,OAAmC,EACnC,EAAE;YACF,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;KACF;IACD;QACE,IAAI,EAAE,QAAiB;QACvB,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,CAAC,EAAsB,EAAE,EAAE;YACjC,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,UAAU,EAAE,CACV,QAAoC,EACpC,OAAmC,EACnC,EAAE;YACF,MAAM,eAAe,GAAG,eAAe,CACrC,iBAAiB,EACjB,OAAO,EAAE,OAAO,CACjB,CAAC;YACF,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QACxE,CAAC;KACF;CACF,CAAC"}