Skip to content

Commit f1e14a2

Browse files
Dedupe calls to route.lazy functions (#13260)
1 parent 47c4c03 commit f1e14a2

File tree

6 files changed

+465
-395
lines changed

6 files changed

+465
-395
lines changed

.changeset/green-windows-itch.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-router": patch
3+
---
4+
5+
Dedupe calls to `route.lazy` functions

packages/react-router/__tests__/router/data-strategy-test.ts

+37-23
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import type {
33
DataStrategyMatch,
44
DataStrategyResult,
55
} from "../../lib/router/utils";
6-
import { createDeferred, setup } from "./utils/data-router-setup";
6+
import {
7+
createDeferred,
8+
createLazyStub,
9+
setup,
10+
} from "./utils/data-router-setup";
711
import { createFormData, tick } from "./utils/utils";
812

913
describe("router dataStrategy", () => {
@@ -95,6 +99,10 @@ describe("router dataStrategy", () => {
9599
keyedResults(matches, results)
96100
)
97101
);
102+
let { lazyStub: lazyJsonStub, lazyDeferred: lazyJsonDeferred } =
103+
createLazyStub();
104+
let { lazyStub: lazyTextStub, lazyDeferred: lazyTextDeferred } =
105+
createLazyStub();
98106
let t = setup({
99107
routes: [
100108
{
@@ -103,24 +111,24 @@ describe("router dataStrategy", () => {
103111
{
104112
id: "json",
105113
path: "/test",
106-
lazy: true,
114+
lazy: lazyJsonStub,
107115
children: [
108116
{
109117
id: "text",
110118
index: true,
111-
lazy: true,
119+
lazy: lazyTextStub,
112120
},
113121
],
114122
},
115123
],
116124
dataStrategy,
117125
});
118126

119-
let A = await t.navigate("/test");
120-
await A.lazy.json.resolve({
127+
await t.navigate("/test");
128+
await lazyJsonDeferred.resolve({
121129
loader: () => ({ message: "hello json" }),
122130
});
123-
await A.lazy.text.resolve({
131+
await lazyTextDeferred.resolve({
124132
loader: () => "hello text",
125133
});
126134
expect(t.router.state.loaderData).toEqual({
@@ -211,6 +219,7 @@ describe("router dataStrategy", () => {
211219
});
212220

213221
it("should allow custom implementations to override default behavior with lazy", async () => {
222+
let { lazyStub, lazyDeferred } = createLazyStub();
214223
let t = setup({
215224
routes: [
216225
{
@@ -219,7 +228,7 @@ describe("router dataStrategy", () => {
219228
{
220229
id: "test",
221230
path: "/test",
222-
lazy: true,
231+
lazy: lazyStub,
223232
},
224233
],
225234
async dataStrategy({ matches }) {
@@ -234,8 +243,8 @@ describe("router dataStrategy", () => {
234243
},
235244
});
236245

237-
let A = await t.navigate("/test");
238-
await A.lazy.test.resolve({ loader: () => "TEST" });
246+
await t.navigate("/test");
247+
await lazyDeferred.resolve({ loader: () => "TEST" });
239248

240249
expect(t.router.state.loaderData).toMatchObject({
241250
test: 'Route ID "test" returned "TEST"',
@@ -365,6 +374,7 @@ describe("router dataStrategy", () => {
365374
});
366375

367376
it("does not require resolve to be called if a match is not being loaded", async () => {
377+
let { lazyStub, lazyDeferred } = createLazyStub();
368378
let t = setup({
369379
routes: [
370380
{
@@ -379,7 +389,7 @@ describe("router dataStrategy", () => {
379389
{
380390
id: "child",
381391
path: "child",
382-
lazy: true,
392+
lazy: lazyStub,
383393
},
384394
],
385395
},
@@ -415,7 +425,7 @@ describe("router dataStrategy", () => {
415425
});
416426

417427
let B = await t.navigate("/parent/child");
418-
await B.lazy.child.resolve({ loader: () => "CHILD" });
428+
await lazyDeferred.resolve({ loader: () => "CHILD" });
419429

420430
// no-op
421431
await B.loaders.parent.resolve("XXX");
@@ -441,6 +451,7 @@ describe("router dataStrategy", () => {
441451
keyedResults(matches, results)
442452
);
443453
});
454+
let { lazyStub, lazyDeferred } = createLazyStub();
444455
let t = setup({
445456
routes: [
446457
{
@@ -457,7 +468,7 @@ describe("router dataStrategy", () => {
457468
{
458469
id: "child",
459470
path: "child",
460-
lazy: true,
471+
lazy: lazyStub,
461472
},
462473
],
463474
},
@@ -500,7 +511,7 @@ describe("router dataStrategy", () => {
500511
parent: "PARENT",
501512
});
502513

503-
let C = await t.navigate("/parent/child");
514+
await t.navigate("/parent/child");
504515
expect(dataStrategy.mock.calls[2][0].matches).toEqual([
505516
expect.objectContaining({
506517
shouldLoad: false,
@@ -515,7 +526,7 @@ describe("router dataStrategy", () => {
515526
route: expect.objectContaining({ id: "child" }),
516527
}),
517528
]);
518-
await C.lazy.child.resolve({
529+
await lazyDeferred.resolve({
519530
action: () => "CHILD ACTION",
520531
loader: () => "CHILD",
521532
shouldRevalidate: () => false,
@@ -621,6 +632,7 @@ describe("router dataStrategy", () => {
621632
keyedResults(matches, results)
622633
)
623634
);
635+
let { lazyStub, lazyDeferred } = createLazyStub();
624636
let t = setup({
625637
routes: [
626638
{
@@ -629,17 +641,17 @@ describe("router dataStrategy", () => {
629641
{
630642
id: "json",
631643
path: "/test",
632-
lazy: true,
644+
lazy: lazyStub,
633645
},
634646
],
635647
dataStrategy,
636648
});
637649

638-
let A = await t.navigate("/test", {
650+
await t.navigate("/test", {
639651
formMethod: "post",
640652
formData: createFormData({}),
641653
});
642-
await A.lazy.json.resolve({
654+
await lazyDeferred.resolve({
643655
action: () => ({ message: "hello json" }),
644656
});
645657
expect(t.router.state.actionData).toEqual({
@@ -709,6 +721,7 @@ describe("router dataStrategy", () => {
709721
keyedResults(matches, results)
710722
)
711723
);
724+
let { lazyStub, lazyDeferred } = createLazyStub();
712725
let t = setup({
713726
routes: [
714727
{
@@ -717,15 +730,15 @@ describe("router dataStrategy", () => {
717730
{
718731
id: "json",
719732
path: "/test",
720-
lazy: true,
733+
lazy: lazyStub,
721734
},
722735
],
723736
dataStrategy,
724737
});
725738

726739
let key = "key";
727-
let A = await t.fetch("/test", key);
728-
await A.lazy.json.resolve({
740+
await t.fetch("/test", key);
741+
await lazyDeferred.resolve({
729742
loader: () => ({ message: "hello json" }),
730743
});
731744
expect(t.fetchers[key].data.message).toBe("hello json");
@@ -795,6 +808,7 @@ describe("router dataStrategy", () => {
795808
keyedResults(matches, results)
796809
)
797810
);
811+
let { lazyStub, lazyDeferred } = createLazyStub();
798812
let t = setup({
799813
routes: [
800814
{
@@ -803,18 +817,18 @@ describe("router dataStrategy", () => {
803817
{
804818
id: "json",
805819
path: "/test",
806-
lazy: true,
820+
lazy: lazyStub,
807821
},
808822
],
809823
dataStrategy,
810824
});
811825

812826
let key = "key";
813-
let A = await t.fetch("/test", key, {
827+
await t.fetch("/test", key, {
814828
formMethod: "post",
815829
formData: createFormData({}),
816830
});
817-
await A.lazy.json.resolve({
831+
await lazyDeferred.resolve({
818832
action: () => ({ message: "hello json" }),
819833
});
820834

0 commit comments

Comments
 (0)