@libj/make-uri
Version:
182 lines • 7.46 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeUri = void 0;
var UriTemplate_1 = require("./UriTemplate");
var isType_1 = require("./common/isType/isType");
var makeUriQueryString_1 = require("./makeUriQueryString");
var MakeUriBaseUri_1 = require("./MakeUriBaseUri");
var MakeUriError_1 = require("./MakeUriError");
var trimUriPath_1 = require("./trimUriPath");
var joinUriPath_1 = require("./joinUriPath");
var UriPart_1 = require("./UriPart");
var makeUri = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var params = extractParams(args), parts = defineParts(params), baseUri = params.baseUri, builtUri = UriTemplate_1.UriTemplate.uri(parts);
return "".concat(baseUri).concat(builtUri);
};
exports.makeUri = makeUri;
function extractParams(args) {
var _a, _b;
var baseUri, params;
if (args.length === 1 && (0, isType_1.isObj)(args[0])) {
(_a = ['', args[0]], baseUri = _a[0], params = _a[1]);
}
else if (args.length === 1 && (0, isType_1.isStr)(args[0])) {
(_b = [args[0], {}], baseUri = _b[0], params = _b[1]);
}
else if (args.length === 2) {
(baseUri = args[0], params = args[1]);
}
else {
throw new MakeUriError_1.MakeUriError("Invalid makeUri() args given: ".concat(JSON.stringify(args)));
}
return __assign(__assign({}, params), { baseUri: prepareBaseUri(baseUri, params) });
}
function prepareBaseUri(baseUri, params) {
var uri = new MakeUriBaseUri_1.MakeUriBaseUri((0, trimUriPath_1.rtrimUriPath)(baseUri)), hasParams = Object.keys(params).length > 0, authority = params.authority, scheme = params.scheme, path = params.path, query = params.query;
// Validate scheme
if (uri.schemeOnly && hasParams && !authority) {
throw new MakeUriError_1.MakeUriError('Missing authority in params for scheme base uri');
}
else if (uri.hasScheme && hasParams && scheme) {
throw new MakeUriError_1.MakeUriError('Conflicting scheme given in base uri and params');
}
// Validate authority
if (uri.hasAuthority && hasParams && authority) {
throw new MakeUriError_1.MakeUriError('Conflicting authority given in base uri and params');
}
else if (uri.hasAuthority && hasParams && scheme) {
throw new MakeUriError_1.MakeUriError('Authority base uri and scheme in params not supported.');
}
// Validate path
if (uri.hasPath && hasParams && (authority || scheme)) {
throw new MakeUriError_1.MakeUriError('Path base uri and authority or scheme in params not supported.');
}
// Validate query
if (uri.hasQuery && hasParams && (query || path || authority || scheme)) {
throw new MakeUriError_1.MakeUriError('Query base uri with scheme or authority or path or query in params not supported.');
}
// Validate fragment
if (uri.hasFragment) {
throw new MakeUriError_1.MakeUriError('Fragment base uri is not supported');
}
return uri;
}
function defineParts(params) {
var scheme = params.scheme, authority = params.authority, path = params.path, query = params.query, fragment = params.fragment, baseUri = params.baseUri, parts = {
scheme: '',
authority: '',
path: '',
query: '',
fragment: '',
};
if (scheme) {
parts.scheme = makeScheme(scheme, params);
}
if (authority) {
parts.authority = makeAuthority(authority, params);
}
if (path) {
parts.path = makePath(path);
}
if (query) {
parts.query = makeQuery(query, params);
}
if (fragment && (authority || path || baseUri.hasAuthority || baseUri.hasPath || baseUri.hasQuery)) {
parts.fragment = makeFragment(fragment);
}
return parts;
}
function makeScheme(scheme, _a) {
var authority = _a.authority;
if (!authority) {
throw new MakeUriError_1.MakeUriError('Missing authority for scheme.');
}
return UriTemplate_1.UriTemplate.scheme(scheme);
}
function makeAuthority(authority, _a) {
var scheme = _a.scheme, baseUri = _a.baseUri;
var parts = {
host: '',
port: '',
user: '',
};
if ((0, isType_1.isStr)(authority)) {
parts.host = authority;
}
else if ((0, isType_1.isObj)(authority)) {
var _b = authority, host = _b.host, port = _b.port, user = _b.user;
parts.host = host;
if (port) {
parts.port = UriTemplate_1.UriTemplate.port(port);
}
if (user) {
parts.user = UriTemplate_1.UriTemplate.user(user);
}
}
var hasPrefix = !!scheme || (baseUri.schemeOnly);
return UriTemplate_1.UriTemplate.authority(parts, hasPrefix);
}
function makePath(path) {
var _a;
var resPath, opts = { trimTrail: false };
if ((0, isType_1.isObj)(path) && path.path && path.opts) {
(_a = path, resPath = _a.path, opts = _a.opts);
resPath = makeActualPath(resPath);
}
else {
resPath = makeActualPath(path);
}
return UriTemplate_1.UriTemplate.path(resPath, { trimTrail: opts.trimTrail });
}
function makeActualPath(path) {
var res = '';
if ((0, isType_1.isStr)(path)) {
res = path;
}
else if ((0, isType_1.isObj)(path)) {
var _a = path, template = _a.template, _b = _a.params, params_1 = _b === void 0 ? {} : _b;
res = template.replace(new RegExp("".concat(UriPart_1.UriPart.COLON, "(").concat(Object.keys(params_1).join('|'), ")"), 'g'), function (m, p) { return params_1[p] || m; });
// Check if all params substituted
if (res.indexOf(UriPart_1.UriPart.COLON) > -1) {
var missingParams = res
.match(new RegExp("".concat(UriPart_1.UriPart.COLON, "\\w+"), 'g'))
.map(function (p) { return p.substr(1); });
throw new MakeUriError_1.MakeUriError("Missing params: ".concat(missingParams.join(','), " | for path template: ").concat(template));
}
}
else if ((0, isType_1.isArr)(path)) {
res = joinUriPath_1.joinUriPath.apply(void 0, path);
}
return res;
}
function makeQuery(query, _a) {
var authority = _a.authority, path = _a.path, baseUri = _a.baseUri;
var _b = extractQueryOpt(query), data = _b[0], options = _b[1], usePrefix = Object.keys(data).length && (!!(authority || path) || baseUri.hasAuthority || baseUri.hasPath);
return UriTemplate_1.UriTemplate.query((0, makeUriQueryString_1.makeUriQueryString)(data, options), usePrefix);
}
function makeFragment(fragment) {
var _a = extractQueryOpt(fragment), data = _a[0], options = _a[1];
return UriTemplate_1.UriTemplate.fragment((0, makeUriQueryString_1.makeUriQueryString)(data, options));
}
function extractQueryOpt(opt) {
var _a = Object.prototype.hasOwnProperty.call(opt, '$data')
? [opt.$data, opt.$options]
: [opt, {}], _b = _a[0], data = _b === void 0 ? {} : _b, options = _a[1];
return [data, options];
}
//# sourceMappingURL=makeUri.js.map