aurelia-path
Version:
Utilities for path manipulation.
213 lines (209 loc) • 6.59 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
function trimDots(ary) {
for (var i = 0; i < ary.length; ++i) {
var part = ary[i];
if (part === '.') {
ary.splice(i, 1);
i -= 1;
}
else if (part === '..') {
if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') {
continue;
}
else if (i > 0) {
ary.splice(i - 1, 2);
i -= 2;
}
}
}
}
function relativeToFile(name, file) {
var fileParts = file && file.split('/');
var nameParts = name.trim().split('/');
if (nameParts[0].charAt(0) === '.' && fileParts) {
var normalizedBaseParts = fileParts.slice(0, fileParts.length - 1);
nameParts.unshift.apply(nameParts, normalizedBaseParts);
}
trimDots(nameParts);
return nameParts.join('/');
}
function join(path1, path2) {
if (!path1) {
return path2;
}
if (!path2) {
return path1;
}
var schemeMatch = path1.match(/^([^/]*?:)\//);
var scheme = (schemeMatch && schemeMatch.length > 0) ? schemeMatch[1] : '';
path1 = path1.substr(scheme.length);
var urlPrefix;
if (path1.indexOf('///') === 0 && scheme === 'file:') {
urlPrefix = '///';
}
else if (path1.indexOf('//') === 0) {
urlPrefix = '//';
}
else if (path1.indexOf('/') === 0) {
urlPrefix = '/';
}
else {
urlPrefix = '';
}
var trailingSlash = path2.slice(-1) === '/' ? '/' : '';
var url1 = path1.split('/');
var url2 = path2.split('/');
var url3 = [];
for (var i = 0, ii = url1.length; i < ii; ++i) {
if (url1[i] === '..') {
if (url3.length && url3[url3.length - 1] !== '..') {
url3.pop();
}
else {
url3.push(url1[i]);
}
}
else if (url1[i] === '.' || url1[i] === '') {
continue;
}
else {
url3.push(url1[i]);
}
}
for (var i = 0, ii = url2.length; i < ii; ++i) {
if (url2[i] === '..') {
if (url3.length && url3[url3.length - 1] !== '..') {
url3.pop();
}
else {
url3.push(url2[i]);
}
}
else if (url2[i] === '.' || url2[i] === '') {
continue;
}
else {
url3.push(url2[i]);
}
}
return scheme + urlPrefix + url3.join('/') + trailingSlash;
}
var encode = encodeURIComponent;
var dollarSignRegex = /%24/g;
var encodeKey = function (k) { return encode(k).replace(dollarSignRegex, '$'); };
function buildParam(key, value, traditional) {
var result = [];
if (value === null || value === undefined) {
return result;
}
if (Array.isArray(value)) {
for (var i = 0, l = value.length; i < l; i++) {
if (traditional) {
result.push("".concat(encodeKey(key), "=").concat(encode(value[i])));
}
else {
var arrayKey = key + '[' + (typeof value[i] === 'object' && value[i] !== null ? i : '') + ']';
result = result.concat(buildParam(arrayKey, value[i]));
}
}
}
else if (typeof (value) === 'object' && !traditional) {
for (var propertyName in value) {
result = result.concat(buildParam(key + '[' + propertyName + ']', value[propertyName]));
}
}
else {
result.push("".concat(encodeKey(key), "=").concat(encode(value)));
}
return result;
}
function buildQueryString(params, traditional) {
var pairs = [];
var keys = Object.keys(params || {}).sort();
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
pairs = pairs.concat(buildParam(key, params[key], traditional));
}
if (pairs.length === 0) {
return '';
}
return pairs.join('&');
}
function processScalarParam(existedParam, value) {
if (Array.isArray(existedParam)) {
existedParam.push(value);
return existedParam;
}
if (existedParam !== undefined) {
return [existedParam, value];
}
return value;
}
function parseComplexParam(queryParams, keys, value) {
var currentParams = queryParams;
var keysLastIndex = keys.length - 1;
for (var j = 0; j <= keysLastIndex; j++) {
var key = keys[j] === '' ? currentParams.length : keys[j];
preventPollution(key);
if (j < keysLastIndex) {
var prevValue = !currentParams[key] || typeof currentParams[key] === 'object' ? currentParams[key] : [currentParams[key]];
currentParams = currentParams[key] = prevValue || (isNaN(keys[j + 1]) ? {} : []);
}
else {
currentParams = currentParams[key] = value;
}
}
}
function parseQueryString(queryString) {
var queryParams = {};
if (!queryString || typeof queryString !== 'string') {
return queryParams;
}
var query = queryString;
if (query.charAt(0) === '?') {
query = query.substr(1);
}
var pairs = query.replace(/\+/g, ' ').split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
var key = decodeURIComponent(pair[0]);
if (!key) {
continue;
}
var keys = key.split('][');
var keysLastIndex = keys.length - 1;
if (/\[/.test(keys[0]) && /\]$/.test(keys[keysLastIndex])) {
keys[keysLastIndex] = keys[keysLastIndex].replace(/\]$/, '');
keys = keys.shift().split('[').concat(keys);
keysLastIndex = keys.length - 1;
}
else {
keysLastIndex = 0;
}
if (pair.length >= 2) {
var value = pair[1] ? decodeURIComponent(pair[1]) : '';
if (keysLastIndex) {
parseComplexParam(queryParams, keys, value);
}
else {
preventPollution(key);
queryParams[key] = processScalarParam(queryParams[key], value);
}
}
else {
queryParams[key] = true;
}
}
return queryParams;
}
function preventPollution(key) {
if (key === '__proto__') {
throw new Error('Prototype pollution detected.');
}
}
exports.buildQueryString = buildQueryString;
exports.join = join;
exports.parseQueryString = parseQueryString;
exports.relativeToFile = relativeToFile;
//# sourceMappingURL=aurelia-path.js.map
;