Skip to content

Commit 78ef4ef

Browse files
authored
Stabilize useRevalidator (#10707)
1 parent 94f0428 commit 78ef4ef

File tree

13 files changed

+428
-426
lines changed

13 files changed

+428
-426
lines changed

.changeset/stable-use-revalidator.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-router": patch
3+
---
4+
5+
Ensure `useRevalidator` is referentially stable across re-renders if revalidations are not actively occuring

packages/react-router-dom/__tests__/concurrent-mode-navigations-test.tsx

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ import {
1313
import {
1414
act,
1515
fireEvent,
16-
prettyDOM,
1716
render,
1817
screen,
1918
waitFor,
2019
} from "@testing-library/react";
2120
import { JSDOM } from "jsdom";
21+
import createDeferred from "../../router/__tests__/utils/createDeferred";
22+
import getHtml from "react-router/__tests__/utils/getHtml";
2223

2324
describe("Handles concurrent mode features during navigations", () => {
2425
function getComponents() {
@@ -378,36 +379,3 @@ function getWindowImpl(initialUrl: string, isHash = false): Window {
378379
dom.window.history.replaceState(null, "", (isHash ? "#" : "") + initialUrl);
379380
return dom.window as unknown as Window;
380381
}
381-
382-
function getHtml(container: HTMLElement) {
383-
return prettyDOM(container, undefined, {
384-
highlight: false,
385-
});
386-
}
387-
388-
async function tick() {
389-
await new Promise((r) => setTimeout(r, 0));
390-
}
391-
392-
function createDeferred() {
393-
let resolve: (val?: any) => Promise<void>;
394-
let reject: (error?: Error) => Promise<void>;
395-
let promise = new Promise((res, rej) => {
396-
resolve = async (val: any) => {
397-
res(val);
398-
await tick();
399-
await promise;
400-
};
401-
reject = async (error?: Error) => {
402-
rej(error);
403-
await promise.catch(() => tick());
404-
};
405-
});
406-
return {
407-
promise,
408-
//@ts-ignore
409-
resolve,
410-
//@ts-ignore
411-
reject,
412-
};
413-
}

packages/react-router-dom/__tests__/data-browser-router-test.tsx

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
fireEvent,
77
waitFor,
88
screen,
9-
prettyDOM,
109
} from "@testing-library/react";
1110
import "@testing-library/jest-dom";
1211
import type { ErrorResponse, Fetcher } from "@remix-run/router";
@@ -37,6 +36,9 @@ import {
3736
createRoutesFromElements,
3837
} from "react-router-dom";
3938

39+
import createDeferred from "../../router/__tests__/utils/createDeferred";
40+
import getHtml from "../../react-router/__tests__/utils/getHtml";
41+
4042
testDomRouter("<DataBrowserRouter>", createBrowserRouter, (url) =>
4143
getWindowImpl(url, false)
4244
);
@@ -5925,48 +5927,9 @@ function testDomRouter(
59255927
});
59265928
}
59275929

5928-
function createDeferred() {
5929-
let resolve: (val?: any) => Promise<void>;
5930-
let reject: (error?: Error) => Promise<void>;
5931-
let promise = new Promise((res, rej) => {
5932-
resolve = async (val: any) => {
5933-
res(val);
5934-
try {
5935-
await promise;
5936-
} catch (e) {}
5937-
};
5938-
reject = async (error?: Error) => {
5939-
rej(error);
5940-
try {
5941-
await promise;
5942-
} catch (e) {}
5943-
};
5944-
});
5945-
return {
5946-
promise,
5947-
//@ts-ignore
5948-
resolve,
5949-
//@ts-ignore
5950-
reject,
5951-
};
5952-
}
5953-
59545930
function getWindowImpl(initialUrl: string, isHash = false): Window {
59555931
// Need to use our own custom DOM in order to get a working history
59565932
const dom = new JSDOM(`<!DOCTYPE html>`, { url: "http://localhost/" });
59575933
dom.window.history.replaceState(null, "", (isHash ? "#" : "") + initialUrl);
59585934
return dom.window as unknown as Window;
59595935
}
5960-
5961-
function getHtml(container: HTMLElement) {
5962-
return prettyDOM(container, undefined, {
5963-
highlight: false,
5964-
theme: {
5965-
comment: null,
5966-
content: null,
5967-
prop: null,
5968-
tag: null,
5969-
value: null,
5970-
},
5971-
});
5972-
}

packages/react-router-dom/__tests__/scroll-restoration-test.tsx

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { JSDOM } from "jsdom";
22
import * as React from "react";
3-
import { render, prettyDOM, fireEvent, screen } from "@testing-library/react";
3+
import { render, fireEvent, screen } from "@testing-library/react";
44
import "@testing-library/jest-dom";
55
import {
66
Link,
@@ -10,6 +10,8 @@ import {
1010
createBrowserRouter,
1111
} from "react-router-dom";
1212

13+
import getHtml from "../../react-router/__tests__/utils/getHtml";
14+
1315
describe(`ScrollRestoration`, () => {
1416
it("removes the basename from the location provided to getKey", () => {
1517
let getKey = jest.fn(() => "mykey");
@@ -70,16 +72,3 @@ function getWindowImpl(initialUrl: string): Window {
7072
dom.window.history.replaceState(null, "", initialUrl);
7173
return dom.window as unknown as Window;
7274
}
73-
74-
function getHtml(container: HTMLElement) {
75-
return prettyDOM(container, undefined, {
76-
highlight: false,
77-
theme: {
78-
comment: null,
79-
content: null,
80-
prop: null,
81-
tag: null,
82-
value: null,
83-
},
84-
});
85-
}

0 commit comments

Comments
 (0)