url-search-utils
Version:
Utils for manipulate search params in query string.
151 lines (144 loc) • 4.82 kB
JavaScript
// src/parseQuery.ts
function parseQuery(search, paramTypes = {}) {
if (search.length === 0) {
return {};
}
return search.split("&").reduce((res, searchItem) => {
const [name, rawValue] = searchItem.split("=");
const value = decodeURIComponent(rawValue);
const paramType = paramTypes[name];
if (paramType) {
if (typeof paramType === "function") {
res[name] = paramType(value, res[name]);
return res;
}
switch (paramType) {
case "array-of-strings": {
if (!res[name]) {
res[name] = [];
}
const acc = res[name];
if (!Array.isArray(acc)) {
throw new Error("accumulator is not an array");
}
acc.push(value);
return res;
}
case "array-of-numbers": {
if (!res[name]) {
res[name] = [];
}
const acc = res[name];
if (!Array.isArray(acc)) {
throw new Error("accumulator is not an array");
}
acc.push(parseFloat(value));
return res;
}
case "number":
res[name] = parseFloat(value);
return res;
case "exclude":
return res;
default:
throw new Error(
`Unknown type of parameter for parse "${name}": "${paramType}"`
);
}
}
res[name] = value;
return res;
}, {});
}
// src/stringifyParams.ts
function stringifyParams(params, mapParamsNames = {}, paramTypes = {}) {
return Object.keys(params).map((rawParamName) => {
const paramName = mapParamsNames[rawParamName] || rawParamName;
const paramValue = params[rawParamName];
const paramType = paramTypes[paramName];
if (paramType) {
if (typeof paramType === "function") {
const mappedParamValue = paramType(paramValue);
if (mappedParamValue === null || typeof mappedParamValue === "undefined") {
return null;
}
return `${paramName}=${encodeURIComponent(mappedParamValue)}`;
}
switch (paramType) {
case "exclude":
return null;
case "include-if-falsy":
if (paramValue instanceof Array) {
if (paramValue.length === 0) {
return null;
}
return paramValue.map(
(paramValueItem) => `${paramName}=${encodeURIComponent(paramValueItem)}`
).join("&");
}
return `${paramName}=${encodeURIComponent(paramValue || "")}`;
default:
throw new Error(
`Unknown type of parameter for serialize "${paramName}": "${paramType}"`
);
}
}
if (paramValue instanceof Array) {
if (paramValue.length === 0) {
return null;
}
return paramValue.map(
(paramValueItem) => `${paramName}=${encodeURIComponent(paramValueItem)}`
).join("&");
}
if (!paramValue) {
return null;
}
return `${paramName}=${encodeURIComponent(paramValue)}`;
}).filter((item) => item !== null).join("&");
}
// src/parseSearchParams.ts
var prepareSearch = (search) => search.substring(1, search.length);
function parseSearchParams(paramTypes = {}) {
const search = prepareSearch(window.location.search);
return parseQuery(search, paramTypes);
}
// src/parseHashParams.ts
function parseHashParams(paramTypes = {}) {
const search = window.location.hash.replace(/^#/, "");
return parseQuery(search, paramTypes);
}
// src/parseHashLocationQuery.ts
function parseHashLocationQuery(paramTypes = {}) {
const search = window.location.hash.split("?")[1] || "";
return parseQuery(search, paramTypes);
}
// src/setSearchParams.ts
var getNewUrl = (pathname, paramsStr) => `${pathname}?${paramsStr}`;
function setSearchParams(params, mapParamsNames = {}, paramTypes = {}) {
const paramsStr = stringifyParams(params, mapParamsNames, paramTypes);
const newUrl = getNewUrl(window.location.pathname, paramsStr);
window.history.replaceState({}, "", newUrl);
}
// src/setHashParams.ts
function setHashParams(params, mapParamsNames = {}, paramTypes = {}) {
const paramsStr = stringifyParams(params, mapParamsNames, paramTypes);
window.history.replaceState(null, "", `#${paramsStr}`);
}
// src/setHashLocationQuery.ts
function setHashLocationQuery(params, mapParamsNames = {}, paramTypes = {}) {
const paramsStr = stringifyParams(params, mapParamsNames, paramTypes);
const hashWithoutSearch = window.location.hash.replace(/^#/, "").split("?")[0];
window.history.replaceState(null, "", `#${hashWithoutSearch}?${paramsStr}`);
}
export {
parseHashLocationQuery,
parseHashParams,
parseQuery,
parseSearchParams,
setHashLocationQuery,
setHashParams,
setSearchParams,
stringifyParams
};
//# sourceMappingURL=index.js.map