`: Search params (e.g., `page:number,filter:string`)
### Examples:
```bash
# Create static route
/es-tanstack-route /about
# Create dynamic route with loader
/es-tanstack-route /users/$id --loader
# Create API route
/es-tanstack-route /api/users --api
# Create route with search params
/es-tanstack-route /users --search-params page:number,sort:string
```
## Main Tasks
### 1. Parse Route Path
Convert route path to file path:
| Route Path | File Path |
|------------|-----------|
| `/` | `src/routes/index.tsx` |
| `/about` | `src/routes/about.tsx` |
| `/users/$id` | `src/routes/users.$id.tsx` |
| `/blog/$slug` | `src/routes/blog.$slug.tsx` |
| `/api/users` | `src/routes/api/users.ts` |
### 2. Generate Route File
**Standard Route with Loader**:
```tsx
// src/routes/users.$id.tsx
import { createFileRoute } from '@tanstack/react-router'
import { z } from 'zod'
export const Route = createFileRoute('/users/$id')({
loader: async ({ params, context }) => {
const { env } = context.cloudflare
const user = await env.DB.prepare(
'SELECT * FROM users WHERE id = ?'
).bind(params.id).first()
if (!user) {
throw new Error('User not found')
}
return { user }
},
errorComponent: ({ error }) => (
),
pendingComponent: () => (
Loading...
),
component: UserPage,
})
function UserPage() {
const { user } = Route.useLoaderData()
return (
)
}
```
**API Route**:
```typescript
// src/routes/api/users.ts
import { createAPIFileRoute } from '@tanstack/start/api'
export const Route = createAPIFileRoute('/api/users')({
GET: async ({ request, context }) => {
const { env } = context.cloudflare
const users = await env.DB.prepare('SELECT * FROM users').all()
return Response.json(users)
},
POST: async ({ request, context }) => {
const { env } = context.cloudflare
const data = await request.json()
await env.DB.prepare(
'INSERT INTO users (name, email) VALUES (?, ?)'
).bind(data.name, data.email).run()
return Response.json({ success: true })
},
})
```
**Route with Search Params**:
```tsx
// src/routes/users.tsx
import { createFileRoute } from '@tanstack/react-router'
import { z } from 'zod'
const searchSchema = z.object({
page: z.number().int().positive().default(1),
sort: z.enum(['name', 'date']).default('name'),
filter: z.string().optional(),
})
export const Route = createFileRoute('/users')({
validateSearch: searchSchema,
loaderDeps: ({ search }) => search,
loader: async ({ deps: search, context }) => {
const { env } = context.cloudflare
const offset = (search.page - 1) * 20
const users = await env.DB.prepare(
`SELECT * FROM users ORDER BY ${search.sort} LIMIT 20 OFFSET ?`
).bind(offset).all()
return { users, search }
},
component: UsersPage,
})
function UsersPage() {
const { users, search } = Route.useLoaderData()
const navigate = Route.useNavigate()
return (
Users (Page {search.page})
{/* ... */}
)
}
```
### 3. Generate TypeScript Types
```typescript
// src/types/routes.ts
export interface UserParams {
id: string
}
export interface UsersSearch {
page: number
sort: 'name' | 'date'
filter?: string
}
```
### 4. Update Router Configuration
Ensure route is registered in router.
### 5. Validation
**Task tanstack-routing-specialist(generated route)**:
- Verify route path syntax
- Validate loader implementation
- Check error handling
- Verify TypeScript types
- Ensure Cloudflare bindings accessible
## Success Criteria
✅ Route file generated in correct location
✅ Loader implemented with Cloudflare bindings
✅ Error boundary included
✅ Pending state handled
✅ TypeScript types defined
✅ Search params validated (if applicable)