11# Route Patterns
22
3- > ** Reference** : [ URLPattern API Documentation] ( https://docs.deno.com/api/web/~/URLPattern )
4-
5- Deserve uses ` URLPattern ` for efficient route matching with native pattern support.
3+ Deserve uses a ** Simple Router** with radix tree structure algorithm.
64
75## Pattern Matching
86
9- Deserve converts file paths to ` URLPattern ` instances for route matching :
7+ Deserve converts file paths to route patterns using a radix tree implementation :
108
119```
1210.
@@ -23,7 +21,9 @@ Use `[param]` syntax for dynamic route segments:
2321### Single Parameter
2422``` typescript
2523// routes/users/[id].ts
26- export function GET(req : Request , params : Record <string , string >) {
24+ import { Send , DeserveRequest } from ' @neabyte/deserve'
25+
26+ export function GET(req : DeserveRequest , params : Record <string , string >) {
2727 const { id } = params
2828 return Send .json ({ userId: id })
2929}
@@ -32,7 +32,9 @@ export function GET(req: Request, params: Record<string, string>) {
3232### Multiple Parameters
3333``` typescript
3434// routes/users/[id]/posts/[postId].ts
35- export function GET(req : Request , params : Record <string , string >) {
35+ import { Send , DeserveRequest } from ' @neabyte/deserve'
36+
37+ export function GET(req : DeserveRequest , params : Record <string , string >) {
3638 const { id, postId } = params
3739 return Send .json ({ userId: id , postId })
3840}
@@ -41,7 +43,9 @@ export function GET(req: Request, params: Record<string, string>) {
4143### Nested Parameters
4244``` typescript
4345// routes/api/v1/users/[userId]/posts/[postId]/comments/[commentId].ts
44- export function GET(req : Request , params : Record <string , string >) {
46+ import { Send , DeserveRequest } from ' @neabyte/deserve'
47+
48+ export function GET(req : DeserveRequest , params : Record <string , string >) {
4549 const { userId, postId, commentId } = params
4650 return Send .json ({ userId , postId , commentId })
4751}
@@ -52,32 +56,32 @@ export function GET(req: Request, params: Record<string, string>) {
5256### User Management
5357```
5458routes/
55- ├── users.ts → /users
56- ├── users/[id].ts → /users/:id
57- ├── users/[id]/profile.ts → /users/:id/profile
58- ├── users/[id]/posts.ts → /users/:id/posts
59- └── users/[id]/posts/[postId].ts → /users/:id/posts/:postId
59+ ├── users.ts → /users
60+ ├── users/[id].ts → /users/:id
61+ ├── users/[id]/profile.ts → /users/:id/profile
62+ ├── users/[id]/posts.ts → /users/:id/posts
63+ └── users/[id]/posts/[postId].ts → /users/:id/posts/:postId
6064```
6165
6266### API Versioning
6367```
6468routes/
6569├── api/
6670│ ├── v1/
67- │ │ └── users/[id].ts → /api/v1/users/:id
71+ │ │ └── users/[id].ts → /api/v1/users/:id
6872│ └── v2/
69- │ └── users/[id].ts → /api/v2/users/:id
73+ │ └── users/[id].ts → /api/v2/users/:id
7074```
7175
7276### Blog System
7377```
7478routes/
7579├── blog/
76- │ ├── [slug].ts → /blog/:slug
80+ │ ├── [slug].ts → /blog/:slug
7781│ └── [year]/
7882│ └── [month]/
7983│ └── [day]/
80- │ └── [slug].ts → /blog/:year/:month/:day/:slug
84+ │ └── [slug].ts → /blog/:year/:month/:day/:slug
8185```
8286
8387## Route Matching Priority
@@ -103,7 +107,9 @@ Extract and validate parameters in your route handlers:
103107
104108``` typescript
105109// routes/users/[id].ts
106- export function GET(req : Request , params : Record <string , string >) {
110+ import { Send , DeserveRequest } from ' @neabyte/deserve'
111+
112+ export function GET(req : DeserveRequest , params : Record <string , string >) {
107113 const { id } = params
108114 // Validate parameter
109115 if (! id || ! / ^ \d + $ / .test (id )) {
@@ -118,7 +124,9 @@ export function GET(req: Request, params: Record<string, string>) {
118124### Optional Parameters
119125``` typescript
120126// routes/posts/[slug].ts
121- export function GET(req : Request , params : Record <string , string >) {
127+ import { Send , DeserveRequest } from ' @neabyte/deserve'
128+
129+ export function GET(req : DeserveRequest , params : Record <string , string >) {
122130 const { slug } = params
123131 // Handle post by slug
124132 return Send .json ({ slug })
@@ -128,26 +136,58 @@ export function GET(req: Request, params: Record<string, string>) {
128136### Multiple Segments
129137``` typescript
130138// routes/categories/[category]/products/[product].ts
131- export function GET(req : Request , params : Record <string , string >) {
139+ import { Send , DeserveRequest } from ' @neabyte/deserve'
140+
141+ export function GET(req : DeserveRequest , params : Record <string , string >) {
132142 const { category, product } = params
133143 return Send .json ({ category , product })
134144}
135145```
136146
147+ ## Performance Benefits
148+
149+ ### Static Route Optimization
150+ Static routes (no parameters) are cached for O(1) lookup:
151+ ``` typescript
152+ // These routes are optimized for instant matching
153+ routes / index .ts → / (cached )
154+ routes / about .ts → / about (cached )
155+ routes / users .ts → / users (cached )
156+ ```
157+
158+ ### Dynamic Route Matching
159+ Dynamic routes use radix tree traversal for efficient matching:
160+ ``` typescript
161+ // These routes use tree traversal
162+ routes / users / [id ].ts → / users/ :id
163+ routes / users / [id ]/ posts .ts → / users/ :id / posts
164+ routes / api / v1 / [version ].ts → / api / v1 / :version
165+ ```
166+
137167## Pattern Limitations
138168
139169### Invalid Patterns
140170```
141- ❌ routes/users/[...id].ts // Rest parameters not supported
142- ❌ routes/users/(group).ts // Groups not supported
143- ❌ routes/users/:id.ts // Colon syntax not supported
171+ ❌ routes/users/[...id].ts // Rest parameters not supported
172+ ❌ routes/users/(group).ts // Groups not supported
173+ ❌ routes/users/:id.ts // Colon syntax not supported
174+ ❌ routes/users/*.ts // Wildcard without brackets
175+ ❌ routes/users/**.ts // Double wildcard without brackets
176+ ```
177+
178+ ### Supported Patterns
179+ ```
180+ ✅ routes/users/[id].ts // Single parameter
181+ ✅ routes/users/[id]/posts.ts // Nested parameters
182+ ✅ routes/api/v1/[version].ts // API versioning
183+ ✅ routes/posts/[slug].ts // Slug-based routing
144184```
145185
146186### Valid Patterns
147187```
148- ✅ routes/users/[id].ts // Single parameter
149- ✅ routes/users/[id]/posts.ts // Nested parameters
150- ✅ routes/api/v1/users.ts // Static segments
188+ ✅ routes/users/[id].ts // Single parameter
189+ ✅ routes/users/[id]/posts.ts // Nested parameters
190+ ✅ routes/api/v1/users.ts // Static segments
151191```
152192
153193## Best Practices
@@ -179,3 +219,4 @@ router.onError((req, error) => {
179219
180220- [ HTTP Methods] ( /core-concepts/http-methods ) - Supported methods
181221- [ File-based Routing] ( /core-concepts/file-based-routing ) - Core routing concepts
222+ - [ Request Handling] ( /core-concepts/request-handling ) - Working with DeserveRequest
0 commit comments