From 9f2a6908661b942a1d88b5129ccaf619700fc30e Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Tue, 11 Jul 2023 11:53:10 -0400 Subject: [PATCH 01/12] Add support for X-Remix-Reload-Document header This header designates a redirect to trigger a full document reload. --- packages/router/router.ts | 38 ++++++++++++++++++++++++++------------ packages/router/utils.ts | 1 + 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/router/router.ts b/packages/router/router.ts index adae0211e0..91c7b801d7 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -2110,19 +2110,32 @@ export function createRouter(init: RouterInit): Router { redirectLocation, "Expected a location on the redirect navigation" ); - // Check if this an absolute external redirect that goes to a new origin - if (ABSOLUTE_URL_REGEX.test(redirect.location) && isBrowser) { - let url = init.history.createURL(redirect.location); - let isDifferentBasename = stripBasename(url.pathname, basename) == null; - - if (routerWindow.location.origin !== url.origin || isDifferentBasename) { - if (replace) { - routerWindow.location.replace(redirect.location); - } else { - routerWindow.location.assign(redirect.location); - } - return; + + // Check if this redirect should trigger a document reload + const isDocumentReload = (thisOrigin: string) => { + if (redirect.reloadDocument) { + return true; + } + if (!ABSOLUTE_URL_REGEX.test(redirect.location)) { + return false; + } + + const url = init.history.createURL(redirect.location); + // Check if this an absolute external redirect that goes to a new origin + if (thisOrigin !== url.origin) { + return true; + } + + const isDifferentBasename = stripBasename(url.pathname, basename) == null; + return isDifferentBasename; + }; + if (isBrowser && isDocumentReload(routerWindow.location.origin)) { + if (replace) { + routerWindow.location.replace(redirect.location); + } else { + routerWindow.location.assign(redirect.location); } + return; } // There's no need to abort on redirects, since we don't detect the @@ -3733,6 +3746,7 @@ async function callLoaderOrAction( status, location, revalidate: result.headers.get("X-Remix-Revalidate") !== null, + reloadDocument: result.headers.get("X-Remix-Reload-Document") !== null, }; } diff --git a/packages/router/utils.ts b/packages/router/utils.ts index 9830d3078d..e2f65ec2f8 100644 --- a/packages/router/utils.ts +++ b/packages/router/utils.ts @@ -43,6 +43,7 @@ export interface RedirectResult { status: number; location: string; revalidate: boolean; + reloadDocument?: boolean; } /** From 5719415d70a9078c8178bc843298aebadf2baa62 Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Tue, 11 Jul 2023 11:53:29 -0400 Subject: [PATCH 02/12] Add a helper function, redirectWithReload, to append the X-Remix-Reload-Document header automatically --- packages/react-router-dom-v5-compat/index.ts | 1 + packages/react-router-dom/index.tsx | 1 + packages/react-router-native/index.tsx | 1 + packages/react-router/index.ts | 2 ++ packages/router/index.ts | 1 + packages/router/utils.ts | 17 +++++++++++++++++ 6 files changed, 23 insertions(+) diff --git a/packages/react-router-dom-v5-compat/index.ts b/packages/react-router-dom-v5-compat/index.ts index d38c15c840..ed4d2351fd 100644 --- a/packages/react-router-dom-v5-compat/index.ts +++ b/packages/react-router-dom-v5-compat/index.ts @@ -158,6 +158,7 @@ export { Form, json, redirect, + redirectWithReload, useActionData, useAsyncError, useAsyncValue, diff --git a/packages/react-router-dom/index.tsx b/packages/react-router-dom/index.tsx index cf12bca451..595672b198 100644 --- a/packages/react-router-dom/index.tsx +++ b/packages/react-router-dom/index.tsx @@ -152,6 +152,7 @@ export { matchRoutes, parsePath, redirect, + redirectWithReload, renderMatches, resolvePath, useActionData, diff --git a/packages/react-router-native/index.tsx b/packages/react-router-native/index.tsx index c70d2c9f1a..fd44dde5a3 100644 --- a/packages/react-router-native/index.tsx +++ b/packages/react-router-native/index.tsx @@ -87,6 +87,7 @@ export { matchRoutes, parsePath, redirect, + redirectWithReload, renderMatches, resolvePath, useActionData, diff --git a/packages/react-router/index.ts b/packages/react-router/index.ts index 08979c483d..ad805558dc 100644 --- a/packages/react-router/index.ts +++ b/packages/react-router/index.ts @@ -39,6 +39,7 @@ import { matchRoutes, parsePath, redirect, + redirectWithReload, resolvePath, UNSAFE_warning as warning, } from "@remix-run/router"; @@ -187,6 +188,7 @@ export { matchRoutes, parsePath, redirect, + redirectWithReload, renderMatches, resolvePath, useActionData, diff --git a/packages/router/index.ts b/packages/router/index.ts index 3d4fea9620..cc6c205d3c 100644 --- a/packages/router/index.ts +++ b/packages/router/index.ts @@ -39,6 +39,7 @@ export { matchRoutes, normalizePathname, redirect, + redirectWithReload, resolvePath, resolveTo, stripBasename, diff --git a/packages/router/utils.ts b/packages/router/utils.ts index e2f65ec2f8..f8dc90dc9d 100644 --- a/packages/router/utils.ts +++ b/packages/router/utils.ts @@ -1485,6 +1485,23 @@ export const redirect: RedirectFunction = (url, init = 302) => { }); }; +/** + * A redirect response with a forced document reload. Sets a custom header to + * trigger the client-side reload. + * Defaults to "302 Found". + */ +export const redirectWithReload: RedirectFunction = (url, init = 302) => { + let responseInit = init; + if (typeof responseInit === "number") { + responseInit = { status: responseInit }; + } + + responseInit.headers = new Headers(responseInit.headers); + responseInit.headers.set("X-Remix-Reload-Document", "true"); + + return redirect(url, responseInit); +}; + /** * @private * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies From e0e521bc1448f98f16ddf71741096bba1b9caef2 Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Fri, 14 Jul 2023 15:36:26 -0400 Subject: [PATCH 03/12] add test for X-Remix-Reload-Document header --- packages/router/__tests__/router-test.ts | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/router/__tests__/router-test.ts b/packages/router/__tests__/router-test.ts index 6a48cb2b3e..4e03e35618 100644 --- a/packages/router/__tests__/router-test.ts +++ b/packages/router/__tests__/router-test.ts @@ -7004,6 +7004,45 @@ describe("a router", () => { } }); + it("processes redirects with document reload if header is present (assign)", async () => { + let urls = ["/redirect"]; + + for (let url of urls) { + let t = setup({ routes: REDIRECT_ROUTES }); + + let A = await t.navigate("/parent/child", { + formMethod: "post", + formData: createFormData({}), + }); + + await A.actions.child.redirectReturn(url, 301, { + "X-Remix-Reload-Document": "true", + }); + expect(t.window.location.assign).toHaveBeenCalledWith(url); + expect(t.window.location.replace).not.toHaveBeenCalled(); + } + }); + + it("processes redirects with document reload if header is present (replace)", async () => { + let urls = ["/redirect"]; + + for (let url of urls) { + let t = setup({ routes: REDIRECT_ROUTES }); + + let A = await t.navigate("/parent/child", { + formMethod: "post", + formData: createFormData({}), + replace: true, + }); + + await A.actions.child.redirectReturn(url, 301, { + "X-Remix-Reload-Document": "true", + }); + expect(t.window.location.replace).toHaveBeenCalledWith(url); + expect(t.window.location.assign).not.toHaveBeenCalled(); + } + }); + it("properly handles same-origin absolute URLs", async () => { let t = setup({ routes: REDIRECT_ROUTES }); From afab2125730f8d5c40c789d5ab7f3700a4d1afe3 Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Fri, 14 Jul 2023 16:04:28 -0400 Subject: [PATCH 04/12] add name to contributors.yml --- contributors.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.yml b/contributors.yml index eda6c44c42..6bbf498ac9 100644 --- a/contributors.yml +++ b/contributors.yml @@ -225,3 +225,4 @@ - smithki - istarkov - louis-young +- robbtraister From 9c59c86fac26da359da4b4d519537f4b02abcfd3 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 15:07:11 -0400 Subject: [PATCH 05/12] Minor updates --- .changeset/x-remix-reload-document.md | 9 +++++ packages/router/__tests__/router-test.ts | 50 ++++++++++-------------- packages/router/router.ts | 42 ++++++++++---------- packages/router/utils.ts | 18 +++------ 4 files changed, 57 insertions(+), 62 deletions(-) create mode 100644 .changeset/x-remix-reload-document.md diff --git a/.changeset/x-remix-reload-document.md b/.changeset/x-remix-reload-document.md new file mode 100644 index 0000000000..8b072f31ee --- /dev/null +++ b/.changeset/x-remix-reload-document.md @@ -0,0 +1,9 @@ +--- +"react-router": minor +"react-router-dom": minor +"react-router-dom-v5-compat": minor +"react-router-native": minor +"@remix-run/router": minor +--- + +Add support for the new `X-Remix-Reload-Document` header on loader responses to trigger a document reload of the redirected location diff --git a/packages/router/__tests__/router-test.ts b/packages/router/__tests__/router-test.ts index 4e03e35618..a9e432e05d 100644 --- a/packages/router/__tests__/router-test.ts +++ b/packages/router/__tests__/router-test.ts @@ -7005,42 +7005,34 @@ describe("a router", () => { }); it("processes redirects with document reload if header is present (assign)", async () => { - let urls = ["/redirect"]; - - for (let url of urls) { - let t = setup({ routes: REDIRECT_ROUTES }); + let t = setup({ routes: REDIRECT_ROUTES }); - let A = await t.navigate("/parent/child", { - formMethod: "post", - formData: createFormData({}), - }); + let A = await t.navigate("/parent/child", { + formMethod: "post", + formData: createFormData({}), + }); - await A.actions.child.redirectReturn(url, 301, { - "X-Remix-Reload-Document": "true", - }); - expect(t.window.location.assign).toHaveBeenCalledWith(url); - expect(t.window.location.replace).not.toHaveBeenCalled(); - } + await A.actions.child.redirectReturn("/redirect", 301, { + "X-Remix-Reload-Document": "true", + }); + expect(t.window.location.assign).toHaveBeenCalledWith("/redirect"); + expect(t.window.location.replace).not.toHaveBeenCalled(); }); it("processes redirects with document reload if header is present (replace)", async () => { - let urls = ["/redirect"]; - - for (let url of urls) { - let t = setup({ routes: REDIRECT_ROUTES }); + let t = setup({ routes: REDIRECT_ROUTES }); - let A = await t.navigate("/parent/child", { - formMethod: "post", - formData: createFormData({}), - replace: true, - }); + let A = await t.navigate("/parent/child", { + formMethod: "post", + formData: createFormData({}), + replace: true, + }); - await A.actions.child.redirectReturn(url, 301, { - "X-Remix-Reload-Document": "true", - }); - expect(t.window.location.replace).toHaveBeenCalledWith(url); - expect(t.window.location.assign).not.toHaveBeenCalled(); - } + await A.actions.child.redirectReturn("/redirect", 301, { + "X-Remix-Reload-Document": "true", + }); + expect(t.window.location.replace).toHaveBeenCalledWith("/redirect"); + expect(t.window.location.assign).not.toHaveBeenCalled(); }); it("properly handles same-origin absolute URLs", async () => { diff --git a/packages/router/router.ts b/packages/router/router.ts index 91c7b801d7..f5b65ea6ad 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -2111,31 +2111,31 @@ export function createRouter(init: RouterInit): Router { "Expected a location on the redirect navigation" ); - // Check if this redirect should trigger a document reload - const isDocumentReload = (thisOrigin: string) => { - if (redirect.reloadDocument) { - return true; - } - if (!ABSOLUTE_URL_REGEX.test(redirect.location)) { - return false; - } + if (isBrowser) { + let isDocumentReload = false; - const url = init.history.createURL(redirect.location); - // Check if this an absolute external redirect that goes to a new origin - if (thisOrigin !== url.origin) { - return true; + if (redirect.reloadDocument) { + // Hard reload if the response contained X-Remix-Reload-Document + isDocumentReload = true; + } else if (ABSOLUTE_URL_REGEX.test(redirect.location)) { + const url = init.history.createURL(redirect.location); + if (url.origin !== routerWindow.location.origin) { + // Hard reload if it's an absolute URL to a new origin + isDocumentReload = true; + } else { + // Hard reload if it's an absolute URL that does not match our basename + isDocumentReload = stripBasename(url.pathname, basename) == null; + } } - const isDifferentBasename = stripBasename(url.pathname, basename) == null; - return isDifferentBasename; - }; - if (isBrowser && isDocumentReload(routerWindow.location.origin)) { - if (replace) { - routerWindow.location.replace(redirect.location); - } else { - routerWindow.location.assign(redirect.location); + if (isDocumentReload) { + if (replace) { + routerWindow.location.replace(redirect.location); + } else { + routerWindow.location.assign(redirect.location); + } + return; } - return; } // There's no need to abort on redirects, since we don't detect the diff --git a/packages/router/utils.ts b/packages/router/utils.ts index f8dc90dc9d..56088d3a40 100644 --- a/packages/router/utils.ts +++ b/packages/router/utils.ts @@ -1486,20 +1486,14 @@ export const redirect: RedirectFunction = (url, init = 302) => { }; /** - * A redirect response with a forced document reload. Sets a custom header to - * trigger the client-side reload. + * A redirect response that will force a document reload to the new location. + * Sets the status code and the `Location` header. * Defaults to "302 Found". */ -export const redirectWithReload: RedirectFunction = (url, init = 302) => { - let responseInit = init; - if (typeof responseInit === "number") { - responseInit = { status: responseInit }; - } - - responseInit.headers = new Headers(responseInit.headers); - responseInit.headers.set("X-Remix-Reload-Document", "true"); - - return redirect(url, responseInit); +export const redirectWithReload: RedirectFunction = (url, init) => { + let response = redirect(url, init); + response.headers.set("X-Remix-Reload-Document", "true"); + return response; }; /** From 57cddd4bbd68abd89499339dccb64e1f8b4a502a Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 15:09:55 -0400 Subject: [PATCH 06/12] Remove extra nested if --- packages/router/router.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/router/router.ts b/packages/router/router.ts index f5b65ea6ad..e858a60a1c 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -2119,13 +2119,11 @@ export function createRouter(init: RouterInit): Router { isDocumentReload = true; } else if (ABSOLUTE_URL_REGEX.test(redirect.location)) { const url = init.history.createURL(redirect.location); - if (url.origin !== routerWindow.location.origin) { + isDocumentReload = // Hard reload if it's an absolute URL to a new origin - isDocumentReload = true; - } else { + url.origin !== routerWindow.location.origin || // Hard reload if it's an absolute URL that does not match our basename - isDocumentReload = stripBasename(url.pathname, basename) == null; - } + stripBasename(url.pathname, basename) == null; } if (isDocumentReload) { From 63782de42c712967965e036c6f6fe27a48fff4f1 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 15:14:21 -0400 Subject: [PATCH 07/12] Bump bundle --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index fb371bc83a..8f94e95b69 100644 --- a/package.json +++ b/package.json @@ -109,19 +109,19 @@ }, "filesize": { "packages/router/dist/router.umd.min.js": { - "none": "47.2 kB" + "none": "47.4 kB" }, "packages/react-router/dist/react-router.production.min.js": { - "none": "13.8 kB" + "none": "13.9 kB" }, "packages/react-router/dist/umd/react-router.production.min.js": { - "none": "16.2 kB" + "none": "16.3 kB" }, "packages/react-router-dom/dist/react-router-dom.production.min.js": { "none": "12.8 kB" }, "packages/react-router-dom/dist/umd/react-router-dom.production.min.js": { - "none": "18.7 kB" + "none": "18.9 kB" } } } From e4a6cce77c88ccf1077b44bb931f6b07d3d2b736 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 15:15:05 -0400 Subject: [PATCH 08/12] Update changeset --- .changeset/x-remix-reload-document.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/x-remix-reload-document.md b/.changeset/x-remix-reload-document.md index 8b072f31ee..93efe7cc5d 100644 --- a/.changeset/x-remix-reload-document.md +++ b/.changeset/x-remix-reload-document.md @@ -6,4 +6,4 @@ "@remix-run/router": minor --- -Add support for the new `X-Remix-Reload-Document` header on loader responses to trigger a document reload of the redirected location +Add support for the new `X-Remix-Reload-Document` header on `loader`/`action` responses to trigger a document reload of the redirected location From 09ae5451e55a37160181c0c6abfc4f31b7609f66 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 2 Aug 2023 15:26:16 -0400 Subject: [PATCH 09/12] Rename to redirectDocument --- .changeset/x-remix-reload-document.md | 2 +- packages/react-router-dom-v5-compat/index.ts | 2 +- packages/react-router-dom/index.tsx | 2 +- packages/react-router-native/index.tsx | 2 +- packages/react-router/index.ts | 4 ++-- packages/router/index.ts | 2 +- packages/router/utils.ts | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.changeset/x-remix-reload-document.md b/.changeset/x-remix-reload-document.md index 93efe7cc5d..c2759b3d0c 100644 --- a/.changeset/x-remix-reload-document.md +++ b/.changeset/x-remix-reload-document.md @@ -6,4 +6,4 @@ "@remix-run/router": minor --- -Add support for the new `X-Remix-Reload-Document` header on `loader`/`action` responses to trigger a document reload of the redirected location +Add's a new `redirectDocument()` function which allows users to specify that a redirect from a `loader`/`action` should trigger a document reload (via `window.location`) instead of attempting to navigate to the redirected location via React Router diff --git a/packages/react-router-dom-v5-compat/index.ts b/packages/react-router-dom-v5-compat/index.ts index ed4d2351fd..446631607a 100644 --- a/packages/react-router-dom-v5-compat/index.ts +++ b/packages/react-router-dom-v5-compat/index.ts @@ -158,7 +158,7 @@ export { Form, json, redirect, - redirectWithReload, + redirectDocument, useActionData, useAsyncError, useAsyncValue, diff --git a/packages/react-router-dom/index.tsx b/packages/react-router-dom/index.tsx index f9a5f8f7ec..5cf5763d29 100644 --- a/packages/react-router-dom/index.tsx +++ b/packages/react-router-dom/index.tsx @@ -152,7 +152,7 @@ export { matchRoutes, parsePath, redirect, - redirectWithReload, + redirectDocument, renderMatches, resolvePath, useActionData, diff --git a/packages/react-router-native/index.tsx b/packages/react-router-native/index.tsx index fd44dde5a3..b735aef617 100644 --- a/packages/react-router-native/index.tsx +++ b/packages/react-router-native/index.tsx @@ -87,7 +87,7 @@ export { matchRoutes, parsePath, redirect, - redirectWithReload, + redirectDocument, renderMatches, resolvePath, useActionData, diff --git a/packages/react-router/index.ts b/packages/react-router/index.ts index ad805558dc..592d34a598 100644 --- a/packages/react-router/index.ts +++ b/packages/react-router/index.ts @@ -39,7 +39,7 @@ import { matchRoutes, parsePath, redirect, - redirectWithReload, + redirectDocument, resolvePath, UNSAFE_warning as warning, } from "@remix-run/router"; @@ -188,7 +188,7 @@ export { matchRoutes, parsePath, redirect, - redirectWithReload, + redirectDocument, renderMatches, resolvePath, useActionData, diff --git a/packages/router/index.ts b/packages/router/index.ts index cc6c205d3c..5f58db59c8 100644 --- a/packages/router/index.ts +++ b/packages/router/index.ts @@ -39,7 +39,7 @@ export { matchRoutes, normalizePathname, redirect, - redirectWithReload, + redirectDocument, resolvePath, resolveTo, stripBasename, diff --git a/packages/router/utils.ts b/packages/router/utils.ts index 56088d3a40..7663f6c514 100644 --- a/packages/router/utils.ts +++ b/packages/router/utils.ts @@ -1490,7 +1490,7 @@ export const redirect: RedirectFunction = (url, init = 302) => { * Sets the status code and the `Location` header. * Defaults to "302 Found". */ -export const redirectWithReload: RedirectFunction = (url, init) => { +export const redirectDocument: RedirectFunction = (url, init) => { let response = redirect(url, init); response.headers.set("X-Remix-Reload-Document", "true"); return response; From 69d660b0743eade27403970975c4bf221a3f1ae9 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 2 Aug 2023 15:26:24 -0400 Subject: [PATCH 10/12] Add docs --- docs/fetch/redirectDocument.md | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/fetch/redirectDocument.md diff --git a/docs/fetch/redirectDocument.md b/docs/fetch/redirectDocument.md new file mode 100644 index 0000000000..8ef46b6721 --- /dev/null +++ b/docs/fetch/redirectDocument.md @@ -0,0 +1,46 @@ +--- +title: redirectDocument +new: true +--- + +# `redirectDocument` + +This is a small wrapper around [`redirect`][redirect] that will trigger a document-level redirect to the new location instead of a client-side navigation. + +This is most useful when you have a Remix app living next to a non-Remix app on the same domain and need to redirect from the Remix app to the non-Remix app: + +```jsx +import { redirectDocument } from "react-router-dom"; + +const loader = async () => { + const user = await getUser(); + if (!user) { + return redirectDocument("/otherapp/login"); + } + return null; +}; +``` + +## Type Declaration + +```ts +type RedirectFunction = ( + url: string, + init?: number | ResponseInit +) => Response; +``` + +## `url` + +The URL to redirect to. + +```js +redirectDocument("/otherapp/login"); +``` + +## `init` + +The [Response][response] options to be used in the response. + +[response]: https://developer.mozilla.org/en-US/docs/Web/API/Response/Response +[redirect]: ./redirect From ac986cef92fc47f7bee0ccaf18b0268d83f26fd7 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 2 Aug 2023 15:33:17 -0400 Subject: [PATCH 11/12] Update docs --- docs/fetch/redirectDocument.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fetch/redirectDocument.md b/docs/fetch/redirectDocument.md index 8ef46b6721..c88d68232b 100644 --- a/docs/fetch/redirectDocument.md +++ b/docs/fetch/redirectDocument.md @@ -7,7 +7,7 @@ new: true This is a small wrapper around [`redirect`][redirect] that will trigger a document-level redirect to the new location instead of a client-side navigation. -This is most useful when you have a Remix app living next to a non-Remix app on the same domain and need to redirect from the Remix app to the non-Remix app: +This is most useful when you have a React Router app living next to a separate app on the same domain and need to redirect from the React Router app to the other app via `window.location` instead of a React Router navigation: ```jsx import { redirectDocument } from "react-router-dom"; From 05de4f66d0deb37e3ed227a7500a49cd4030e105 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 2 Aug 2023 15:34:10 -0400 Subject: [PATCH 12/12] Bump bundle --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f94e95b69..d53976bc8b 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ }, "filesize": { "packages/router/dist/router.umd.min.js": { - "none": "47.4 kB" + "none": "47.5 kB" }, "packages/react-router/dist/react-router.production.min.js": { "none": "13.9 kB"