react-router-v7 — Cursor rule: what it does, how to install
Enforces React Router v7 conventions for route modules, deterministic loaders, action mutations, and typed routing in Cursor.
.cursor/rules/react-router-v7.mdcWhat react-router-v7 does
This rule guides Cursor when generating code for React Router v7 projects in framework mode. Route modules serve as boundaries for UI, loaders, actions, and ErrorBoundary exports. The assistant avoids placing data fetching inside useEffect, keeping loaders deterministic and free of side effects.
Data mutations rely on action handlers paired with Form, useFetcher, and useSubmit for progressive enhancement. Validation failures return typed action data instead of unhandled exceptions. Checking authorization strictly inside UI components is unsafe: access checks belong directly in loaders before protected data reaches the client.
Target paths cover app/routes/**/*, src/routes/**/*, routes/**/*, alongside react-router.config.*, vite.config.*, and all TypeScript files. For testing, the rule requires mocking network requests at the service layer and writing integration checks for form submissions.
What it helps with
- eliminate redundant data fetches inside
useEffect - implement mutations with
action,Form, anduseFetcher - validate route parameters and query strings at loader boundaries
- prevent server secrets from leaking into client actions
Example prompts for the agent
- Create
app/routes/settings.tsxwith a typed loader and an action for form updates - Refactor this component to use
useFetcherand progressive enhancement - Add route-level validation for query parameters in the loader
How to install react-router-v7
Manually: put the files in place
.cursor/rules/react-router-v7.mdcFrontmatter: description, globs, alwaysApply
Manually: put the files in place
.claude/rules/react-router-v7.mdThe paths frontmatter field limits the files: move globs from the source into paths
AGENTS.md
Codex reads AGENTS.md: paste the rule text there
Manually: put the files in place
.github/instructions/react-router-v7.instructions.mdThe applyTo field sets which files it applies to: move globs from the source into applyTo
Manually: put the files in place
.devin/rules/react-router-v7.mdManually: put the files in place
.clinerules/react-router-v7.mdStep by step, with commands for each platform: Cursor rules: .mdc files, four modes and what replaced .cursorrules
Questions about react-router-v7
How to install react-router-v7 in Cursor?
Create the file .cursor/rules/react-router-v7.mdc in your repository root and paste the rule text into it.
What does react-router-v7 do?
It configures Cursor to write code following React Router v7 patterns, focusing on data loading, actions, typed parameters, and error boundaries.
Why does the rule restrict authentication checks to loaders?
Checking auth only in React components lets loaders fetch and expose protected records to the browser. Access checks must run before rendering begins.
Source text
react-router-v7.mdc · CC0-1.0
--- description: React Router v7 rules for framework mode, data routers, loaders, actions, route modules, and progressive enhancement globs: ["app/routes/**/*", "src/routes/**/*", "routes/**/*", "react-router.config.*", "vite.config.*", "**/*.tsx", "**/*.ts"] alwaysApply: false --- # React Router v7 Rules ## Route Modules - Use route modules as the boundary for route UI, loader data, actions, metadata, and error boundaries. - Keep route modules small; move shared UI to components and reusable data access to services. - Prefer file-based routing in framework mode when the project is configured for it. - Use nested routes for shared layouts and progressive disclosure. - Export route-specific `ErrorBoundary` components for recoverable route failures. ## Data Loading - Use loaders for route data that should be available before render. - Keep loaders deterministic and side-effect free. - Validate params and search params at the loader boundary. - Return typed data and consume it through route hooks rather than duplicating fetch logic in components. - Use deferred or streaming patterns only when they improve perceived performance. ## Mutations - Use actions for route mutations and form submissions. - Prefer `Form`, `useFetcher`, and `useSubmit` for progressive enhancement. - Revalidate affected loader data after mutations. - Handle validation errors as typed action data instead of generic exceptions. - Keep server-only secrets and privileged operations out of client actions. ## Navigation and State - Store shareable state in URL params or search params. - Keep ephemeral UI state local to components. - Use pending navigation state to show optimistic or loading UI. - Avoid global state for data that belongs to route loaders. ## TypeScript and Testing - Type loader and action return values. - Add tests for route loaders, actions, validation failures, and error boundaries. - Use integration tests for critical form and navigation flows. - Mock network and persistence at the route-service boundary. ## Common Mistakes - Do not duplicate loader fetches in `useEffect`. - Do not mutate data in loaders. - Do not hide route errors behind a single generic app-level catch-all. - Do not put auth checks only in components when loader data is protected.
© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules