ngx-restangular
Version:
1,107 lines • 98.5 kB
JavaScript
/**
* @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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