webserv
Version:
a quick, flexible, fully typed development server
72 lines • 2.98 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "path-to-regexp", "url", "../log", "../util/request"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const path_to_regexp_1 = __importDefault(require("path-to-regexp"));
const url_1 = require("url");
const log_1 = require("../log");
const request_1 = require("../util/request");
exports.routeMatch = Symbol();
function parameterizeMatches(keys, matches) {
const params = {};
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const match = matches[i + 1];
if (match) {
params[key.name] = decodeURIComponent(match);
if (key.repeat) {
params[key.name] = params[key.name].split(key.delimiter);
}
}
}
return params;
}
function relativeUrl(url, keys, matches) {
if (keys.length === 0) {
// There are no wildcards. The entire route was matched.
return '/';
}
else if (keys[keys.length - 1].pattern === '.*') {
// the last match was a wildcard. Reduce the incoming url.
const relativeUrl = matches[matches.length - 1] || '/';
return relativeUrl.charAt(0) === '/' ? relativeUrl : `/${relativeUrl}`;
}
return url;
}
exports.pathGuard = ({ match }) => {
if (typeof match === 'string') {
const keys = [];
const regex = path_to_regexp_1.default(match, keys);
log_1.log.debug(`Created regexp ${regex} to match ${match}`);
log_1.log.debug('route keys', keys);
return (request) => {
const url = url_1.parse(request.url);
const result = regex.exec(url.pathname);
log_1.log.debug(`matching ${url.pathname} against ${regex}. ${Boolean(result)}.`);
if (result) {
request_1.updateRequest(request, {
originalUrl: request.url,
params: parameterizeMatches(keys, result),
url: relativeUrl(request.url, keys, result)
});
}
return !!result;
};
}
return (request) => {
const url = url_1.parse(request.url);
return match.test(url.pathname);
};
};
});
//# sourceMappingURL=path.js.map