url-search-utils
Version:
Utils for manipulate search params in query string.
185 lines (176 loc) • 6.16 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
parseHashLocationQuery: () => parseHashLocationQuery,
parseHashParams: () => parseHashParams,
parseQuery: () => parseQuery,
parseSearchParams: () => parseSearchParams,
setHashLocationQuery: () => setHashLocationQuery,
setHashParams: () => setHashParams,
setSearchParams: () => setSearchParams,
stringifyParams: () => stringifyParams
});
module.exports = __toCommonJS(src_exports);
// 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}`);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
parseHashLocationQuery,
parseHashParams,
parseQuery,
parseSearchParams,
setHashLocationQuery,
setHashParams,
setSearchParams,
stringifyParams
});
//# sourceMappingURL=index.js.map