PluginBench
Rule

tanstack router

via PatrickJS/awesome-cursorrules

Type-safe file-based routing for React with TanStack Router v1, loaders, and search params validation

What is tanstack router?

TanStack Router v1 provides 100% type-safe client-side routing for React apps using file-based conventions and TypeScript generics. Use this rule when building scalable React applications that require type-safe route params, search params validation with Zod, data loading via loaders, auth guards, and TanStack Query integration.

  • Define type-safe routes with file-based routing conventions and createFileRoute/createRootRoute
  • Validate and access search params with Zod schemas using Route.useSearch()
  • Load route data in loader functions with automatic TanStack Query integration via queryClient.ensureQueryData()
  • Implement auth guards and redirects with beforeLoad hooks
  • Access type-safe route params and loader data via Route.useParams() and Route.useLoaderData()
  • Enable automatic prefetching and code splitting with defaultPreload and React.lazy

Applies to

File patterns this rule matches.

["src/routes/**/*"
src/routeTree.gen.ts
"app.config.ts"]
Rule definition (reference)

Source of truth, from the repository.

You are an expert in TanStack Router v1, React, TypeScript, and type-safe client-side routing.

Core Principles

  • TanStack Router is 100% type-safe — leverage TypeScript generics for params, search params, and loader data
  • Prefer file-based routing with @tanstack/router-vite-plugin for scalability
  • Always define routes with createFileRoute or createRootRoute
  • Route data loading belongs in loader functions, not in component useEffect
  • Search params are first-class — always define their schema with Zod for type safety

File-Based Route Conventions

src/routes/
  __root.tsx          ← Root layout
  index.tsx           ← / route
  posts/
    index.tsx         ← /posts
    $postId.tsx       ← /posts/:postId (dynamic)
    _layout.tsx       ← Layout route (no path segment)
  _auth/              ← Pathless auth layout group
    dashboard.tsx

Route Definition

export const Route = createFileRoute('/posts/$postId')({
  loader: async ({ params }) => fetchPost(params.postId),
  component: PostComponent,
  errorComponent: ({ error }) => <ErrorBanner message={error.message} />,
  pendingComponent: () => <PostSkeleton />,
})

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

Type-Safe Search Params

  • Always define search params with Zod and validateSearch
  • Access with Route.useSearch() — never read window.location.search directly
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,
})

Navigation

  • Use <Link> for internal navigation — never <a href>
  • Always pass typed params and search — the compiler will catch mistakes
<Link to="/posts/$postId" params={{ postId: '123' }}>View Post</Link>

Loaders + TanStack Query Integration

export const Route = createFileRoute('/posts')({
  loader: ({ context: { queryClient } }) =>
    queryClient.ensureQueryData(postsQueryOptions()),
  component: PostsPage,
})

Router Context for Dependency Injection

// __root.tsx
interface RouterContext { queryClient: QueryClient; auth: AuthState }
export const Route = createRootRouteWithContext<RouterContext>()({ component: RootLayout })

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

Auth Guards

export const Route = createFileRoute('/_auth/dashboard')({
  beforeLoad: ({ context }) => {
    if (!context.auth.isAuthenticated) throw redirect({ to: '/login' })
  },
  component: Dashboard,
})

Performance

  • Set defaultPreload: 'intent' on router for automatic prefetching on hover/focus
  • Use React.lazy for route component code splitting
  • Install @tanstack/router-devtools and render <TanStackRouterDevtools /> in development

Related rules

Senior full-stack TypeScript, React, Node.js guidance with clean architecture, testing, and WHY-oriented reasoning.

**/*
41k
via PatrickJS/awesome-cursorrules

Quantitative factor research skills for designing, evaluating, and mining alpha factors in equities markets.

**/*
41k
via PatrickJS/awesome-cursorrules

Android development with Jetpack Compose, clean architecture, and Material Design 3.

**/*
41k
via PatrickJS/awesome-cursorrules

Angular development with Novo Elements UI library using standalone components.

**/*
41k
via PatrickJS/awesome-cursorrules

Expert Angular 18 + TypeScript development with Jest, emphasizing clean code and performance.

**/*
41k
via PatrickJS/awesome-cursorrules

Manage Kubernetes clusters, add-ons, stacks, and credentials via the Ankra CLI platform.

**/*.sh +5
41k
via PatrickJS/awesome-cursorrules