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
|
const { exec, match, parse } = require('matchit');
class Trouter {
constructor(opts) {
this.opts = opts || {};
this.routes = {};
this.handlers = {};
this.all = this.add.bind(this, '*');
this.get = this.add.bind(this, 'GET');
this.head = this.add.bind(this, 'HEAD');
this.patch = this.add.bind(this, 'PATCH');
this.options = this.add.bind(this, 'OPTIONS');
this.connect = this.add.bind(this, 'CONNECT');
this.delete = this.add.bind(this, 'DELETE');
this.trace = this.add.bind(this, 'TRACE');
this.post = this.add.bind(this, 'POST');
this.put = this.add.bind(this, 'PUT');
}
add(method, pattern, ...fns) {
// Save decoded pattern info
if (this.routes[method] === void 0) this.routes[method]=[];
this.routes[method].push(parse(pattern));
// Save route handler(s)
if (this.handlers[method] === void 0) this.handlers[method]={};
this.handlers[method][pattern] = fns;
// Allow chainable
return this;
}
find(method, url) {
let arr = match(url, this.routes[method] || []);
if (arr.length === 0) {
arr = match(url, this.routes[method='*'] || []);
if (!arr.length) return false;
}
return {
params: exec(url, arr),
handlers: this.handlers[method][arr[0].old]
};
}
}
module.exports = Trouter;
|