@preact/signals-react 1.3.5 → 1.3.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.
- package/CHANGELOG.md +14 -0
- package/dist/signals.d.ts +1 -1
- package/dist/signals.js +1 -1
- package/dist/signals.js.map +1 -1
- package/dist/signals.min.js +1 -1
- package/dist/signals.min.js.map +1 -1
- package/dist/signals.mjs +1 -1
- package/dist/signals.mjs.map +1 -1
- package/dist/signals.module.js +1 -1
- package/dist/signals.module.js.map +1 -1
- package/package.json +11 -1
- package/runtime/dist/auto.d.ts +1 -0
- package/runtime/dist/index.d.ts +3 -2
- package/runtime/dist/runtime.js +1 -1
- package/runtime/dist/runtime.js.map +1 -1
- package/runtime/dist/runtime.min.js +1 -1
- package/runtime/dist/runtime.min.js.map +1 -1
- package/runtime/dist/runtime.mjs +1 -1
- package/runtime/dist/runtime.mjs.map +1 -1
- package/runtime/dist/runtime.module.js +1 -1
- package/runtime/dist/runtime.module.js.map +1 -1
- package/runtime/src/auto.ts +7 -3
- package/runtime/src/index.ts +50 -8
- package/src/index.ts +6 -2
- package/runtime/test/useSignals.test.tsx +0 -422
- package/test/browser/exports.test.tsx +0 -18
- package/test/browser/mounts.test.tsx +0 -32
- package/test/browser/react-router.test.tsx +0 -63
- package/test/browser/updates.test.tsx +0 -735
- package/test/node/renderToStaticMarkup.test.tsx +0 -22
- package/test/shared/mounting.tsx +0 -184
- package/test/shared/utils.ts +0 -127
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import { createElement, Fragment } from "react";
|
|
2
|
-
import { Signal, signal, batch } from "@preact/signals-core";
|
|
3
|
-
import { useSignals } from "@preact/signals-react/runtime";
|
|
4
|
-
import {
|
|
5
|
-
Root,
|
|
6
|
-
createRoot,
|
|
7
|
-
act,
|
|
8
|
-
checkHangingAct,
|
|
9
|
-
getConsoleErrorSpy,
|
|
10
|
-
checkConsoleErrorLogs,
|
|
11
|
-
} from "../../test/shared/utils";
|
|
12
|
-
|
|
13
|
-
describe("useSignals", () => {
|
|
14
|
-
let scratch: HTMLDivElement;
|
|
15
|
-
let root: Root;
|
|
16
|
-
|
|
17
|
-
async function render(element: Parameters<Root["render"]>[0]) {
|
|
18
|
-
await act(() => root.render(element));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
beforeEach(async () => {
|
|
22
|
-
scratch = document.createElement("div");
|
|
23
|
-
document.body.appendChild(scratch);
|
|
24
|
-
root = await createRoot(scratch);
|
|
25
|
-
getConsoleErrorSpy().resetHistory();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
afterEach(async () => {
|
|
29
|
-
await act(() => root.unmount());
|
|
30
|
-
scratch.remove();
|
|
31
|
-
|
|
32
|
-
checkConsoleErrorLogs();
|
|
33
|
-
checkHangingAct();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("should rerender components when signals they use change", async () => {
|
|
37
|
-
const signal1 = signal(0);
|
|
38
|
-
function Child1() {
|
|
39
|
-
useSignals();
|
|
40
|
-
return <p>{signal1.value}</p>;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const signal2 = signal(0);
|
|
44
|
-
function Child2() {
|
|
45
|
-
useSignals();
|
|
46
|
-
return <p>{signal2.value}</p>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function Parent() {
|
|
50
|
-
return (
|
|
51
|
-
<Fragment>
|
|
52
|
-
<Child1 />
|
|
53
|
-
<Child2 />
|
|
54
|
-
</Fragment>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
await render(<Parent />);
|
|
59
|
-
expect(scratch.innerHTML).to.equal("<p>0</p><p>0</p>");
|
|
60
|
-
|
|
61
|
-
await act(() => {
|
|
62
|
-
signal1.value += 1;
|
|
63
|
-
});
|
|
64
|
-
expect(scratch.innerHTML).to.equal("<p>1</p><p>0</p>");
|
|
65
|
-
|
|
66
|
-
await act(() => {
|
|
67
|
-
signal2.value += 1;
|
|
68
|
-
});
|
|
69
|
-
expect(scratch.innerHTML).to.equal("<p>1</p><p>1</p>");
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("should correctly invoke rerenders if useSignals is called multiple times in the same component", async () => {
|
|
73
|
-
const signal1 = signal(0);
|
|
74
|
-
const signal2 = signal(0);
|
|
75
|
-
const signal3 = signal(0);
|
|
76
|
-
function App() {
|
|
77
|
-
useSignals();
|
|
78
|
-
const sig1 = signal1.value;
|
|
79
|
-
useSignals();
|
|
80
|
-
const sig2 = signal2.value;
|
|
81
|
-
const sig3 = signal3.value;
|
|
82
|
-
useSignals();
|
|
83
|
-
return (
|
|
84
|
-
<p>
|
|
85
|
-
{sig1}
|
|
86
|
-
{sig2}
|
|
87
|
-
{sig3}
|
|
88
|
-
</p>
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
await render(<App />);
|
|
93
|
-
expect(scratch.innerHTML).to.equal("<p>000</p>");
|
|
94
|
-
|
|
95
|
-
await act(() => {
|
|
96
|
-
signal1.value += 1;
|
|
97
|
-
});
|
|
98
|
-
expect(scratch.innerHTML).to.equal("<p>100</p>");
|
|
99
|
-
|
|
100
|
-
await act(() => {
|
|
101
|
-
signal2.value += 1;
|
|
102
|
-
});
|
|
103
|
-
expect(scratch.innerHTML).to.equal("<p>110</p>");
|
|
104
|
-
|
|
105
|
-
await act(() => {
|
|
106
|
-
signal3.value += 1;
|
|
107
|
-
});
|
|
108
|
-
expect(scratch.innerHTML).to.equal("<p>111</p>");
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("should not rerender components when signals they use do not change", async () => {
|
|
112
|
-
const child1Spy = sinon.spy();
|
|
113
|
-
const signal1 = signal(0);
|
|
114
|
-
function Child1() {
|
|
115
|
-
child1Spy();
|
|
116
|
-
useSignals();
|
|
117
|
-
return <p>{signal1.value}</p>;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const child2Spy = sinon.spy();
|
|
121
|
-
const signal2 = signal(0);
|
|
122
|
-
function Child2() {
|
|
123
|
-
child2Spy();
|
|
124
|
-
useSignals();
|
|
125
|
-
return <p>{signal2.value}</p>;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const parentSpy = sinon.spy();
|
|
129
|
-
function Parent() {
|
|
130
|
-
parentSpy();
|
|
131
|
-
return (
|
|
132
|
-
<Fragment>
|
|
133
|
-
<Child1 />
|
|
134
|
-
<Child2 />
|
|
135
|
-
</Fragment>
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function resetSpies() {
|
|
140
|
-
child1Spy.resetHistory();
|
|
141
|
-
child2Spy.resetHistory();
|
|
142
|
-
parentSpy.resetHistory();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
resetSpies();
|
|
146
|
-
await render(<Parent />);
|
|
147
|
-
expect(scratch.innerHTML).to.equal("<p>0</p><p>0</p>");
|
|
148
|
-
expect(child1Spy).to.have.been.calledOnce;
|
|
149
|
-
expect(child2Spy).to.have.been.calledOnce;
|
|
150
|
-
expect(parentSpy).to.have.been.calledOnce;
|
|
151
|
-
|
|
152
|
-
resetSpies();
|
|
153
|
-
await act(() => {
|
|
154
|
-
signal1.value += 1;
|
|
155
|
-
});
|
|
156
|
-
expect(scratch.innerHTML).to.equal("<p>1</p><p>0</p>");
|
|
157
|
-
expect(child1Spy).to.have.been.calledOnce;
|
|
158
|
-
expect(child2Spy).to.not.have.been.called;
|
|
159
|
-
expect(parentSpy).to.not.have.been.called;
|
|
160
|
-
|
|
161
|
-
resetSpies();
|
|
162
|
-
await act(() => {
|
|
163
|
-
signal2.value += 1;
|
|
164
|
-
});
|
|
165
|
-
expect(scratch.innerHTML).to.equal("<p>1</p><p>1</p>");
|
|
166
|
-
expect(child1Spy).to.not.have.been.called;
|
|
167
|
-
expect(child2Spy).to.have.been.calledOnce;
|
|
168
|
-
expect(parentSpy).to.not.have.been.called;
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it("should not rerender components when signals they use change but they are not mounted", async () => {
|
|
172
|
-
const child1Spy = sinon.spy();
|
|
173
|
-
const signal1 = signal(0);
|
|
174
|
-
function Child() {
|
|
175
|
-
child1Spy();
|
|
176
|
-
useSignals();
|
|
177
|
-
const sig1 = signal1.value;
|
|
178
|
-
return <p>{sig1}</p>;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function Parent({ show }: { show: boolean }) {
|
|
182
|
-
return <Fragment>{show && <Child />}</Fragment>;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
await render(<Parent show={true} />);
|
|
186
|
-
expect(scratch.innerHTML).to.equal("<p>0</p>");
|
|
187
|
-
|
|
188
|
-
await act(() => {
|
|
189
|
-
signal1.value += 1;
|
|
190
|
-
});
|
|
191
|
-
expect(scratch.innerHTML).to.equal("<p>1</p>");
|
|
192
|
-
|
|
193
|
-
await act(() => {
|
|
194
|
-
render(<Parent show={false} />);
|
|
195
|
-
});
|
|
196
|
-
expect(scratch.innerHTML).to.equal("");
|
|
197
|
-
|
|
198
|
-
await act(() => {
|
|
199
|
-
signal1.value += 1;
|
|
200
|
-
});
|
|
201
|
-
expect(child1Spy).to.have.been.calledTwice;
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it("should not rerender components that only update signals in event handlers", async () => {
|
|
205
|
-
const buttonSpy = sinon.spy();
|
|
206
|
-
function AddOneButton({ num }: { num: Signal<number> }) {
|
|
207
|
-
useSignals();
|
|
208
|
-
buttonSpy();
|
|
209
|
-
return (
|
|
210
|
-
<button
|
|
211
|
-
onClick={() => {
|
|
212
|
-
num.value += 1;
|
|
213
|
-
}}
|
|
214
|
-
>
|
|
215
|
-
Add One
|
|
216
|
-
</button>
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const displaySpy = sinon.spy();
|
|
221
|
-
function DisplayNumber({ num }: { num: Signal<number> }) {
|
|
222
|
-
useSignals();
|
|
223
|
-
displaySpy();
|
|
224
|
-
return <p>{num.value}</p>;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const number = signal(0);
|
|
228
|
-
function App() {
|
|
229
|
-
return (
|
|
230
|
-
<Fragment>
|
|
231
|
-
<AddOneButton num={number} />
|
|
232
|
-
<DisplayNumber num={number} />
|
|
233
|
-
</Fragment>
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
await render(<App />);
|
|
238
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>0</p>");
|
|
239
|
-
expect(buttonSpy).to.have.been.calledOnce;
|
|
240
|
-
expect(displaySpy).to.have.been.calledOnce;
|
|
241
|
-
|
|
242
|
-
await act(() => {
|
|
243
|
-
scratch.querySelector("button")!.click();
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>1</p>");
|
|
247
|
-
expect(buttonSpy).to.have.been.calledOnce;
|
|
248
|
-
expect(displaySpy).to.have.been.calledTwice;
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
it("should not rerender components that only read signals in event handlers", async () => {
|
|
252
|
-
const buttonSpy = sinon.spy();
|
|
253
|
-
function AddOneButton({ num }: { num: Signal<number> }) {
|
|
254
|
-
useSignals();
|
|
255
|
-
buttonSpy();
|
|
256
|
-
return (
|
|
257
|
-
<button
|
|
258
|
-
onClick={() => {
|
|
259
|
-
num.value += adder.value;
|
|
260
|
-
}}
|
|
261
|
-
>
|
|
262
|
-
Add One
|
|
263
|
-
</button>
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const displaySpy = sinon.spy();
|
|
268
|
-
function DisplayNumber({ num }: { num: Signal<number> }) {
|
|
269
|
-
useSignals();
|
|
270
|
-
displaySpy();
|
|
271
|
-
return <p>{num.value}</p>;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const adder = signal(2);
|
|
275
|
-
const number = signal(0);
|
|
276
|
-
function App() {
|
|
277
|
-
return (
|
|
278
|
-
<Fragment>
|
|
279
|
-
<AddOneButton num={number} />
|
|
280
|
-
<DisplayNumber num={number} />
|
|
281
|
-
</Fragment>
|
|
282
|
-
);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
function resetSpies() {
|
|
286
|
-
buttonSpy.resetHistory();
|
|
287
|
-
displaySpy.resetHistory();
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
resetSpies();
|
|
291
|
-
await render(<App />);
|
|
292
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>0</p>");
|
|
293
|
-
expect(buttonSpy).to.have.been.calledOnce;
|
|
294
|
-
expect(displaySpy).to.have.been.calledOnce;
|
|
295
|
-
|
|
296
|
-
resetSpies();
|
|
297
|
-
await act(() => {
|
|
298
|
-
scratch.querySelector("button")!.click();
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>2</p>");
|
|
302
|
-
expect(buttonSpy).to.not.have.been.called;
|
|
303
|
-
expect(displaySpy).to.have.been.calledOnce;
|
|
304
|
-
|
|
305
|
-
resetSpies();
|
|
306
|
-
await act(() => {
|
|
307
|
-
adder.value += 1;
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>2</p>");
|
|
311
|
-
expect(buttonSpy).to.not.have.been.called;
|
|
312
|
-
expect(displaySpy).to.not.have.been.called;
|
|
313
|
-
|
|
314
|
-
resetSpies();
|
|
315
|
-
await act(() => {
|
|
316
|
-
scratch.querySelector("button")!.click();
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
expect(scratch.innerHTML).to.equal("<button>Add One</button><p>5</p>");
|
|
320
|
-
expect(buttonSpy).to.not.have.been.called;
|
|
321
|
-
expect(displaySpy).to.have.been.calledOnce;
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it("should properly rerender components that use custom hooks", async () => {
|
|
325
|
-
const greeting = signal("Hello");
|
|
326
|
-
function useGreeting() {
|
|
327
|
-
useSignals();
|
|
328
|
-
return greeting.value;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const name = signal("John");
|
|
332
|
-
function useName() {
|
|
333
|
-
useSignals();
|
|
334
|
-
return name.value;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
function App() {
|
|
338
|
-
const greeting = useGreeting();
|
|
339
|
-
const name = useName();
|
|
340
|
-
return (
|
|
341
|
-
<div>
|
|
342
|
-
{greeting} {name}!
|
|
343
|
-
</div>
|
|
344
|
-
);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
await render(<App />);
|
|
348
|
-
expect(scratch.innerHTML).to.equal("<div>Hello John!</div>");
|
|
349
|
-
|
|
350
|
-
await act(() => {
|
|
351
|
-
greeting.value = "Hi";
|
|
352
|
-
});
|
|
353
|
-
expect(scratch.innerHTML).to.equal("<div>Hi John!</div>");
|
|
354
|
-
|
|
355
|
-
await act(() => {
|
|
356
|
-
name.value = "Jane";
|
|
357
|
-
});
|
|
358
|
-
expect(scratch.innerHTML).to.equal("<div>Hi Jane!</div>");
|
|
359
|
-
|
|
360
|
-
await act(() => {
|
|
361
|
-
batch(() => {
|
|
362
|
-
greeting.value = "Hello";
|
|
363
|
-
name.value = "John";
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
expect(scratch.innerHTML).to.equal("<div>Hello John!</div>");
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it("should properly rerender components that use custom hooks and signals", async () => {
|
|
370
|
-
const greeting = signal("Hello");
|
|
371
|
-
function useGreeting() {
|
|
372
|
-
useSignals();
|
|
373
|
-
return greeting.value;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const name = signal("John");
|
|
377
|
-
function useName() {
|
|
378
|
-
useSignals();
|
|
379
|
-
return name.value;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
const punctuation = signal("!");
|
|
383
|
-
function App() {
|
|
384
|
-
useSignals();
|
|
385
|
-
const greeting = useGreeting();
|
|
386
|
-
const name = useName();
|
|
387
|
-
return (
|
|
388
|
-
<div>
|
|
389
|
-
{greeting} {name}
|
|
390
|
-
{punctuation.value}
|
|
391
|
-
</div>
|
|
392
|
-
);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
await render(<App />);
|
|
396
|
-
expect(scratch.innerHTML).to.equal("<div>Hello John!</div>");
|
|
397
|
-
|
|
398
|
-
await act(() => {
|
|
399
|
-
greeting.value = "Hi";
|
|
400
|
-
});
|
|
401
|
-
expect(scratch.innerHTML).to.equal("<div>Hi John!</div>");
|
|
402
|
-
|
|
403
|
-
await act(() => {
|
|
404
|
-
name.value = "Jane";
|
|
405
|
-
});
|
|
406
|
-
expect(scratch.innerHTML).to.equal("<div>Hi Jane!</div>");
|
|
407
|
-
|
|
408
|
-
await act(() => {
|
|
409
|
-
punctuation.value = "?";
|
|
410
|
-
});
|
|
411
|
-
expect(scratch.innerHTML).to.equal("<div>Hi Jane?</div>");
|
|
412
|
-
|
|
413
|
-
await act(() => {
|
|
414
|
-
batch(() => {
|
|
415
|
-
greeting.value = "Hello";
|
|
416
|
-
name.value = "John";
|
|
417
|
-
punctuation.value = "!";
|
|
418
|
-
});
|
|
419
|
-
});
|
|
420
|
-
expect(scratch.innerHTML).to.equal("<div>Hello John!</div>");
|
|
421
|
-
});
|
|
422
|
-
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as core from "@preact/signals-core";
|
|
2
|
-
import * as adapter from "@preact/signals-react";
|
|
3
|
-
|
|
4
|
-
describe("@preact/signals-react", () => {
|
|
5
|
-
describe("exports", () => {
|
|
6
|
-
it("should re-export core", () => {
|
|
7
|
-
const keys = Object.keys(core);
|
|
8
|
-
|
|
9
|
-
for (let i = 0; i < keys.length; i++) {
|
|
10
|
-
const key = keys[i];
|
|
11
|
-
expect(key in adapter).to.equal(
|
|
12
|
-
true,
|
|
13
|
-
`"${key}" is not exported from react adapter`
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
});
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { mountSignalsTests } from "../shared/mounting";
|
|
2
|
-
import {
|
|
3
|
-
Root,
|
|
4
|
-
createRoot,
|
|
5
|
-
act,
|
|
6
|
-
getConsoleErrorSpy,
|
|
7
|
-
checkConsoleErrorLogs,
|
|
8
|
-
} from "../shared/utils";
|
|
9
|
-
|
|
10
|
-
describe("@preact/signals-react mounting", () => {
|
|
11
|
-
let scratch: HTMLDivElement;
|
|
12
|
-
let root: Root;
|
|
13
|
-
|
|
14
|
-
async function render(element: JSX.Element | null): Promise<string> {
|
|
15
|
-
await act(() => root.render(element));
|
|
16
|
-
return scratch.innerHTML;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
beforeEach(async () => {
|
|
20
|
-
scratch = document.createElement("div");
|
|
21
|
-
document.body.appendChild(scratch);
|
|
22
|
-
root = await createRoot(scratch);
|
|
23
|
-
getConsoleErrorSpy().resetHistory();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
afterEach(async () => {
|
|
27
|
-
scratch.remove();
|
|
28
|
-
checkConsoleErrorLogs();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
mountSignalsTests(render);
|
|
32
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
// @ts-ignore-next-line
|
|
2
|
-
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
3
|
-
|
|
4
|
-
import { signal } from "@preact/signals-react";
|
|
5
|
-
import { createElement } from "react";
|
|
6
|
-
import * as ReactRouter from "react-router-dom";
|
|
7
|
-
|
|
8
|
-
import { act, checkHangingAct, createRoot, Root } from "../shared/utils";
|
|
9
|
-
|
|
10
|
-
const MemoryRouter = ReactRouter.MemoryRouter;
|
|
11
|
-
const Routes = ReactRouter.Routes
|
|
12
|
-
? ReactRouter.Routes
|
|
13
|
-
: (ReactRouter as any).Switch; // react-router-dom v5
|
|
14
|
-
|
|
15
|
-
// @ts-expect-error We are doing a check for react-router-dom v5 vs v6 here, so
|
|
16
|
-
// while TS thinks ReactRouter.Routes will always be here, it isn't in v5.
|
|
17
|
-
const Route = ReactRouter.Routes
|
|
18
|
-
? ReactRouter.Route
|
|
19
|
-
: // react-router-dom v5 requires the element prop to be passed as children.
|
|
20
|
-
({ element, ...props }: any) => (
|
|
21
|
-
<ReactRouter.Route {...props}>{element}</ReactRouter.Route>
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
describe("@preact/signals-react", () => {
|
|
25
|
-
let scratch: HTMLDivElement;
|
|
26
|
-
let root: Root;
|
|
27
|
-
async function render(element: Parameters<Root["render"]>[0]) {
|
|
28
|
-
await act(() => root.render(element));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
beforeEach(async () => {
|
|
32
|
-
scratch = document.createElement("div");
|
|
33
|
-
document.body.appendChild(scratch);
|
|
34
|
-
root = await createRoot(scratch);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
afterEach(async () => {
|
|
38
|
-
checkHangingAct();
|
|
39
|
-
await act(() => root.unmount());
|
|
40
|
-
scratch.remove();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe("react-router-dom", () => {
|
|
44
|
-
it("Route component should render", async () => {
|
|
45
|
-
const name = signal("World")!;
|
|
46
|
-
|
|
47
|
-
function App() {
|
|
48
|
-
return (
|
|
49
|
-
<MemoryRouter>
|
|
50
|
-
<Routes>
|
|
51
|
-
<Route path="/page1" element={<div>Page 1</div>}></Route>
|
|
52
|
-
<Route path="*" element={<div>Hello {name}!</div>}></Route>
|
|
53
|
-
</Routes>
|
|
54
|
-
</MemoryRouter>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
await render(<App />);
|
|
59
|
-
|
|
60
|
-
expect(scratch.innerHTML).to.equal("<div>Hello World!</div>");
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
});
|