К основному содержанию
правило

tanstack-router-react-cursorrules-prompt-file — правило Cursor

Задаёт стандарты TanStack Router v1 в React: файловую маршрутизацию, валидацию search-параметров схемами Zod, загрузчики данных и защиту маршрутов через beforeLoad.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/tanstack-router-react-cursorrules-prompt-file.mdc
Открыть на GitHub

Что делает tanstack-router-react-cursorrules-prompt-file

Правило настраивает генерацию кода под стек @tanstack/react-router с плагином @tanstack/router-vite-plugin. Оно заставляет ассистента строить файловую структуру в src/routes/, выносить корневой слой в __root.tsx и объявлять маршруты строго через createFileRoute либо createRootRoute. Файл routeTree.gen.ts генерируется автоматически, поэтому ассистент не должен трогать его руками.

Загрузка данных переносится из useEffect компонентов прямо в функции loader, в том числе с интеграцией кэша через queryClient.ensureQueryData. Для search-параметров правило требует схемы Zod или Valibot в свойстве validateSearch, запрещая прямое чтение window.location.search. Проверка прав авторизации выносится в хук beforeLoad с вызовом redirect.

Для тестов инструкция предписывает изолировать окружение через createMemoryHistory и передавать моки в контекст роутера.

Какие задачи решает

  • перевести загрузку данных из useEffect в типизированные loader
  • настроить валидацию search-параметров роута через Zod
  • организовать структуру файлового роутинга в директории src/routes/
  • добавить защиту приватных маршрутов через хук beforeLoad

Примеры запросов агенту

  • Создай маршрут поста src/routes/posts/$postId.tsx с типизированным loader и обработкой ошибок
  • Настрой схему пагинации и поиска для страницы каталога через validateSearch и Zod
  • Добавь auth-guard в ветку маршрутов _auth с редиректом на /login

Как установить tanstack-router-react-cursorrules-prompt-file

Вручную: положить файлы

.cursor/rules/tanstack-router-react-cursorrules-prompt-file.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о tanstack-router-react-cursorrules-prompt-file

Как установить tanstack-router-react-cursorrules-prompt-file в Cursor?

Сохраните файл по пути .cursor/rules/tanstack-router-react-cursorrules-prompt-file.mdc в корне вашего проекта.

Зачем нужно это правило?

Оно предотвращает типичные ошибки при работе с TanStack Router v1, заставляя модель соблюдать строгую типизацию, использовать файловые маршруты и выносить логику данных в loader.

Как правило защищает приватные маршруты?

Проверка авторизации выносится в свойство beforeLoad определения роута с выбросом функции redirect, что исключает логику проверки доступа из самих React-компонентов.

Исходный текст

tanstack-router-react-cursorrules-prompt-file.mdc · CC0-1.0
---
description: "Cursor rules for TanStack Router v1 with file-based routing, typed params, search validation, loaders, auth guards, and route preloading."
globs: **/*
alwaysApply: false
---
You are an expert in TanStack Router, React, TypeScript, and modern type-safe client-side routing.

# TanStack Router + React Guidelines

## Core Philosophy
- TanStack Router is 100% type-safe — leverage TypeScript generics for route params, search params, and loader data
- Prefer file-based routing for scalability; use code-based routing only for highly dynamic use cases
- Always define routes with `createFileRoute` or `createRootRoute` — never use plain objects
- Route data loading belongs in `loader` functions, not in component `useEffect`
- Search params are first-class citizens — define their schema with Zod or Valibot for validation and type inference

## Project Setup
- Use `@tanstack/react-router` with Vite and the `@tanstack/router-vite-plugin` for file-based routing
- Enable `routeTree.gen.ts` auto-generation — never manually edit this file
- Structure routes under `src/routes/` directory
- Root layout goes in `src/routes/__root.tsx`
- Use `src/routes/index.tsx` for the home/index route

## File-Based Route Conventions
```
src/routes/
  __root.tsx          ← Root layout (wraps all routes)
  index.tsx           ← / route
  about.tsx           ← /about route
  posts/
    index.tsx         ← /posts route
    $postId.tsx       ← /posts/:postId (dynamic segment)
    _layout.tsx       ← Layout route (no path segment)
  _auth/
    login.tsx         ← /login (grouped under auth layout)
  (admin)/
    dashboard.tsx     ← /dashboard (pathless group)
```

## Route Definition Patterns
```tsx
// src/routes/posts/$postId.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/posts/$postId')({
  loader: async ({ params }) => {
    return fetchPost(params.postId) // fully typed params
  },
  component: PostComponent,
})

function PostComponent() {
  const post = Route.useLoaderData() // type-safe loader data
  const { postId } = Route.useParams() // type-safe params
  return <div>{post.title}</div>
}
```

## Type-Safe Search Params
- Always define search param schemas using `z.object()` from Zod
- Use `validateSearch` option on route definition
- Access with `Route.useSearch()` — never read raw `window.location.search`
```tsx
import { z } from 'zod'
import { createFileRoute } from '@tanstack/react-router'

const searchSchema = z.object({
  page: z.number().int().min(1).default(1),
  q: z.string().optional(),
})

export const Route = createFileRoute('/search')({
  validateSearch: searchSchema,
  component: SearchPage,
})

function SearchPage() {
  const { page, q } = Route.useSearch()
  // ...
}
```

## Navigation
- Use `<Link>` from `@tanstack/react-router` — never `<a href>` for internal navigation
- Use `useNavigate()` for programmatic navigation
- Always pass typed `params` and `search` to Link — the compiler will catch mistakes
```tsx
import { Link, useNavigate } from '@tanstack/react-router'

// Declarative
<Link to="/posts/$postId" params={{ postId: '123' }}>View Post</Link>

// Programmatic
const navigate = useNavigate()
navigate({ to: '/posts/$postId', params: { postId: post.id } })
```

## Loaders & Data Fetching
- Use `loader` for data that must be available before render (no loading spinners for critical data)
- Integrate with TanStack Query by using `ensureQueryData` inside loaders for caching
- Use `staleTime` on loaders to avoid redundant fetches during navigation
- Return plain serializable data from loaders — no class instances
```tsx
export const Route = createFileRoute('/posts')({
  loader: ({ context: { queryClient } }) =>
    queryClient.ensureQueryData(postsQueryOptions()),
  component: PostsPage,
})
```

## Error Handling
- Define `errorComponent` on routes to handle loader or render errors
- Use `notFoundComponent` for 404 states within a route subtree
- Use `pendingComponent` for showing skeletons/spinners during data loading
```tsx
export const Route = createFileRoute('/posts/$postId')({
  loader: fetchPost,
  errorComponent: ({ error }) => <ErrorBanner message={error.message} />,
  pendingComponent: () => <PostSkeleton />,
  notFoundComponent: () => <NotFound />,
  component: PostDetail,
})
```

## Router Context
- Use router context to inject global dependencies (queryClient, auth, theme) into loaders
- Define context type in `__root.tsx` and pass it when creating the router
```tsx
// __root.tsx
import { createRootRouteWithContext } from '@tanstack/react-router'

interface RouterContext {
  queryClient: QueryClient
  auth: AuthState
}

export const Route = createRootRouteWithContext<RouterContext>()({
  component: RootLayout,
})

// main.tsx
const router = createRouter({
  routeTree,
  context: { queryClient, auth },
})
```

## Route Guards / Auth
- Use `beforeLoad` for authentication checks — redirect to login if unauthenticated
- Never put auth logic inside components — handle it at the routing layer
```tsx
export const Route = createFileRoute('/_auth/dashboard')({
  beforeLoad: ({ context }) => {
    if (!context.auth.isAuthenticated) {
      throw redirect({ to: '/login' })
    }
  },
  component: Dashboard,
})
```

## Performance
- Use `preload` on `<Link>` to trigger loader prefetching on hover/focus
- Set `defaultPreload: 'intent'` on the router for automatic preloading
- Use `gcTime` and `staleTime` on loaders to tune cache behavior
- Lazy-load route components with `React.lazy` for code splitting

## DevTools
- Install `@tanstack/router-devtools` and render `<TanStackRouterDevtools />` in development
- Use devtools to inspect route tree, active matches, loader data, and search params

## Testing
- Use `createMemoryHistory` and `createRouter` to create isolated router instances in tests
- Wrap components under test with `<RouterProvider router={testRouter} />`
- Mock loaders by providing fake context values

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Похожие правила IDE

Все правила IDE по теме «Фронтенд и UI» →
winui3 официальный github Правило задаёт рекомендации для WinUI 3 и Windows App SDK: от XAML и потоков до окон и MVVM. Пригодится, чтобы Copilot учитывал особенности настольных приложений Windows. ★ 40 451звёзд репо vue официальный github Правило задаёт Copilot стандарты Vue 3: Composition API, <script setup>, реактивность, Pinia и Vue Router. Пригодится, когда агент пишет компоненты в вашем стиле. ★ 40 451звёзд репо tanstack-start-shadcn-tailwind официальный github Правило задаёт Copilot стек TanStack Start, Shadcn/ui и Tailwind CSS и требует валидировать внешние данные через Zod. ★ 40 451звёзд репо tailwind-v4-vite официальный github Правило помогает подключить Tailwind CSS v4 к проекту на Vite через официальный плагин. Пригодится и для новой установки, и при переходе с v3. ★ 40 451звёзд репо svelte официальный github Направляет GitHub Copilot на стандарты Svelte 5 и SvelteKit 2: руны вместо старых сторов, типизация компонентов и безопасная работа с SSR. ★ 40 451звёзд репо power-bi-custom-visuals-development официальный github Правило для GitHub Copilot, которое подсказывает агенту, как писать кастомные визуалы Power BI на React, D3.js и TypeScript. ★ 40 451звёзд репо

Из того же набора234

Весь набор →
tauri-svelte-typescript-guide-cursorrules-prompt-f Правило для Cursor, которое задаёт агенту стиль работы с десктопными приложениями на Tauri: Svelte во фронтенде, TypeScript для типов. ★ 41 024звёзд репо tanstack-start Инструктирует Cursor по архитектуре TanStack Start: серверным функциям createServerFn, стримингу через defer() и конфигурации Vinxi. Помогает писать типизированный фулстек-код без лишних REST API. ★ 41 024звёзд репо tanstack-start-cursorrules-prompt-file Правило задаёт Cursor ориентиры для разработки на TanStack Start: от серверных функций и маршрутов до потоковой загрузки и SSR. ★ 41 024звёзд репо tanstack-router Правило для Cursor, которое задаёт агенту стандарты TanStack Router v1: файловые маршруты, типизация параметров и загрузка данных через loader. ★ 41 024звёзд репо tanstack-query Правило задаёт для Cursor шаблоны работы с TanStack Query v5 в TypeScript и React. Оно пригодится при запросах, мутациях, пагинации и Suspense. ★ 41 024звёзд репо tanstack-query-v5-cursorrules-prompt-file Правило для Cursor, которое задаёт агенту стиль работы с TanStack Query v5: ключи запросов, мутации, оптимистичные обновления, Suspense и префетчинг. ★ 41 024звёзд репо tailwind Задаёт стандарты вёрстки на Tailwind CSS и правила для компонентов UI. Срабатывает при редактировании стилей и разметки JSX или TSX. ★ 41 024звёзд репо tailwind-shadcn-ui-integration-cursorrules-prompt- Правило задаёт стиль работы Cursor с Tailwind и shadcn/ui: просит сначала расписать план, а затем писать читаемый код на TypeScript и Next.js. ★ 41 024звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой