@studiometa/js-toolkit
Version:
A set of useful little bits of JavaScript to boost your project! 🚀
71 lines (70 loc) • 2.02 kB
JavaScript
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