sipp
Version:
An Opinionated, High-Productivity MVC Web Framework in TypeScript
69 lines • 2.37 kB
JavaScript
;
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