From 5ae997905b8362c3c5ba4361eb67f402d894f747 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Tue, 30 Apr 2024 15:04:47 -0400 Subject: [PATCH] Collapse Packages (#11505) --- .changeset/collapse-packages.md | 7 + .changeset/config.json | 3 +- .changeset/drop-node-16.md | 2 - .github/workflows/release-experimental.yml | 4 +- README.md | 1 - integration/error-data-request-test.ts | 2 +- integration/error-sanitization-test.ts | 2 +- integration/helpers/cf-template/app/root.tsx | 8 +- integration/helpers/create-fixture.ts | 2 +- .../helpers/deno-template/app/root.tsx | 8 +- .../helpers/node-template/app/root.tsx | 8 +- .../vite-cloudflare-template/app/root.tsx | 8 +- .../helpers/vite-template/app/root.tsx | 8 +- integration/package.json | 3 +- jest/jest.config.shared.js | 11 +- package.json | 14 +- packages/react-router-dom/.eslintrc | 13 - packages/react-router-dom/.gitignore | 4 - packages/react-router-dom/CHANGELOG.md | 839 ------------------ packages/react-router-dom/README.md | 4 +- .../__tests__/exports-test.tsx | 28 - packages/react-router-dom/__tests__/setup.ts | 38 - .../react-router-dom/{index.tsx => index.ts} | 175 ++-- packages/react-router-dom/jest.config.js | 8 - packages/react-router-dom/package.json | 12 +- packages/react-router-dom/rollup.config.js | 140 +-- packages/react-router-dom/tsconfig.json | 5 +- .../__tests__/data-memory-router-test.tsx | 6 +- .../descendant-routes-splat-matching-test.tsx | 2 +- .../dom}/components/LazyComponent.tsx | 0 .../dom}/concurrent-mode-navigations-test.tsx | 6 +- ...ta-browser-router-legacy-formdata-test.tsx | 2 +- .../dom}/data-browser-router-test.tsx | 14 +- .../dom}/data-static-router-test.tsx | 8 +- .../dom}/flush-sync-navigations-test.tsx | 6 +- .../__tests__/dom}/link-click-test.tsx | 2 +- .../__tests__/dom}/link-href-test.tsx | 2 +- .../__tests__/dom}/link-push-test.tsx | 2 +- .../__tests__/dom}/nav-link-active-test.tsx | 2 +- .../dom}/navigate-encode-params-test.tsx | 2 +- .../__tests__/dom}/partial-hydration-test.tsx | 6 +- .../dom}/polyfills/drop-FormData-submitter.ts | 0 .../dom}/scroll-restoration-test.tsx | 8 +- .../__tests__/dom}/search-params-test.tsx | 2 +- .../dom}/special-characters-test.tsx | 6 +- .../__tests__/dom}/ssr/components-test.tsx | 12 +- .../__tests__/dom}/ssr/meta-test.tsx | 3 +- .../__tests__/dom}/static-link-test.tsx | 3 +- .../__tests__/dom}/static-location-test.tsx | 3 +- .../__tests__/dom}/static-navigate-test.tsx | 3 +- .../__tests__/dom}/stub-test.tsx | 7 +- .../__tests__/dom}/trailing-slashes-test.tsx | 4 +- .../__tests__/dom}/use-blocker-test.tsx | 4 +- .../__tests__/dom}/use-prompt-test.tsx | 2 +- .../dom}/useLinkClickHandler-test.tsx | 4 +- .../__tests__/gh-issue-8127-test.tsx | 2 +- .../__tests__/gh-issue-8165-test.tsx | 2 +- .../__tests__/greedy-matching-test.tsx | 2 +- .../EncodedReservedCharacters.ts | 2 +- .../__tests__/router}/TestSequences/GoBack.ts | 2 +- .../router}/TestSequences/GoForward.ts | 2 +- .../InitialLocationDefaultKey.ts | 2 +- .../TestSequences/InitialLocationHasKey.ts | 2 +- .../__tests__/router}/TestSequences/Listen.ts | 2 +- .../router}/TestSequences/ListenPopOnly.ts | 2 +- .../TestSequences/PushMissingPathname.ts | 2 +- .../router}/TestSequences/PushNewLocation.ts | 2 +- .../TestSequences/PushRelativePathname.ts | 2 +- .../PushRelativePathnameWarning.ts | 2 +- .../router}/TestSequences/PushSamePath.ts | 2 +- .../router}/TestSequences/PushState.ts | 2 +- .../router}/TestSequences/PushStateInvalid.ts | 2 +- .../TestSequences/ReplaceNewLocation.ts | 2 +- .../router}/TestSequences/ReplaceSamePath.ts | 2 +- .../router}/TestSequences/ReplaceState.ts | 2 +- .../__tests__/router}/browser-test.ts | 4 +- .../__tests__/router}/create-path-test.ts | 2 +- .../__tests__/router}/data-strategy-test.ts | 4 +- .../__tests__/router}/defer-test.ts | 10 +- .../__tests__/router}/fetchers-test.ts | 8 +- .../__tests__/router}/flush-sync-test.ts | 0 .../__tests__/router}/hash-base-test.ts | 4 +- .../__tests__/router}/hash-test.ts | 4 +- .../__tests__/router}/interruptions-test.ts | 4 +- .../__tests__/router}/lazy-test.ts | 2 +- .../__tests__/router}/memory-test.ts | 4 +- .../router}/navigation-blocking-test.ts | 4 +- .../__tests__/router}/navigation-test.ts | 4 +- .../__tests__/router}/path-resolution-test.ts | 4 +- .../__tests__/router}/redirects-test.ts | 2 +- .../__tests__/router}/resolveTo-test.tsx | 2 +- .../__tests__/router}/revalidate-test.ts | 2 +- .../__tests__/router}/route-fallback-test.ts | 8 +- .../__tests__/router}/router-memory-test.ts | 2 +- .../__tests__/router}/router-test.ts | 15 +- .../router}/scroll-restoration-test.ts | 0 .../router}/should-revalidate-test.ts | 6 +- .../__tests__/router}/ssr-test.ts | 8 +- .../__tests__/router}/submission-test.ts | 4 +- .../router}/utils/custom-matchers.ts | 4 +- .../router}/utils/data-router-setup.ts | 10 +- .../router}/utils/urlDataStrategy.ts | 2 +- .../__tests__/router}/utils/utils.ts | 0 .../__tests__/router}/view-transition-test.ts | 2 +- packages/react-router/__tests__/setup.ts | 21 +- .../__tests__/utils/MemoryNavigate.tsx | 6 +- packages/react-router/index.ts | 239 +++-- packages/react-router/jest.config.js | 5 +- packages/react-router/lib/components.tsx | 98 +- packages/react-router/lib/context.ts | 2 +- .../lib/dom}/dom.ts | 4 +- .../lib/dom}/global.ts | 2 +- .../lib/dom}/lib.tsx | 84 +- packages/react-router/lib/dom/node-main.js | 7 + .../lib/dom}/server.tsx | 26 +- .../lib/dom}/ssr/browser.tsx | 16 +- .../lib/dom}/ssr/components.tsx | 84 +- .../lib/dom/ssr}/create-remix-stub.tsx | 49 +- .../lib/dom}/ssr/data.ts | 2 +- .../lib/dom}/ssr/entry.ts | 2 +- .../lib/dom}/ssr/errorBoundaries.tsx | 4 +- .../lib/dom}/ssr/errors.ts | 4 +- .../lib/dom}/ssr/fallback.tsx | 0 .../lib/dom}/ssr/invariant.ts | 0 .../lib/dom}/ssr/links.ts | 5 +- .../lib/dom}/ssr/markup.ts | 0 .../lib/dom}/ssr/routeModules.ts | 21 +- .../lib/dom}/ssr/routes.tsx | 13 +- .../lib/dom}/ssr/server.tsx | 0 .../lib/dom}/ssr/single-fetch.tsx | 34 +- packages/react-router/lib/hooks.tsx | 4 +- .../{ => react-router/lib}/router/history.ts | 0 .../{ => react-router/lib}/router/index.ts | 0 .../{ => react-router/lib}/router/router.ts | 0 .../{ => react-router/lib}/router/utils.ts | 0 packages/react-router/package.json | 12 +- packages/react-router/rollup.config.js | 46 +- packages/react-router/tsconfig.json | 5 +- .../config/defaults/entry.client.tsx | 2 +- .../defaults/entry.server.cloudflare.tsx | 2 +- .../config/defaults/entry.server.node.tsx | 2 +- .../config/defaults/entry.server.spa.tsx | 2 +- packages/remix-dev/package.json | 12 +- packages/remix-dev/tsconfig.json | 1 + packages/remix-dev/vite/styles.ts | 2 +- packages/remix-express/package.json | 6 +- packages/remix-express/tsconfig.json | 1 + packages/remix-node/package.json | 6 +- packages/remix-node/tsconfig.json | 1 + packages/remix-serve/package.json | 6 +- packages/remix-serve/tsconfig.json | 1 + .../__tests__/handle-error-test.ts | 2 +- .../__tests__/server-test.ts | 2 +- packages/remix-server-runtime/entry.ts | 2 +- packages/remix-server-runtime/errors.ts | 4 +- packages/remix-server-runtime/headers.ts | 2 +- packages/remix-server-runtime/index.ts | 5 - packages/remix-server-runtime/package.json | 8 +- packages/remix-server-runtime/reexport.ts | 2 +- packages/remix-server-runtime/responses.ts | 4 +- .../remix-server-runtime/routeMatching.ts | 4 +- packages/remix-server-runtime/routeModules.ts | 2 +- packages/remix-server-runtime/routes.ts | 2 +- packages/remix-server-runtime/server.ts | 4 +- .../remix-server-runtime/serverHandoff.ts | 2 +- packages/remix-server-runtime/single-fetch.ts | 26 +- packages/remix-server-runtime/tsconfig.json | 1 + packages/remix-testing/CHANGELOG.md | 465 ---------- packages/remix-testing/README.md | 13 - packages/remix-testing/index.ts | 2 - packages/remix-testing/jest.config.js | 11 - packages/remix-testing/jest.setup.js | 8 - packages/remix-testing/package.json | 55 -- packages/remix-testing/rollup.config.js | 73 -- packages/remix-testing/tsconfig.json | 19 - packages/router/.eslintrc | 10 - packages/router/CHANGELOG.md | 732 --------------- packages/router/README.md | 135 --- packages/router/__tests__/.eslintrc | 8 - packages/router/__tests__/setup.ts | 25 - packages/router/jest.config.js | 5 - packages/router/package.json | 33 - packages/router/rollup.config.js | 81 -- packages/router/tsconfig.json | 20 - .../compiler-express/app/entry.client.tsx | 2 +- .../compiler-express/app/entry.server.tsx | 2 +- playground/compiler-express/app/root.tsx | 8 +- playground/compiler-express/package.json | 3 +- playground/compiler-spa/app/entry.client.tsx | 2 +- playground/compiler-spa/app/entry.server.tsx | 2 +- playground/compiler-spa/app/root.tsx | 8 +- playground/compiler-spa/package.json | 3 +- playground/compiler/app/entry.client.tsx | 2 +- playground/compiler/app/entry.server.tsx | 2 +- playground/compiler/app/root.tsx | 8 +- playground/compiler/package.json | 3 +- pnpm-lock.yaml | 180 ++-- pnpm-workspace.yaml | 2 - rollup.config.js | 7 +- rollup.utils.js | 2 +- scripts/publish.js | 16 +- scripts/version.js | 59 +- tsconfig.json | 6 +- 203 files changed, 938 insertions(+), 3628 deletions(-) create mode 100644 .changeset/collapse-packages.md delete mode 100644 packages/react-router-dom/.eslintrc delete mode 100644 packages/react-router-dom/.gitignore delete mode 100644 packages/react-router-dom/CHANGELOG.md delete mode 100644 packages/react-router-dom/__tests__/exports-test.tsx delete mode 100644 packages/react-router-dom/__tests__/setup.ts rename packages/react-router-dom/{index.tsx => index.ts} (70%) delete mode 100644 packages/react-router-dom/jest.config.js rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/components/LazyComponent.tsx (100%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/concurrent-mode-navigations-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/data-browser-router-legacy-formdata-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/data-browser-router-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/data-static-router-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/flush-sync-navigations-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/link-click-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/link-href-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/link-push-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/nav-link-active-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/navigate-encode-params-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/partial-hydration-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/polyfills/drop-FormData-submitter.ts (100%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/scroll-restoration-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/search-params-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/special-characters-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/ssr/components-test.tsx (95%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/ssr/meta-test.tsx (98%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/static-link-test.tsx (93%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/static-location-test.tsx (92%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/static-navigate-test.tsx (87%) rename packages/{remix-testing/__tests__ => react-router/__tests__/dom}/stub-test.tsx (96%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/trailing-slashes-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/use-blocker-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/use-prompt-test.tsx (99%) rename packages/{react-router-dom/__tests__ => react-router/__tests__/dom}/useLinkClickHandler-test.tsx (98%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/EncodedReservedCharacters.ts (90%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/GoBack.ts (94%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/GoForward.ts (96%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/InitialLocationDefaultKey.ts (66%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/InitialLocationHasKey.ts (65%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/Listen.ts (73%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/ListenPopOnly.ts (84%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushMissingPathname.ts (90%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushNewLocation.ts (86%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushRelativePathname.ts (90%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushRelativePathnameWarning.ts (92%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushSamePath.ts (92%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushState.ts (86%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/PushStateInvalid.ts (88%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/ReplaceNewLocation.ts (90%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/ReplaceSamePath.ts (89%) rename packages/{router/__tests__ => react-router/__tests__/router}/TestSequences/ReplaceState.ts (86%) rename packages/{router/__tests__ => react-router/__tests__/router}/browser-test.ts (97%) rename packages/{router/__tests__ => react-router/__tests__/router}/create-path-test.ts (97%) rename packages/{router/__tests__ => react-router/__tests__/router}/data-strategy-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/defer-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/fetchers-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/flush-sync-test.ts (100%) rename packages/{router/__tests__ => react-router/__tests__/router}/hash-base-test.ts (91%) rename packages/{router/__tests__ => react-router/__tests__/router}/hash-test.ts (97%) rename packages/{router/__tests__ => react-router/__tests__/router}/interruptions-test.ts (98%) rename packages/{router/__tests__ => react-router/__tests__/router}/lazy-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/memory-test.ts (97%) rename packages/{router/__tests__ => react-router/__tests__/router}/navigation-blocking-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/navigation-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/path-resolution-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/redirects-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/resolveTo-test.tsx (93%) rename packages/{router/__tests__ => react-router/__tests__/router}/revalidate-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/route-fallback-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/router-memory-test.ts (98%) rename packages/{router/__tests__ => react-router/__tests__/router}/router-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/scroll-restoration-test.ts (100%) rename packages/{router/__tests__ => react-router/__tests__/router}/should-revalidate-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/ssr-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/submission-test.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/utils/custom-matchers.ts (95%) rename packages/{router/__tests__ => react-router/__tests__/router}/utils/data-router-setup.ts (99%) rename packages/{router/__tests__ => react-router/__tests__/router}/utils/urlDataStrategy.ts (96%) rename packages/{router/__tests__ => react-router/__tests__/router}/utils/utils.ts (100%) rename packages/{router/__tests__ => react-router/__tests__/router}/view-transition-test.ts (97%) rename packages/{react-router-dom => react-router/lib/dom}/dom.ts (98%) rename packages/{react-router-dom => react-router/lib/dom}/global.ts (94%) rename packages/{react-router-dom => react-router/lib/dom}/lib.tsx (99%) create mode 100644 packages/react-router/lib/dom/node-main.js rename packages/{react-router-dom => react-router/lib/dom}/server.tsx (96%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/browser.tsx (97%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/components.tsx (93%) rename packages/{remix-testing => react-router/lib/dom/ssr}/create-remix-stub.tsx (84%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/data.ts (99%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/entry.ts (95%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/errorBoundaries.tsx (97%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/errors.ts (90%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/fallback.tsx (100%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/invariant.ts (100%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/links.ts (98%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/markup.ts (100%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/routeModules.ts (91%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/routes.tsx (98%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/server.tsx (100%) rename packages/{react-router-dom => react-router/lib/dom}/ssr/single-fetch.tsx (94%) rename packages/{ => react-router/lib}/router/history.ts (100%) rename packages/{ => react-router/lib}/router/index.ts (100%) rename packages/{ => react-router/lib}/router/router.ts (100%) rename packages/{ => react-router/lib}/router/utils.ts (100%) delete mode 100644 packages/remix-testing/CHANGELOG.md delete mode 100644 packages/remix-testing/README.md delete mode 100644 packages/remix-testing/index.ts delete mode 100644 packages/remix-testing/jest.config.js delete mode 100644 packages/remix-testing/jest.setup.js delete mode 100644 packages/remix-testing/package.json delete mode 100644 packages/remix-testing/rollup.config.js delete mode 100644 packages/remix-testing/tsconfig.json delete mode 100644 packages/router/.eslintrc delete mode 100644 packages/router/CHANGELOG.md delete mode 100644 packages/router/README.md delete mode 100644 packages/router/__tests__/.eslintrc delete mode 100644 packages/router/__tests__/setup.ts delete mode 100644 packages/router/jest.config.js delete mode 100644 packages/router/package.json delete mode 100644 packages/router/rollup.config.js delete mode 100644 packages/router/tsconfig.json diff --git a/.changeset/collapse-packages.md b/.changeset/collapse-packages.md new file mode 100644 index 0000000000..770ba359e7 --- /dev/null +++ b/.changeset/collapse-packages.md @@ -0,0 +1,7 @@ +--- +"react-router": major +--- + +- Collapse `@remix-run/router` into `react-router` +- Collapse `react-router-dom` into `react-router` +- Collapse `@remix-run/testing` into `react-router` diff --git a/.changeset/config.json b/.changeset/config.json index c60f1994a0..e0d60b0475 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -13,8 +13,7 @@ "@react-router/express", "@react-router/node", "@react-router/serve", - "@react-router/server-runtime", - "@react-router/testing" + "@react-router/server-runtime" ] ], "linked": [], diff --git a/.changeset/drop-node-16.md b/.changeset/drop-node-16.md index 1026973d63..be3759da73 100644 --- a/.changeset/drop-node-16.md +++ b/.changeset/drop-node-16.md @@ -1,7 +1,5 @@ --- -"react-router-dom": major "react-router": major -"@remix-run/router": major --- Drop support for Node 16, React Router SSR now requires Node 18 or higher diff --git a/.github/workflows/release-experimental.yml b/.github/workflows/release-experimental.yml index 4e6feaa4d4..f69d4dd500 100644 --- a/.github/workflows/release-experimental.yml +++ b/.github/workflows/release-experimental.yml @@ -22,7 +22,7 @@ jobs: with: ref: ${{ github.event.inputs.branch }} # checkout using a custom token so that we can push later on - token: ${{ secrets.NIGHTLY_PAT }} + token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 - name: 📦 Setup pnpm @@ -32,7 +32,7 @@ jobs: uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" - cache: pnpm + cache: "pnpm" - name: 📥 Install deps run: pnpm install --frozen-lockfile diff --git a/README.md b/README.md index f3170517ad..abad653026 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,6 @@ This repository is a monorepo containing the following packages: - [`@react-router/node`](/packages/remix-node) - [`@react-router/serve`](/packages/remix-serve) - [`@react-router/server-runtime`](/packages/remix-server-runtime) -- [`@react-router/testing`](/packages/remix-testing) - [`react-router`](/packages/react-router) - [`react-router-dom`](/packages/react-router-dom) diff --git a/integration/error-data-request-test.ts b/integration/error-data-request-test.ts index f8c434ff0f..0ec1c1464f 100644 --- a/integration/error-data-request-test.ts +++ b/integration/error-data-request-test.ts @@ -1,5 +1,5 @@ import { test, expect } from "@playwright/test"; -import { UNSAFE_ErrorResponseImpl as ErrorResponseImpl } from "@remix-run/router"; +import { UNSAFE_ErrorResponseImpl as ErrorResponseImpl } from "react-router"; import { createAppFixture, diff --git a/integration/error-sanitization-test.ts b/integration/error-sanitization-test.ts index 152e2c474b..13ba7f622a 100644 --- a/integration/error-sanitization-test.ts +++ b/integration/error-sanitization-test.ts @@ -1,5 +1,5 @@ import { test, expect } from "@playwright/test"; -import { UNSAFE_ErrorResponseImpl as ErrorResponseImpl } from "@remix-run/router"; +import { UNSAFE_ErrorResponseImpl as ErrorResponseImpl } from "react-router"; import { UNSAFE_ServerMode as ServerMode } from "@react-router/server-runtime"; import type { Fixture } from "./helpers/create-fixture.js"; diff --git a/integration/helpers/cf-template/app/root.tsx b/integration/helpers/cf-template/app/root.tsx index 103a927da8..b36392b4dd 100644 --- a/integration/helpers/cf-template/app/root.tsx +++ b/integration/helpers/cf-template/app/root.tsx @@ -1,10 +1,4 @@ -import { - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router-dom"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; export default function App() { return ( diff --git a/integration/helpers/create-fixture.ts b/integration/helpers/create-fixture.ts index 3ed93af036..48f0715398 100644 --- a/integration/helpers/create-fixture.ts +++ b/integration/helpers/create-fixture.ts @@ -13,7 +13,7 @@ import type { ServerBuild } from "@react-router/server-runtime"; import { createRequestHandler } from "@react-router/server-runtime"; import { createRequestHandler as createExpressHandler } from "@react-router/express"; import { installGlobals } from "@react-router/node"; -import { UNSAFE_decodeViaTurboStream as decodeViaTurboStream } from "react-router-dom"; +import { UNSAFE_decodeViaTurboStream as decodeViaTurboStream } from "react-router"; import { viteConfig } from "./vite.js"; diff --git a/integration/helpers/deno-template/app/root.tsx b/integration/helpers/deno-template/app/root.tsx index 2b60fb485d..7c5ae1b45b 100644 --- a/integration/helpers/deno-template/app/root.tsx +++ b/integration/helpers/deno-template/app/root.tsx @@ -1,10 +1,4 @@ -import { - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router-dom"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; import * as React from "react"; export default function App() { diff --git a/integration/helpers/node-template/app/root.tsx b/integration/helpers/node-template/app/root.tsx index 103a927da8..b36392b4dd 100644 --- a/integration/helpers/node-template/app/root.tsx +++ b/integration/helpers/node-template/app/root.tsx @@ -1,10 +1,4 @@ -import { - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router-dom"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; export default function App() { return ( diff --git a/integration/helpers/vite-cloudflare-template/app/root.tsx b/integration/helpers/vite-cloudflare-template/app/root.tsx index 103a927da8..b36392b4dd 100644 --- a/integration/helpers/vite-cloudflare-template/app/root.tsx +++ b/integration/helpers/vite-cloudflare-template/app/root.tsx @@ -1,10 +1,4 @@ -import { - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router-dom"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; export default function App() { return ( diff --git a/integration/helpers/vite-template/app/root.tsx b/integration/helpers/vite-template/app/root.tsx index 103a927da8..b36392b4dd 100644 --- a/integration/helpers/vite-template/app/root.tsx +++ b/integration/helpers/vite-template/app/root.tsx @@ -1,10 +1,4 @@ -import { - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router-dom"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; export default function App() { return ( diff --git a/integration/package.json b/integration/package.json index 21a9bd0cff..6dec322e70 100644 --- a/integration/package.json +++ b/integration/package.json @@ -14,7 +14,6 @@ "@react-router/dev": "workspace:*", "@react-router/express": "workspace:*", "@react-router/node": "workspace:*", - "@remix-run/router": "workspace:*", "@react-router/server-runtime": "workspace:*", "@types/express": "^4.17.9", "@vanilla-extract/css": "^1.10.0", @@ -35,7 +34,7 @@ "prettier": "^2.7.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "workspace:*", + "react-router": "workspace:*", "serialize-javascript": "^6.0.1", "shelljs": "^0.8.5", "strip-ansi": "^6.0.1", diff --git a/jest/jest.config.shared.js b/jest/jest.config.shared.js index d76289b1a5..1be05b0363 100644 --- a/jest/jest.config.shared.js +++ b/jest/jest.config.shared.js @@ -9,9 +9,13 @@ const ignorePatterns = [ /** @type {import('jest').Config} */ module.exports = { moduleNameMapper: { - "^@remix-run/router$": "/../router/index.ts", + "@react-router/dev$": "/../remix-dev/index.ts", + "@react-router/express$": "/../remix-express/index.ts", + "@react-router/node$": "/../remix-node/index.ts", + "@react-router/serve$": "/../remix-serve/index.ts", + "@react-router/server-runtime$": + "/../remix-server-runtime/index.ts", "^react-router$": "/../react-router/index.ts", - "^react-router-dom$": "/../react-router-dom/index.tsx", "^@web3-storage/multipart-parser$": require.resolve( "@web3-storage/multipart-parser" ), @@ -23,4 +27,7 @@ module.exports = { "\\.[jt]sx?$": require.resolve("./transform"), }, watchPathIgnorePatterns: [...ignorePatterns, "\\/node_modules\\/"], + globals: { + __DEV__: true, + }, }; diff --git a/package.json b/package.json index 7ac16ccf60..2b2e08b84a 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "scripts": { "build": "rollup -c", "clean": "git clean -fdX .", + "clean:build": "git clean -fdx -e node_modules .", "clean:integration": "node ./integration/helpers/cleanup.mjs", "format": "prettier --ignore-path .eslintignore --write .", "format:check": "prettier --ignore-path .eslintignore --check .", @@ -127,20 +128,11 @@ "node": ">=14.0.0" }, "filesize": { - "packages/router/dist/router.umd.min.js": { - "none": "52.8 kB" - }, "packages/react-router/dist/react-router.production.min.js": { - "none": "14.8 kB" + "none": "115.5 kB" }, "packages/react-router/dist/umd/react-router.production.min.js": { - "none": "17.21 kB" - }, - "packages/react-router-dom/dist/react-router-dom.production.min.js": { - "none": "17.1 kB" - }, - "packages/react-router-dom/dist/umd/react-router-dom.production.min.js": { - "none": "23.5 kB" + "none": "120 kB" } }, "pnpm": { diff --git a/packages/react-router-dom/.eslintrc b/packages/react-router-dom/.eslintrc deleted file mode 100644 index 7258667c7e..0000000000 --- a/packages/react-router-dom/.eslintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true - }, - "globals": { - "__DEV__": true - }, - "rules": { - "strict": 0, - "no-restricted-syntax": ["error", "LogicalExpression[operator='??']"] - } -} diff --git a/packages/react-router-dom/.gitignore b/packages/react-router-dom/.gitignore deleted file mode 100644 index 810d45f6ae..0000000000 --- a/packages/react-router-dom/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# TODO: Delete in v7 -server.js -server.mjs -server.d.ts diff --git a/packages/react-router-dom/CHANGELOG.md b/packages/react-router-dom/CHANGELOG.md deleted file mode 100644 index c19bc004b8..0000000000 --- a/packages/react-router-dom/CHANGELOG.md +++ /dev/null @@ -1,839 +0,0 @@ -# `react-router-dom` - -## 6.23.0 - -### Minor Changes - -- Add a new `unstable_dataStrategy` configuration option ([#11098](/~https://github.com/remix-run/react-router/pull/11098)) - - This option allows Data Router applications to take control over the approach for executing route loaders and actions - - The default implementation is today's behavior, to fetch all loaders in parallel, but this option allows users to implement more advanced data flows including Remix single-fetch, middleware/context APIs, automatic loader caching, and more - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.16.0` - - `react-router@6.23.0` - -## 6.22.3 - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.15.3` - - `react-router@6.22.3` - -## 6.22.2 - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.15.2` - - `react-router@6.22.2` - -## 6.22.1 - -### Patch Changes - -- Updated dependencies: - - `react-router@6.22.1` - - `@remix-run/router@1.15.1` - -## 6.22.0 - -### Minor Changes - -- Include a `window__reactRouterVersion` tag for CWV Report detection ([#11222](/~https://github.com/remix-run/react-router/pull/11222)) - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.15.0` - - `react-router@6.22.0` - -## 6.21.3 - -### Patch Changes - -- Fix `NavLink` `isPending` when a `basename` is used ([#11195](/~https://github.com/remix-run/react-router/pull/11195)) -- Remove leftover `unstable_` prefix from `Blocker`/`BlockerFunction` types ([#11187](/~https://github.com/remix-run/react-router/pull/11187)) -- Updated dependencies: - - `react-router@6.21.3` - -## 6.21.2 - -### Patch Changes - -- Leverage `useId` for internal fetcher keys when available ([#11166](/~https://github.com/remix-run/react-router/pull/11166)) -- Updated dependencies: - - `@remix-run/router@1.14.2` - - `react-router@6.21.2` - -## 6.21.1 - -### Patch Changes - -- Updated dependencies: - - `react-router@6.21.1` - - `@remix-run/router@1.14.1` - -## 6.21.0 - -### Minor Changes - -- Add a new `future.v7_relativeSplatPath` flag to implement a breaking bug fix to relative routing when inside a splat route. ([#11087](/~https://github.com/remix-run/react-router/pull/11087)) - - This fix was originally added in [#10983](/~https://github.com/remix-run/react-router/issues/10983) and was later reverted in [#11078](/~https://github.com/remix-run/react-router/pull/11078) because it was determined that a large number of existing applications were relying on the buggy behavior (see [#11052](/~https://github.com/remix-run/react-router/issues/11052)) - - **The Bug** - The buggy behavior is that without this flag, the default behavior when resolving relative paths is to _ignore_ any splat (`*`) portion of the current route path. - - **The Background** - This decision was originally made thinking that it would make the concept of nested different sections of your apps in `` easier if relative routing would _replace_ the current splat: - - ```jsx - - - } /> - } /> - - - ``` - - Any paths like `/dashboard`, `/dashboard/team`, `/dashboard/projects` will match the `Dashboard` route. The dashboard component itself can then render nested ``: - - ```jsx - function Dashboard() { - return ( -
-

Dashboard

- - - - } /> - } /> - } /> - -
- ); - } - ``` - - Now, all links and route paths are relative to the router above them. This makes code splitting and compartmentalizing your app really easy. You could render the `Dashboard` as its own independent app, or embed it into your large app without making any changes to it. - - **The Problem** - - The problem is that this concept of ignoring part of a path breaks a lot of other assumptions in React Router - namely that `"."` always means the current location pathname for that route. When we ignore the splat portion, we start getting invalid paths when using `"."`: - - ```jsx - // If we are on URL /dashboard/team, and we want to link to /dashboard/team: - function DashboardTeam() { - // ❌ This is broken and results in - return A broken link to the Current URL; - - // ✅ This is fixed but super unintuitive since we're already at /dashboard/team! - return A broken link to the Current URL; - } - ``` - - We've also introduced an issue that we can no longer move our `DashboardTeam` component around our route hierarchy easily - since it behaves differently if we're underneath a non-splat route, such as `/dashboard/:widget`. Now, our `"."` links will, properly point to ourself _inclusive of the dynamic param value_ so behavior will break from it's corresponding usage in a `/dashboard/*` route. - - Even worse, consider a nested splat route configuration: - - ```jsx - - - - } /> - - - - ``` - - Now, a `` and a `` inside the `Dashboard` component go to the same place! That is definitely not correct! - - Another common issue arose in Data Routers (and Remix) where any `
` should post to it's own route `action` if you the user doesn't specify a form action: - - ```jsx - let router = createBrowserRouter({ - path: "/dashboard", - children: [ - { - path: "*", - action: dashboardAction, - Component() { - // ❌ This form is broken! It throws a 405 error when it submits because - // it tries to submit to /dashboard (without the splat value) and the parent - // `/dashboard` route doesn't have an action - return ...
; - }, - }, - ], - }); - ``` - - This is just a compounded issue from the above because the default location for a `Form` to submit to is itself (`"."`) - and if we ignore the splat portion, that now resolves to the parent route. - - **The Solution** - If you are leveraging this behavior, it's recommended to enable the future flag, move your splat to it's own route, and leverage `../` for any links to "sibling" pages: - - ```jsx - - - - } /> - - - - - function Dashboard() { - return ( -
-

Dashboard

- - - - } /> - } /> - } /> - -
- ); - } - ``` - - This way, `.` means "the full current pathname for my route" in all cases (including static, dynamic, and splat routes) and `..` always means "my parents pathname". - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.14.0` - - `react-router@6.21.0` - -## 6.20.1 - -### Patch Changes - -- Revert the `useResolvedPath` fix for splat routes due to a large number of applications that were relying on the buggy behavior (see ). We plan to re-introduce this fix behind a future flag in the next minor version. ([#11078](/~https://github.com/remix-run/react-router/pull/11078)) -- Updated dependencies: - - `react-router@6.20.1` - - `@remix-run/router@1.13.1` - -## 6.20.0 - -### Minor Changes - -- Export the `PathParam` type from the public API ([#10719](/~https://github.com/remix-run/react-router/pull/10719)) - -### Patch Changes - -- Updated dependencies: - - `react-router@6.20.0` - - `@remix-run/router@1.13.0` - -## 6.19.0 - -### Minor Changes - -- Add `unstable_flushSync` option to `useNavigate`/`useSumbit`/`fetcher.load`/`fetcher.submit` to opt-out of `React.startTransition` and into `ReactDOM.flushSync` for state updates ([#11005](/~https://github.com/remix-run/react-router/pull/11005)) -- Allow `unstable_usePrompt` to accept a `BlockerFunction` in addition to a `boolean` ([#10991](/~https://github.com/remix-run/react-router/pull/10991)) - -### Patch Changes - -- Fix issue where a changing fetcher `key` in a `useFetcher` that remains mounted wasn't getting picked up ([#11009](/~https://github.com/remix-run/react-router/pull/11009)) -- Fix `useFormAction` which was incorrectly inheriting the `?index` query param from child route `action` submissions ([#11025](/~https://github.com/remix-run/react-router/pull/11025)) -- Fix `NavLink` `active` logic when `to` location has a trailing slash ([#10734](/~https://github.com/remix-run/react-router/pull/10734)) -- Updated dependencies: - - `react-router@6.19.0` - - `@remix-run/router@1.12.0` - -## 6.18.0 - -### Minor Changes - -- Add support for manual fetcher key specification via `useFetcher({ key: string })` so you can access the same fetcher instance from different components in your application without prop-drilling ([RFC](/~https://github.com/remix-run/remix/discussions/7698)) ([#10960](/~https://github.com/remix-run/react-router/pull/10960)) - - - Fetcher keys are now also exposed on the fetchers returned from `useFetchers` so that they can be looked up by `key` - -- Add `navigate`/`fetcherKey` params/props to `useSumbit`/`Form` to support kicking off a fetcher submission under the hood with an optionally user-specified `key` ([#10960](/~https://github.com/remix-run/react-router/pull/10960)) - - - Invoking a fetcher in this way is ephemeral and stateless - - If you need to access the state of one of these fetchers, you will need to leverage `useFetcher({ key })` to look it up elsewhere - -### Patch Changes - -- Adds a fetcher context to `RouterProvider` that holds completed fetcher data, in preparation for the upcoming future flag that will change the fetcher persistence/cleanup behavior ([#10961](/~https://github.com/remix-run/react-router/pull/10961)) -- Fix the `future` prop on `BrowserRouter`, `HashRouter` and `MemoryRouter` so that it accepts a `Partial` instead of requiring all flags to be included. ([#10962](/~https://github.com/remix-run/react-router/pull/10962)) -- Updated dependencies: - - `@remix-run/router@1.11.0` - - `react-router@6.18.0` - -## 6.17.0 - -### Minor Changes - -- Add experimental support for the [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/ViewTransition) via `document.startViewTransition` to enable CSS animated transitions on SPA navigations in your application. ([#10916](/~https://github.com/remix-run/react-router/pull/10916)) - - The simplest approach to enabling a View Transition in your React Router app is via the new `` prop. This will cause the navigation DOM update to be wrapped in `document.startViewTransition` which will enable transitions for the DOM update. Without any additional CSS styles, you'll get a basic cross-fade animation for your page. - - If you need to apply more fine-grained styles for your animations, you can leverage the `unstable_useViewTransitionState` hook which will tell you when a transition is in progress and you can use that to apply classes or styles: - - ```jsx - function ImageLink(to, src, alt) { - let isTransitioning = unstable_useViewTransitionState(to); - return ( - - {alt} - - ); - } - ``` - - You can also use the `` shorthand which will manage the hook usage for you and automatically add a `transitioning` class to the `
` during the transition: - - ```css - a.transitioning img { - view-transition-name: "image-expand"; - } - ``` - - ```jsx - - {alt} - - ``` - - For an example usage of View Transitions with React Router, check out [our fork](/~https://github.com/brophdawg11/react-router-records) of the [Astro Records](/~https://github.com/Charca/astro-records) demo. - - For more information on using the View Transitions API, please refer to the [Smooth and simple transitions with the View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions/) guide from the Google Chrome team. - - Please note, that because the `ViewTransition` API is a DOM API, we now export a specific `RouterProvider` from `react-router-dom` with this functionality. If you are importing `RouterProvider` from `react-router`, then it will not support view transitions. ([#10928](/~https://github.com/remix-run/react-router/pull/10928) - -### Patch Changes - -- Log a warning and fail gracefully in `ScrollRestoration` when `sessionStorage` is unavailable ([#10848](/~https://github.com/remix-run/react-router/pull/10848)) -- Updated dependencies: - - `@remix-run/router@1.10.0` - - `react-router@6.17.0` - -## 6.16.0 - -### Minor Changes - -- Updated dependencies: - - `@remix-run/router@1.9.0` - - `react-router@6.16.0` - -### Patch Changes - -- Properly encode rendered URIs in server rendering to avoid hydration errors ([#10769](/~https://github.com/remix-run/react-router/pull/10769)) - -## 6.15.0 - -### Minor Changes - -- 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 ([#10705](/~https://github.com/remix-run/react-router/pull/10705)) - -### Patch Changes - -- Fixes an edge-case affecting web extensions in Firefox that use `URLSearchParams` and the `useSearchParams` hook. ([#10620](/~https://github.com/remix-run/react-router/pull/10620)) -- Do not include hash in `useFormAction()` for unspecified actions since it cannot be determined on the server and causes hydration issues ([#10758](/~https://github.com/remix-run/react-router/pull/10758)) -- Reorder effects in `unstable_usePrompt` to avoid throwing an exception if the prompt is unblocked and a navigation is performed synchronously ([#10687](/~https://github.com/remix-run/react-router/pull/10687), [#10718](/~https://github.com/remix-run/react-router/pull/10718)) -- Updated dependencies: - - `@remix-run/router@1.8.0` - - `react-router@6.15.0` - -## 6.14.2 - -### Patch Changes - -- Properly decode element id when emulating hash scrolling via `` ([#10682](/~https://github.com/remix-run/react-router/pull/10682)) -- Add missing `
` prop to populate `history.state` on submission navigations ([#10630](/~https://github.com/remix-run/react-router/pull/10630)) -- Support proper hydration of `Error` subclasses such as `ReferenceError`/`TypeError` ([#10633](/~https://github.com/remix-run/react-router/pull/10633)) -- Updated dependencies: - - `@remix-run/router@1.7.2` - - `react-router@6.14.2` - -## 6.14.1 - -### Patch Changes - -- Updated dependencies: - - `react-router@6.14.1` - - `@remix-run/router@1.7.1` - -## 6.14.0 - -### Minor Changes - -- Add support for `application/json` and `text/plain` encodings for `useSubmit`/`fetcher.submit`. To reflect these additional types, `useNavigation`/`useFetcher` now also contain `navigation.json`/`navigation.text` and `fetcher.json`/`fetcher.text` which include the json/text submission if applicable ([#10413](/~https://github.com/remix-run/react-router/pull/10413)) - - ```jsx - // The default behavior will still serialize as FormData - function Component() { - let navigation = useNavigation(); - let submit = useSubmit(); - submit({ key: "value" }, { method: "post" }); - // navigation.formEncType => "application/x-www-form-urlencoded" - // navigation.formData => FormData instance - } - - async function action({ request }) { - // request.headers.get("Content-Type") => "application/x-www-form-urlencoded" - // await request.formData() => FormData instance - } - ``` - - ```js - // Opt-into JSON encoding with `encType: "application/json"` - function Component() { - let navigation = useNavigation(); - let submit = useSubmit(); - submit({ key: "value" }, { method: "post", encType: "application/json" }); - // navigation.formEncType => "application/json" - // navigation.json => { key: "value" } - } - - async function action({ request }) { - // request.headers.get("Content-Type") => "application/json" - // await request.json() => { key: "value" } - } - ``` - - ```js - // Opt-into text encoding with `encType: "text/plain"` - function Component() { - let navigation = useNavigation(); - let submit = useSubmit(); - submit("Text submission", { method: "post", encType: "text/plain" }); - // navigation.formEncType => "text/plain" - // navigation.text => "Text submission" - } - - async function action({ request }) { - // request.headers.get("Content-Type") => "text/plain" - // await request.text() => "Text submission" - } - ``` - -### Patch Changes - -- When submitting a form from a `submitter` element, prefer the built-in `new FormData(form, submitter)` instead of the previous manual approach in modern browsers (those that support the new `submitter` parameter) ([#9865](/~https://github.com/remix-run/react-router/pull/9865), [#10627](/~https://github.com/remix-run/react-router/pull/10627)) - - For browsers that don't support it, we continue to just append the submit button's entry to the end, and we also add rudimentary support for `type="image"` buttons - - If developers want full spec-compliant support for legacy browsers, they can use the `formdata-submitter-polyfill` -- Call `window.history.pushState/replaceState` before updating React Router state (instead of after) so that `window.location` matches `useLocation` during synchronous React 17 rendering ([#10448](/~https://github.com/remix-run/react-router/pull/10448)) - - ⚠️ However, generally apps should not be relying on `window.location` and should always reference `useLocation` when possible, as `window.location` will not be in sync 100% of the time (due to `popstate` events, concurrent mode, etc.) -- Fix `tsc --skipLibCheck:false` issues on React 17 ([#10622](/~https://github.com/remix-run/react-router/pull/10622)) -- Upgrade `typescript` to 5.1 ([#10581](/~https://github.com/remix-run/react-router/pull/10581)) -- Updated dependencies: - - `react-router@6.14.0` - - `@remix-run/router@1.7.0` - -## 6.13.0 - -### Minor Changes - -- Move [`React.startTransition`](https://react.dev/reference/react/startTransition) usage behind a [future flag](https://reactrouter.com/en/main/guides/api-development-strategy) to avoid issues with existing incompatible `Suspense` usages. We recommend folks adopting this flag to be better compatible with React concurrent mode, but if you run into issues you can continue without the use of `startTransition` until v7. Issues usually boils down to creating net-new promises during the render cycle, so if you run into issues you should either lift your promise creation out of the render cycle or put it behind a `useMemo`. ([#10596](/~https://github.com/remix-run/react-router/pull/10596)) - - Existing behavior will no longer include `React.startTransition`: - - ```jsx - - {/*...*/} - - - - ``` - - If you wish to enable `React.startTransition`, pass the future flag to your component: - - ```jsx - - {/*...*/} - - - - ``` - -### Patch Changes - -- Work around webpack/terser `React.startTransition` minification bug in production mode ([#10588](/~https://github.com/remix-run/react-router/pull/10588)) -- Updated dependencies: - - `react-router@6.13.0` - -## 6.12.1 - -> \[!WARNING] -> Please use version `6.13.0` or later instead of `6.12.1`. This version suffers from a `webpack`/`terser` minification issue resulting in invalid minified code in your resulting production bundles which can cause issues in your application. See [#10579](/~https://github.com/remix-run/react-router/issues/10579) for more details. - -### Patch Changes - -- Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#10569](/~https://github.com/remix-run/react-router/pull/10569)) -- Updated dependencies: - - `react-router@6.12.1` - -## 6.12.0 - -### Minor Changes - -- Wrap internal router state updates with `React.startTransition` if it exists ([#10438](/~https://github.com/remix-run/react-router/pull/10438)) - -### Patch Changes - -- Re-throw `DOMException` (`DataCloneError`) when attempting to perform a `PUSH` navigation with non-serializable state. ([#10427](/~https://github.com/remix-run/react-router/pull/10427)) -- Updated dependencies: - - `@remix-run/router@1.6.3` - - `react-router@6.12.0` - -## 6.11.2 - -### Patch Changes - -- Export `SetURLSearchParams` type ([#10444](/~https://github.com/remix-run/react-router/pull/10444)) -- Updated dependencies: - - `react-router@6.11.2` - - `@remix-run/router@1.6.2` - -## 6.11.1 - -### Patch Changes - -- Updated dependencies: - - `react-router@6.11.1` - - `@remix-run/router@1.6.1` - -## 6.11.0 - -### Minor Changes - -- Enable `basename` support in `useFetcher` ([#10336](/~https://github.com/remix-run/react-router/pull/10336)) - - If you were previously working around this issue by manually prepending the `basename` then you will need to remove the manually prepended `basename` from your `fetcher` calls (`fetcher.load('/basename/route') -> fetcher.load('/route')`) - -### Patch Changes - -- Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#10287](/~https://github.com/remix-run/react-router/pull/10287)) -- Fail gracefully on `` and other invalid URL values ([#10367](/~https://github.com/remix-run/react-router/pull/10367)) -- Switched from `useSyncExternalStore` to `useState` for internal `@remix-run/router` router state syncing in ``. We found some [subtle bugs](https://codesandbox.io/s/use-sync-external-store-loop-9g7b81) where router state updates got propagated _before_ other normal `useState` updates, which could lead to footguns in `useEffect` calls. ([#10377](/~https://github.com/remix-run/react-router/pull/10377), [#10409](/~https://github.com/remix-run/react-router/pull/10409)) -- Add static prop to `StaticRouterProvider`'s internal `Router` component ([#10401](/~https://github.com/remix-run/react-router/pull/10401)) -- When using a `RouterProvider`, `useNavigate`/`useSubmit`/`fetcher.submit` are now stable across location changes, since we can handle relative routing via the `@remix-run/router` instance and get rid of our dependence on `useLocation()`. When using `BrowserRouter`, these hooks remain unstable across location changes because they still rely on `useLocation()`. ([#10336](/~https://github.com/remix-run/react-router/pull/10336)) -- Updated dependencies: - - `react-router@6.11.0` - - `@remix-run/router@1.6.0` - -## 6.10.0 - -### Minor Changes - -- Added support for [**Future Flags**](https://reactrouter.com/en/main/guides/api-development-strategy) in React Router. The first flag being introduced is `future.v7_normalizeFormMethod` which will normalize the exposed `useNavigation()/useFetcher()` `formMethod` fields as uppercase HTTP methods to align with the `fetch()` behavior. ([#10207](/~https://github.com/remix-run/react-router/pull/10207)) - - - When `future.v7_normalizeFormMethod === false` (default v6 behavior), - - `useNavigation().formMethod` is lowercase - - `useFetcher().formMethod` is lowercase - - When `future.v7_normalizeFormMethod === true`: - - `useNavigation().formMethod` is uppercase - - `useFetcher().formMethod` is uppercase - -### Patch Changes - -- Fix `createStaticHandler` to also check for `ErrorBoundary` on routes in addition to `errorElement` ([#10190](/~https://github.com/remix-run/react-router/pull/10190)) -- Updated dependencies: - - `@remix-run/router@1.5.0` - - `react-router@6.10.0` - -## 6.9.0 - -### Minor Changes - -- React Router now supports an alternative way to define your route `element` and `errorElement` fields as React Components instead of React Elements. You can instead pass a React Component to the new `Component` and `ErrorBoundary` fields if you choose. There is no functional difference between the two, so use whichever approach you prefer 😀. You shouldn't be defining both, but if you do `Component`/`ErrorBoundary` will "win". ([#10045](/~https://github.com/remix-run/react-router/pull/10045)) - - **Example JSON Syntax** - - ```jsx - // Both of these work the same: - const elementRoutes = [{ - path: '/', - element: , - errorElement: , - }] - - const componentRoutes = [{ - path: '/', - Component: Home, - ErrorBoundary: HomeError, - }] - - function Home() { ... } - function HomeError() { ... } - ``` - - **Example JSX Syntax** - - ```jsx - // Both of these work the same: - const elementRoutes = createRoutesFromElements( - } errorElement={ } /> - ); - - const componentRoutes = createRoutesFromElements( - - ); - - function Home() { ... } - function HomeError() { ... } - ``` - -- **Introducing Lazy Route Modules!** ([#10045](/~https://github.com/remix-run/react-router/pull/10045)) - - In order to keep your application bundles small and support code-splitting of your routes, we've introduced a new `lazy()` route property. This is an async function that resolves the non-route-matching portions of your route definition (`loader`, `action`, `element`/`Component`, `errorElement`/`ErrorBoundary`, `shouldRevalidate`, `handle`). - - Lazy routes are resolved on initial load and during the `loading` or `submitting` phase of a navigation or fetcher call. You cannot lazily define route-matching properties (`path`, `index`, `children`) since we only execute your lazy route functions after we've matched known routes. - - Your `lazy` functions will typically return the result of a dynamic import. - - ```jsx - // In this example, we assume most folks land on the homepage so we include that - // in our critical-path bundle, but then we lazily load modules for /a and /b so - // they don't load until the user navigates to those routes - let routes = createRoutesFromElements( - }> - } /> - import("./a")} /> - import("./b")} /> - - ); - ``` - - Then in your lazy route modules, export the properties you want defined for the route: - - ```jsx - export async function loader({ request }) { - let data = await fetchData(request); - return json(data); - } - - // Export a `Component` directly instead of needing to create a React Element from it - export function Component() { - let data = useLoaderData(); - - return ( - <> -

You made it!

-

{data}

- - ); - } - - // Export an `ErrorBoundary` directly instead of needing to create a React Element from it - export function ErrorBoundary() { - let error = useRouteError(); - return isRouteErrorResponse(error) ? ( -

- {error.status} {error.statusText} -

- ) : ( -

{error.message || error}

- ); - } - ``` - - An example of this in action can be found in the [`examples/lazy-loading-router-provider`](/~https://github.com/remix-run/react-router/tree/main/examples/lazy-loading-router-provider) directory of the repository. - - 🙌 Huge thanks to @rossipedia for the [Initial Proposal](/~https://github.com/remix-run/react-router/discussions/9826) and [POC Implementation](/~https://github.com/remix-run/react-router/pull/9830). - -- Updated dependencies: - - `react-router@6.9.0` - - `@remix-run/router@1.4.0` - -## 6.8.2 - -### Patch Changes - -- Treat same-origin absolute URLs in `` as external if they are outside of the router `basename` ([#10135](/~https://github.com/remix-run/react-router/pull/10135)) -- Fix `useBlocker` to return `IDLE_BLOCKER` during SSR ([#10046](/~https://github.com/remix-run/react-router/pull/10046)) -- Fix SSR of absolute `` urls ([#10112](/~https://github.com/remix-run/react-router/pull/10112)) -- Properly escape HTML characters in `StaticRouterProvider` serialized hydration data ([#10068](/~https://github.com/remix-run/react-router/pull/10068)) -- Updated dependencies: - - `@remix-run/router@1.3.3` - - `react-router@6.8.2` - -## 6.8.1 - -### Patch Changes - -- Improved absolute url detection in `Link` component (now also supports `mailto:` urls) ([#9994](/~https://github.com/remix-run/react-router/pull/9994)) -- Fix partial object (search or hash only) pathnames losing current path value ([#10029](/~https://github.com/remix-run/react-router/pull/10029)) -- Updated dependencies: - - `react-router@6.8.1` - - `@remix-run/router@1.3.2` - -## 6.8.0 - -### Minor Changes - -- Support absolute URLs in ``. If the URL is for the current origin, it will still do a client-side navigation. If the URL is for a different origin then it will do a fresh document request for the new origin. ([#9900](/~https://github.com/remix-run/react-router/pull/9900)) - - ```tsx - {/* Document request */} - {/* Document request */} - {/* Client-side navigation */} - ``` - -### Patch Changes - -- Fix bug with search params removal via `useSearchParams` ([#9969](/~https://github.com/remix-run/react-router/pull/9969)) -- Respect `preventScrollReset` on `` ([#9963](/~https://github.com/remix-run/react-router/pull/9963)) -- Fix navigation for hash routers on manual URL changes ([#9980](/~https://github.com/remix-run/react-router/pull/9980)) -- Use `pagehide` instead of `beforeunload` for ``. This has better cross-browser support, specifically on Mobile Safari. ([#9945](/~https://github.com/remix-run/react-router/pull/9945)) -- Updated dependencies: - - `@remix-run/router@1.3.1` - - `react-router@6.8.0` - -## 6.7.0 - -### Minor Changes - -- Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#9709](/~https://github.com/remix-run/react-router/pull/9709)) -- Add `unstable_usePrompt` hook for blocking navigations within the app's location origin ([#9932](/~https://github.com/remix-run/react-router/pull/9932)) -- Add `preventScrollReset` prop to `` ([#9886](/~https://github.com/remix-run/react-router/pull/9886)) - -### Patch Changes - -- Added pass-through event listener options argument to `useBeforeUnload` ([#9709](/~https://github.com/remix-run/react-router/pull/9709)) -- Streamline jsdom bug workaround in tests ([#9824](/~https://github.com/remix-run/react-router/pull/9824)) -- Updated dependencies: - - `@remix-run/router@1.3.0` - - `react-router@6.7.0` - -## 6.6.2 - -### Patch Changes - -- Ensure `useId` consistency during SSR ([#9805](/~https://github.com/remix-run/react-router/pull/9805)) -- Updated dependencies: - - `react-router@6.6.2` - -## 6.6.1 - -### Patch Changes - -- Updated dependencies: - - `@remix-run/router@1.2.1` - - `react-router@6.6.1` - -## 6.6.0 - -### Minor Changes - -- Add `useBeforeUnload()` hook ([#9664](/~https://github.com/remix-run/react-router/pull/9664)) -- Remove `unstable_` prefix from `createStaticHandler`/`createStaticRouter`/`StaticRouterProvider` ([#9738](/~https://github.com/remix-run/react-router/pull/9738)) - -### Patch Changes - -- Proper hydration of `Error` objects from `StaticRouterProvider` ([#9664](/~https://github.com/remix-run/react-router/pull/9664)) -- Support uppercase `` and `useSubmit` method values ([#9664](/~https://github.com/remix-run/react-router/pull/9664)) -- Skip initial scroll restoration for SSR apps with `hydrationData` ([#9664](/~https://github.com/remix-run/react-router/pull/9664)) -- Fix `