Routage
Lacis génère les routes automatiquement depuis votre répertoire routes/. Chaque fichier index.ts dans ce répertoire devient un endpoint — aucune déclaration manuelle n’est nécessaire.
Structure des répertoires
Section intitulée « Structure des répertoires »Placez vos fichiers de routes sous routes/. La hiérarchie des dossiers correspond directement aux chemins URL.
Répertoireroutes/
- index.ts → GET /
Répertoireusers/
- index.ts → /users
Répertoire[id]/
- index.ts → /users/:id
Répertoireposts/
- index.ts → /posts
Répertoire[slug]/
- index.ts → /posts/:slug
Exports de méthodes HTTP
Section intitulée « Exports de méthodes HTTP »Exportez des fonctions nommées correspondant aux méthodes HTTP en majuscules. Chaque export gère cette méthode pour l’URL du fichier.
// routes/users/index.ts → /usersimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { res.json({ users: [] })}
export async function POST(req: Request, res: Response) { const body = await req.json() res.status(201).json({ created: body })}
export async function PUT(req: Request, res: Response) { const body = await req.json() res.json({ updated: body })}
export async function PATCH(req: Request, res: Response) { const body = await req.json() res.json({ patched: body })}
export async function DELETE(req: Request, res: Response) { res.status(204).send('')}Méthodes supportées : GET, POST, PUT, PATCH, DELETE.
Segments dynamiques
Section intitulée « Segments dynamiques »Entourez un nom de répertoire de crochets pour en faire un paramètre d’URL. Le nom du paramètre est le texte entre les crochets.
Répertoireroutes/
Répertoireusers/
Répertoire[id]/
- index.ts → /users/:id
Répertoireorgs/
Répertoire[orgId]/
Répertoireteams/
Répertoire[teamId]/
- index.ts → /orgs/:orgId/teams/:teamId
Accédez aux paramètres via req.params :
// routes/users/[id]/index.ts → /users/:idimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { const { id } = req.params res.json({ id })}Routes imbriquées
Section intitulée « Routes imbriquées »Imbriquez des répertoires pour créer des chemins URL imbriqués. Chaque niveau peut avoir son propre index.ts avec des handlers indépendants.
Répertoireroutes/
Répertoireapi/
- index.ts → /api
Répertoireusers/
- index.ts → /api/users
Répertoire[id]/
- index.ts → /api/users/:id
Répertoireposts/
- index.ts → /api/users/:id/posts
// routes/api/users/[id]/posts/index.ts → /api/users/:id/postsimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { const { id } = req.params res.json({ userId: id, posts: [] })}Routes wildcard
Section intitulée « Routes wildcard »Utilisez un répertoire nommé [...] pour capturer tous les segments de chemin restants.
Répertoireroutes/
Répertoirefiles/
Répertoire[…path]/
- index.ts → /files/*
// routes/files/[...path]/index.tsimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { const filePath = req.params.path res.json({ path: filePath })}Method Not Allowed
Section intitulée « Method Not Allowed »Quand une route existe mais que la requête utilise une méthode HTTP non déclarée, Lacis retourne 405 Method Not Allowed et ajoute automatiquement un header Allow listant les méthodes supportées.
Exemple complet
Section intitulée « Exemple complet »// routes/index.ts → GET /import type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { res.json({ name: 'My API', version: '1.0.0' })}// routes/users/index.ts → /usersimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { res.json({ users: [] })}
export async function POST(req: Request, res: Response) { const body = await req.json<{ name: string; email: string }>() res.status(201).json({ id: crypto.randomUUID(), ...body })}// routes/users/[id]/index.ts → /users/:idimport type { Request, Response } from 'lacis'
export async function GET(req: Request, res: Response) { const { id } = req.params res.json({ id, name: 'Alice' })}
export async function DELETE(req: Request, res: Response) { res.status(204).send('')}