UNPKG

@studiometa/js-toolkit

Version:

A set of useful little bits of JavaScript to boost your project! 🚀

71 lines (70 loc) • 2.02 kB
import { isArray, isObject } from "./is.js"; import { hasWindow } from "./has.js"; import { startsWith } from "./string/index.js"; function updateUrlSearchParam(params, name, value) { if (value === "" || value === null || value === void 0) { if (params.has(name)) { params.delete(name); } return params; } if (isArray(value)) { for (const [index, val] of value.entries()) { const arrayName = `${name}[${index}]`; updateUrlSearchParam(params, arrayName, val); } return params; } if (isObject(value)) { for (const [key, val] of Object.entries(value)) { const objectName = `${name}[${key}]`; updateUrlSearchParam(params, objectName, val); } return params; } params.set(name, value); return params; } function objectToURLSearchParams(obj, defaultSearch = hasWindow() ? window.location.search : "") { return Object.entries(obj).reduce( (urlSearchParams, [name, value]) => updateUrlSearchParam(urlSearchParams, name, value), new URLSearchParams(defaultSearch) ); } function updateHistory(mode, options, data = {}, title = "") { if (!window.history) { return; } const { path, search, hash } = { path: window.location.pathname, search: new URLSearchParams(window.location.search), hash: window.location.hash, ...options }; let url = path; const mergedSearch = search instanceof URLSearchParams ? search : objectToURLSearchParams(search); if (mergedSearch.toString()) { url += `?${mergedSearch.toString()}`; } if (hash) { if (startsWith(hash, "#")) { url += hash; } else { url += `#${hash}`; } } const method = `${mode}State`; window.history[method](data, title, url); } function push(options, data = {}, title = "") { updateHistory("push", options, data, title); } function replace(options, data = {}, title = "") { updateHistory("replace", options, data, title); } export { objectToURLSearchParams, push, replace }; //# sourceMappingURL=history.js.map