UNPKG

search-params

Version:

A module to manipulate search part of URLs (querystring)

257 lines (209 loc) 5.78 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var makeOptions = function makeOptions(opts) { if (opts === void 0) { opts = {}; } return { arrayFormat: opts.arrayFormat || 'none', booleanFormat: opts.booleanFormat || 'none', nullFormat: opts.nullFormat || 'default' }; }; var encodeValue = function encodeValue(value) { return encodeURIComponent(value); }; var decodeValue = function decodeValue(value) { return decodeURIComponent(value.replace(/\+/g, ' ')); }; var encodeBoolean = function encodeBoolean(name, value, opts) { if (opts.booleanFormat === 'empty-true' && value) { return name; } var encodedValue; if (opts.booleanFormat === 'unicode') { encodedValue = value ? '✓' : '✗'; } else { encodedValue = value.toString(); } return name + "=" + encodedValue; }; var encodeNull = function encodeNull(name, opts) { if (opts.nullFormat === 'hidden') { return ''; } if (opts.nullFormat === 'string') { return name + "=null"; } return name; }; var getNameEncoder = function getNameEncoder(opts) { if (opts.arrayFormat === 'index') { return function (name, index) { return name + "[" + index + "]"; }; } if (opts.arrayFormat === 'brackets') { return function (name) { return name + "[]"; }; } return function (name) { return name; }; }; var encodeArray = function encodeArray(name, arr, opts) { var encodeName = getNameEncoder(opts); return arr.map(function (val, index) { return encodeName(name, index) + "=" + encodeValue(val); }).join('&'); }; var encode = function encode(name, value, opts) { var encodedName = encodeValue(name); if (value === null) { return encodeNull(encodedName, opts); } if (typeof value === 'boolean') { return encodeBoolean(encodedName, value, opts); } if (Array.isArray(value)) { return encodeArray(encodedName, value, opts); } return encodedName + "=" + encodeValue(value); }; var decode = function decode(value, opts) { if (value === undefined) { return opts.booleanFormat === 'empty-true' ? true : null; } if (opts.booleanFormat === 'string') { if (value === 'true') { return true; } if (value === 'false') { return false; } } if (opts.nullFormat === 'string') { if (value === 'null') { return null; } } var decodedValue = decodeValue(value); if (opts.booleanFormat === 'unicode') { if (decodedValue === '✓') { return true; } if (decodedValue === '✗') { return false; } } return decodedValue; }; var getSearch = function getSearch(path) { var pos = path.indexOf('?'); if (pos === -1) { return path; } return path.slice(pos + 1); }; var isSerialisable = function isSerialisable(val) { return val !== undefined; }; var parseName = function parseName(name) { var bracketPosition = name.indexOf('['); var hasBrackets = bracketPosition !== -1; return { hasBrackets: hasBrackets, name: hasBrackets ? name.slice(0, bracketPosition) : name }; }; /** * Parse a querystring and return an object of parameters */ var parse = function parse(path, opts) { var options = makeOptions(opts); return getSearch(path).split('&').reduce(function (params, param) { var _a = param.split('='), rawName = _a[0], value = _a[1]; var _b = parseName(rawName), hasBrackets = _b.hasBrackets, name = _b.name; var decodedName = decodeValue(name); var currentValue = params[name]; var decodedValue = decode(value, options); if (currentValue === undefined) { params[decodedName] = hasBrackets ? [decodedValue] : decodedValue; } else { params[decodedName] = (Array.isArray(currentValue) ? currentValue : [currentValue]).concat(decodedValue); } return params; }, {}); }; /** * Build a querystring from an object of parameters */ var build = function build(params, opts) { var options = makeOptions(opts); return Object.keys(params).filter(function (paramName) { return isSerialisable(params[paramName]); }).map(function (paramName) { return encode(paramName, params[paramName], options); }).filter(Boolean).join('&'); }; /** * Remove a list of parameters from a querystring */ var omit = function omit(path, paramsToOmit, opts) { var options = makeOptions(opts); var searchPart = getSearch(path); if (searchPart === '') { return { querystring: '', removedParams: {} }; } var _a = path.split('&').reduce(function (_a, chunk) { var left = _a[0], right = _a[1]; var rawName = chunk.split('=')[0]; var name = parseName(rawName).name; return paramsToOmit.indexOf(name) === -1 ? [left.concat(chunk), right] : [left, right.concat(chunk)]; }, [[], []]), kept = _a[0], removed = _a[1]; return { querystring: kept.join('&'), removedParams: parse(removed.join('&'), options) }; }; /** * Remove a list of parameters from a querystring */ var keep = function keep(path, paramsToKeep, opts) { var options = makeOptions(opts); var searchPart = getSearch(path); if (searchPart === '') { return { keptParams: {}, querystring: '' }; } var kept = path.split('&').reduce(function (acc, chunk) { var rawName = chunk.split('=')[0]; var name = parseName(rawName).name; if (paramsToKeep.includes(name)) { acc.push(chunk); } return acc; }, []); return { keptParams: parse(kept.join('&'), options), querystring: kept.join('&') }; }; exports.build = build; exports.keep = keep; exports.omit = omit; exports.parse = parse; //# sourceMappingURL=search-params.cjs.development.js.map