UNPKG

nuqs

Version:

Type-safe search params state manager for React - Like useState, but stored in the URL query string

70 lines (68 loc) 2.42 kB
import { debug, error } from "./context-BWo_DoaC.js"; import { resetQueues, spinQueueResetMutex } from "./reset-BmRuoRYl.js"; //#region src/adapters/lib/patch-history.ts const historyUpdateMarker = "__nuqs__"; function getSearchParams(url) { if (url instanceof URL) return url.searchParams; if (url.startsWith("?")) return new URLSearchParams(url); try { return new URL(url, location.origin).searchParams; } catch { return new URLSearchParams(url); } } function shouldPatchHistory(adapter) { if (typeof history === "undefined") return false; if (history.nuqs?.version && history.nuqs.version !== "0.0.0-inject-version-here") { console.error(error(409), history.nuqs.version, `0.0.0-inject-version-here`, adapter); return false; } if (history.nuqs?.adapters?.includes(adapter)) return false; return true; } function markHistoryAsPatched(adapter) { history.nuqs = history.nuqs ?? { version: "0.0.0-inject-version-here", adapters: [] }; history.nuqs.adapters.push(adapter); } function patchHistory(emitter, adapter) { if (!shouldPatchHistory(adapter)) return; let lastSearchSeen = typeof location === "object" ? location.search : ""; emitter.on("update", (search) => { const searchString = search.toString(); lastSearchSeen = searchString.length ? "?" + searchString : ""; }); window.addEventListener("popstate", () => { lastSearchSeen = location.search; resetQueues(); }); debug("[nuqs %s] Patching history (%s adapter)", "0.0.0-inject-version-here", adapter); function sync(url) { spinQueueResetMutex(); try { const newSearch = new URL(url, location.origin).search; if (newSearch === lastSearchSeen) return; } catch {} try { emitter.emit("update", getSearchParams(url)); } catch (e) { console.error(e); } } const originalPushState = history.pushState; const originalReplaceState = history.replaceState; history.pushState = function nuqs_pushState(state, marker, url) { originalPushState.call(history, state, "", url); if (url && marker !== historyUpdateMarker) sync(url); }; history.replaceState = function nuqs_replaceState(state, marker, url) { originalReplaceState.call(history, state, "", url); if (url && marker !== historyUpdateMarker) sync(url); }; markHistoryAsPatched(adapter); } //#endregion export { historyUpdateMarker, markHistoryAsPatched, patchHistory, shouldPatchHistory }; //# sourceMappingURL=patch-history-VL_JehFX.js.map