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;