rask-ui 0.28.2 → 0.28.4
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/dist/component.d.ts +1 -0
- package/dist/component.d.ts.map +1 -1
- package/dist/component.js +7 -2
- package/dist/tests/batch.test.js +202 -12
- package/dist/tests/createContext.test.js +50 -37
- package/dist/tests/error.test.js +25 -12
- package/dist/tests/renderCount.test.d.ts +2 -0
- package/dist/tests/renderCount.test.d.ts.map +1 -0
- package/dist/tests/renderCount.test.js +95 -0
- package/dist/tests/scopeEnforcement.test.d.ts +2 -0
- package/dist/tests/scopeEnforcement.test.d.ts.map +1 -0
- package/dist/tests/scopeEnforcement.test.js +157 -0
- package/dist/tests/useAction.test.d.ts +2 -0
- package/dist/tests/useAction.test.d.ts.map +1 -0
- package/dist/tests/useAction.test.js +132 -0
- package/dist/tests/useAsync.test.d.ts +2 -0
- package/dist/tests/useAsync.test.d.ts.map +1 -0
- package/dist/tests/useAsync.test.js +499 -0
- package/dist/tests/useDerived.test.d.ts +2 -0
- package/dist/tests/useDerived.test.d.ts.map +1 -0
- package/dist/tests/useDerived.test.js +407 -0
- package/dist/tests/useEffect.test.d.ts +2 -0
- package/dist/tests/useEffect.test.d.ts.map +1 -0
- package/dist/tests/useEffect.test.js +600 -0
- package/dist/tests/useLookup.test.d.ts +2 -0
- package/dist/tests/useLookup.test.d.ts.map +1 -0
- package/dist/tests/useLookup.test.js +299 -0
- package/dist/tests/useRef.test.d.ts +2 -0
- package/dist/tests/useRef.test.d.ts.map +1 -0
- package/dist/tests/useRef.test.js +189 -0
- package/dist/tests/useState.test.d.ts +2 -0
- package/dist/tests/useState.test.d.ts.map +1 -0
- package/dist/tests/useState.test.js +178 -0
- package/dist/tests/useSuspend.test.d.ts +2 -0
- package/dist/tests/useSuspend.test.d.ts.map +1 -0
- package/dist/tests/useSuspend.test.js +752 -0
- package/dist/tests/useView.test.d.ts +2 -0
- package/dist/tests/useView.test.d.ts.map +1 -0
- package/dist/tests/useView.test.js +305 -0
- package/dist/transformer.d.ts.map +1 -1
- package/dist/transformer.js +1 -5
- package/dist/useState.js +4 -2
- package/package.json +1 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { jsx as _jsx } from "rask-ui/jsx-runtime";
|
|
2
|
+
import { describe, it, expect, vi } from "vitest";
|
|
3
|
+
import { useDerived } from "../useDerived";
|
|
4
|
+
import { useState } from "../useState";
|
|
5
|
+
import { Observer } from "../observation";
|
|
6
|
+
import { render } from "../index";
|
|
7
|
+
describe("useDerived", () => {
|
|
8
|
+
it("should compute values lazily", () => {
|
|
9
|
+
const computeFn = vi.fn();
|
|
10
|
+
let computed;
|
|
11
|
+
function Component() {
|
|
12
|
+
const state = useState({ count: 5 });
|
|
13
|
+
computeFn.mockImplementation(() => state.count * 2);
|
|
14
|
+
computed = useDerived({
|
|
15
|
+
doubled: computeFn,
|
|
16
|
+
});
|
|
17
|
+
return () => _jsx("div", { children: "test" });
|
|
18
|
+
}
|
|
19
|
+
const container = document.createElement("div");
|
|
20
|
+
render(_jsx(Component, {}), container);
|
|
21
|
+
// Should not compute until accessed
|
|
22
|
+
expect(computeFn).not.toHaveBeenCalled();
|
|
23
|
+
const result = computed.doubled;
|
|
24
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
25
|
+
expect(result).toBe(10);
|
|
26
|
+
});
|
|
27
|
+
it("should cache computed values", () => {
|
|
28
|
+
const computeFn = vi.fn();
|
|
29
|
+
let computed;
|
|
30
|
+
function Component() {
|
|
31
|
+
const state = useState({ count: 5 });
|
|
32
|
+
computeFn.mockImplementation(() => state.count * 2);
|
|
33
|
+
computed = useDerived({
|
|
34
|
+
doubled: computeFn,
|
|
35
|
+
});
|
|
36
|
+
return () => _jsx("div", { children: "test" });
|
|
37
|
+
}
|
|
38
|
+
const container = document.createElement("div");
|
|
39
|
+
render(_jsx(Component, {}), container);
|
|
40
|
+
// Access multiple times
|
|
41
|
+
computed.doubled;
|
|
42
|
+
computed.doubled;
|
|
43
|
+
computed.doubled;
|
|
44
|
+
// Should only compute once due to caching
|
|
45
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
46
|
+
});
|
|
47
|
+
it("should invalidate cache when dependencies change", async () => {
|
|
48
|
+
const computeFn = vi.fn();
|
|
49
|
+
let state;
|
|
50
|
+
let computed;
|
|
51
|
+
function Component() {
|
|
52
|
+
state = useState({ count: 5 });
|
|
53
|
+
computeFn.mockImplementation(() => state.count * 2);
|
|
54
|
+
computed = useDerived({
|
|
55
|
+
doubled: computeFn,
|
|
56
|
+
});
|
|
57
|
+
return () => _jsx("div", { children: "test" });
|
|
58
|
+
}
|
|
59
|
+
const container = document.createElement("div");
|
|
60
|
+
render(_jsx(Component, {}), container);
|
|
61
|
+
expect(computed.doubled).toBe(10);
|
|
62
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
63
|
+
// Change dependency
|
|
64
|
+
state.count = 10;
|
|
65
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
66
|
+
// Should recompute on next access
|
|
67
|
+
expect(computed.doubled).toBe(20);
|
|
68
|
+
expect(computeFn).toHaveBeenCalledTimes(2);
|
|
69
|
+
});
|
|
70
|
+
it("should handle multiple computed properties", async () => {
|
|
71
|
+
let state;
|
|
72
|
+
let computed;
|
|
73
|
+
function Component() {
|
|
74
|
+
state = useState({ width: 10, height: 5 });
|
|
75
|
+
computed = useDerived({
|
|
76
|
+
area: () => state.width * state.height,
|
|
77
|
+
perimeter: () => 2 * (state.width + state.height),
|
|
78
|
+
});
|
|
79
|
+
return () => _jsx("div", { children: "test" });
|
|
80
|
+
}
|
|
81
|
+
const container = document.createElement("div");
|
|
82
|
+
render(_jsx(Component, {}), container);
|
|
83
|
+
expect(computed.area).toBe(50);
|
|
84
|
+
expect(computed.perimeter).toBe(30);
|
|
85
|
+
state.width = 20;
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
87
|
+
expect(computed.area).toBe(100);
|
|
88
|
+
expect(computed.perimeter).toBe(50);
|
|
89
|
+
});
|
|
90
|
+
it("should support computed properties depending on other computed properties", async () => {
|
|
91
|
+
let state;
|
|
92
|
+
let computed;
|
|
93
|
+
function Component() {
|
|
94
|
+
state = useState({ count: 5 });
|
|
95
|
+
computed = useDerived({
|
|
96
|
+
doubled: () => state.count * 2,
|
|
97
|
+
quadrupled: () => computed.doubled * 2,
|
|
98
|
+
});
|
|
99
|
+
return () => _jsx("div", { children: "test" });
|
|
100
|
+
}
|
|
101
|
+
const container = document.createElement("div");
|
|
102
|
+
render(_jsx(Component, {}), container);
|
|
103
|
+
expect(computed.doubled).toBe(10);
|
|
104
|
+
expect(computed.quadrupled).toBe(20);
|
|
105
|
+
state.count = 10;
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
107
|
+
expect(computed.doubled).toBe(20);
|
|
108
|
+
expect(computed.quadrupled).toBe(40);
|
|
109
|
+
});
|
|
110
|
+
it("should be reactive when observed", async () => {
|
|
111
|
+
let state;
|
|
112
|
+
let computed;
|
|
113
|
+
function Component() {
|
|
114
|
+
state = useState({ count: 5 });
|
|
115
|
+
computed = useDerived({
|
|
116
|
+
doubled: () => state.count * 2,
|
|
117
|
+
});
|
|
118
|
+
return () => _jsx("div", { children: "test" });
|
|
119
|
+
}
|
|
120
|
+
const container = document.createElement("div");
|
|
121
|
+
render(_jsx(Component, {}), container);
|
|
122
|
+
let observedValue = null;
|
|
123
|
+
const observer = new Observer(() => {
|
|
124
|
+
observedValue = computed.doubled;
|
|
125
|
+
});
|
|
126
|
+
const dispose = observer.observe();
|
|
127
|
+
computed.doubled; // Track the computed
|
|
128
|
+
dispose();
|
|
129
|
+
expect(observedValue).toBe(null);
|
|
130
|
+
// Change state
|
|
131
|
+
state.count = 10;
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
133
|
+
expect(observedValue).toBe(20);
|
|
134
|
+
observer.dispose();
|
|
135
|
+
});
|
|
136
|
+
it("should only recompute when actual dependencies change", () => {
|
|
137
|
+
const computeFn = vi.fn();
|
|
138
|
+
let state;
|
|
139
|
+
let computed;
|
|
140
|
+
function Component() {
|
|
141
|
+
state = useState({ a: 1, b: 2 });
|
|
142
|
+
computeFn.mockImplementation(() => state.a * 2);
|
|
143
|
+
computed = useDerived({
|
|
144
|
+
result: computeFn,
|
|
145
|
+
});
|
|
146
|
+
return () => _jsx("div", { children: "test" });
|
|
147
|
+
}
|
|
148
|
+
const container = document.createElement("div");
|
|
149
|
+
render(_jsx(Component, {}), container);
|
|
150
|
+
expect(computed.result).toBe(2);
|
|
151
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
152
|
+
// Change unrelated property
|
|
153
|
+
state.b = 100;
|
|
154
|
+
// Should still return cached value
|
|
155
|
+
expect(computed.result).toBe(2);
|
|
156
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
157
|
+
});
|
|
158
|
+
it("should handle complex dependency chains", async () => {
|
|
159
|
+
let state;
|
|
160
|
+
let computed;
|
|
161
|
+
function Component() {
|
|
162
|
+
state = useState({
|
|
163
|
+
items: [1, 2, 3, 4, 5],
|
|
164
|
+
multiplier: 2,
|
|
165
|
+
});
|
|
166
|
+
computed = useDerived({
|
|
167
|
+
total: () => state.items.reduce((sum, item) => sum + item, 0),
|
|
168
|
+
multipliedTotal: () => computed.total * state.multiplier,
|
|
169
|
+
average: () => computed.total / state.items.length,
|
|
170
|
+
});
|
|
171
|
+
return () => _jsx("div", { children: "test" });
|
|
172
|
+
}
|
|
173
|
+
const container = document.createElement("div");
|
|
174
|
+
render(_jsx(Component, {}), container);
|
|
175
|
+
expect(computed.total).toBe(15);
|
|
176
|
+
expect(computed.multipliedTotal).toBe(30);
|
|
177
|
+
expect(computed.average).toBe(3);
|
|
178
|
+
state.items.push(6);
|
|
179
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
180
|
+
expect(computed.total).toBe(21);
|
|
181
|
+
expect(computed.multipliedTotal).toBe(42);
|
|
182
|
+
expect(computed.average).toBe(3.5);
|
|
183
|
+
state.multiplier = 3;
|
|
184
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
185
|
+
expect(computed.multipliedTotal).toBe(63);
|
|
186
|
+
});
|
|
187
|
+
it("should handle array operations", async () => {
|
|
188
|
+
let state;
|
|
189
|
+
let computed;
|
|
190
|
+
function Component() {
|
|
191
|
+
state = useState({ items: [1, 2, 3] });
|
|
192
|
+
computed = useDerived({
|
|
193
|
+
sum: () => state.items.reduce((sum, item) => sum + item, 0),
|
|
194
|
+
count: () => state.items.length,
|
|
195
|
+
});
|
|
196
|
+
return () => _jsx("div", { children: "test" });
|
|
197
|
+
}
|
|
198
|
+
const container = document.createElement("div");
|
|
199
|
+
render(_jsx(Component, {}), container);
|
|
200
|
+
expect(computed.sum).toBe(6);
|
|
201
|
+
expect(computed.count).toBe(3);
|
|
202
|
+
state.items.push(4);
|
|
203
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
204
|
+
expect(computed.sum).toBe(10);
|
|
205
|
+
expect(computed.count).toBe(4);
|
|
206
|
+
state.items.pop();
|
|
207
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
208
|
+
expect(computed.sum).toBe(6);
|
|
209
|
+
expect(computed.count).toBe(3);
|
|
210
|
+
});
|
|
211
|
+
it("should handle deeply nested state", async () => {
|
|
212
|
+
let state;
|
|
213
|
+
let computed;
|
|
214
|
+
function Component() {
|
|
215
|
+
state = useState({
|
|
216
|
+
user: {
|
|
217
|
+
profile: {
|
|
218
|
+
name: "Alice",
|
|
219
|
+
age: 30,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
computed = useDerived({
|
|
224
|
+
displayName: () => `${state.user.profile.name} (${state.user.profile.age})`,
|
|
225
|
+
});
|
|
226
|
+
return () => _jsx("div", { children: "test" });
|
|
227
|
+
}
|
|
228
|
+
const container = document.createElement("div");
|
|
229
|
+
render(_jsx(Component, {}), container);
|
|
230
|
+
expect(computed.displayName).toBe("Alice (30)");
|
|
231
|
+
state.user.profile.name = "Bob";
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
233
|
+
expect(computed.displayName).toBe("Bob (30)");
|
|
234
|
+
state.user.profile.age = 25;
|
|
235
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
236
|
+
expect(computed.displayName).toBe("Bob (25)");
|
|
237
|
+
});
|
|
238
|
+
it("should not recompute unnecessarily with nested computed", async () => {
|
|
239
|
+
const innerFn = vi.fn();
|
|
240
|
+
const outerFn = vi.fn();
|
|
241
|
+
let state;
|
|
242
|
+
let computed;
|
|
243
|
+
function Component() {
|
|
244
|
+
state = useState({ count: 5 });
|
|
245
|
+
innerFn.mockImplementation(() => state.count * 2);
|
|
246
|
+
outerFn.mockImplementation(() => computed.inner + 10);
|
|
247
|
+
computed = useDerived({
|
|
248
|
+
inner: innerFn,
|
|
249
|
+
outer: outerFn,
|
|
250
|
+
});
|
|
251
|
+
return () => _jsx("div", { children: "test" });
|
|
252
|
+
}
|
|
253
|
+
const container = document.createElement("div");
|
|
254
|
+
render(_jsx(Component, {}), container);
|
|
255
|
+
// Access outer (should compute both)
|
|
256
|
+
expect(computed.outer).toBe(20);
|
|
257
|
+
expect(innerFn).toHaveBeenCalledTimes(1);
|
|
258
|
+
expect(outerFn).toHaveBeenCalledTimes(1);
|
|
259
|
+
// Access outer again (should use cache)
|
|
260
|
+
expect(computed.outer).toBe(20);
|
|
261
|
+
expect(innerFn).toHaveBeenCalledTimes(1);
|
|
262
|
+
expect(outerFn).toHaveBeenCalledTimes(1);
|
|
263
|
+
// Change state
|
|
264
|
+
state.count = 10;
|
|
265
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
266
|
+
// Access outer (should recompute both)
|
|
267
|
+
expect(computed.outer).toBe(30);
|
|
268
|
+
expect(innerFn).toHaveBeenCalledTimes(2);
|
|
269
|
+
expect(outerFn).toHaveBeenCalledTimes(2);
|
|
270
|
+
});
|
|
271
|
+
it("should handle conditional dependencies", async () => {
|
|
272
|
+
const computeFn = vi.fn();
|
|
273
|
+
let state;
|
|
274
|
+
let computed;
|
|
275
|
+
function Component() {
|
|
276
|
+
state = useState({ useA: true, a: 10, b: 20 });
|
|
277
|
+
computeFn.mockImplementation(() => (state.useA ? state.a : state.b));
|
|
278
|
+
computed = useDerived({
|
|
279
|
+
value: computeFn,
|
|
280
|
+
});
|
|
281
|
+
return () => _jsx("div", { children: "test" });
|
|
282
|
+
}
|
|
283
|
+
const container = document.createElement("div");
|
|
284
|
+
render(_jsx(Component, {}), container);
|
|
285
|
+
expect(computed.value).toBe(10);
|
|
286
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
287
|
+
// Change b (not currently tracked)
|
|
288
|
+
state.b = 30;
|
|
289
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
290
|
+
expect(computed.value).toBe(10); // Should not recompute
|
|
291
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
292
|
+
// Change a (currently tracked)
|
|
293
|
+
state.a = 15;
|
|
294
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
295
|
+
expect(computed.value).toBe(15); // Should recompute
|
|
296
|
+
expect(computeFn).toHaveBeenCalledTimes(2);
|
|
297
|
+
// Switch to using b
|
|
298
|
+
state.useA = false;
|
|
299
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
300
|
+
expect(computed.value).toBe(30); // Should recompute and now track b
|
|
301
|
+
expect(computeFn).toHaveBeenCalledTimes(3);
|
|
302
|
+
// Change a (no longer tracked)
|
|
303
|
+
state.a = 100;
|
|
304
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
305
|
+
expect(computed.value).toBe(30); // Should not recompute
|
|
306
|
+
expect(computeFn).toHaveBeenCalledTimes(3);
|
|
307
|
+
// Change b (now tracked)
|
|
308
|
+
state.b = 40;
|
|
309
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
310
|
+
expect(computed.value).toBe(40); // Should recompute
|
|
311
|
+
expect(computeFn).toHaveBeenCalledTimes(4);
|
|
312
|
+
});
|
|
313
|
+
it("should return consistent values during same synchronous execution", () => {
|
|
314
|
+
let state;
|
|
315
|
+
let computed;
|
|
316
|
+
function Component() {
|
|
317
|
+
state = useState({ count: 5 });
|
|
318
|
+
computed = useDerived({
|
|
319
|
+
doubled: () => state.count * 2,
|
|
320
|
+
});
|
|
321
|
+
return () => _jsx("div", { children: "test" });
|
|
322
|
+
}
|
|
323
|
+
const container = document.createElement("div");
|
|
324
|
+
render(_jsx(Component, {}), container);
|
|
325
|
+
const first = computed.doubled;
|
|
326
|
+
const second = computed.doubled;
|
|
327
|
+
const third = computed.doubled;
|
|
328
|
+
expect(first).toBe(10);
|
|
329
|
+
expect(second).toBe(10);
|
|
330
|
+
expect(third).toBe(10);
|
|
331
|
+
});
|
|
332
|
+
it("should handle empty computed object", () => {
|
|
333
|
+
let computed;
|
|
334
|
+
function Component() {
|
|
335
|
+
computed = useDerived({});
|
|
336
|
+
return () => _jsx("div", { children: "test" });
|
|
337
|
+
}
|
|
338
|
+
const container = document.createElement("div");
|
|
339
|
+
render(_jsx(Component, {}), container);
|
|
340
|
+
expect(Object.keys(computed).length).toBe(0);
|
|
341
|
+
});
|
|
342
|
+
it("should properly track changes in computed used by observers", async () => {
|
|
343
|
+
let state;
|
|
344
|
+
let computed;
|
|
345
|
+
function Component() {
|
|
346
|
+
state = useState({ x: 1, y: 2 });
|
|
347
|
+
computed = useDerived({
|
|
348
|
+
sum: () => state.x + state.y,
|
|
349
|
+
});
|
|
350
|
+
return () => _jsx("div", { children: "test" });
|
|
351
|
+
}
|
|
352
|
+
const container = document.createElement("div");
|
|
353
|
+
render(_jsx(Component, {}), container);
|
|
354
|
+
const results = [];
|
|
355
|
+
const observer = new Observer(() => {
|
|
356
|
+
results.push(computed.sum);
|
|
357
|
+
});
|
|
358
|
+
const dispose = observer.observe();
|
|
359
|
+
computed.sum; // Track
|
|
360
|
+
dispose();
|
|
361
|
+
state.x = 10;
|
|
362
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
363
|
+
state.y = 20;
|
|
364
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
365
|
+
expect(results).toEqual([12, 30]);
|
|
366
|
+
observer.dispose();
|
|
367
|
+
});
|
|
368
|
+
it("should recompute when parent props change", async () => {
|
|
369
|
+
let parentState;
|
|
370
|
+
let childComputed;
|
|
371
|
+
let computeFn = vi.fn();
|
|
372
|
+
let renderCount = 0;
|
|
373
|
+
function Child(props) {
|
|
374
|
+
computeFn.mockImplementation(() => props.filter || "all");
|
|
375
|
+
childComputed = useDerived({
|
|
376
|
+
currentFilter: computeFn,
|
|
377
|
+
});
|
|
378
|
+
return () => {
|
|
379
|
+
renderCount++;
|
|
380
|
+
return _jsx("div", { children: childComputed.currentFilter });
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
function Parent() {
|
|
384
|
+
parentState = useState({ filter: "active" });
|
|
385
|
+
return () => _jsx(Child, { filter: parentState.filter });
|
|
386
|
+
}
|
|
387
|
+
const container = document.createElement("div");
|
|
388
|
+
render(_jsx(Parent, {}), container);
|
|
389
|
+
// Initial render
|
|
390
|
+
expect(renderCount).toBe(1);
|
|
391
|
+
expect(childComputed.currentFilter).toBe("active");
|
|
392
|
+
expect(computeFn).toHaveBeenCalledTimes(1);
|
|
393
|
+
// Change parent prop
|
|
394
|
+
parentState.filter = "completed";
|
|
395
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
396
|
+
// Should recompute with new prop value and child should only render once
|
|
397
|
+
expect(renderCount).toBe(2);
|
|
398
|
+
expect(childComputed.currentFilter).toBe("completed");
|
|
399
|
+
expect(computeFn).toHaveBeenCalledTimes(2);
|
|
400
|
+
// Change again
|
|
401
|
+
parentState.filter = "all";
|
|
402
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
403
|
+
expect(renderCount).toBe(3);
|
|
404
|
+
expect(childComputed.currentFilter).toBe("all");
|
|
405
|
+
expect(computeFn).toHaveBeenCalledTimes(3);
|
|
406
|
+
});
|
|
407
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEffect.test.d.ts","sourceRoot":"","sources":["../../src/tests/useEffect.test.tsx"],"names":[],"mappings":""}
|