@void-snippets/react

createRouteContract

Type-safe route tree factory for React Router v7.

#What it does

Converts a tree of defineRoute() definitions into a typed route contract. Every route gets a build() function that TypeScript checks at compile time — missing path params, wrong types, and forgotten required fields are all caught before the code runs.

Requires react-router ≥7.0.0.

#Setup — one file, imported everywhere

typescript
// routes.ts
import { createRouteContract, defineRoute } from '@void-snippets/react';

export const AppRoutes = createRouteContract({
  auth: {
    login:    defineRoute('/auth/login').search<{ redirect?: string }>(),
    register: defineRoute('/auth/register'),
  },
  dashboard: {
    root: defineRoute('/dashboard', {
      breadcrumb: 'Home',
      title:      'Dashboard',
    }),
    users: {
      list: defineRoute('/dashboard/users', {
        permissions: ['ADMIN'],
        breadcrumb:  'Users',
      }).search<{ page: number; sort?: 'asc' | 'desc'; q?: string }>(),

      detail: defineRoute('/dashboard/users/:userId', {
        permissions: ['ADMIN'],
        breadcrumb:  'User Detail',
      }).search<{ tab?: 'profile' | 'settings' | 'activity' }>(),
    },
    settings: defineRoute('/dashboard/settings', { breadcrumb: 'Settings' }),
  },
});

Every leaf in the tree is now a ProcessedRoute with .path, .breadcrumb, .title, .permissions, and build().