├── .browserslistrc
├── .changeset
├── README.md
└── config.json
├── .eslintignore
├── .eslintrc
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── config.yml
│ └── documentation_isse.yml
├── dependabot.yml
└── workflows
│ ├── deduplicate-lock-file.yml
│ ├── format.yml
│ ├── integration-full.yml
│ ├── integration-pr-ubuntu.yml
│ ├── integration-pr-windows-macos.yml
│ ├── no-response.yml
│ ├── release-comments.yml
│ ├── release-experimental.yml
│ ├── release-nightly.yml
│ ├── release.yml
│ ├── shared-build.yml
│ ├── shared-integration.yml
│ ├── support.yml
│ └── test.yml
├── .gitignore
├── .npmrc
├── .nvmrc
├── .vscode
└── settings.json
├── CHANGELOG.md
├── CLA.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DEVELOPMENT.md
├── LICENSE.md
├── README.md
├── build.utils.ts
├── contributors.yml
├── decisions
├── 0001-use-blocker.md
├── 0001-use-npm-to-manage-npm-dependencies-for-deno-projects.md
├── 0002-do-not-clone-request.md
├── 0002-lazy-route-modules.md
├── 0003-data-strategy.md
├── 0003-infer-types-for-useloaderdata-and-useactiondata-from-loader-and-action-via-generics.md
├── 0004-streaming-apis.md
├── 0005-remixing-react-router.md
├── 0006-linear-workflow.md
├── 0007-remix-on-react-router-6-4-0.md
├── 0008-only-support-js-conversion-for-app-code.md
├── 0009-do-not-rely-on-treeshaking-for-correctness.md
├── 0010-splitting-up-client-and-server-code-in-vite.md
├── 0011-routes-ts.md
├── 0012-type-inference.md
├── 0013-react-router-config-ts.md
└── template.md
├── docs
├── community
│ ├── api-development-strategy.md
│ ├── contributing.md
│ └── index.md
├── elements.md
├── explanation
│ ├── README
│ ├── code-splitting.md
│ ├── hot-module-replacement.md
│ ├── hydration.md
│ ├── index.md
│ ├── location.md
│ ├── picking-a-router.md
│ ├── progressive-enhancement.md
│ ├── race-conditions.md
│ ├── route-matching.md
│ ├── server-client-execution.md
│ ├── sessions-and-cookies.md
│ ├── special-files.md
│ ├── state-management.md
│ └── type-safety.md
├── how-to
│ ├── README
│ ├── client-data.md
│ ├── error-boundary.md
│ ├── error-reporting.md
│ ├── fetchers.md
│ ├── file-route-conventions.md
│ ├── file-uploads.md
│ ├── form-validation.md
│ ├── headers.md
│ ├── index.md
│ ├── meta.md
│ ├── optimize-revalidation.md
│ ├── pre-rendering.md
│ ├── react-server-components.md
│ ├── resource-routes.md
│ ├── route-module-type-safety.md
│ ├── search-params.md
│ ├── spa.md
│ ├── status.md
│ ├── suspense.md
│ ├── view-transitions.md
│ └── webhook.md
├── index.md
├── prettier.config.js
├── start
│ ├── README
│ ├── framework
│ │ ├── actions.md
│ │ ├── custom.md
│ │ ├── data-loading.md
│ │ ├── deploying.md
│ │ ├── index.md
│ │ ├── installation.md
│ │ ├── navigating.md
│ │ ├── pending-ui.md
│ │ ├── rendering.md
│ │ ├── route-module.md
│ │ ├── routing.md
│ │ └── testing.md
│ ├── index.md
│ └── library
│ │ ├── data-routers.md
│ │ ├── index.md
│ │ ├── installation.md
│ │ ├── navigating.md
│ │ ├── routing.md
│ │ └── url-values.md
├── tutorials
│ ├── README
│ ├── address-book.md
│ ├── advanced-data-fetching.md
│ └── index.md
└── upgrading
│ ├── README
│ ├── component-routes.md
│ ├── index.md
│ ├── remix.md
│ ├── router-provider.md
│ └── v6.md
├── examples
├── README.md
├── auth-router-provider
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── auth.ts
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── auth
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── auth.ts
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── basic-data-router
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── basic
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── custom-filter-link
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ ├── snkrs.ts
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── custom-link
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── custom-query-parsing
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ ├── types
│ │ └── jsurl.d.ts
│ └── vite.config.ts
├── data-router
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ ├── todos.ts
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── error-boundaries
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ ├── routes.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── lazy-loading-router-provider
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ ├── pages
│ │ │ ├── About.tsx
│ │ │ └── Dashboard.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── lazy-loading
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ ├── pages
│ │ │ ├── About.tsx
│ │ │ └── Dashboard.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── modal-route-with-outlet
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── images.ts
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── modal
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── images.ts
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── multi-app
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── home
│ │ ├── App.jsx
│ │ ├── index.css
│ │ ├── main.jsx
│ │ └── no-match.jsx
│ ├── inbox
│ │ ├── App.jsx
│ │ ├── index.css
│ │ ├── index.html
│ │ ├── main.jsx
│ │ ├── messages.js
│ │ └── no-match.jsx
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── server.js
│ └── vite.config.js
├── navigation-blocking
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── notes
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.jsx
│ │ ├── index.css
│ │ ├── main.jsx
│ │ ├── notes.js
│ │ ├── routes
│ │ │ ├── new.jsx
│ │ │ ├── note.jsx
│ │ │ ├── notes.jsx
│ │ │ └── root.jsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── route-objects
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── scroll-restoration
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── search-params
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── ssr-data-router
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── server.js
│ ├── src
│ │ ├── App.tsx
│ │ ├── entry.client.tsx
│ │ ├── entry.server.tsx
│ │ ├── index.css
│ │ ├── lazy.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.js
├── ssr
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── server.js
│ ├── src
│ │ ├── App.tsx
│ │ ├── entry.client.tsx
│ │ ├── entry.server.tsx
│ │ ├── index.css
│ │ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.js
└── view-transitions
│ ├── .gitignore
│ ├── .stackblitzrc
│ ├── README.md
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ ├── index.css
│ ├── main.tsx
│ └── vite-env.d.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── integration
├── CHANGELOG.md
├── abort-signal-test.ts
├── action-test.ts
├── assets
│ ├── toupload.txt
│ └── touploadtoobig.txt
├── blocking-test.ts
├── browser-entry-test.ts
├── bug-report-test.ts
├── catch-boundary-data-test.ts
├── catch-boundary-test.ts
├── client-data-test.ts
├── custom-entry-server-test.ts
├── defer-loader-test.ts
├── defer-test.ts
├── error-boundary-test.ts
├── error-boundary-v2-test.ts
├── error-data-request-test.ts
├── error-sanitization-test.ts
├── fetch-globals-test.ts
├── fetcher-layout-test.ts
├── fetcher-test.ts
├── fog-of-war-test.ts
├── form-data-test.ts
├── form-test.ts
├── fs-routes-test.ts
├── headers-test.ts
├── helpers
│ ├── cleanup.mjs
│ ├── create-fixture.ts
│ ├── playwright-fixture.ts
│ ├── vite-5-template
│ │ ├── .gitignore
│ │ ├── app
│ │ │ ├── root.tsx
│ │ │ ├── routes.ts
│ │ │ └── routes
│ │ │ │ └── _index.tsx
│ │ ├── env.d.ts
│ │ ├── package.json
│ │ ├── public
│ │ │ └── favicon.ico
│ │ ├── tsconfig.json
│ │ └── vite.config.ts
│ ├── vite-6-template
│ │ ├── .gitignore
│ │ ├── app
│ │ │ ├── root.tsx
│ │ │ ├── routes.ts
│ │ │ └── routes
│ │ │ │ └── _index.tsx
│ │ ├── env.d.ts
│ │ ├── package.json
│ │ ├── public
│ │ │ └── favicon.ico
│ │ ├── tsconfig.json
│ │ └── vite.config.ts
│ ├── vite-cloudflare-template
│ │ ├── .gitignore
│ │ ├── app
│ │ │ ├── entry.server.tsx
│ │ │ ├── root.tsx
│ │ │ ├── routes.ts
│ │ │ └── routes
│ │ │ │ └── _index.tsx
│ │ ├── package.json
│ │ ├── public
│ │ │ └── favicon.ico
│ │ ├── tsconfig.json
│ │ └── vite.config.ts
│ └── vite.ts
├── hook-useSubmit-test.ts
├── layout-route-test.ts
├── link-test.ts
├── loader-test.ts
├── matches-test.ts
├── multiple-cookies-test.ts
├── navigation-state-test.ts
├── package.json
├── playwright.config.ts
├── prefetch-test.ts
├── redirects-test.ts
├── remix-serve-test.ts
├── rendering-test.ts
├── request-test.ts
├── resource-routes-test.ts
├── revalidate-test.ts
├── root-route-test.ts
├── route-collisions-test.ts
├── route-config-test.ts
├── scroll-test.ts
├── server-entry-test.ts
├── set-cookie-revalidation-test.ts
├── single-fetch-test.ts
├── splat-routes-test.ts
├── transition-test.ts
├── tsconfig.json
├── typegen-test.ts
├── vite-absolute-base-test.ts
├── vite-basename-test.ts
├── vite-build-test.ts
├── vite-cloudflare-test.ts
├── vite-css-test.ts
├── vite-dev-custom-entry-test.ts
├── vite-dev-test.ts
├── vite-dot-client-test.ts
├── vite-dot-server-test.ts
├── vite-dotenv-test.ts
├── vite-hmr-hdr-test.ts
├── vite-loader-context-test.ts
├── vite-manifests-test.ts
├── vite-node-env-test.ts
├── vite-plugin-order-validation-test.ts
├── vite-prerender-test.ts
├── vite-presets-test.ts
├── vite-route-added-test.ts
├── vite-route-exports-modified-offscreen-test.ts
├── vite-server-bundles-test.ts
├── vite-server-fs-allow-test.ts
├── vite-spa-mode-test.ts
└── vite-unused-route-exports-test.ts
├── jest
├── jest.config.shared.js
└── transform.js
├── package.json
├── packages
├── create-react-router
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── create-react-router-test.ts
│ │ ├── fixtures
│ │ │ ├── basic
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── app
│ │ │ │ │ ├── root.tsx
│ │ │ │ │ ├── routes.ts
│ │ │ │ │ └── routes
│ │ │ │ │ │ └── home.tsx
│ │ │ │ ├── package.json
│ │ │ │ ├── public
│ │ │ │ │ └── favicon.ico
│ │ │ │ ├── tsconfig.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── blank
│ │ │ │ └── package.json
│ │ │ ├── nested-dir-repo.tar.gz
│ │ │ ├── tar.js
│ │ │ ├── template.tar.gz
│ │ │ ├── template.tgz
│ │ │ ├── templates-repo.tar.gz
│ │ │ └── with-ignored-dir
│ │ │ │ └── package.json
│ │ ├── github-mocks.ts
│ │ ├── msw-register.ts
│ │ ├── msw.ts
│ │ └── setupAfterEnv.ts
│ ├── cli.ts
│ ├── copy-template.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── loading-indicator.ts
│ ├── package.json
│ ├── prompt.ts
│ ├── prompts-confirm.ts
│ ├── prompts-multi-select.ts
│ ├── prompts-prompt-base.ts
│ ├── prompts-select.ts
│ ├── prompts-text.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── utils.ts
├── react-router-architect
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── 554828.jpeg
│ │ ├── binaryTypes-test.ts
│ │ └── server-test.ts
│ ├── binaryTypes.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── package.json
│ ├── server.ts
│ ├── sessions
│ │ └── arcTableSessionStorage.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── react-router-cloudflare
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── index.ts
│ ├── package.json
│ ├── sessions
│ │ └── workersKVStorage.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ ├── typedoc.json
│ └── worker.ts
├── react-router-dev
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── cli-reveal-test.ts
│ │ ├── cli-routes-test.ts
│ │ ├── cli-test.ts
│ │ ├── fixtures
│ │ │ └── basic
│ │ │ │ ├── .gitignore
│ │ │ │ ├── app
│ │ │ │ ├── root.tsx
│ │ │ │ ├── routes.ts
│ │ │ │ └── routes
│ │ │ │ │ └── _index.tsx
│ │ │ │ ├── package.json
│ │ │ │ ├── public
│ │ │ │ └── favicon.ico
│ │ │ │ └── tsconfig.json
│ │ ├── route-config-test.ts
│ │ ├── setupAfterEnv.ts
│ │ ├── styles-test.ts
│ │ └── utils
│ │ │ ├── captureError.ts
│ │ │ ├── cli.ts
│ │ │ ├── eol.ts
│ │ │ ├── git.ts
│ │ │ └── withApp.ts
│ ├── bin.js
│ ├── cli
│ │ ├── commands.ts
│ │ ├── detectPackageManager.ts
│ │ ├── index.ts
│ │ ├── run.ts
│ │ └── useJavascript.ts
│ ├── config.ts
│ ├── config
│ │ ├── config.ts
│ │ ├── defaults
│ │ │ ├── entry.client.tsx
│ │ │ └── entry.server.node.tsx
│ │ ├── format.ts
│ │ ├── is-react-router-repo.ts
│ │ ├── routes.ts
│ │ └── serverModes.ts
│ ├── invariant.ts
│ ├── jest.config.js
│ ├── manifest.ts
│ ├── module-sync-enabled
│ │ ├── false.cjs
│ │ ├── index.d.mts
│ │ ├── index.mjs
│ │ └── true.mjs
│ ├── package.json
│ ├── routes.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ ├── typedoc.json
│ ├── typegen
│ │ ├── context.ts
│ │ ├── generate.ts
│ │ ├── index.ts
│ │ └── paths.ts
│ ├── vite.ts
│ └── vite
│ │ ├── babel.ts
│ │ ├── build.ts
│ │ ├── cloudflare-dev-proxy.ts
│ │ ├── cloudflare.ts
│ │ ├── combine-urls-test.ts
│ │ ├── combine-urls.ts
│ │ ├── dev.ts
│ │ ├── node-adapter.ts
│ │ ├── plugin.ts
│ │ ├── profiler.ts
│ │ ├── remove-exports-test.ts
│ │ ├── remove-exports.ts
│ │ ├── resolve-file-url.ts
│ │ ├── static
│ │ └── refresh-utils.cjs
│ │ ├── styles.ts
│ │ ├── virtual-module.ts
│ │ ├── vite-node.ts
│ │ ├── vite.ts
│ │ └── with-props.ts
├── react-router-dom
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── index.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── tsup.config.ts
├── react-router-express
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ └── server-test.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── package.json
│ ├── server.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── react-router-fs-routes
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── flatRoutes-test.ts
│ │ └── routeManifestToRouteConfig-test.ts
│ ├── flatRoutes.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── manifest.ts
│ ├── normalizeSlashes.ts
│ ├── package.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── react-router-node
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── sessions-test.ts
│ │ └── utils.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── package.json
│ ├── server.ts
│ ├── sessions
│ │ └── fileStorage.ts
│ ├── stream.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── react-router-remix-routes-option-adapter
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ │ ├── defineRoutes-test.ts
│ │ └── routeManifestToRouteConfig-test.ts
│ ├── defineRoutes.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── manifest.ts
│ ├── normalizeSlashes.ts
│ ├── package.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── react-router-serve
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── bin.js
│ ├── cli.ts
│ ├── package.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
└── react-router
│ ├── .eslintrc.js
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__
│ ├── .eslintrc
│ ├── Route-test.tsx
│ ├── Router-basename-test.tsx
│ ├── Router-test.tsx
│ ├── Routes-location-test.tsx
│ ├── Routes-test.tsx
│ ├── __snapshots__
│ │ └── route-matching-test.tsx.snap
│ ├── absolute-path-matching-test.tsx
│ ├── createRoutesFromChildren-test.tsx
│ ├── data-memory-router-test.tsx
│ ├── data-router-no-dom-test.tsx
│ ├── descendant-routes-params-test.tsx
│ ├── descendant-routes-splat-matching-test.tsx
│ ├── descendant-routes-warning-test.tsx
│ ├── dom
│ │ ├── components
│ │ │ └── LazyComponent.tsx
│ │ ├── concurrent-mode-navigations-test.tsx
│ │ ├── data-browser-router-legacy-formdata-test.tsx
│ │ ├── data-browser-router-test.tsx
│ │ ├── data-static-router-test.tsx
│ │ ├── flush-sync-navigations-test.tsx
│ │ ├── link-click-test.tsx
│ │ ├── link-href-test.tsx
│ │ ├── link-push-test.tsx
│ │ ├── nav-link-active-test.tsx
│ │ ├── navigate-encode-params-test.tsx
│ │ ├── partial-hydration-test.tsx
│ │ ├── polyfills
│ │ │ └── drop-FormData-submitter.ts
│ │ ├── scroll-restoration-test.tsx
│ │ ├── search-params-test.tsx
│ │ ├── special-characters-test.tsx
│ │ ├── ssr
│ │ │ ├── components-test.tsx
│ │ │ └── meta-test.tsx
│ │ ├── static-link-test.tsx
│ │ ├── static-location-test.tsx
│ │ ├── static-navigate-test.tsx
│ │ ├── stub-test.tsx
│ │ ├── trailing-slashes-test.tsx
│ │ ├── use-blocker-test.tsx
│ │ ├── use-prompt-test.tsx
│ │ └── useLinkClickHandler-test.tsx
│ ├── generatePath-test.tsx
│ ├── gh-issue-8127-test.tsx
│ ├── gh-issue-8165-test.tsx
│ ├── greedy-matching-test.tsx
│ ├── index-routes-test.tsx
│ ├── layout-routes-test.tsx
│ ├── matchPath-test.tsx
│ ├── matchRoutes-test.tsx
│ ├── navigate-test.tsx
│ ├── params-decode-test.tsx
│ ├── path-matching-test.tsx
│ ├── resolvePath-test.tsx
│ ├── route-depth-order-matching-test.tsx
│ ├── route-matching-test.tsx
│ ├── router
│ │ ├── TestSequences
│ │ │ ├── EncodedReservedCharacters.ts
│ │ │ ├── GoBack.ts
│ │ │ ├── GoForward.ts
│ │ │ ├── InitialLocationDefaultKey.ts
│ │ │ ├── InitialLocationHasKey.ts
│ │ │ ├── Listen.ts
│ │ │ ├── ListenPopOnly.ts
│ │ │ ├── PushMissingPathname.ts
│ │ │ ├── PushNewLocation.ts
│ │ │ ├── PushRelativePathname.ts
│ │ │ ├── PushRelativePathnameWarning.ts
│ │ │ ├── PushSamePath.ts
│ │ │ ├── PushState.ts
│ │ │ ├── PushStateInvalid.ts
│ │ │ ├── ReplaceNewLocation.ts
│ │ │ ├── ReplaceSamePath.ts
│ │ │ └── ReplaceState.ts
│ │ ├── browser-test.ts
│ │ ├── create-path-test.ts
│ │ ├── data-strategy-test.ts
│ │ ├── fetchers-test.ts
│ │ ├── flush-sync-test.ts
│ │ ├── hash-base-test.ts
│ │ ├── hash-test.ts
│ │ ├── interruptions-test.ts
│ │ ├── lazy-discovery-test.ts
│ │ ├── lazy-test.ts
│ │ ├── memory-test.ts
│ │ ├── navigation-blocking-test.ts
│ │ ├── navigation-test.ts
│ │ ├── path-resolution-test.ts
│ │ ├── redirects-test.ts
│ │ ├── resolveTo-test.tsx
│ │ ├── revalidate-test.ts
│ │ ├── route-fallback-test.ts
│ │ ├── router-memory-test.ts
│ │ ├── router-test.ts
│ │ ├── scroll-restoration-test.ts
│ │ ├── should-revalidate-test.ts
│ │ ├── ssr-test.ts
│ │ ├── submission-test.ts
│ │ ├── utils
│ │ │ ├── custom-matchers.ts
│ │ │ ├── data-router-setup.ts
│ │ │ ├── urlDataStrategy.ts
│ │ │ └── utils.ts
│ │ └── view-transition-test.ts
│ ├── same-component-lifecycle-test.tsx
│ ├── server-runtime
│ │ ├── cookies-test.ts
│ │ ├── data-test.ts
│ │ ├── handle-error-test.ts
│ │ ├── handler-test.ts
│ │ ├── markup-test.ts
│ │ ├── responses-test.ts
│ │ ├── server-test.ts
│ │ ├── sessions-test.ts
│ │ └── utils.ts
│ ├── setup.ts
│ ├── use-revalidator-test.tsx
│ ├── useHref-basename-test.tsx
│ ├── useHref-test.tsx
│ ├── useLocation-test.tsx
│ ├── useMatch-test.tsx
│ ├── useNavigate-test.tsx
│ ├── useOutlet-test.tsx
│ ├── useParams-test.tsx
│ ├── useResolvedPath-test.tsx
│ ├── useRoutes-test.tsx
│ └── utils
│ │ ├── MemoryNavigate.tsx
│ │ ├── getHtml.ts
│ │ ├── renderStrict.tsx
│ │ ├── tick.ts
│ │ └── waitForRedirect.tsx
│ ├── dom-export.ts
│ ├── index.ts
│ ├── jest.config.js
│ ├── lib
│ ├── components.tsx
│ ├── context.ts
│ ├── dom-export
│ │ ├── dom-router-provider.tsx
│ │ └── hydrated-router.tsx
│ ├── dom
│ │ ├── dom.ts
│ │ ├── global.ts
│ │ ├── lib.tsx
│ │ ├── node-main.js
│ │ ├── server.tsx
│ │ └── ssr
│ │ │ ├── components.tsx
│ │ │ ├── data.ts
│ │ │ ├── entry.ts
│ │ │ ├── errorBoundaries.tsx
│ │ │ ├── errors.ts
│ │ │ ├── fallback.tsx
│ │ │ ├── fog-of-war.ts
│ │ │ ├── invariant.ts
│ │ │ ├── links.ts
│ │ │ ├── markup.ts
│ │ │ ├── routeModules.ts
│ │ │ ├── routes-test-stub.tsx
│ │ │ ├── routes.tsx
│ │ │ ├── server.tsx
│ │ │ └── single-fetch.tsx
│ ├── hooks.tsx
│ ├── router
│ │ ├── history.ts
│ │ ├── links.ts
│ │ ├── router.ts
│ │ └── utils.ts
│ ├── server-runtime
│ │ ├── .eslintrc.js
│ │ ├── build.ts
│ │ ├── cookies.ts
│ │ ├── crypto.ts
│ │ ├── data.ts
│ │ ├── dev.ts
│ │ ├── entry.ts
│ │ ├── errors.ts
│ │ ├── headers.ts
│ │ ├── invariant.ts
│ │ ├── markup.ts
│ │ ├── mode.ts
│ │ ├── routeMatching.ts
│ │ ├── routes.ts
│ │ ├── server.ts
│ │ ├── serverHandoff.ts
│ │ ├── sessions.ts
│ │ ├── sessions
│ │ │ ├── cookieStorage.ts
│ │ │ └── memoryStorage.ts
│ │ ├── single-fetch.ts
│ │ ├── typecheck.ts
│ │ └── warnings.ts
│ └── types
│ │ ├── route-data.ts
│ │ ├── route-module.ts
│ │ └── utils.ts
│ ├── node-main-dom-export.js
│ ├── node-main.js
│ ├── package.json
│ ├── tsconfig.dom.json
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── typedoc.json
├── patches
├── @changesets__assemble-release-plan.patch
└── @changesets__get-dependents-graph@1.3.6.patch
├── playground
├── framework-express
│ ├── .gitignore
│ ├── app
│ │ ├── root.tsx
│ │ ├── routes.ts
│ │ └── routes
│ │ │ └── _index.tsx
│ ├── package.json
│ ├── public
│ │ └── favicon.ico
│ ├── server.js
│ ├── tsconfig.json
│ └── vite.config.ts
├── framework-spa
│ ├── .gitignore
│ ├── app
│ │ ├── root.tsx
│ │ ├── routes.ts
│ │ └── routes
│ │ │ └── _index.tsx
│ ├── package.json
│ ├── public
│ │ └── favicon.ico
│ ├── react-router.config.ts
│ ├── tsconfig.json
│ └── vite.config.ts
└── framework
│ ├── .gitignore
│ ├── app
│ ├── root.tsx
│ ├── routes.ts
│ └── routes
│ │ ├── _index.tsx
│ │ └── product.tsx
│ ├── package.json
│ ├── public
│ └── favicon.ico
│ ├── tsconfig.json
│ └── vite.config.ts
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── prettier.config.js
├── scripts
├── clean-v6-artifacts.sh
├── constants.js
├── find-release-from-changeset.js
├── playground.js
├── publish.js
├── remove-prerelease-changelogs.mjs
├── utils.js
└── version.js
├── static
└── base-branch.png
├── tutorials
└── address-book
│ ├── .gitignore
│ ├── README.md
│ ├── app
│ ├── app.css
│ ├── data.ts
│ ├── root.tsx
│ └── routes.ts
│ ├── package.json
│ ├── public
│ └── favicon.ico
│ ├── react-router.config.ts
│ ├── tsconfig.json
│ └── vite.config.ts
└── typedoc.json
/.browserslistrc:
--------------------------------------------------------------------------------
1 | # Browsers we support
2 | Chrome >= 73
3 | ChromeAndroid >= 75
4 | Firefox >= 67
5 | Edge >= 17
6 | Safari >= 12.1
7 | iOS >= 11.3
8 |
--------------------------------------------------------------------------------
/.changeset/README.md:
--------------------------------------------------------------------------------
1 | # Changesets
2 |
3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
4 | with multi-package repos, or single-package repos to help you version and publish your code. You can
5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets)
6 |
7 | We have a quick list of common questions to get you started engaging with this project in
8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
9 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /fixtures/
2 | node_modules/
3 | pnpm-lock.yaml
4 | /docs/api
5 | examples/**/dist/
6 | /playground/
7 | /playground-local/
8 | packages/**/dist/
9 | packages/react-router-dom/server.d.ts
10 | packages/react-router-dom/server.js
11 | packages/react-router-dom/server.mjs
12 | tutorial/dist/
13 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["react-app"],
3 | "rules": {
4 | "import/first": "off",
5 | "@typescript-eslint/consistent-type-imports": "error"
6 | },
7 | "overrides": [
8 | {
9 | "files": ["**/__tests__/**"],
10 | "plugins": ["jest"],
11 | "extends": ["plugin:jest/recommended"]
12 | },
13 | {
14 | "files": ["integration/**/*.*"],
15 | "rules": {
16 | "react-hooks/rules-of-hooks": "off"
17 | },
18 | "env": {
19 | "jest/globals": false
20 | }
21 | }
22 | ],
23 | "reportUnusedDisableDirectives": true
24 | }
25 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: react-router
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 💡 Feature Request
4 | url: https://github.com/remix-run/react-router/discussions/new?category=proposals
5 | about: If you've got an idea for a new feature in React Router, please open a new Discussion with the `Proposals` label
6 | - name: 🤔 Usage Question (Github Discussions)
7 | url: https://github.com/remix-run/remix/discussions/new?category=q-a
8 | about: Open a Discussion in GitHub wih the `Q&A` label
9 | - name: 💬 Remix Discord Channel
10 | url: https://rmx.as/discord
11 | about: Interact with other people using React Router and Remix 📀
12 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/documentation_isse.yml:
--------------------------------------------------------------------------------
1 | name: 📚 Documentation Issue
2 | description: Something is wrong with the React Router docs
3 | title: "[Docs]: "
4 | labels:
5 | - docs
6 | body:
7 | - type: markdown
8 | attributes:
9 | value: |
10 | Thank you for contributing!
11 |
12 | For documentation updates - we would happily accept PRs, so feel free to update and
13 | open a PR to the `main` branch. Otherwise let us know in this issue what you felt
14 | was missing or incorrect.
15 |
16 | - type: textarea
17 | attributes:
18 | label: Describe what's incorrect/missing in the documentation
19 | description: A concise description of what you expected to see in the docs
20 | validations:
21 | required: true
22 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: github-actions
4 | directory: /
5 | schedule:
6 | interval: daily
7 |
--------------------------------------------------------------------------------
/.github/workflows/release-comments.yml:
--------------------------------------------------------------------------------
1 | name: 📝 Comment on Release
2 |
3 | on:
4 | workflow_call:
5 |
6 | jobs:
7 | comment:
8 | name: 📝 Comment on related issues and pull requests
9 | if: github.repository == 'remix-run/react-router'
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: ⬇️ Checkout repo
13 | uses: actions/checkout@v4
14 | with:
15 | fetch-depth: 0
16 |
17 | - name: 📝 Comment on related issues and pull requests
18 | uses: remix-run/release-comment-action@v0.4.1
19 | with:
20 | DIRECTORY_TO_CHECK: "./packages"
21 | PACKAGE_NAME: "react-router"
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | npm-debug.log
3 |
4 | /docs/api/
5 | /website/build/
6 | node_modules/
7 |
8 | /examples/*/yarn.lock
9 | /examples/*/pnpm-lock.yaml
10 | /examples/*/dist
11 | /tutorial/dist
12 | /playground-local/
13 | /integration/playwright-report
14 | /integration/test-results
15 |
16 | # v5 build files
17 | /packages/*/cjs/
18 | /packages/*/esm/
19 | /packages/*/umd/
20 |
21 | # v6 build files
22 | /build/
23 | /packages/*/dist/
24 | /packages/*/LICENSE.md
25 |
26 | # v7 build files
27 | .react-router
28 |
29 | .wireit
30 | .eslintcache
31 | .tmp
32 | tsup.config.bundled_*.mjs
33 | /.env
34 | /NOTES.md
35 |
36 | # v7 reference docs
37 | /public
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | ignore-workspace-cycles=true
2 | enable-pre-post-scripts=true
3 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | 20
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "typescript.tsdk": "node_modules/typescript/lib",
3 | "typescript.enablePromptUseWorkspaceTsdk": true
4 | }
5 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | Please see [our guide to contributing](docs/community/contributing.md).
2 |
--------------------------------------------------------------------------------
/build.utils.ts:
--------------------------------------------------------------------------------
1 | export function createBanner(packageName: string, version: string) {
2 | return `/**
3 | * ${packageName} v${version}
4 | *
5 | * Copyright (c) Remix Software Inc.
6 | *
7 | * This source code is licensed under the MIT license found in the
8 | * LICENSE.md file in the root directory of this source tree.
9 | *
10 | * @license MIT
11 | */`;
12 | }
13 |
--------------------------------------------------------------------------------
/decisions/template.md:
--------------------------------------------------------------------------------
1 | # Title
2 |
3 | Date: YYYY-MM-DD
4 |
5 | Status: proposed | rejected | accepted | deprecated | … | superseded by [0005](0005-example.md)
6 |
7 | ## Context
8 |
9 | ## Decision
10 |
11 | ## Consequences
12 |
--------------------------------------------------------------------------------
/docs/community/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Community
3 | order: 6
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/explanation/README:
--------------------------------------------------------------------------------
1 | Explanations:
2 |
3 | - Theoretical Knowledge
4 | - Understanding Oriented
5 | - Useful when we're studying
6 |
--------------------------------------------------------------------------------
/docs/explanation/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Explanations
3 | order: 5
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/explanation/location.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Location Object
3 | hidden: true
4 | ---
5 |
6 |
7 |
--------------------------------------------------------------------------------
/docs/explanation/picking-a-router.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Picking a Router
3 | hidden: true
4 | ---
5 |
6 | ## TODO:
7 |
--------------------------------------------------------------------------------
/docs/explanation/route-matching.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Route Matching
3 | hidden: true
4 | # want to explain how the matching algorithm works with any potential gotchas
5 | ---
6 |
7 | # Route Matching
8 |
--------------------------------------------------------------------------------
/docs/explanation/server-client-execution.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Server vs. Client Code Execution
3 | hidden: true
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/how-to/README:
--------------------------------------------------------------------------------
1 | How-To:
2 |
3 | - Practical Steps
4 | - Problem Oriented
5 | - Useful when we're coding
6 |
--------------------------------------------------------------------------------
/docs/how-to/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How-Tos
3 | order: 4
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/how-to/search-params.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Using Search Params
3 | hidden: true
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/prettier.config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @type {import('prettier').Options}
3 | */
4 | module.exports = {
5 | ...require("../prettier.config"),
6 | printWidth: 60,
7 | };
8 |
--------------------------------------------------------------------------------
/docs/start/README:
--------------------------------------------------------------------------------
1 | Get them off the ground and acquainted with basics. Docs here are a mix of:
2 |
3 | How-To:
4 |
5 | - Practical Steps
6 | - Problem Oriented
7 | - Useful when we're coding
8 |
9 | Explanation:
10 |
11 | - Theoretical Knowledge
12 | - Understanding Oriented
13 | - Useful when we're studying
14 |
--------------------------------------------------------------------------------
/docs/start/framework/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Framework
3 | order: 1
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/start/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Getting Started
3 | order: 1
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/start/library/data-routers.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Data Routers
3 | hidden: true
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/start/library/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Library
3 | order: 2
4 | ---
5 |
--------------------------------------------------------------------------------
/docs/tutorials/README:
--------------------------------------------------------------------------------
1 | Tutorials:
2 |
3 | - Practical Steps
4 | - Learning Oriented
5 | - Useful when we're studying
6 |
--------------------------------------------------------------------------------
/docs/tutorials/advanced-data-fetching.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Advanced Data Fetching
3 | hidden: true
4 | ---
5 |
6 | # Advanced Data Fetching
7 |
8 |