@tanstack/history 0.0.1-beta.249 → 0.0.1-beta.250

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -241,9 +241,8 @@ function createBrowserHistory(opts) {
241
241
  };
242
242
  return history;
243
243
  }
244
- function createHashHistory({
245
- window: win
246
- }) {
244
+ function createHashHistory(opts) {
245
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
247
246
  return createBrowserHistory({
248
247
  getHref: () => win.location.hash.substring(1),
249
248
  createHref: path => `#${path}`,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
@@ -239,9 +239,8 @@ function createBrowserHistory(opts) {
239
239
  };
240
240
  return history;
241
241
  }
242
- function createHashHistory({
243
- window: win
244
- }) {
242
+ function createHashHistory(opts) {
243
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
245
244
  return createBrowserHistory({
246
245
  getHref: () => win.location.hash.substring(1),
247
246
  createHref: path => `#${path}`,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
@@ -4818,7 +4818,7 @@ var drawChart = (function (exports) {
4818
4818
  </script>
4819
4819
  <script>
4820
4820
  /*<!--*/
4821
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"9881-1"}]}],"isRoot":true},"nodeParts":{"9881-1":{"renderedLength":9537,"gzipLength":2784,"brotliLength":0,"metaUid":"9881-0"}},"nodeMetas":{"9881-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"9881-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"4.6.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4821
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"5ac9-1"}]}],"isRoot":true},"nodeParts":{"5ac9-1":{"renderedLength":9608,"gzipLength":2778,"brotliLength":0,"metaUid":"5ac9-0"}},"nodeMetas":{"5ac9-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"5ac9-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"4.6.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4822
4822
 
4823
4823
  const run = () => {
4824
4824
  const width = window.innerWidth;
@@ -8,7 +8,7 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "packages/history/src/index.ts",
11
- "uid": "9881-3"
11
+ "uid": "5ac9-3"
12
12
  }
13
13
  ]
14
14
  }
@@ -16,18 +16,18 @@
16
16
  "isRoot": true
17
17
  },
18
18
  "nodeParts": {
19
- "9881-3": {
20
- "renderedLength": 9537,
21
- "gzipLength": 2784,
19
+ "5ac9-3": {
20
+ "renderedLength": 9608,
21
+ "gzipLength": 2778,
22
22
  "brotliLength": 0,
23
- "metaUid": "9881-2"
23
+ "metaUid": "5ac9-2"
24
24
  }
25
25
  },
26
26
  "nodeMetas": {
27
- "9881-2": {
27
+ "5ac9-2": {
28
28
  "id": "/packages/history/src/index.ts",
29
29
  "moduleParts": {
30
- "index.production.js": "9881-3"
30
+ "index.production.js": "5ac9-3"
31
31
  },
32
32
  "imported": [],
33
33
  "importedBy": [],
@@ -67,7 +67,7 @@ declare function createBrowserHistory(opts?: {
67
67
  createHref?: (path: string) => string;
68
68
  window?: any;
69
69
  }): RouterHistory;
70
- declare function createHashHistory({ window: win, }: {
70
+ declare function createHashHistory(opts?: {
71
71
  window?: any;
72
72
  }): RouterHistory;
73
73
  declare function createMemoryHistory(opts?: {
@@ -245,9 +245,8 @@
245
245
  };
246
246
  return history;
247
247
  }
248
- function createHashHistory({
249
- window: win
250
- }) {
248
+ function createHashHistory(opts) {
249
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
251
250
  return createBrowserHistory({
252
251
  getHref: () => win.location.hash.substring(1),
253
252
  createHref: path => `#${path}`,
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TanStackHistory={})}(this,(function(e){"use strict";const t="pushstate",r="popstate",n="beforeunload",o=e=>(e.preventDefault(),e.returnValue=""),i=()=>{removeEventListener(n,o,{capture:!0})};function s(e){let t=e.getLocation(),r=new Set,s=[];const c=()=>{t=e.getLocation(),r.forEach((e=>e()))},h=t=>{if("undefined"!=typeof document&&s.length)for(let t of s)if(!window.confirm(t.message))return void e.onBlocked?.(c);t()};return{get location(){return t},subscribe:e=>(r.add(e),()=>{r.delete(e)}),push:(t,r)=>{r=a(r),h((()=>{e.pushState(t,r,c)}))},replace:(t,r)=>{r=a(r),h((()=>{e.replaceState(t,r,c)}))},go:t=>{h((()=>{e.go(t)}))},back:()=>{h((()=>{e.back()}))},forward:()=>{h((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>{const t={message:e};return s.push(t),1===s.length&&addEventListener(n,o,{capture:!0}),()=>{s=s.filter((e=>e!==t)),s.length||i()}},flush:()=>e.flush?.(),destroy:()=>e.destroy?.(),notify:c}}function a(e){return e||(e={}),{...e,key:u()}}function c(e){const n=e?.window??("undefined"!=typeof document?window:void 0),o=e?.getHref??(()=>`${n.location.pathname}${n.location.search}${n.location.hash}`),i=e?.createHref??(e=>e);let a,c=h(o(),n.history.state);let u,f,l=!0;const d=()=>{l=!1,(()=>{u&&(n.history[u.isPush?"pushState":"replaceState"](u.state,"",u.href),u=void 0,f=void 0,a=void 0)})(),l=!0},p=(e,t,r,n)=>{const o=i(t);f||(a=c),c=h(o,r),u={href:o,state:r,isPush:u?.isPush||"push"===e},n(),f||(f=Promise.resolve().then((()=>d())))},y=()=>{c=h(o(),n.history.state),v.notify()};var g=n.history.pushState,m=n.history.replaceState;const v=s({getLocation:()=>c,pushState:(e,t,r)=>p("push",e,t,r),replaceState:(e,t,r)=>p("replace",e,t,r),back:()=>n.history.back(),forward:()=>n.history.forward(),go:e=>n.history.go(e),createHref:e=>i(e),flush:d,destroy:()=>{n.history.pushState=g,n.history.replaceState=m,n.removeEventListener(t,y),n.removeEventListener(r,y)},onBlocked:e=>{a&&c!==a&&(c=a,e())}});return n.addEventListener(t,y),n.addEventListener(r,y),n.history.pushState=function(){let e=g.apply(n.history,arguments);return l&&v.notify(),e},n.history.replaceState=function(){let e=m.apply(n.history,arguments);return l&&v.notify(),e},v}function h(e,t){let r=e.indexOf("#"),n=e.indexOf("?");return{href:e,pathname:e.substring(0,r>0?n>0?Math.min(r,n):r:n>0?n:e.length),hash:r>-1?e.substring(r):"",search:n>-1?e.slice(n,-1===r?void 0:r):"",state:t||{}}}function u(){return(Math.random()+1).toString(36).substring(7)}e.createBrowserHistory=c,e.createHashHistory=function({window:e}){return c({getHref:()=>e.location.hash.substring(1),createHref:e=>`#${e}`,window:e})},e.createHistory=s,e.createMemoryHistory=function(e={initialEntries:["/"]}){const t=e.initialEntries;let r=e.initialIndex??t.length-1,n={key:u()};return s({getLocation:()=>h(t[r],n),pushState:(e,o)=>{n=o,t.push(e),r++},replaceState:(e,o)=>{n=o,t[r]=e},back:()=>{r--},forward:()=>{r=Math.min(r+1,t.length-1)},go:e=>{r=Math.min(Math.max(r+e,0),t.length-1)},createHref:e=>e})}}));
11
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TanStackHistory={})}(this,(function(e){"use strict";const t="pushstate",n="popstate",o="beforeunload",r=e=>(e.preventDefault(),e.returnValue=""),i=()=>{removeEventListener(o,r,{capture:!0})};function s(e){let t=e.getLocation(),n=new Set,s=[];const c=()=>{t=e.getLocation(),n.forEach((e=>e()))},h=t=>{if("undefined"!=typeof document&&s.length)for(let t of s)if(!window.confirm(t.message))return void e.onBlocked?.(c);t()};return{get location(){return t},subscribe:e=>(n.add(e),()=>{n.delete(e)}),push:(t,n)=>{n=a(n),h((()=>{e.pushState(t,n,c)}))},replace:(t,n)=>{n=a(n),h((()=>{e.replaceState(t,n,c)}))},go:t=>{h((()=>{e.go(t)}))},back:()=>{h((()=>{e.back()}))},forward:()=>{h((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>{const t={message:e};return s.push(t),1===s.length&&addEventListener(o,r,{capture:!0}),()=>{s=s.filter((e=>e!==t)),s.length||i()}},flush:()=>e.flush?.(),destroy:()=>e.destroy?.(),notify:c}}function a(e){return e||(e={}),{...e,key:u()}}function c(e){const o=e?.window??("undefined"!=typeof document?window:void 0),r=e?.getHref??(()=>`${o.location.pathname}${o.location.search}${o.location.hash}`),i=e?.createHref??(e=>e);let a,c=h(r(),o.history.state);let u,f,d=!0;const l=()=>{d=!1,(()=>{u&&(o.history[u.isPush?"pushState":"replaceState"](u.state,"",u.href),u=void 0,f=void 0,a=void 0)})(),d=!0},p=(e,t,n,o)=>{const r=i(t);f||(a=c),c=h(r,n),u={href:r,state:n,isPush:u?.isPush||"push"===e},o(),f||(f=Promise.resolve().then((()=>l())))},y=()=>{c=h(r(),o.history.state),v.notify()};var g=o.history.pushState,m=o.history.replaceState;const v=s({getLocation:()=>c,pushState:(e,t,n)=>p("push",e,t,n),replaceState:(e,t,n)=>p("replace",e,t,n),back:()=>o.history.back(),forward:()=>o.history.forward(),go:e=>o.history.go(e),createHref:e=>i(e),flush:l,destroy:()=>{o.history.pushState=g,o.history.replaceState=m,o.removeEventListener(t,y),o.removeEventListener(n,y)},onBlocked:e=>{a&&c!==a&&(c=a,e())}});return o.addEventListener(t,y),o.addEventListener(n,y),o.history.pushState=function(){let e=g.apply(o.history,arguments);return d&&v.notify(),e},o.history.replaceState=function(){let e=m.apply(o.history,arguments);return d&&v.notify(),e},v}function h(e,t){let n=e.indexOf("#"),o=e.indexOf("?");return{href:e,pathname:e.substring(0,n>0?o>0?Math.min(n,o):n:o>0?o:e.length),hash:n>-1?e.substring(n):"",search:o>-1?e.slice(o,-1===n?void 0:n):"",state:t||{}}}function u(){return(Math.random()+1).toString(36).substring(7)}e.createBrowserHistory=c,e.createHashHistory=function(e){const t=e?.window??("undefined"!=typeof document?window:void 0);return c({getHref:()=>t.location.hash.substring(1),createHref:e=>`#${e}`,window:t})},e.createHistory=s,e.createMemoryHistory=function(e={initialEntries:["/"]}){const t=e.initialEntries;let n=e.initialIndex??t.length-1,o={key:u()};return s({getLocation:()=>h(t[n],o),pushState:(e,r)=>{o=r,t.push(e),n++},replaceState:(e,r)=>{o=r,t[n]=e},back:()=>{n--},forward:()=>{n=Math.min(n+1,t.length-1)},go:e=>{n=Math.min(Math.max(n+e,0),t.length-1)},createHref:e=>e})}}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","rollbackLocation","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","fn","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState","max"],"mappings":"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"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","rollbackLocation","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","fn","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState","max"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/history",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.249",
4
+ "version": "0.0.1-beta.250",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/history",
7
7
  "homepage": "https://tanstack.com",
package/src/index.ts CHANGED
@@ -330,11 +330,10 @@ export function createBrowserHistory(opts?: {
330
330
  return history
331
331
  }
332
332
 
333
- export function createHashHistory({
334
- window: win,
335
- }: {
336
- window?: any
337
- }): RouterHistory {
333
+ export function createHashHistory(opts?: { window?: any }): RouterHistory {
334
+ const win =
335
+ opts?.window ??
336
+ (typeof document !== 'undefined' ? window : (undefined as any))
338
337
  return createBrowserHistory({
339
338
  getHref: () => win.location.hash.substring(1),
340
339
  createHref: (path) => `#${path}`,