@@ -1479,6 +1479,77 @@ test.describe("Middleware", () => {
1479
1479
return <h3 data-b>B: {loaderData}</h3>;
1480
1480
}
1481
1481
` ,
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
+ ` ,
1482
1553
"app/routes/without-loader-document._index.tsx" : js `
1483
1554
import { Link } from 'react-router'
1484
1555
export default function Component({ loaderData }) {
@@ -1823,6 +1894,34 @@ test.describe("Middleware", () => {
1823
1894
expect ( await page . locator ( "[data-b]" ) . textContent ( ) ) . toBe ( "B: a,b" ) ;
1824
1895
} ) ;
1825
1896
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
+
1826
1925
test ( "calls middleware for routes even without a loader (document)" , async ( {
1827
1926
page,
1828
1927
} ) => {
0 commit comments