UNPKG

@libj/make-uri

Version:
182 lines 7.46 kB
"use strict"; 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