46 lines
1.2 KiB
JavaScript
46 lines
1.2 KiB
JavaScript
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;
|