UNPKG

webserv

Version:

a quick, flexible, fully typed development server

72 lines 2.98 kB
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