UNPKG

url-search-utils

Version:

Utils for manipulate search params in query string.

151 lines (144 loc) 4.82 kB
// 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