multiview/node_modules/trouter/index.js
Martin Donnelly e8de544ece init
2020-05-26 21:59:25 +01:00

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;