@tanstack/history 0.0.1-beta.193 → 0.0.1-beta.196

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.
@@ -75,13 +75,13 @@ function createHistory(opts) {
75
75
  };
76
76
  },
77
77
  push: (path, state) => {
78
- assignKey(state);
78
+ state = assignKey(state);
79
79
  queueTask(() => {
80
80
  opts.pushState(path, state, onUpdate);
81
81
  });
82
82
  },
83
83
  replace: (path, state) => {
84
- assignKey(state);
84
+ state = assignKey(state);
85
85
  queueTask(() => {
86
86
  opts.replaceState(path, state, onUpdate);
87
87
  });
@@ -120,13 +120,11 @@ function createHistory(opts) {
120
120
  };
121
121
  }
122
122
  function assignKey(state) {
123
+ if (!state) {
124
+ state = {};
125
+ }
123
126
  state.key = createRandomKey();
124
- // if (state.__actualLocation) {
125
- // state.__actualLocation.state = {
126
- // ...state.__actualLocation.state,
127
- // key,
128
- // }
129
- // }
127
+ return state;
130
128
  }
131
129
 
132
130
  /**
@@ -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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 __tempLocation?: HistoryLocation\n __tempKey?: string\n}\n\ntype BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n state.key = createRandomKey()\n // if (state.__actualLocation) {\n // state.__actualLocation.state = {\n // ...state.__actualLocation.state,\n // key,\n // }\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n state.key = createRandomKey()\n return state\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
@@ -71,13 +71,13 @@ function createHistory(opts) {
71
71
  };
72
72
  },
73
73
  push: (path, state) => {
74
- assignKey(state);
74
+ state = assignKey(state);
75
75
  queueTask(() => {
76
76
  opts.pushState(path, state, onUpdate);
77
77
  });
78
78
  },
79
79
  replace: (path, state) => {
80
- assignKey(state);
80
+ state = assignKey(state);
81
81
  queueTask(() => {
82
82
  opts.replaceState(path, state, onUpdate);
83
83
  });
@@ -116,13 +116,11 @@ function createHistory(opts) {
116
116
  };
117
117
  }
118
118
  function assignKey(state) {
119
+ if (!state) {
120
+ state = {};
121
+ }
119
122
  state.key = createRandomKey();
120
- // if (state.__actualLocation) {
121
- // state.__actualLocation.state = {
122
- // ...state.__actualLocation.state,
123
- // key,
124
- // }
125
- // }
123
+ return state;
126
124
  }
127
125
 
128
126
  /**
@@ -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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 __tempLocation?: HistoryLocation\n __tempKey?: string\n}\n\ntype BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n state.key = createRandomKey()\n // if (state.__actualLocation) {\n // state.__actualLocation.state = {\n // ...state.__actualLocation.state,\n // key,\n // }\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n state.key = createRandomKey()\n return state\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
@@ -4024,7 +4024,7 @@ var drawChart = (function (exports) {
4024
4024
  </script>
4025
4025
  <script>
4026
4026
  /*<!--*/
4027
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"7fc4-863"}]}],"isRoot":true},"nodeParts":{"7fc4-863":{"renderedLength":9309,"gzipLength":2670,"brotliLength":0,"mainUid":"7fc4-862"}},"nodeMetas":{"7fc4-862":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"7fc4-863"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4027
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"85f5-1"}]}],"isRoot":true},"nodeParts":{"85f5-1":{"renderedLength":9226,"gzipLength":2644,"brotliLength":0,"mainUid":"85f5-0"}},"nodeMetas":{"85f5-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"85f5-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4028
4028
 
4029
4029
  const run = () => {
4030
4030
  const width = window.innerWidth;
@@ -8,7 +8,7 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "packages/history/src/index.ts",
11
- "uid": "7fc4-865"
11
+ "uid": "85f5-3"
12
12
  }
13
13
  ]
14
14
  }
@@ -16,18 +16,18 @@
16
16
  "isRoot": true
17
17
  },
18
18
  "nodeParts": {
19
- "7fc4-865": {
20
- "renderedLength": 9309,
21
- "gzipLength": 2670,
19
+ "85f5-3": {
20
+ "renderedLength": 9226,
21
+ "gzipLength": 2644,
22
22
  "brotliLength": 0,
23
- "mainUid": "7fc4-864"
23
+ "mainUid": "85f5-2"
24
24
  }
25
25
  },
26
26
  "nodeMetas": {
27
- "7fc4-864": {
27
+ "85f5-2": {
28
28
  "id": "/packages/history/src/index.ts",
29
29
  "moduleParts": {
30
- "index.production.js": "7fc4-865"
30
+ "index.production.js": "85f5-3"
31
31
  },
32
32
  "imported": [],
33
33
  "importedBy": [],
@@ -31,8 +31,6 @@ interface ParsedPath {
31
31
  }
32
32
  interface HistoryState {
33
33
  key: string;
34
- __tempLocation?: HistoryLocation;
35
- __tempKey?: string;
36
34
  }
37
35
  type BlockerFn = (retry: () => void, cancel: () => void) => void;
38
36
  /**
@@ -77,13 +77,13 @@
77
77
  };
78
78
  },
79
79
  push: (path, state) => {
80
- assignKey(state);
80
+ state = assignKey(state);
81
81
  queueTask(() => {
82
82
  opts.pushState(path, state, onUpdate);
83
83
  });
84
84
  },
85
85
  replace: (path, state) => {
86
- assignKey(state);
86
+ state = assignKey(state);
87
87
  queueTask(() => {
88
88
  opts.replaceState(path, state, onUpdate);
89
89
  });
@@ -122,13 +122,11 @@
122
122
  };
123
123
  }
124
124
  function assignKey(state) {
125
+ if (!state) {
126
+ state = {};
127
+ }
125
128
  state.key = createRandomKey();
126
- // if (state.__actualLocation) {
127
- // state.__actualLocation.state = {
128
- // ...state.__actualLocation.state,
129
- // key,
130
- // }
131
- // }
129
+ return state;
132
130
  }
133
131
 
134
132
  /**
@@ -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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 __tempLocation?: HistoryLocation\n __tempKey?: string\n}\n\ntype BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n state.key = createRandomKey()\n // if (state.__actualLocation) {\n // state.__actualLocation.state = {\n // ...state.__actualLocation.state,\n // key,\n // }\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n state.key = createRandomKey()\n return state\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","tracking","scheduled","untrack","fn","isPush","href","undefined","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":";;;;;;;;;;;;;;;;EAAA;EACA;EACA;;EAgCA,MAAMA,cAAc,GAAG,WAAW,CAAA;EAClC,MAAMC,aAAa,GAAG,UAAU,CAAA;EAChC,MAAMC,iBAAiB,GAAG,cAAc,CAAA;EAExC,MAAMC,oBAAoB,GAAIC,KAAY,IAAK;IAC7CA,KAAK,CAACC,cAAc,EAAE,CAAA;EACtB;EACA,EAAA,OAAQD,KAAK,CAACE,WAAW,GAAG,EAAE,CAAA;EAChC,CAAC,CAAA;EAED,MAAMC,YAAY,GAAGA,MAAM;EACzBC,EAAAA,mBAAmB,CAACN,iBAAiB,EAAEC,oBAAoB,EAAE;EAC3DM,IAAAA,OAAO,EAAE,IAAA;EACX,GAAC,CAAC,CAAA;EACJ,CAAC,CAAA;EAED,SAASC,aAAaA,CAACC,IAUtB,EAAiB;EAChB,EAAA,IAAIC,QAAQ,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;EACjC,EAAA,IAAIC,KAAK,GAAGA,MAAM,EAAE,CAAA;EACpB,EAAA,IAAIC,WAAW,GAAG,IAAIC,GAAG,EAAc,CAAA;IACvC,IAAIC,QAAqB,GAAG,EAAE,CAAA;IAC9B,IAAIC,KAAqB,GAAG,EAAE,CAAA;IAE9B,MAAMC,QAAQ,GAAGA,MAAM;MACrB,IAAIF,QAAQ,CAACG,MAAM,EAAE;EACnBH,MAAAA,QAAQ,CAAC,CAAC,CAAC,GAAGE,QAAQ,EAAE,MAAM;EAC5BF,QAAAA,QAAQ,GAAG,EAAE,CAAA;EACbV,QAAAA,YAAY,EAAE,CAAA;EAChB,OAAC,CAAC,CAAA;EACF,MAAA,OAAA;EACF,KAAA;MAEA,OAAOW,KAAK,CAACE,MAAM,EAAE;EACnBF,MAAAA,KAAK,CAACG,KAAK,EAAE,IAAI,CAAA;EACnB,KAAA;EAEA,IAAA,IAAI,CAACV,IAAI,CAACW,UAAU,EAAE;EACpBC,MAAAA,QAAQ,EAAE,CAAA;EACZ,KAAA;KACD,CAAA;IAED,MAAMC,SAAS,GAAIC,IAAgB,IAAK;EACtCP,IAAAA,KAAK,CAACQ,IAAI,CAACD,IAAI,CAAC,CAAA;EAChBN,IAAAA,QAAQ,EAAE,CAAA;KACX,CAAA;IAED,MAAMI,QAAQ,GAAGA,MAAM;EACrBX,IAAAA,QAAQ,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;MAC7BE,WAAW,CAACY,OAAO,CAAEL,UAAU,IAAKA,UAAU,EAAE,CAAC,CAAA;KAClD,CAAA;IAED,OAAO;MACL,IAAIV,QAAQA,GAAG;EACb,MAAA,OAAOA,QAAQ,CAAA;OAChB;MACDgB,SAAS,EAAGC,EAAc,IAAK;EAC7B,MAAA,IAAId,WAAW,CAACe,IAAI,KAAK,CAAC,EAAE;EAC1BhB,QAAAA,KAAK,GACH,OAAOH,IAAI,CAACW,UAAU,KAAK,UAAU,GACjCX,IAAI,CAACW,UAAU,CAACC,QAAQ,CAAC,GACzB,MAAM,EAAE,CAAA;EAChB,OAAA;EACAR,MAAAA,WAAW,CAACgB,GAAG,CAACF,EAAE,CAAC,CAAA;EAEnB,MAAA,OAAO,MAAM;EACXd,QAAAA,WAAW,CAACiB,MAAM,CAACH,EAAE,CAAC,CAAA;EACtB,QAAA,IAAId,WAAW,CAACe,IAAI,KAAK,CAAC,EAAE;EAC1BhB,UAAAA,KAAK,EAAE,CAAA;EACT,SAAA;SACD,CAAA;OACF;EACDY,IAAAA,IAAI,EAAEA,CAACO,IAAY,EAAEC,KAAU,KAAK;EAClCA,MAAAA,KAAK,GAAGC,SAAS,CAACD,KAAK,CAAC,CAAA;EACxBV,MAAAA,SAAS,CAAC,MAAM;UACdb,IAAI,CAACyB,SAAS,CAACH,IAAI,EAAEC,KAAK,EAAEX,QAAQ,CAAC,CAAA;EACvC,OAAC,CAAC,CAAA;OACH;EACDc,IAAAA,OAAO,EAAEA,CAACJ,IAAY,EAAEC,KAAU,KAAK;EACrCA,MAAAA,KAAK,GAAGC,SAAS,CAACD,KAAK,CAAC,CAAA;EACxBV,MAAAA,SAAS,CAAC,MAAM;UACdb,IAAI,CAAC2B,YAAY,CAACL,IAAI,EAAEC,KAAK,EAAEX,QAAQ,CAAC,CAAA;EAC1C,OAAC,CAAC,CAAA;OACH;MACDgB,EAAE,EAAGC,KAAK,IAAK;EACbhB,MAAAA,SAAS,CAAC,MAAM;EACdb,QAAAA,IAAI,CAAC4B,EAAE,CAACC,KAAK,CAAC,CAAA;EAChB,OAAC,CAAC,CAAA;OACH;MACDC,IAAI,EAAEA,MAAM;EACVjB,MAAAA,SAAS,CAAC,MAAM;UACdb,IAAI,CAAC8B,IAAI,EAAE,CAAA;EACb,OAAC,CAAC,CAAA;OACH;MACDC,OAAO,EAAEA,MAAM;EACblB,MAAAA,SAAS,CAAC,MAAM;UACdb,IAAI,CAAC+B,OAAO,EAAE,CAAA;EAChB,OAAC,CAAC,CAAA;OACH;MACDC,UAAU,EAAGC,GAAG,IAAKjC,IAAI,CAACgC,UAAU,CAACC,GAAG,CAAC;MACzCC,KAAK,EAAGhB,EAAE,IAAK;EACbZ,MAAAA,QAAQ,CAACS,IAAI,CAACG,EAAE,CAAC,CAAA;EAEjB,MAAA,IAAIZ,QAAQ,CAACG,MAAM,KAAK,CAAC,EAAE;EACzB0B,QAAAA,gBAAgB,CAAC5C,iBAAiB,EAAEC,oBAAoB,EAAE;EACxDM,UAAAA,OAAO,EAAE,IAAA;EACX,SAAC,CAAC,CAAA;EACJ,OAAA;EAEA,MAAA,OAAO,MAAM;UACXQ,QAAQ,GAAGA,QAAQ,CAAC8B,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKnB,EAAE,CAAC,CAAA;EAE3C,QAAA,IAAI,CAACZ,QAAQ,CAACG,MAAM,EAAE;EACpBb,UAAAA,YAAY,EAAE,CAAA;EAChB,SAAA;SACD,CAAA;OACF;EACD0C,IAAAA,KAAK,EAAEA,MAAMtC,IAAI,CAACsC,KAAK,IAAG;KAC3B,CAAA;EACH,CAAA;EAEA,SAASd,SAASA,CAACD,KAAmB,EAAE;IACtC,IAAI,CAACA,KAAK,EAAE;MACVA,KAAK,GAAG,EAAkB,CAAA;EAC5B,GAAA;EACAA,EAAAA,KAAK,CAACgB,GAAG,GAAGC,eAAe,EAAE,CAAA;EAC7B,EAAA,OAAOjB,KAAK,CAAA;EACd,CAAA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACO,SAASkB,oBAAoBA,CAACzC,IAGpC,EAAiB;IAChB,MAAM0C,OAAO,GACX1C,IAAI,EAAE0C,OAAO,KACZ,MACE,CAAEC,EAAAA,MAAM,CAAC1C,QAAQ,CAAC2C,QAAS,GAAED,MAAM,CAAC1C,QAAQ,CAAC4C,MAAO,CAAA,EAAEF,MAAM,CAAC1C,QAAQ,CAAC6C,IAAK,CAAA,CAAC,CAAC,CAAA;IAElF,MAAMd,UAAU,GAAGhC,IAAI,EAAEgC,UAAU,KAAMV,IAAI,IAAKA,IAAI,CAAC,CAAA;EAEvD,EAAA,IAAIyB,eAAe,GAAGC,aAAa,CAACN,OAAO,EAAE,EAAEC,MAAM,CAACM,OAAO,CAAC1B,KAAK,CAAC,CAAA;EAEpE,EAAA,MAAMrB,WAAW,GAAGA,MAAM6C,eAAe,CAAA;EAEzC,EAAA,IAAIG,IASC,CAAA;;EAEL;EACA;EACA;EACA;IACA,IAAIC,QAAQ,GAAG,IAAI,CAAA;;EAEnB;EACA;EACA,EAAA,IAAIC,SAAoC,CAAA;;EAExC;EACA;IACA,MAAMC,OAAO,GAAIC,EAAc,IAAK;EAClCH,IAAAA,QAAQ,GAAG,KAAK,CAAA;EAChBG,IAAAA,EAAE,EAAE,CAAA;EACJH,IAAAA,QAAQ,GAAG,IAAI,CAAA;KAChB,CAAA;;EAED;IACA,MAAMb,KAAK,GAAGA,MAAM;EAClB;EACAe,IAAAA,OAAO,CAAC,MAAM;QACZ,IAAI,CAACH,IAAI,EAAE,OAAA;QACXP,MAAM,CAACM,OAAO,CAACC,IAAI,CAACK,MAAM,GAAG,WAAW,GAAG,cAAc,CAAC,CACxDL,IAAI,CAAC3B,KAAK,EACV,EAAE,EACF2B,IAAI,CAACM,IACP,CAAC,CAAA;EACD;EACAN,MAAAA,IAAI,GAAGO,SAAS,CAAA;EAChBL,MAAAA,SAAS,GAAGK,SAAS,CAAA;EACvB,KAAC,CAAC,CAAA;KACH,CAAA;;EAED;IACA,MAAMC,kBAAkB,GAAGA,CACzBC,IAAwB,EACxBrC,IAAY,EACZC,KAAU,EACVX,QAAoB,KACjB;EACH,IAAA,MAAM4C,IAAI,GAAGxB,UAAU,CAACV,IAAI,CAAC,CAAA;;EAE7B;EACAyB,IAAAA,eAAe,GAAGC,aAAa,CAACQ,IAAI,EAAEjC,KAAK,CAAC,CAAA;;EAE5C;EACA2B,IAAAA,IAAI,GAAG;QACLM,IAAI;QACJjC,KAAK;EACLgC,MAAAA,MAAM,EAAEL,IAAI,EAAEK,MAAM,IAAII,IAAI,KAAK,MAAA;OAClC,CAAA;EACD;EACA/C,IAAAA,QAAQ,EAAE,CAAA;MAEV,IAAI,CAACwC,SAAS,EAAE;EACd;EACAA,MAAAA,SAAS,GAAGQ,OAAO,CAACC,OAAO,EAAE,CAACC,IAAI,CAAC,MAAMxB,KAAK,EAAE,CAAC,CAAA;EACnD,KAAA;KACD,CAAA;EAED,EAAA,OAAOvC,aAAa,CAAC;MACnBG,WAAW;MACXS,UAAU,EAAGC,QAAQ,IAAK;EACxB+B,MAAAA,MAAM,CAACR,gBAAgB,CAAC9C,cAAc,EAAE,MAAM;EAC5C0D,QAAAA,eAAe,GAAGC,aAAa,CAACN,OAAO,EAAE,EAAEC,MAAM,CAACM,OAAO,CAAC1B,KAAK,CAAC,CAAA;EAChEX,QAAAA,QAAQ,EAAE,CAAA;EACZ,OAAC,CAAC,CAAA;EACF+B,MAAAA,MAAM,CAACR,gBAAgB,CAAC7C,aAAa,EAAE,MAAM;EAC3CyD,QAAAA,eAAe,GAAGC,aAAa,CAACN,OAAO,EAAE,EAAEC,MAAM,CAACM,OAAO,CAAC1B,KAAK,CAAC,CAAA;EAChEX,QAAAA,QAAQ,EAAE,CAAA;EACZ,OAAC,CAAC,CAAA;EAEF,MAAA,IAAIa,SAAS,GAAGkB,MAAM,CAACM,OAAO,CAACxB,SAAS,CAAA;EACxCkB,MAAAA,MAAM,CAACM,OAAO,CAACxB,SAAS,GAAG,YAAY;UACrC,IAAIsC,GAAG,GAAGtC,SAAS,CAACuC,KAAK,CAACf,OAAO,EAAEgB,SAAgB,CAAC,CAAA;EACpD,QAAA,IAAId,QAAQ,EAAEvC,QAAQ,EAAE,CAAA;EACxB,QAAA,OAAOmD,GAAG,CAAA;SACX,CAAA;EACD,MAAA,IAAIpC,YAAY,GAAGgB,MAAM,CAACM,OAAO,CAACtB,YAAY,CAAA;EAC9CgB,MAAAA,MAAM,CAACM,OAAO,CAACtB,YAAY,GAAG,YAAY;UACxC,IAAIoC,GAAG,GAAGpC,YAAY,CAACqC,KAAK,CAACf,OAAO,EAAEgB,SAAgB,CAAC,CAAA;EACvD,QAAA,IAAId,QAAQ,EAAEvC,QAAQ,EAAE,CAAA;EACxB,QAAA,OAAOmD,GAAG,CAAA;SACX,CAAA;EAED,MAAA,OAAO,MAAM;EACXpB,QAAAA,MAAM,CAACM,OAAO,CAACxB,SAAS,GAAGA,SAAS,CAAA;EACpCkB,QAAAA,MAAM,CAACM,OAAO,CAACtB,YAAY,GAAGA,YAAY,CAAA;EAC1CgB,QAAAA,MAAM,CAAC9C,mBAAmB,CAACR,cAAc,EAAEuB,QAAQ,CAAC,CAAA;EACpD+B,QAAAA,MAAM,CAAC9C,mBAAmB,CAACP,aAAa,EAAEsB,QAAQ,CAAC,CAAA;SACpD,CAAA;OACF;EACDa,IAAAA,SAAS,EAAEA,CAACH,IAAI,EAAEC,KAAK,EAAEX,QAAQ,KAC/B8C,kBAAkB,CAAC,MAAM,EAAEpC,IAAI,EAAEC,KAAK,EAAEX,QAAQ,CAAC;EACnDe,IAAAA,YAAY,EAAEA,CAACL,IAAI,EAAEC,KAAK,EAAEX,QAAQ,KAClC8C,kBAAkB,CAAC,SAAS,EAAEpC,IAAI,EAAEC,KAAK,EAAEX,QAAQ,CAAC;MACtDkB,IAAI,EAAEA,MAAMa,MAAM,CAACM,OAAO,CAACnB,IAAI,EAAE;MACjCC,OAAO,EAAEA,MAAMY,MAAM,CAACM,OAAO,CAAClB,OAAO,EAAE;MACvCH,EAAE,EAAGsC,CAAC,IAAKvB,MAAM,CAACM,OAAO,CAACrB,EAAE,CAACsC,CAAC,CAAC;EAC/BlC,IAAAA,UAAU,EAAGV,IAAI,IAAKU,UAAU,CAACV,IAAI,CAAC;EACtCgB,IAAAA,KAAAA;EACF,GAAC,CAAC,CAAA;EACJ,CAAA;EAEO,SAAS6B,iBAAiBA,GAAkB;EACjD,EAAA,OAAO1B,oBAAoB,CAAC;EAC1BC,IAAAA,OAAO,EAAEA,MAAMC,MAAM,CAAC1C,QAAQ,CAAC6C,IAAI,CAACsB,SAAS,CAAC,CAAC,CAAC;EAChDpC,IAAAA,UAAU,EAAGV,IAAI,IAAM,CAAA,CAAA,EAAGA,IAAK,CAAA,CAAA;EACjC,GAAC,CAAC,CAAA;EACJ,CAAA;EAEO,SAAS+C,mBAAmBA,CACjCrE,IAGC,GAAG;IACFsE,cAAc,EAAE,CAAC,GAAG,CAAA;EACtB,CAAC,EACc;EACf,EAAA,MAAMC,OAAO,GAAGvE,IAAI,CAACsE,cAAc,CAAA;IACnC,IAAIzC,KAAK,GAAG7B,IAAI,CAACwE,YAAY,IAAID,OAAO,CAAC9D,MAAM,GAAG,CAAC,CAAA;EACnD,EAAA,IAAIgE,YAAY,GAAG;MACjBlC,GAAG,EAAEC,eAAe,EAAC;KACN,CAAA;EAEjB,EAAA,MAAMtC,WAAW,GAAGA,MAAM8C,aAAa,CAACuB,OAAO,CAAC1C,KAAK,CAAC,EAAG4C,YAAY,CAAC,CAAA;EAEtE,EAAA,OAAO1E,aAAa,CAAC;MACnBG,WAAW;EACXS,IAAAA,UAAU,EAAE,KAAK;EACjBc,IAAAA,SAAS,EAAEA,CAACH,IAAI,EAAEC,KAAK,KAAK;EAC1BkD,MAAAA,YAAY,GAAGlD,KAAK,CAAA;EACpBgD,MAAAA,OAAO,CAACxD,IAAI,CAACO,IAAI,CAAC,CAAA;EAClBO,MAAAA,KAAK,EAAE,CAAA;OACR;EACDF,IAAAA,YAAY,EAAEA,CAACL,IAAI,EAAEC,KAAK,KAAK;EAC7BkD,MAAAA,YAAY,GAAGlD,KAAK,CAAA;EACpBgD,MAAAA,OAAO,CAAC1C,KAAK,CAAC,GAAGP,IAAI,CAAA;OACtB;MACDQ,IAAI,EAAEA,MAAM;EACVD,MAAAA,KAAK,EAAE,CAAA;OACR;MACDE,OAAO,EAAEA,MAAM;EACbF,MAAAA,KAAK,GAAG6C,IAAI,CAACC,GAAG,CAAC9C,KAAK,GAAG,CAAC,EAAE0C,OAAO,CAAC9D,MAAM,GAAG,CAAC,CAAC,CAAA;OAChD;MACDmB,EAAE,EAAGsC,CAAC,IAAKvB,MAAM,CAACM,OAAO,CAACrB,EAAE,CAACsC,CAAC,CAAC;MAC/BlC,UAAU,EAAGV,IAAI,IAAKA,IAAAA;EACxB,GAAC,CAAC,CAAA;EACJ,CAAA;EAEA,SAAS0B,aAAaA,CAACQ,IAAY,EAAEjC,KAAmB,EAAmB;EACzE,EAAA,IAAIqD,SAAS,GAAGpB,IAAI,CAACqB,OAAO,CAAC,GAAG,CAAC,CAAA;EACjC,EAAA,IAAIC,WAAW,GAAGtB,IAAI,CAACqB,OAAO,CAAC,GAAG,CAAC,CAAA;IAEnC,OAAO;MACLrB,IAAI;EACJZ,IAAAA,QAAQ,EAAEY,IAAI,CAACY,SAAS,CACtB,CAAC,EACDQ,SAAS,GAAG,CAAC,GACTE,WAAW,GAAG,CAAC,GACbJ,IAAI,CAACC,GAAG,CAACC,SAAS,EAAEE,WAAW,CAAC,GAChCF,SAAS,GACXE,WAAW,GAAG,CAAC,GACfA,WAAW,GACXtB,IAAI,CAAC/C,MACX,CAAC;EACDqC,IAAAA,IAAI,EAAE8B,SAAS,GAAG,CAAC,CAAC,GAAGpB,IAAI,CAACY,SAAS,CAACQ,SAAS,CAAC,GAAG,EAAE;MACrD/B,MAAM,EACJiC,WAAW,GAAG,CAAC,CAAC,GACZtB,IAAI,CAACuB,KAAK,CAACD,WAAW,EAAEF,SAAS,KAAK,CAAC,CAAC,GAAGnB,SAAS,GAAGmB,SAAS,CAAC,GACjE,EAAE;MACRrD,KAAK,EAAEA,KAAK,IAAI,EAAC;KAClB,CAAA;EACH,CAAA;;EAEA;EACA,SAASiB,eAAeA,GAAG;EACzB,EAAA,OAAO,CAACkC,IAAI,CAACM,MAAM,EAAE,GAAG,CAAC,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACb,SAAS,CAAC,CAAC,CAAC,CAAA;EACtD;;;;;;;;;;;;"}
@@ -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=()=>{},s=new Set,c=[],h=[];const u=()=>{if(c.length)c[0]?.(u,(()=>{c=[],i()}));else{for(;h.length;)h.shift()?.();e.subscriber||f()}},d=e=>{h.push(e),u()},f=()=>{t=e.getLocation(),s.forEach((e=>e()))};return{get location(){return t},subscribe:t=>(0===s.size&&(r="function"==typeof e.subscriber?e.subscriber(f):()=>{}),s.add(t),()=>{s.delete(t),0===s.size&&r()}),push:(t,r)=>{a(r),d((()=>{e.pushState(t,r,f)}))},replace:(t,r)=>{a(r),d((()=>{e.replaceState(t,r,f)}))},go:t=>{d((()=>{e.go(t)}))},back:()=>{d((()=>{e.back()}))},forward:()=>{d((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>(c.push(e),1===c.length&&addEventListener(n,o,{capture:!0}),()=>{c=c.filter((t=>t!==e)),c.length||i()}),flush:()=>e.flush?.()}}function a(e){e.key=u()}function c(e){const n=e?.getHref??(()=>`${window.location.pathname}${window.location.search}${window.location.hash}`),o=e?.createHref??(e=>e);let i=h(n(),window.history.state);let a,c,u=!0;const d=()=>{u=!1,(()=>{a&&(window.history[a.isPush?"pushState":"replaceState"](a.state,"",a.href),a=void 0,c=void 0)})(),u=!0},f=(e,t,r,n)=>{const s=o(t);i=h(s,r),a={href:s,state:r,isPush:a?.isPush||"push"===e},n(),c||(c=Promise.resolve().then((()=>d())))};return s({getLocation:()=>i,subscriber:e=>{window.addEventListener(t,(()=>{i=h(n(),window.history.state),e()})),window.addEventListener(r,(()=>{i=h(n(),window.history.state),e()}));var o=window.history.pushState;window.history.pushState=function(){let t=o.apply(history,arguments);return u&&e(),t};var s=window.history.replaceState;return window.history.replaceState=function(){let t=s.apply(history,arguments);return u&&e(),t},()=>{window.history.pushState=o,window.history.replaceState=s,window.removeEventListener(t,e),window.removeEventListener(r,e)}},pushState:(e,t,r)=>f("push",e,t,r),replaceState:(e,t,r)=>f("replace",e,t,r),back:()=>window.history.back(),forward:()=>window.history.forward(),go:e=>window.history.go(e),createHref:e=>o(e),flush:d})}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(){return c({getHref:()=>window.location.hash.substring(1),createHref:e=>`#${e}`})},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),subscriber:!1,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=>window.history.go(e),createHref:e=>e})},Object.defineProperty(e,"__esModule",{value:!0})}));
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=()=>{},s=new Set,c=[],h=[];const u=()=>{if(c.length)c[0]?.(u,(()=>{c=[],i()}));else{for(;h.length;)h.shift()?.();e.subscriber||f()}},d=e=>{h.push(e),u()},f=()=>{t=e.getLocation(),s.forEach((e=>e()))};return{get location(){return t},subscribe:t=>(0===s.size&&(r="function"==typeof e.subscriber?e.subscriber(f):()=>{}),s.add(t),()=>{s.delete(t),0===s.size&&r()}),push:(t,r)=>{r=a(r),d((()=>{e.pushState(t,r,f)}))},replace:(t,r)=>{r=a(r),d((()=>{e.replaceState(t,r,f)}))},go:t=>{d((()=>{e.go(t)}))},back:()=>{d((()=>{e.back()}))},forward:()=>{d((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>(c.push(e),1===c.length&&addEventListener(n,o,{capture:!0}),()=>{c=c.filter((t=>t!==e)),c.length||i()}),flush:()=>e.flush?.()}}function a(e){return e||(e={}),e.key=u(),e}function c(e){const n=e?.getHref??(()=>`${window.location.pathname}${window.location.search}${window.location.hash}`),o=e?.createHref??(e=>e);let i=h(n(),window.history.state);let a,c,u=!0;const d=()=>{u=!1,(()=>{a&&(window.history[a.isPush?"pushState":"replaceState"](a.state,"",a.href),a=void 0,c=void 0)})(),u=!0},f=(e,t,r,n)=>{const s=o(t);i=h(s,r),a={href:s,state:r,isPush:a?.isPush||"push"===e},n(),c||(c=Promise.resolve().then((()=>d())))};return s({getLocation:()=>i,subscriber:e=>{window.addEventListener(t,(()=>{i=h(n(),window.history.state),e()})),window.addEventListener(r,(()=>{i=h(n(),window.history.state),e()}));var o=window.history.pushState;window.history.pushState=function(){let t=o.apply(history,arguments);return u&&e(),t};var s=window.history.replaceState;return window.history.replaceState=function(){let t=s.apply(history,arguments);return u&&e(),t},()=>{window.history.pushState=o,window.history.replaceState=s,window.removeEventListener(t,e),window.removeEventListener(r,e)}},pushState:(e,t,r)=>f("push",e,t,r),replaceState:(e,t,r)=>f("replace",e,t,r),back:()=>window.history.back(),forward:()=>window.history.forward(),go:e=>window.history.go(e),createHref:e=>o(e),flush:d})}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(){return c({getHref:()=>window.location.hash.substring(1),createHref:e=>`#${e}`})},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),subscriber:!1,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=>window.history.go(e),createHref:e=>e})},Object.defineProperty(e,"__esModule",{value:!0})}));
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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 __tempLocation?: HistoryLocation\n __tempKey?: string\n}\n\ntype BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n state.key = createRandomKey()\n // if (state.__actualLocation) {\n // state.__actualLocation.state = {\n // ...state.__actualLocation.state,\n // key,\n // }\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","undefined","fn","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState"],"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: (blockerFn: BlockerFn) => () => void\n flush: () => 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 BlockerFn = (retry: () => void, cancel: () => void) => void\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\nfunction createHistory(opts: {\n getLocation: () => HistoryLocation\n subscriber: false | ((onUpdate: () => void) => () => void)\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}): RouterHistory {\n let location = opts.getLocation()\n let unsub = () => {}\n let subscribers = new Set<() => void>()\n let blockers: BlockerFn[] = []\n let queue: (() => void)[] = []\n\n const tryFlush = () => {\n if (blockers.length) {\n blockers[0]?.(tryFlush, () => {\n blockers = []\n stopBlocking()\n })\n return\n }\n\n while (queue.length) {\n queue.shift()?.()\n }\n\n if (!opts.subscriber) {\n onUpdate()\n }\n }\n\n const queueTask = (task: () => void) => {\n queue.push(task)\n tryFlush()\n }\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n if (subscribers.size === 0) {\n unsub =\n typeof opts.subscriber === 'function'\n ? opts.subscriber(onUpdate)\n : () => {}\n }\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n if (subscribers.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n queueTask(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n queueTask(() => {\n opts.go(index)\n })\n },\n back: () => {\n queueTask(() => {\n opts.back()\n })\n },\n forward: () => {\n queueTask(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (cb) => {\n blockers.push(cb)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== cb)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n state.key = createRandomKey()\n return state\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}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.search}${window.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), window.history.state)\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 window.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 })\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 // 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 // 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 return createHistory({\n getLocation,\n subscriber: (onUpdate) => {\n window.addEventListener(pushStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n window.addEventListener(popStateEvent, () => {\n currentLocation = parseLocation(getHref(), window.history.state)\n onUpdate()\n })\n\n var pushState = window.history.pushState\n window.history.pushState = function () {\n let res = pushState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n var replaceState = window.history.replaceState\n window.history.replaceState = function () {\n let res = replaceState.apply(history, arguments as any)\n if (tracking) onUpdate()\n return res\n }\n\n return () => {\n window.history.pushState = pushState\n window.history.replaceState = replaceState\n window.removeEventListener(pushStateEvent, onUpdate)\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\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 subscriber: false,\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) => window.history.go(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","unsub","subscribers","Set","blockers","queue","tryFlush","length","shift","subscriber","onUpdate","queueTask","task","push","forEach","subscribe","cb","size","add","delete","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","addEventListener","filter","b","flush","key","createRandomKey","createBrowserHistory","getHref","window","pathname","search","hash","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","undefined","fn","queueHistoryAction","type","Promise","resolve","then","res","apply","arguments","n","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState"],"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.193",
4
+ "version": "0.0.1-beta.196",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/history",
7
7
  "homepage": "https://tanstack.com",
package/src/index.ts CHANGED
@@ -28,8 +28,6 @@ export interface ParsedPath {
28
28
 
29
29
  export interface HistoryState {
30
30
  key: string
31
- __tempLocation?: HistoryLocation
32
- __tempKey?: string
33
31
  }
34
32
 
35
33
  type BlockerFn = (retry: () => void, cancel: () => void) => void
@@ -116,13 +114,13 @@ function createHistory(opts: {
116
114
  }
117
115
  },
118
116
  push: (path: string, state: any) => {
119
- assignKey(state)
117
+ state = assignKey(state)
120
118
  queueTask(() => {
121
119
  opts.pushState(path, state, onUpdate)
122
120
  })
123
121
  },
124
122
  replace: (path: string, state: any) => {
125
- assignKey(state)
123
+ state = assignKey(state)
126
124
  queueTask(() => {
127
125
  opts.replaceState(path, state, onUpdate)
128
126
  })
@@ -165,13 +163,11 @@ function createHistory(opts: {
165
163
  }
166
164
 
167
165
  function assignKey(state: HistoryState) {
166
+ if (!state) {
167
+ state = {} as HistoryState
168
+ }
168
169
  state.key = createRandomKey()
169
- // if (state.__actualLocation) {
170
- // state.__actualLocation.state = {
171
- // ...state.__actualLocation.state,
172
- // key,
173
- // }
174
- // }
170
+ return state
175
171
  }
176
172
 
177
173
  /**