@@ -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 } ) => {
0 commit comments