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
JavaScript
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;
};
};
;