You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.0 KiB
186 lines
5.0 KiB
(function (global, factory) {
|
|
if (typeof define === "function" && define.amd) {
|
|
define(['module', 'exports'], factory);
|
|
} else if (typeof exports !== "undefined") {
|
|
factory(module, exports);
|
|
} else {
|
|
var mod = {
|
|
exports: {}
|
|
};
|
|
factory(mod, mod.exports);
|
|
global.url = mod.exports;
|
|
}
|
|
})(this, function (module, exports) {
|
|
'use strict';
|
|
|
|
exports.__esModule = true;
|
|
function parseQuery(str) {
|
|
var query = {};
|
|
if (str.length) {
|
|
str.replace(/\+/g, ' ').split('&').forEach(function (s) {
|
|
var pair = s.split('=');
|
|
var key = decodeURIComponent(pair[0]);
|
|
var val = pair.length === 1 ? '' : decodeURIComponent(pair[1]);
|
|
if (query[key] == null) {
|
|
query[key] = val;
|
|
} else {
|
|
if (query[key].constructor !== Array) query[key] = [query[key]];
|
|
query[key].push(val);
|
|
}
|
|
});
|
|
}
|
|
return query;
|
|
}
|
|
|
|
function formatQuery(obj) {
|
|
var str = '';
|
|
|
|
var _loop = function _loop(p) {
|
|
var key = encodeURIComponent(p);
|
|
[].concat(obj[p]).forEach(function (val) {
|
|
if (val == null) return;
|
|
str += '&' + key;
|
|
if (val !== '') str += '=' + encodeURIComponent(val);
|
|
});
|
|
};
|
|
|
|
for (var p in obj) {
|
|
_loop(p);
|
|
}
|
|
return str.slice(1);
|
|
}
|
|
|
|
function parse(str) {
|
|
var m = /^(?:([^:/?#]+:))?(?:\/\/(?:(([^:@]*)(?::([^:@]*))?)?@)?(([^:/?#]*)(?::(\d*))?))?(((?:[^?#/]*\/)*[^?#]*)(?:(\?[^#]*))?)(?:(#.*))?/.exec(str);
|
|
var url = {};['href', 'protocol', 'auth', 'username', 'password', 'host', 'hostname', 'port', 'path', 'pathname', 'search', 'hash'].forEach(function (key, i) {
|
|
return url[key] = m[i] || '';
|
|
});
|
|
if (!url.path && !url.pathname) url.path = url.pathname = '/';
|
|
url.query = parseQuery(url.search.slice(1));
|
|
return url;
|
|
}
|
|
|
|
function format() {
|
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
_ref$protocol = _ref.protocol,
|
|
protocol = _ref$protocol === undefined ? '' : _ref$protocol,
|
|
_ref$auth = _ref.auth,
|
|
auth = _ref$auth === undefined ? '' : _ref$auth,
|
|
_ref$username = _ref.username,
|
|
username = _ref$username === undefined ? '' : _ref$username,
|
|
_ref$password = _ref.password,
|
|
password = _ref$password === undefined ? '' : _ref$password,
|
|
_ref$host = _ref.host,
|
|
host = _ref$host === undefined ? '' : _ref$host,
|
|
_ref$hostname = _ref.hostname,
|
|
hostname = _ref$hostname === undefined ? '' : _ref$hostname,
|
|
_ref$port = _ref.port,
|
|
port = _ref$port === undefined ? '' : _ref$port,
|
|
_ref$path = _ref.path,
|
|
path = _ref$path === undefined ? '' : _ref$path,
|
|
_ref$pathname = _ref.pathname,
|
|
pathname = _ref$pathname === undefined ? '' : _ref$pathname,
|
|
_ref$search = _ref.search,
|
|
search = _ref$search === undefined ? '' : _ref$search,
|
|
_ref$query = _ref.query,
|
|
query = _ref$query === undefined ? null : _ref$query,
|
|
_ref$hash = _ref.hash,
|
|
hash = _ref$hash === undefined ? '' : _ref$hash;
|
|
|
|
var str = '';
|
|
|
|
if (protocol) {
|
|
str += protocol;
|
|
if (protocol.slice(-1) !== ':') str += ':';
|
|
}
|
|
|
|
if (protocol || host || hostname) str += '//';
|
|
|
|
if (host || hostname) {
|
|
if (auth) {
|
|
str += auth + '@';
|
|
} else if (username) {
|
|
str += username;
|
|
if (password) str += ':' + password;
|
|
str += '@';
|
|
}
|
|
|
|
if (host) {
|
|
str += host;
|
|
} else {
|
|
str += hostname;
|
|
if (port) str += ':' + port;
|
|
}
|
|
}
|
|
|
|
if (path) {
|
|
str += path;
|
|
} else {
|
|
str += pathname || '/';
|
|
|
|
if (search) {
|
|
str += search;
|
|
} else if (query) {
|
|
var q = formatQuery(query);
|
|
if (q) str += '?' + q;
|
|
}
|
|
}
|
|
|
|
str += hash;
|
|
|
|
return str;
|
|
}
|
|
|
|
function resolve(from, to) {
|
|
from = parse(from);
|
|
to = parse(to);
|
|
|
|
// 'to' is an absolute URL
|
|
if (to.protocol) return to.href;
|
|
|
|
// 'to' only need to complete the protocol
|
|
if (to.host) {
|
|
to.protocol = from.protocol;
|
|
return format(to);
|
|
}
|
|
|
|
// 'to' has aboslute path
|
|
if (to.path[0] === '/') {
|
|
from.path = to.path;
|
|
from.pathname = from.search = '';
|
|
from.query = null;
|
|
from.hash = to.hash;
|
|
return format(from);
|
|
}
|
|
|
|
if (to.pathname) {
|
|
(function () {
|
|
var dirFrom = from.pathname.split('/');
|
|
// pop the filename
|
|
dirFrom.pop();
|
|
|
|
to.pathname.split('/').forEach(function (d) {
|
|
switch (d) {
|
|
case '.':
|
|
return;
|
|
case '..':
|
|
return dirFrom.length > 1 ? dirFrom.pop() : null;
|
|
default:
|
|
dirFrom.push(d);
|
|
}
|
|
});
|
|
|
|
from.pathname = dirFrom.join('/');
|
|
})();
|
|
}
|
|
|
|
from.path = '';
|
|
from.search = to.search;
|
|
from.query = null;
|
|
from.hash = to.hash;
|
|
return format(from);
|
|
}
|
|
|
|
exports.default = { parse: parse, format: format, resolve: resolve, parseQuery: parseQuery, formatQuery: formatQuery };
|
|
module.exports = exports['default'];
|
|
}); |