UNPKG

sipp

Version:

An Opinionated, High-Productivity MVC Web Framework in TypeScript

69 lines 2.37 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RouteMapper = void 0; const query_string_1 = __importDefault(require("query-string")); class RouteMapper { constructor() { this.aliasMap = new Map(); } register(alias, path, method) { if (this.aliasMap.has(alias)) { throw new Error(`Conflict ${alias} already registered`); } const isOverrideableMethod = ['put', 'patch', 'delete'].includes(method); this.aliasMap.set(alias, [ this.createPath(path.split('/')), isOverrideableMethod ? method : undefined, ]); } has(name) { return this.aliasMap.has(name); } spliceParams(parts, params) { return parts.reduce((path, part) => { if (part.startsWith(':')) { const paramValue = params[part.replace(':', '')]; return path + '/' + (paramValue !== undefined ? paramValue : part); } return part ? path + '/' + part : path; }, ''); } appendQuery(path, query) { if (!query) { return path; } return `${path.replace(/\??$/, '?')}${query_string_1.default.stringify(query)}`; } resolve(name, params, query, method) { if (!this.has(name)) { throw new Error(`Not Found: ${name} not registered`); } const [path, routeMethod] = this.aliasMap.get(name); return this.construcUrl(path, params, query, method || routeMethod); } construcUrl(parts, params, query, method) { let route = this.spliceParams(parts, params || {}); if (method) { query = query || {}; query._method = method; } return this.appendQuery(route, query); } createPath(path) { const pathParts = []; path.forEach((part) => { part.split('/').forEach((partial) => { partial && pathParts.push(this.stripSlashes(partial)); }); }); return pathParts; } stripSlashes(str) { return str.replace(/^\/?(.*)\/?$/, '$1'); } } exports.RouteMapper = RouteMapper; //# sourceMappingURL=RouteMapper.js.map