UNPKG

contensis-core-api

Version:

A dependency library used by contensis-delivery-api and contensis-management-api

83 lines (82 loc) 3.05 kB
import { hasProp, isString, toQuery } from '../utils'; export class UrlBuilder { url; query; paramMatcher = /(:\b\D\w*)/g; options = {}; clientParams; mappers = {}; static create(url, query = null) { return new UrlBuilder(url, query); } constructor(url, query) { this.url = url; this.query = query; } addOptions(options, defaultParamName = null) { if (isString(options) && !!defaultParamName) { this.options[defaultParamName] = options; } else { this.options = { ...this.options, ...options }; } return this; } setParams(clientParams) { this.clientParams = clientParams; return this; } addMappers(mappers) { if (mappers) { Object.keys(mappers).forEach(key => { this.mappers[key] = mappers[key]; }); } return this; } toUrl() { let namedParams = {}; let urlTemplate = typeof this.url === 'function' ? this.url(this.options, this.clientParams) : this.url; let paramNames = urlTemplate.match(this.paramMatcher); if (paramNames) { paramNames.forEach(paramName => { let key = paramName.substring(1); let value = null; if (hasProp(this.options, key) && this.options[key] !== null) { value = this.options[key]; } else if (hasProp(this.clientParams, key) && this.clientParams[key] !== null) { value = this.clientParams[key]; } let mapperValue = null; if (this.mappers[paramName]) { mapperValue = this.mappers[paramName](value, this.options, this.clientParams); } namedParams[paramName] = mapperValue !== null ? mapperValue : value; }); } let query = {}; if (this.query) { query = { ...this.query }; Object.keys(this.query).forEach(paramName => { let value = query[paramName]; if (hasProp(this.options, paramName) && this.options[paramName] !== null) { value = this.options[paramName]; } else if (hasProp(this.clientParams, paramName) && this.clientParams[paramName] !== null) { value = this.clientParams[paramName]; } query[paramName] = this.mappers[paramName] ? this.mappers[paramName](value, this.options, this.clientParams) : value; }); } let url = Object.keys(namedParams) .reduce((url, key) => url.replace(key, namedParams[key]), urlTemplate); let queryString = toQuery(query); return `${url}${queryString}`; } }