UNPKG

ngx-restangular

Version:
1,107 lines 98.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/ngx-restangular-config.factory.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { includes, isUndefined, isNull, isArray, isObject, isBoolean, defaults, each, extend, find, has, initial, last, clone, reduce, keys, isEmpty, forEach, } from 'lodash'; /** * @param {?} object * @param {?} configuration * @return {?} */ export function RestangularConfigurer(object, configuration) { object.configuration = configuration; /** * Those are HTTP safe methods for which there is no need to pass any data with the request. * @type {?} */ const safeMethods = ['get', 'head', 'options', 'trace', 'getlist']; configuration.isSafe = (/** * @param {?} operation * @return {?} */ function (operation) { return includes(safeMethods, operation.toLowerCase()); }); /** @type {?} */ const absolutePattern = /^https?:\/\//i; configuration.isAbsoluteUrl = (/** * @param {?} string * @return {?} */ function (string) { return isUndefined(configuration.absoluteUrl) || isNull(configuration.absoluteUrl) ? string && absolutePattern.test(string) : configuration.absoluteUrl; }); configuration.absoluteUrl = isUndefined(configuration.absoluteUrl) ? true : configuration.absoluteUrl; object.setSelfLinkAbsoluteUrl = (/** * @param {?} value * @return {?} */ function (value) { configuration.absoluteUrl = value; }); /** * This is the BaseURL to be used with Restangular */ configuration.baseUrl = isUndefined(configuration.baseUrl) ? '' : configuration.baseUrl; object.setBaseUrl = (/** * @param {?} newBaseUrl * @return {?} */ function (newBaseUrl) { configuration.baseUrl = /\/$/.test(newBaseUrl) ? newBaseUrl.substring(0, newBaseUrl.length - 1) : newBaseUrl; return this; }); /** * Sets the extra fields to keep from the parents */ configuration.extraFields = configuration.extraFields || []; object.setExtraFields = (/** * @param {?} newExtraFields * @return {?} */ function (newExtraFields) { configuration.extraFields = newExtraFields; return this; }); /** * Some default $http parameter to be used in EVERY call **/ configuration.defaultHttpFields = configuration.defaultHttpFields || {}; object.setDefaultHttpFields = (/** * @param {?} values * @return {?} */ function (values) { configuration.defaultHttpFields = values; return this; }); /** * Always return plain data, no restangularized object **/ configuration.plainByDefault = configuration.plainByDefault || false; object.setPlainByDefault = (/** * @param {?} value * @return {?} */ function (value) { configuration.plainByDefault = value === true ? true : false; return this; }); configuration.withHttpValues = (/** * @param {?} httpLocalConfig * @param {?} obj * @return {?} */ function (httpLocalConfig, obj) { return defaults(obj, httpLocalConfig, configuration.defaultHttpFields); }); configuration.encodeIds = isUndefined(configuration.encodeIds) ? true : configuration.encodeIds; object.setEncodeIds = (/** * @param {?} encode * @return {?} */ function (encode) { configuration.encodeIds = encode; }); configuration.defaultRequestParams = configuration.defaultRequestParams || { get: {}, post: {}, put: {}, remove: {}, common: {} }; object.setDefaultRequestParams = (/** * @param {?} param1 * @param {?} param2 * @return {?} */ function (param1, param2) { /** @type {?} */ let methods = []; /** @type {?} */ const params = param2 || param1; if (!isUndefined(param2)) { if (isArray(param1)) { methods = param1; } else { methods.push(param1); } } else { methods.push('common'); } each(methods, (/** * @param {?} method * @return {?} */ function (method) { configuration.defaultRequestParams[method] = params; })); return this; }); object.requestParams = configuration.defaultRequestParams; configuration.defaultHeaders = configuration.defaultHeaders || {}; object.setDefaultHeaders = (/** * @param {?} headers * @return {?} */ function (headers) { configuration.defaultHeaders = headers; object.defaultHeaders = configuration.defaultHeaders; return this; }); object.defaultHeaders = configuration.defaultHeaders; /** * Method overriders response Method **/ configuration.defaultResponseMethod = configuration.defaultResponseMethod || 'promise'; object.setDefaultResponseMethod = (/** * @param {?} method * @return {?} */ function (method) { configuration.defaultResponseMethod = method; object.defaultResponseMethod = configuration.defaultResponseMethod; return this; }); object.defaultResponseMethod = configuration.defaultResponseMethod; /** * Method overriders will set which methods are sent via POST with an X-HTTP-Method-Override **/ configuration.methodOverriders = configuration.methodOverriders || []; object.setMethodOverriders = (/** * @param {?} values * @return {?} */ function (values) { /** @type {?} */ const overriders = extend([], values); if (configuration.isOverridenMethod('delete', overriders)) { overriders.push('remove'); } configuration.methodOverriders = overriders; return this; }); configuration.jsonp = isUndefined(configuration.jsonp) ? false : configuration.jsonp; object.setJsonp = (/** * @param {?} active * @return {?} */ function (active) { configuration.jsonp = active; }); configuration.isOverridenMethod = (/** * @param {?} method * @param {?} values * @return {?} */ function (method, values) { /** @type {?} */ const search = values || configuration.methodOverriders; return !isUndefined(find(search, (/** * @param {?} one * @return {?} */ function (one) { return one.toLowerCase() === method.toLowerCase(); }))); }); /** * Sets the URL creator type. For now, only Path is created. In the future we'll have queryParams **/ configuration.urlCreator = configuration.urlCreator || 'path'; object.setUrlCreator = (/** * @param {?} name * @return {?} */ function (name) { if (!has(configuration.urlCreatorFactory, name)) { throw new Error('URL Path selected isn\'t valid'); } configuration.urlCreator = name; return this; }); /** * You can set the restangular fields here. The 3 required fields for Restangular are: * * id: Id of the element * route: name of the route of this element * parentResource: the reference to the parent resource * * All of this fields except for id, are handled (and created) by Restangular. By default, * the field values will be id, route and parentResource respectively */ configuration.restangularFields = configuration.restangularFields || { id: 'id', route: 'route', parentResource: 'parentResource', restangularCollection: 'restangularCollection', cannonicalId: '__cannonicalId', etag: 'restangularEtag', selfLink: 'href', get: 'get', getList: 'getList', put: 'put', post: 'post', remove: 'remove', head: 'head', trace: 'trace', options: 'options', patch: 'patch', getRestangularUrl: 'getRestangularUrl', getRequestedUrl: 'getRequestedUrl', putElement: 'putElement', addRestangularMethod: 'addRestangularMethod', getParentList: 'getParentList', clone: 'clone', ids: 'ids', httpConfig: '_$httpConfig', reqParams: 'reqParams', one: 'one', all: 'all', several: 'several', oneUrl: 'oneUrl', allUrl: 'allUrl', customPUT: 'customPUT', customPATCH: 'customPATCH', customPOST: 'customPOST', customDELETE: 'customDELETE', customGET: 'customGET', customGETLIST: 'customGETLIST', customOperation: 'customOperation', doPUT: 'doPUT', doPATCH: 'doPATCH', doPOST: 'doPOST', doDELETE: 'doDELETE', doGET: 'doGET', doGETLIST: 'doGETLIST', fromServer: 'fromServer', withConfig: 'withConfig', withHttpConfig: 'withHttpConfig', singleOne: 'singleOne', plain: 'plain', save: 'save', restangularized: 'restangularized' }; object.setRestangularFields = (/** * @param {?} resFields * @return {?} */ function (resFields) { configuration.restangularFields = extend({}, configuration.restangularFields, resFields); return this; }); configuration.isRestangularized = (/** * @param {?} obj * @return {?} */ function (obj) { return !!obj[configuration.restangularFields.restangularized]; }); configuration.setFieldToElem = (/** * @param {?} field * @param {?} elem * @param {?} value * @return {?} */ function (field, elem, value) { /** @type {?} */ const properties = field.split('.'); /** @type {?} */ let idValue = elem; each(initial(properties), (/** * @param {?} prop * @return {?} */ function (prop) { idValue[prop] = {}; idValue = idValue[prop]; })); /** @type {?} */ const index = last(properties); idValue[index] = value; return this; }); configuration.getFieldFromElem = (/** * @param {?} field * @param {?} elem * @return {?} */ function (field, elem) { /** @type {?} */ const properties = field.split('.'); /** @type {?} */ let idValue = elem; each(properties, (/** * @param {?} prop * @return {?} */ function (prop) { if (idValue) { idValue = idValue[prop]; } })); return clone(idValue); }); configuration.setIdToElem = (/** * @param {?} elem * @param {?} id * @return {?} */ function (elem, id /*, route */) { configuration.setFieldToElem(configuration.restangularFields.id, elem, id); return this; }); configuration.getIdFromElem = (/** * @param {?} elem * @return {?} */ function (elem) { return configuration.getFieldFromElem(configuration.restangularFields.id, elem); }); configuration.isValidId = (/** * @param {?} elemId * @return {?} */ function (elemId) { return '' !== elemId && !isUndefined(elemId) && !isNull(elemId); }); configuration.setUrlToElem = (/** * @param {?} elem * @param {?} url * @return {?} */ function (elem, url /*, route */) { configuration.setFieldToElem(configuration.restangularFields.selfLink, elem, url); return this; }); configuration.getUrlFromElem = (/** * @param {?} elem * @return {?} */ function (elem) { return configuration.getFieldFromElem(configuration.restangularFields.selfLink, elem); }); configuration.useCannonicalId = isUndefined(configuration.useCannonicalId) ? false : configuration.useCannonicalId; object.setUseCannonicalId = (/** * @param {?} value * @return {?} */ function (value) { configuration.useCannonicalId = value; return this; }); configuration.getCannonicalIdFromElem = (/** * @param {?} elem * @return {?} */ function (elem) { /** @type {?} */ const cannonicalId = elem[configuration.restangularFields.cannonicalId]; /** @type {?} */ const actualId = configuration.isValidId(cannonicalId) ? cannonicalId : configuration.getIdFromElem(elem); return actualId; }); /** * Sets the Response parser. This is used in case your response isn't directly the data. * For example if you have a response like {meta: {'meta'}, data: {name: 'Gonto'}} * you can extract this data which is the one that needs wrapping * * The ResponseExtractor is a function that receives the response and the method executed. */ configuration.responseInterceptors = configuration.responseInterceptors ? [...configuration.responseInterceptors] : []; configuration.defaultResponseInterceptor = (/** * @param {?} data * @return {?} */ function (data /*, operation, what, url, response, subject */) { return data || {}; }); configuration.responseExtractor = (/** * @param {?} data * @param {?} operation * @param {?} what * @param {?} url * @param {?} response * @param {?} subject * @return {?} */ function (data, operation, what, url, response, subject) { /** @type {?} */ const interceptors = clone(configuration.responseInterceptors); interceptors.push(configuration.defaultResponseInterceptor); /** @type {?} */ let theData = data; each(interceptors, (/** * @param {?} interceptor * @return {?} */ function (interceptor) { theData = interceptor(theData, operation, what, url, response, subject); })); return theData; }); object.addResponseInterceptor = (/** * @param {?} extractor * @return {?} */ function (extractor) { configuration.responseInterceptors.push(extractor); return this; }); configuration.errorInterceptors = configuration.errorInterceptors ? [...configuration.errorInterceptors] : []; object.addErrorInterceptor = (/** * @param {?} interceptor * @return {?} */ function (interceptor) { configuration.errorInterceptors = [interceptor, ...configuration.errorInterceptors]; return this; }); object.setResponseInterceptor = object.addResponseInterceptor; object.setResponseExtractor = object.addResponseInterceptor; object.setErrorInterceptor = object.addErrorInterceptor; /** * Response interceptor is called just before resolving promises. */ /** * Request interceptor is called before sending an object to the server. */ configuration.requestInterceptors = configuration.requestInterceptors ? [...configuration.requestInterceptors] : []; configuration.defaultInterceptor = (/** * @param {?} element * @param {?} operation * @param {?} path * @param {?} url * @param {?} headers * @param {?} params * @param {?} httpConfig * @return {?} */ function (element, operation, path, url, headers, params, httpConfig) { return { element: element, headers: headers, params: params, httpConfig: httpConfig }; }); configuration.fullRequestInterceptor = (/** * @param {?} element * @param {?} operation * @param {?} path * @param {?} url * @param {?} headers * @param {?} params * @param {?} httpConfig * @return {?} */ function (element, operation, path, url, headers, params, httpConfig) { /** @type {?} */ const interceptors = clone(configuration.requestInterceptors); /** @type {?} */ const defaultRequest = configuration.defaultInterceptor(element, operation, path, url, headers, params, httpConfig); return reduce(interceptors, (/** * @param {?} request * @param {?} interceptor * @return {?} */ function (request, interceptor) { /** @type {?} */ const returnInterceptor = interceptor(request.element, operation, path, url, request.headers, request.params, request.httpConfig); return extend(request, returnInterceptor); }), defaultRequest); }); object.addRequestInterceptor = (/** * @param {?} interceptor * @return {?} */ function (interceptor) { configuration.requestInterceptors.push((/** * @param {?} elem * @param {?} operation * @param {?} path * @param {?} url * @param {?} headers * @param {?} params * @param {?} httpConfig * @return {?} */ function (elem, operation, path, url, headers, params, httpConfig) { return { headers: headers, params: params, element: interceptor(elem, operation, path, url), httpConfig: httpConfig }; })); return this; }); object.setRequestInterceptor = object.addRequestInterceptor; object.addFullRequestInterceptor = (/** * @param {?} interceptor * @return {?} */ function (interceptor) { configuration.requestInterceptors.push(interceptor); return this; }); object.setFullRequestInterceptor = object.addFullRequestInterceptor; configuration.onBeforeElemRestangularized = configuration.onBeforeElemRestangularized || (/** * @param {?} elem * @return {?} */ function (elem) { return elem; }); object.setOnBeforeElemRestangularized = (/** * @param {?} post * @return {?} */ function (post) { configuration.onBeforeElemRestangularized = post; return this; }); object.setRestangularizePromiseInterceptor = (/** * @param {?} interceptor * @return {?} */ function (interceptor) { configuration.restangularizePromiseInterceptor = interceptor; return this; }); /** * This method is called after an element has been "Restangularized". * * It receives the element, a boolean indicating if it's an element or a collection * and the name of the model * */ configuration.onElemRestangularized = configuration.onElemRestangularized || (/** * @param {?} elem * @return {?} */ function (elem) { return elem; }); object.setOnElemRestangularized = (/** * @param {?} post * @return {?} */ function (post) { configuration.onElemRestangularized = post; return this; }); configuration.shouldSaveParent = configuration.shouldSaveParent || (/** * @return {?} */ function () { return true; }); object.setParentless = (/** * @param {?} values * @return {?} */ function (values) { if (isArray(values)) { configuration.shouldSaveParent = (/** * @param {?} route * @return {?} */ function (route) { return !includes(values, route); }); } else if (isBoolean(values)) { configuration.shouldSaveParent = (/** * @return {?} */ function () { return !values; }); } return this; }); /** * This lets you set a suffix to every request. * * For example, if your api requires that for JSon requests you do /users/123.json, you can set that * in here. * * * By default, the suffix is null */ configuration.suffix = isUndefined(configuration.suffix) ? null : configuration.suffix; object.setRequestSuffix = (/** * @param {?} newSuffix * @return {?} */ function (newSuffix) { configuration.suffix = newSuffix; return this; }); /** * Add element transformers for certain routes. */ configuration.transformers = configuration.transformers || {}; object.addElementTransformer = (/** * @param {?} type * @param {?} secondArg * @param {?} thirdArg * @return {?} */ function (type, secondArg, thirdArg) { /** @type {?} */ let isCollection = null; /** @type {?} */ let transformer = null; if (arguments.length === 2) { transformer = secondArg; } else { transformer = thirdArg; isCollection = secondArg; } /** @type {?} */ let typeTransformers = configuration.transformers[type]; if (!typeTransformers) { typeTransformers = configuration.transformers[type] = []; } typeTransformers.push((/** * @param {?} coll * @param {?} elem * @return {?} */ function (coll, elem) { if (isNull(isCollection) || (coll === isCollection)) { return transformer(elem); } return elem; })); return object; }); object.extendCollection = (/** * @param {?} route * @param {?} fn * @return {?} */ function (route, fn) { return object.addElementTransformer(route, true, fn); }); object.extendModel = (/** * @param {?} route * @param {?} fn * @return {?} */ function (route, fn) { return object.addElementTransformer(route, false, fn); }); configuration.transformElem = (/** * @param {?} elem * @param {?} isCollection * @param {?} route * @param {?} Restangular * @param {?} force * @return {?} */ function (elem, isCollection, route, Restangular, force) { if (!force && !configuration.transformLocalElements && !elem[configuration.restangularFields.fromServer]) { return elem; } /** @type {?} */ const typeTransformers = configuration.transformers[route]; /** @type {?} */ let changedElem = elem; if (typeTransformers) { each(typeTransformers, (/** * @param {?} transformer * @return {?} */ function (transformer) { changedElem = transformer(isCollection, changedElem); })); } return configuration.onElemRestangularized(changedElem, isCollection, route, Restangular); }); configuration.transformLocalElements = isUndefined(configuration.transformLocalElements) ? false : configuration.transformLocalElements; object.setTransformOnlyServerElements = (/** * @param {?} active * @return {?} */ function (active) { configuration.transformLocalElements = !active; }); configuration.fullResponse = isUndefined(configuration.fullResponse) ? false : configuration.fullResponse; object.setFullResponse = (/** * @param {?} full * @return {?} */ function (full) { configuration.fullResponse = full; return this; }); // Internal values and functions configuration.urlCreatorFactory = {}; /** * Base URL Creator. Base prototype for everything related to it * * @type {?} */ const BaseCreator = (/** * @return {?} */ function () { }); BaseCreator.prototype.setConfig = (/** * @param {?} config * @return {?} */ function (config) { this.config = config; return this; }); BaseCreator.prototype.parentsArray = (/** * @param {?} current * @return {?} */ function (current) { /** @type {?} */ const parents = []; while (current) { parents.push(current); current = current[this.config.restangularFields.parentResource]; } return parents.reverse(); }); /** * @param {?} config * @param {?} $http * @param {?} url * @param {?} configurer * @return {?} */ function RestangularResource(config, $http, url, configurer) { /** @type {?} */ const resource = {}; each(keys(configurer), (/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ const value = configurer[key]; // Add default parameters value.params = extend({}, value.params, config.defaultRequestParams[value.method.toLowerCase()]); // We don't want the ? if no params are there if (isEmpty(value.params)) { delete value.params; } if (config.isSafe(value.method)) { resource[key] = (/** * @return {?} */ function () { /** @type {?} */ const resultConfig = extend(value, { url: url }); return $http.createRequest(resultConfig); }); } else { resource[key] = (/** * @param {?} data * @return {?} */ function (data) { /** @type {?} */ const resultConfig = extend(value, { url: url, data: data }); return $http.createRequest(resultConfig); }); } })); return resource; } BaseCreator.prototype.resource = (/** * @param {?} current * @param {?} $http * @param {?} localHttpConfig * @param {?} callHeaders * @param {?} callParams * @param {?} what * @param {?} etag * @param {?} operation * @return {?} */ function (current, $http, localHttpConfig, callHeaders, callParams, what, etag, operation) { /** @type {?} */ const params = defaults(callParams || {}, this.config.defaultRequestParams.common); /** @type {?} */ const headers = defaults(callHeaders || {}, this.config.defaultHeaders); if (etag) { if (!configuration.isSafe(operation)) { headers['If-Match'] = etag; } else { headers['If-None-Match'] = etag; } } /** @type {?} */ let url = this.base(current); if (what) { /** @type {?} */ let add = ''; if (!/\/$/.test(url)) { add += '/'; } add += what; url += add; } if (this.config.suffix && url.indexOf(this.config.suffix, url.length - this.config.suffix.length) === -1 && !this.config.getUrlFromElem(current)) { url += this.config.suffix; } current[this.config.restangularFields.httpConfig] = undefined; return RestangularResource(this.config, $http, url, { getList: this.config.withHttpValues(localHttpConfig, { method: 'GET', params: params, headers: headers }), get: this.config.withHttpValues(localHttpConfig, { method: 'GET', params: params, headers: headers }), jsonp: this.config.withHttpValues(localHttpConfig, { method: 'jsonp', params: params, headers: headers }), put: this.config.withHttpValues(localHttpConfig, { method: 'PUT', params: params, headers: headers }), post: this.config.withHttpValues(localHttpConfig, { method: 'POST', params: params, headers: headers }), remove: this.config.withHttpValues(localHttpConfig, { method: 'DELETE', params: params, headers: headers }), head: this.config.withHttpValues(localHttpConfig, { method: 'HEAD', params: params, headers: headers }), trace: this.config.withHttpValues(localHttpConfig, { method: 'TRACE', params: params, headers: headers }), options: this.config.withHttpValues(localHttpConfig, { method: 'OPTIONS', params: params, headers: headers }), patch: this.config.withHttpValues(localHttpConfig, { method: 'PATCH', params: params, headers: headers }) }); }); /** * This is the Path URL creator. It uses Path to show Hierarchy in the Rest API. * This means that if you have an Account that then has a set of Buildings, a URL to a building * would be /accounts/123/buildings/456 * * @type {?} */ const Path = (/** * @return {?} */ function () { }); Path.prototype = new BaseCreator(); Path.prototype.normalizeUrl = (/** * @param {?} url * @return {?} */ function (url) { /** @type {?} */ const parts = /((?:http[s]?:)?\/\/)?(.*)?/.exec(url); parts[2] = parts[2].replace(/[\\\/]+/g, '/'); return (typeof parts[1] !== 'undefined') ? parts[1] + parts[2] : parts[2]; }); Path.prototype.base = (/** * @param {?} current * @return {?} */ function (current) { /** @type {?} */ const __this = this; return reduce(this.parentsArray(current), (/** * @param {?} acum * @param {?} elem * @return {?} */ function (acum, elem) { /** @type {?} */ let elemUrl; /** @type {?} */ const elemSelfLink = __this.config.getUrlFromElem(elem); if (elemSelfLink) { if (__this.config.isAbsoluteUrl(elemSelfLink)) { return elemSelfLink; } else { elemUrl = elemSelfLink; } } else { elemUrl = elem[__this.config.restangularFields.route]; if (elem[__this.config.restangularFields.restangularCollection]) { /** @type {?} */ const ids = elem[__this.config.restangularFields.ids]; if (ids) { elemUrl += '/' + ids.join(','); } } else { /** @type {?} */ let elemId; if (__this.config.useCannonicalId) { elemId = __this.config.getCannonicalIdFromElem(elem); } else { elemId = __this.config.getIdFromElem(elem); } if (configuration.isValidId(elemId) && !elem.singleOne) { elemUrl += '/' + (__this.config.encodeIds ? encodeURIComponent(elemId) : elemId); } } } acum = acum.replace(/\/$/, '') + '/' + elemUrl; return __this.normalizeUrl(acum); }), this.config.baseUrl); }); Path.prototype.fetchUrl = (/** * @param {?} current * @param {?} what * @return {?} */ function (current, what) { /** @type {?} */ let baseUrl = this.base(current); if (what) { baseUrl += '/' + what; } return baseUrl; }); Path.prototype.fetchRequestedUrl = (/** * @param {?} current * @param {?} what * @return {?} */ function (current, what) { /** @type {?} */ const url = this.fetchUrl(current, what); /** @type {?} */ const params = current[configuration.restangularFields.reqParams]; // From here on and until the end of fetchRequestedUrl, // the code has been kindly borrowed from angular.js // The reason for such code bloating is coherence: // If the user were to use this for cache management, the // serialization of parameters would need to be identical // to the one done by angular for cache keys to match. /** * @param {?} obj * @return {?} */ function sortedKeys(obj) { /** @type {?} */ const resultKeys = []; for (const key in obj) { if (obj.hasOwnProperty(key)) { resultKeys.push(key); } } return resultKeys.sort(); } /** * @param {?} obj * @param {?=} iterator * @param {?=} context * @return {?} */ function forEachSorted(obj, iterator, context) { /** @type {?} */ const sortedKeysArray = sortedKeys(obj); for (let i = 0; i < sortedKeysArray.length; i++) { iterator.call(context, obj[sortedKeysArray[i]], sortedKeysArray[i]); } return sortedKeysArray; } /** * @param {?} val * @param {?=} pctEncodeSpaces * @return {?} */ function encodeUriQuery(val, pctEncodeSpaces) { return encodeURIComponent(val) .replace(/%40/gi, '@') .replace(/%3A/gi, ':') .replace(/%24/g, '$') .replace(/%2C/gi, ',') .replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); } if (!params) { return url + (this.config.suffix || ''); } /** @type {?} */ const parts = []; forEachSorted(params, (/** * @param {?} value * @param {?} key * @return {?} */ function (value, key) { if (value === null || value === undefined) { return; } if (!isArray(value)) { value = [value]; } forEach(value, (/** * @param {?} v * @return {?} */ function (v) { if (isObject(v)) { v = JSON.stringify(v); } parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v)); })); })); return url + (this.config.suffix || '') + ((url.indexOf('?') === -1) ? '?' : '&') + parts.join('&'); }); configuration.urlCreatorFactory.path = Path; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlc3Rhbmd1bGFyLWNvbmZpZy5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3Rhbmd1bGFyL3NyYy9saWIvbmd4LXJlc3Rhbmd1bGFyLWNvbmZpZy5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxFQUNOLE9BQU8sRUFDUCxRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLElBQUksRUFDSixHQUFHLEVBQ0gsT0FBTyxFQUNQLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sUUFBUSxDQUFDOzs7Ozs7QUFFaEIsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxhQUFhO0lBQ3pELE1BQU0sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDOzs7OztVQUsvQixXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO0lBQ2xFLGFBQWEsQ0FBQyxNQUFNOzs7O0lBQUcsVUFBVSxTQUFTO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUEsQ0FBQzs7VUFFSSxlQUFlLEdBQUcsZUFBZTtJQUN2QyxhQUFhLENBQUMsYUFBYTs7OztJQUFHLFVBQVUsTUFBTTtRQUM1QyxPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsYUFBYSxDQUFD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