mirror of
https://github.com/denoland/deno.git
synced 2024-11-01 09:24:20 -04:00
84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.mergePath = exports.isAbsoluteURL = exports.getPathFromURL = exports.getPattern = exports.splitPath = void 0;
|
||
|
const URL_REGEXP = /^https?:\/\/[a-zA-Z0-9\-\.:]+(\/?[^?#]*)/;
|
||
|
const splitPath = (path) => {
|
||
|
const paths = path.split(/\//); // faster than path.split('/')
|
||
|
if (paths[0] === '') {
|
||
|
paths.shift();
|
||
|
}
|
||
|
return paths;
|
||
|
};
|
||
|
exports.splitPath = splitPath;
|
||
|
const patternCache = {};
|
||
|
const getPattern = (label) => {
|
||
|
// * => wildcard
|
||
|
// :id{[0-9]+} => ([0-9]+)
|
||
|
// :id => (.+)
|
||
|
//const name = ''
|
||
|
if (label === '*') {
|
||
|
return '*';
|
||
|
}
|
||
|
const match = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);
|
||
|
if (match) {
|
||
|
if (!patternCache[label]) {
|
||
|
if (match[2]) {
|
||
|
patternCache[label] = [label, match[1], new RegExp('^' + match[2] + '$')];
|
||
|
}
|
||
|
else {
|
||
|
patternCache[label] = [label, match[1], true];
|
||
|
}
|
||
|
}
|
||
|
return patternCache[label];
|
||
|
}
|
||
|
return null;
|
||
|
};
|
||
|
exports.getPattern = getPattern;
|
||
|
const getPathFromURL = (url, strict = true) => {
|
||
|
const queryIndex = url.indexOf('?');
|
||
|
const result = url.substring(url.indexOf('/', 8), queryIndex === -1 ? url.length : queryIndex);
|
||
|
// if strict routing is false => `/hello/hey/` and `/hello/hey` are treated the same
|
||
|
// default is true
|
||
|
if (strict === false && result.endsWith('/')) {
|
||
|
return result.slice(0, -1);
|
||
|
}
|
||
|
return result;
|
||
|
};
|
||
|
exports.getPathFromURL = getPathFromURL;
|
||
|
const isAbsoluteURL = (url) => {
|
||
|
const match = url.match(URL_REGEXP);
|
||
|
if (match) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
exports.isAbsoluteURL = isAbsoluteURL;
|
||
|
const mergePath = (...paths) => {
|
||
|
let p = '';
|
||
|
let endsWithSlash = false;
|
||
|
for (let path of paths) {
|
||
|
/* ['/hey/','/say'] => ['/hey', '/say'] */
|
||
|
if (p.endsWith('/')) {
|
||
|
p = p.slice(0, -1);
|
||
|
endsWithSlash = true;
|
||
|
}
|
||
|
/* ['/hey','say'] => ['/hey', '/say'] */
|
||
|
if (!path.startsWith('/')) {
|
||
|
path = `/${path}`;
|
||
|
}
|
||
|
/* ['/hey/', '/'] => `/hey/` */
|
||
|
if (path === '/' && endsWithSlash) {
|
||
|
p = `${p}/`;
|
||
|
}
|
||
|
else if (path !== '/') {
|
||
|
p = `${p}${path}`;
|
||
|
}
|
||
|
/* ['/', '/'] => `/` */
|
||
|
if (path === '/' && p === '') {
|
||
|
p = '/';
|
||
|
}
|
||
|
}
|
||
|
return p;
|
||
|
};
|
||
|
exports.mergePath = mergePath;
|