deno.land / x / duck_web_framework@0.1.1 / router.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { Middleware, MiddlewareFunction, ErrorMiddlewareFunction, Endpoint,} from "./middleware.ts";
export enum HTTPMethods { GET = "GET", POST = "POST", PUT = "PUT", PATCH = "PATCH", DELETE = "DELETE", OPTIONS = "OPTIONS", HEAD = "HEAD", ANY = "*",}
/** * Router stores route handlers and middlewares. * It can have a base URL specified, which will be prepended to every route. * Every middleware will only work on requests that point to URL that starts with that base. */export class Router { private _middlewares: Middleware[] = []; private _base: string;
/** * * @param base - base URL to be prepended to every route */ constructor(base: string = "") { this._base = base; }
private route(path: string, method: HTTPMethods, middlewareHandler: MiddlewareFunction | ErrorMiddlewareFunction) { const endpoint: Endpoint = { path: () => `${this._base}${path}`, method: method, }; this._middlewares.push(new Middleware(middlewareHandler, endpoint)); }
/** * @returns {(MiddlewareFunction | ErrorMiddlewareFunction)[]} - all middlewares, internal usage only */ get middlewares() { return this._middlewares; }
/** * Pushes given middleware or merges another router's middlewares with this router's middlewares * @param middlewareHandler - middleware to use or another router to merge with */ use(middlewareHandler: MiddlewareFunction | ErrorMiddlewareFunction | Router) { if (middlewareHandler instanceof Router) { // prepend this router's base to the router's being used base middlewareHandler._base = this._base + middlewareHandler._base; return this._middlewares = this._middlewares.concat(middlewareHandler.middlewares); }
this._middlewares.push(new Middleware(middlewareHandler, { path: () => `${this._base}/*`, method: HTTPMethods.ANY })); }
/** * Uses specified middleware(s) on given path, matching all HTTP methods * @param path - the path to handle * @param middlewares - one or more middlewares (NOT an array) */ all(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.ANY, middleware); }); }
/** * Uses specified middleware(s) on given path, if request method is GET. * All other methods match HTTP methods according to their name (post matches POST, delete matches DELETE etc.) * @param path - the path to hand;e * @param middlewares - one or more middlewares (NOT an array) */ get(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.GET, middleware); }); }
head(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.HEAD, middleware); }); }
post(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.POST, middleware); }); }
put(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.PUT, middleware); }); }
patch(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.PATCH, middleware); }); }
delete(path: string, ...middlewares: MiddlewareFunction[]) { middlewares.forEach((middleware) => { this.route(path, HTTPMethods.DELETE, middleware); }); }}
duck_web_framework

Version Info

Tagged at
3 years ago