UNPKG

url-factory

Version:

Set a base url and encode params with minimum fuss. Especially useful with JSON API.

59 lines (47 loc) 2.53 kB
'use strict'; exports.__esModule = true; exports.encodeParams = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _isPlainObject = require('is-plain-object'); var _isPlainObject2 = _interopRequireDefault(_isPlainObject); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _encode = function _encode(value) { return Array.isArray(value) && !value.length ? '[]' : encodeURIComponent(value); }; var encodeParam = function encodeParam(value, key) { if ((0, _isPlainObject2.default)(value)) { return Object.keys(value).reduce(function (memo, _key) { return '' + memo + key + '[' + _key + ']=' + _encode(value[_key]) + '&'; }, ''); } else { return key + '=' + _encode(value) + '&'; } }; var encodeParams = exports.encodeParams = function encodeParams() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!(0, _isPlainObject2.default)(params)) throw new Error('encodeParams expects a plain object'); return Object.keys(params).reduce(function (memo, key) { return '' + memo + encodeParam(params[key], key); }, '').slice(0, -1); }; exports.default = function () { var baseUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var baseParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return function (relativeUrl) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (relativeUrl.charAt(0) !== '/') { relativeUrl = '/' + relativeUrl; } var separator = relativeUrl.includes('?') ? '&' : '?'; // doing this because baseParams should be overridden by params, // but preferable to havebaseParams at end of querystring // (even if key order not fully guaranteed) params = Object.keys(baseParams).reduce(function (memo, k) { if (memo[k]) return memo; memo[k] = baseParams[k]; return memo; }, _extends({}, params)); var encodedParams = encodeParams(params); return encodedParams && encodedParams.length > 0 ? '' + baseUrl + relativeUrl + separator + encodedParams : '' + baseUrl + relativeUrl; }; };