Skip to content

Commit 8ea6f14

Browse files
authored
fix: pass skipRevalidation option through middleware pipeline in singleFetchAction (#14286)
1 parent ead7e94 commit 8ea6f14

File tree

3 files changed

+103
-3
lines changed

3 files changed

+103
-3
lines changed

contributors.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@
187187
- jmjpro
188188
- johnpangalos
189189
- jonkoops
190+
- joseph0926
190191
- jrakotoharisoa
191192
- jrestall
192193
- juanpprieto

integration/middleware-test.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,77 @@ test.describe("Middleware", () => {
14791479
return <h3 data-b>B: {loaderData}</h3>;
14801480
}
14811481
`,
1482+
"app/routes/revalidate.parent.tsx": js`
1483+
import { Outlet } from "react-router";
1484+
import { orderContext } from '../context';
1485+
1486+
export const middleware = [
1487+
({ context, params }) => {
1488+
context.set(orderContext, [
1489+
...context.get(orderContext),
1490+
'parent middleware ' + params.child
1491+
]);
1492+
},
1493+
];
1494+
1495+
export async function loader({ context, params }) {
1496+
context.set(orderContext, [
1497+
...context.get(orderContext),
1498+
'parent loader ' + params.child
1499+
]);
1500+
await new Promise(r => setTimeout(r, 0));
1501+
return context.get(orderContext).join(',');
1502+
}
1503+
1504+
export const shouldRevalidate = () => false;
1505+
1506+
export default function Parent({ loaderData }) {
1507+
return (
1508+
<>
1509+
<h1>Parent</h1>
1510+
<div id="parent-loader-data">{loaderData}</div>
1511+
<Outlet />
1512+
</>
1513+
);
1514+
}
1515+
`,
1516+
1517+
"app/routes/revalidate.parent.$child.tsx": js`
1518+
import { href, Link } from "react-router";
1519+
import { orderContext } from '../context';
1520+
1521+
export const middleware = [
1522+
({ context, params }) => {
1523+
context.set(orderContext, [
1524+
...context.get(orderContext),
1525+
'child middleware ' + params.child
1526+
]);
1527+
},
1528+
];
1529+
1530+
export async function loader({ context, params }) {
1531+
context.set(orderContext, [
1532+
...context.get(orderContext),
1533+
'child loader ' + params.child
1534+
]);
1535+
await new Promise(r => setTimeout(r, 0));
1536+
return context.get(orderContext).join(',');
1537+
}
1538+
1539+
export default function Child({ loaderData, params }) {
1540+
const nextChild = String(Number(params.child) + 1);
1541+
1542+
return (
1543+
<>
1544+
<h1>Child: {params.child}</h1>
1545+
<div id="child-loader-data">{loaderData}</div>
1546+
<Link to={href("/revalidate/parent/:child", { child: nextChild })}>
1547+
Next child
1548+
</Link>
1549+
</>
1550+
);
1551+
}
1552+
`,
14821553
"app/routes/without-loader-document._index.tsx": js`
14831554
import { Link } from 'react-router'
14841555
export default function Component({ loaderData }) {
@@ -1823,6 +1894,34 @@ test.describe("Middleware", () => {
18231894
expect(await page.locator("[data-b]").textContent()).toBe("B: a,b");
18241895
});
18251896

1897+
test("Filters server loaders via shouldRevalidate", async ({ page }) => {
1898+
let app = new PlaywrightFixture(appFixture, page);
1899+
1900+
await app.goto("/revalidate/parent/1");
1901+
expect(await page.locator("#parent-loader-data").textContent()).toBe(
1902+
"parent middleware 1,child middleware 1,parent loader 1,child loader 1",
1903+
);
1904+
expect(await page.locator("#child-loader-data").textContent()).toBe(
1905+
"parent middleware 1,child middleware 1,parent loader 1,child loader 1",
1906+
);
1907+
1908+
await app.clickLink("/revalidate/parent/2");
1909+
expect(await page.locator("#parent-loader-data").textContent()).toBe(
1910+
"parent middleware 1,child middleware 1,parent loader 1,child loader 1",
1911+
);
1912+
expect(await page.locator("#child-loader-data").textContent()).toBe(
1913+
"parent middleware 2,child middleware 2,child loader 2",
1914+
);
1915+
1916+
await app.clickLink("/revalidate/parent/3");
1917+
expect(await page.locator("#parent-loader-data").textContent()).toBe(
1918+
"parent middleware 1,child middleware 1,parent loader 1,child loader 1",
1919+
);
1920+
expect(await page.locator("#child-loader-data").textContent()).toBe(
1921+
"parent middleware 3,child middleware 3,child loader 3",
1922+
);
1923+
});
1924+
18261925
test("calls middleware for routes even without a loader (document)", async ({
18271926
page,
18281927
}) => {

packages/react-router/lib/router/router.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3557,7 +3557,7 @@ export function createStaticHandler(
35573557
skipLoaderErrorBubbling,
35583558
skipRevalidation,
35593559
dataStrategy,
3560-
generateMiddlewareResponse: generateMiddlewareResponse,
3560+
generateMiddlewareResponse,
35613561
}: Parameters<StaticHandler["query"]>[1] = {},
35623562
): Promise<StaticHandlerContext | Response> {
35633563
let url = new URL(request.url);
@@ -3667,7 +3667,7 @@ export function createStaticHandler(
36673667
null,
36683668
"filterMatchesToLoad" in opts
36693669
? (opts.filterMatchesToLoad ?? null)
3670-
: null,
3670+
: (filterMatchesToLoad ?? null),
36713671
skipRevalidation === true,
36723672
);
36733673

@@ -3831,7 +3831,7 @@ export function createStaticHandler(
38313831
routeId,
38323832
requestContext,
38333833
dataStrategy,
3834-
generateMiddlewareResponse: generateMiddlewareResponse,
3834+
generateMiddlewareResponse,
38353835
}: Parameters<StaticHandler["queryRoute"]>[1] = {},
38363836
): Promise<any> {
38373837
let url = new URL(request.url);

0 commit comments

Comments
 (0)