File-based Routing ​
Reference: Deno File-based Routing Tutorial
File-based routing is Deserve's core concept - your file system structure becomes your API structure automatically, following the same pattern as Next.js but for Deno APIs.
How It Works ​
Deserve scans your routes directory and creates endpoints from file structure. All supported extensions (.ts, .js, .tsx, .jsx, .mjs, .cjs) work the same way:
routes/
├── index.ts → GET /
├── about.mjs → GET /about
├── users.js → GET /users
├── users/[id].ts → GET /users/:id
└── users/[id]/
└── posts/
└── [postId].jsx → GET /users/:id/posts/:postIdCore Rules ​
1. File Names Become Routes ​
index.ts,index.js,index.mjs→/(root)about.ts,about.js,about.mjs→/aboutusers.ts,users.js,users.cjs→/users
All supported extensions (.ts, .js, .tsx, .jsx, .mjs, .cjs) work identically.
2. Folders Create Nested Routes ​
users/[id].ts→/users/:idusers/[id]/posts.ts→/users/:id/posts
3. Dynamic Parameters Use [param] Syntax ​
[id].ts→:idparameter[userId].ts→:userIdparameter[postId].ts→:postIdparameter
4. HTTP Methods Are Exported Functions ​
typescript
import type { Context } from '@neabyte/deserve'
export function GET(ctx: Context): Response {
return ctx.send.json({ users: [] })
}
export async function POST(ctx: Context): Promise<Response> {
const data = await ctx.body()
return ctx.send.json({ message: 'User created', data })
}
// export function [method](ctx: Context): Response {
// ... code here ...
// }5. Case-Sensitive URLs ​
URLs are case-sensitive following HTTP standards:
/Users/Johnâ‰/users/john/API/v1â‰/api/v1
6. Valid Filename Characters ​
Files can contain specific rules:
a-z,A-Z,0-9- Alphanumeric characters_- Underscore-- Dash.- Dot~- Tilde+- Plus sign[]- Brackets for dynamic parameters