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

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.
@@ -134,9 +134,9 @@ function assignKey(state) {
134
134
  */
135
135
  function createBrowserHistory(opts) {
136
136
  const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
137
- const getHref = opts?.getHref ?? (() => `${win.location.pathname}${win.location.search}${win.location.hash}`);
138
137
  const createHref = opts?.createHref ?? (path => path);
139
- let currentLocation = parseLocation(getHref(), win.history.state);
138
+ const parseLocation = opts?.parseLocation ?? (() => parseHref(`${win.location.pathname}${win.location.search}${win.location.hash}`, win.history.state));
139
+ let currentLocation = parseLocation();
140
140
  let rollbackLocation;
141
141
  const getLocation = () => currentLocation;
142
142
  let next;
@@ -173,14 +173,15 @@ function createBrowserHistory(opts) {
173
173
  };
174
174
 
175
175
  // This function queues up a call to update the browser history
176
- const queueHistoryAction = (type, path, state, onUpdate) => {
177
- const href = createHref(path);
176
+ const queueHistoryAction = (type, destHref, state, onUpdate) => {
177
+ console.log(destHref);
178
+ const href = createHref(destHref);
178
179
  if (!scheduled) {
179
180
  rollbackLocation = currentLocation;
180
181
  }
181
182
 
182
183
  // Update the location in memory
183
- currentLocation = parseLocation(href, state);
184
+ currentLocation = parseHref(destHref, state);
184
185
 
185
186
  // Keep track of the next location we need to flush to the URL
186
187
  next = {
@@ -197,19 +198,19 @@ function createBrowserHistory(opts) {
197
198
  }
198
199
  };
199
200
  const onPushPop = () => {
200
- currentLocation = parseLocation(getHref(), win.history.state);
201
+ currentLocation = parseLocation();
201
202
  history.notify();
202
203
  };
203
204
  var originalPushState = win.history.pushState;
204
205
  var originalReplaceState = win.history.replaceState;
205
206
  const history = createHistory({
206
207
  getLocation,
207
- pushState: (path, state, onUpdate) => queueHistoryAction('push', path, state, onUpdate),
208
- replaceState: (path, state, onUpdate) => queueHistoryAction('replace', path, state, onUpdate),
208
+ pushState: (href, state, onUpdate) => queueHistoryAction('push', href, state, onUpdate),
209
+ replaceState: (href, state, onUpdate) => queueHistoryAction('replace', href, state, onUpdate),
209
210
  back: () => win.history.back(),
210
211
  forward: () => win.history.forward(),
211
212
  go: n => win.history.go(n),
212
- createHref: path => createHref(path),
213
+ createHref: href => createHref(href),
213
214
  flush,
214
215
  destroy: () => {
215
216
  win.history.pushState = originalPushState;
@@ -241,13 +242,16 @@ function createBrowserHistory(opts) {
241
242
  };
242
243
  return history;
243
244
  }
244
- function createHashHistory({
245
- window: win
246
- }) {
245
+ function createHashHistory(opts) {
246
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
247
247
  return createBrowserHistory({
248
- getHref: () => win.location.hash.substring(1),
249
- createHref: path => `#${path}`,
250
- window: win
248
+ window: win,
249
+ parseLocation: () => {
250
+ const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/';
251
+ console.log(hashHref);
252
+ return parseHref(hashHref, win.history.state);
253
+ },
254
+ createHref: href => `${win.location.pathname}${win.location.search}#${href}`
251
255
  });
252
256
  }
253
257
  function createMemoryHistory(opts = {
@@ -258,7 +262,7 @@ function createMemoryHistory(opts = {
258
262
  let currentState = {
259
263
  key: createRandomKey()
260
264
  };
261
- const getLocation = () => parseLocation(entries[index], currentState);
265
+ const getLocation = () => parseHref(entries[index], currentState);
262
266
  return createHistory({
263
267
  getLocation,
264
268
  pushState: (path, state) => {
@@ -282,7 +286,7 @@ function createMemoryHistory(opts = {
282
286
  createHref: path => path
283
287
  });
284
288
  }
285
- function parseLocation(href, state) {
289
+ function parseHref(href, state) {
286
290
  let hashIndex = href.indexOf('#');
287
291
  let searchIndex = href.indexOf('?');
288
292
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n parseLocation?: () => HistoryLocation\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const createHref = opts?.createHref ?? ((path) => path)\n const parseLocation =\n opts?.parseLocation ??\n (() =>\n parseHref(\n `${win.location.pathname}${win.location.search}${win.location.hash}`,\n win.history.state,\n ))\n\n let currentLocation = parseLocation()\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n destHref: string,\n state: any,\n onUpdate: () => void,\n ) => {\n console.log(destHref)\n const href = createHref(destHref)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseHref(destHref, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation()\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (href, state, onUpdate) =>\n queueHistoryAction('push', href, state, onUpdate),\n replaceState: (href, state, onUpdate) =>\n queueHistoryAction('replace', href, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (href) => createHref(href),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n window: win,\n parseLocation: () => {\n const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/'\n console.log(hashHref)\n return parseHref(hashHref, win.history.state)\n },\n createHref: (href) =>\n `${win.location.pathname}${win.location.search}#${href}`,\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 = () => parseHref(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseHref(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","parseLocation","parseHref","pathname","search","hash","history","currentLocation","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","destHref","console","log","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","hashHref","split","slice","join","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","substring","random","toString"],"mappings":"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"}
@@ -132,9 +132,9 @@ function assignKey(state) {
132
132
  */
133
133
  function createBrowserHistory(opts) {
134
134
  const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
135
- const getHref = opts?.getHref ?? (() => `${win.location.pathname}${win.location.search}${win.location.hash}`);
136
135
  const createHref = opts?.createHref ?? (path => path);
137
- let currentLocation = parseLocation(getHref(), win.history.state);
136
+ const parseLocation = opts?.parseLocation ?? (() => parseHref(`${win.location.pathname}${win.location.search}${win.location.hash}`, win.history.state));
137
+ let currentLocation = parseLocation();
138
138
  let rollbackLocation;
139
139
  const getLocation = () => currentLocation;
140
140
  let next;
@@ -171,14 +171,15 @@ function createBrowserHistory(opts) {
171
171
  };
172
172
 
173
173
  // This function queues up a call to update the browser history
174
- const queueHistoryAction = (type, path, state, onUpdate) => {
175
- const href = createHref(path);
174
+ const queueHistoryAction = (type, destHref, state, onUpdate) => {
175
+ console.log(destHref);
176
+ const href = createHref(destHref);
176
177
  if (!scheduled) {
177
178
  rollbackLocation = currentLocation;
178
179
  }
179
180
 
180
181
  // Update the location in memory
181
- currentLocation = parseLocation(href, state);
182
+ currentLocation = parseHref(destHref, state);
182
183
 
183
184
  // Keep track of the next location we need to flush to the URL
184
185
  next = {
@@ -195,19 +196,19 @@ function createBrowserHistory(opts) {
195
196
  }
196
197
  };
197
198
  const onPushPop = () => {
198
- currentLocation = parseLocation(getHref(), win.history.state);
199
+ currentLocation = parseLocation();
199
200
  history.notify();
200
201
  };
201
202
  var originalPushState = win.history.pushState;
202
203
  var originalReplaceState = win.history.replaceState;
203
204
  const history = createHistory({
204
205
  getLocation,
205
- pushState: (path, state, onUpdate) => queueHistoryAction('push', path, state, onUpdate),
206
- replaceState: (path, state, onUpdate) => queueHistoryAction('replace', path, state, onUpdate),
206
+ pushState: (href, state, onUpdate) => queueHistoryAction('push', href, state, onUpdate),
207
+ replaceState: (href, state, onUpdate) => queueHistoryAction('replace', href, state, onUpdate),
207
208
  back: () => win.history.back(),
208
209
  forward: () => win.history.forward(),
209
210
  go: n => win.history.go(n),
210
- createHref: path => createHref(path),
211
+ createHref: href => createHref(href),
211
212
  flush,
212
213
  destroy: () => {
213
214
  win.history.pushState = originalPushState;
@@ -239,13 +240,16 @@ function createBrowserHistory(opts) {
239
240
  };
240
241
  return history;
241
242
  }
242
- function createHashHistory({
243
- window: win
244
- }) {
243
+ function createHashHistory(opts) {
244
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
245
245
  return createBrowserHistory({
246
- getHref: () => win.location.hash.substring(1),
247
- createHref: path => `#${path}`,
248
- window: win
246
+ window: win,
247
+ parseLocation: () => {
248
+ const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/';
249
+ console.log(hashHref);
250
+ return parseHref(hashHref, win.history.state);
251
+ },
252
+ createHref: href => `${win.location.pathname}${win.location.search}#${href}`
249
253
  });
250
254
  }
251
255
  function createMemoryHistory(opts = {
@@ -256,7 +260,7 @@ function createMemoryHistory(opts = {
256
260
  let currentState = {
257
261
  key: createRandomKey()
258
262
  };
259
- const getLocation = () => parseLocation(entries[index], currentState);
263
+ const getLocation = () => parseHref(entries[index], currentState);
260
264
  return createHistory({
261
265
  getLocation,
262
266
  pushState: (path, state) => {
@@ -280,7 +284,7 @@ function createMemoryHistory(opts = {
280
284
  createHref: path => path
281
285
  });
282
286
  }
283
- function parseLocation(href, state) {
287
+ function parseHref(href, state) {
284
288
  let hashIndex = href.indexOf('#');
285
289
  let searchIndex = href.indexOf('?');
286
290
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n parseLocation?: () => HistoryLocation\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const createHref = opts?.createHref ?? ((path) => path)\n const parseLocation =\n opts?.parseLocation ??\n (() =>\n parseHref(\n `${win.location.pathname}${win.location.search}${win.location.hash}`,\n win.history.state,\n ))\n\n let currentLocation = parseLocation()\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n destHref: string,\n state: any,\n onUpdate: () => void,\n ) => {\n console.log(destHref)\n const href = createHref(destHref)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseHref(destHref, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation()\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (href, state, onUpdate) =>\n queueHistoryAction('push', href, state, onUpdate),\n replaceState: (href, state, onUpdate) =>\n queueHistoryAction('replace', href, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (href) => createHref(href),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n window: win,\n parseLocation: () => {\n const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/'\n console.log(hashHref)\n return parseHref(hashHref, win.history.state)\n },\n createHref: (href) =>\n `${win.location.pathname}${win.location.search}#${href}`,\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 = () => parseHref(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseHref(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","parseLocation","parseHref","pathname","search","hash","history","currentLocation","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","destHref","console","log","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","hashHref","split","slice","join","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","substring","random","toString"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;;AAoCA,MAAMA,cAAc,GAAG,WAAW,CAAA;AAClC,MAAMC,aAAa,GAAG,UAAU,CAAA;AAChC,MAAMC,iBAAiB,GAAG,cAAc,CAAA;AAExC,MAAMC,oBAAoB,GAAIC,KAAY,IAAK;EAC7CA,KAAK,CAACC,cAAc,EAAE,CAAA;AACtB;AACA,EAAA,OAAQD,KAAK,CAACE,WAAW,GAAG,EAAE,CAAA;AAChC,CAAC,CAAA;AAED,MAAMC,YAAY,GAAGA,MAAM;AACzBC,EAAAA,mBAAmB,CAACN,iBAAiB,EAAEC,oBAAoB,EAAE;AAC3DM,IAAAA,OAAO,EAAE,IAAA;AACX,GAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAEM,SAASC,aAAaA,CAACC,IAW7B,EAAiB;AAChB,EAAA,IAAIC,QAAQ,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;AACjC,EAAA,IAAIC,WAAW,GAAG,IAAIC,GAAG,EAAc,CAAA;EACvC,IAAIC,QAAmB,GAAG,EAAE,CAAA;EAE5B,MAAMC,QAAQ,GAAGA,MAAM;AACrBL,IAAAA,QAAQ,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;IAC7BC,WAAW,CAACI,OAAO,CAAEC,UAAU,IAAKA,UAAU,EAAE,CAAC,CAAA;GAClD,CAAA;EAED,MAAMC,aAAa,GAAIC,IAAgB,IAAK;IAC1C,IAAI,OAAOC,QAAQ,KAAK,WAAW,IAAIN,QAAQ,CAACO,MAAM,EAAE;AACtD,MAAA,KAAK,IAAIC,OAAO,IAAIR,QAAQ,EAAE;QAC5B,IAAI,CAACS,MAAM,CAACC,OAAO,CAACF,OAAO,CAACG,OAAO,CAAC,EAAE;AACpChB,UAAAA,IAAI,CAACiB,SAAS,GAAGX,QAAQ,CAAC,CAAA;AAC1B,UAAA,OAAA;AACF,SAAA;AACF,OAAA;AACF,KAAA;AAEAI,IAAAA,IAAI,EAAE,CAAA;GACP,CAAA;EAED,OAAO;IACL,IAAIT,QAAQA,GAAG;AACb,MAAA,OAAOA,QAAQ,CAAA;KAChB;IACDiB,SAAS,EAAGC,EAAc,IAAK;AAC7BhB,MAAAA,WAAW,CAACiB,GAAG,CAACD,EAAE,CAAC,CAAA;AAEnB,MAAA,OAAO,MAAM;AACXhB,QAAAA,WAAW,CAACkB,MAAM,CAACF,EAAE,CAAC,CAAA;OACvB,CAAA;KACF;AACDG,IAAAA,IAAI,EAAEA,CAACC,IAAY,EAAEC,KAAU,KAAK;AAClCA,MAAAA,KAAK,GAAGC,SAAS,CAACD,KAAK,CAAC,CAAA;AACxBf,MAAAA,aAAa,CAAC,MAAM;QAClBT,IAAI,CAAC0B,SAAS,CAACH,IAAI,EAAEC,KAAK,EAAElB,QAAQ,CAAC,CAAA;AACvC,OAAC,CAAC,CAAA;KACH;AACDqB,IAAAA,OAAO,EAAEA,CAACJ,IAAY,EAAEC,KAAU,KAAK;AACrCA,MAAAA,KAAK,GAAGC,SAAS,CAACD,KAAK,CAAC,CAAA;AACxBf,MAAAA,aAAa,CAAC,MAAM;QAClBT,IAAI,CAAC4B,YAAY,CAACL,IAAI,EAAEC,KAAK,EAAElB,QAAQ,CAAC,CAAA;AAC1C,OAAC,CAAC,CAAA;KACH;IACDuB,EAAE,EAAGC,KAAK,IAAK;AACbrB,MAAAA,aAAa,CAAC,MAAM;AAClBT,QAAAA,IAAI,CAAC6B,EAAE,CAACC,KAAK,CAAC,CAAA;AAChB,OAAC,CAAC,CAAA;KACH;IACDC,IAAI,EAAEA,MAAM;AACVtB,MAAAA,aAAa,CAAC,MAAM;QAClBT,IAAI,CAAC+B,IAAI,EAAE,CAAA;AACb,OAAC,CAAC,CAAA;KACH;IACDC,OAAO,EAAEA,MAAM;AACbvB,MAAAA,aAAa,CAAC,MAAM;QAClBT,IAAI,CAACgC,OAAO,EAAE,CAAA;AAChB,OAAC,CAAC,CAAA;KACH;IACDC,UAAU,EAAGC,GAAG,IAAKlC,IAAI,CAACiC,UAAU,CAACC,GAAG,CAAC;IACzCC,KAAK,EAAGnB,OAAO,IAAK;AAClB,MAAA,MAAMoB,OAAgB,GAAG;AACvBpB,QAAAA,OAAAA;OACD,CAAA;AAEDX,MAAAA,QAAQ,CAACiB,IAAI,CAACc,OAAO,CAAC,CAAA;AAEtB,MAAA,IAAI/B,QAAQ,CAACO,MAAM,KAAK,CAAC,EAAE;AACzByB,QAAAA,gBAAgB,CAAC9C,iBAAiB,EAAEC,oBAAoB,EAAE;AACxDM,UAAAA,OAAO,EAAE,IAAA;AACX,SAAC,CAAC,CAAA;AACJ,OAAA;AAEA,MAAA,OAAO,MAAM;QACXO,QAAQ,GAAGA,QAAQ,CAACiC,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,OAAO,CAAC,CAAA;AAEhD,QAAA,IAAI,CAAC/B,QAAQ,CAACO,MAAM,EAAE;AACpBhB,UAAAA,YAAY,EAAE,CAAA;AAChB,SAAA;OACD,CAAA;KACF;AACD4C,IAAAA,KAAK,EAAEA,MAAMxC,IAAI,CAACwC,KAAK,IAAI;AAC3BC,IAAAA,OAAO,EAAEA,MAAMzC,IAAI,CAACyC,OAAO,IAAI;AAC/BC,IAAAA,MAAM,EAAEpC,QAAAA;GACT,CAAA;AACH,CAAA;AAEA,SAASmB,SAASA,CAACD,KAAmB,EAAE;EACtC,IAAI,CAACA,KAAK,EAAE;IACVA,KAAK,GAAG,EAAkB,CAAA;AAC5B,GAAA;EACA,OAAO;AACL,IAAA,GAAGA,KAAK;IACRmB,GAAG,EAAEC,eAAe,EAAC;GACtB,CAAA;AACH,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,oBAAoBA,CAAC7C,IAIpC,EAAiB;AAChB,EAAA,MAAM8C,GAAG,GACP9C,IAAI,EAAEc,MAAM,KACX,OAAOH,QAAQ,KAAK,WAAW,GAAGG,MAAM,GAAIiC,SAAiB,CAAC,CAAA;EAEjE,MAAMd,UAAU,GAAGjC,IAAI,EAAEiC,UAAU,KAAMV,IAAI,IAAKA,IAAI,CAAC,CAAA;AACvD,EAAA,MAAMyB,aAAa,GACjBhD,IAAI,EAAEgD,aAAa,KAClB,MACCC,SAAS,CACN,GAAEH,GAAG,CAAC7C,QAAQ,CAACiD,QAAS,CAAEJ,EAAAA,GAAG,CAAC7C,QAAQ,CAACkD,MAAO,CAAA,EAAEL,GAAG,CAAC7C,QAAQ,CAACmD,IAAK,CAAC,CAAA,EACpEN,GAAG,CAACO,OAAO,CAAC7B,KACd,CAAC,CAAC,CAAA;AAEN,EAAA,IAAI8B,eAAe,GAAGN,aAAa,EAAE,CAAA;AACrC,EAAA,IAAIO,gBAA6C,CAAA;AAEjD,EAAA,MAAMrD,WAAW,GAAGA,MAAMoD,eAAe,CAAA;AAEzC,EAAA,IAAIE,IASC,CAAA;;AAEL;AACA;AACA;AACA;EACA,IAAIC,QAAQ,GAAG,IAAI,CAAA;;AAEnB;AACA;AACA,EAAA,IAAIC,SAAoC,CAAA;;AAExC;AACA;EACA,MAAMC,OAAO,GAAIC,EAAc,IAAK;AAClCH,IAAAA,QAAQ,GAAG,KAAK,CAAA;AAChBG,IAAAA,EAAE,EAAE,CAAA;AACJH,IAAAA,QAAQ,GAAG,IAAI,CAAA;GAChB,CAAA;;AAED;EACA,MAAMjB,KAAK,GAAGA,MAAM;AAClB;AACAmB,IAAAA,OAAO,CAAC,MAAM;MACZ,IAAI,CAACH,IAAI,EAAE,OAAA;MACXV,GAAG,CAACO,OAAO,CAACG,IAAI,CAACK,MAAM,GAAG,WAAW,GAAG,cAAc,CAAC,CACrDL,IAAI,CAAChC,KAAK,EACV,EAAE,EACFgC,IAAI,CAACM,IACP,CAAC,CAAA;AACD;AACAN,MAAAA,IAAI,GAAGT,SAAS,CAAA;AAChBW,MAAAA,SAAS,GAAGX,SAAS,CAAA;AACrBQ,MAAAA,gBAAgB,GAAGR,SAAS,CAAA;AAC9B,KAAC,CAAC,CAAA;GACH,CAAA;;AAED;EACA,MAAMgB,kBAAkB,GAAGA,CACzBC,IAAwB,EACxBC,QAAgB,EAChBzC,KAAU,EACVlB,QAAoB,KACjB;AACH4D,IAAAA,OAAO,CAACC,GAAG,CAACF,QAAQ,CAAC,CAAA;AACrB,IAAA,MAAMH,IAAI,GAAG7B,UAAU,CAACgC,QAAQ,CAAC,CAAA;IAEjC,IAAI,CAACP,SAAS,EAAE;AACdH,MAAAA,gBAAgB,GAAGD,eAAe,CAAA;AACpC,KAAA;;AAEA;AACAA,IAAAA,eAAe,GAAGL,SAAS,CAACgB,QAAQ,EAAEzC,KAAK,CAAC,CAAA;;AAE5C;AACAgC,IAAAA,IAAI,GAAG;MACLM,IAAI;MACJtC,KAAK;AACLqC,MAAAA,MAAM,EAAEL,IAAI,EAAEK,MAAM,IAAIG,IAAI,KAAK,MAAA;KAClC,CAAA;;AAED;AACA1D,IAAAA,QAAQ,EAAE,CAAA;IAEV,IAAI,CAACoD,SAAS,EAAE;AACd;AACAA,MAAAA,SAAS,GAAGU,OAAO,CAACC,OAAO,EAAE,CAACC,IAAI,CAAC,MAAM9B,KAAK,EAAE,CAAC,CAAA;AACnD,KAAA;GACD,CAAA;EAED,MAAM+B,SAAS,GAAGA,MAAM;IACtBjB,eAAe,GAAGN,aAAa,EAAE,CAAA;IACjCK,OAAO,CAACX,MAAM,EAAE,CAAA;GACjB,CAAA;AAED,EAAA,IAAI8B,iBAAiB,GAAG1B,GAAG,CAACO,OAAO,CAAC3B,SAAS,CAAA;AAC7C,EAAA,IAAI+C,oBAAoB,GAAG3B,GAAG,CAACO,OAAO,CAACzB,YAAY,CAAA;EAEnD,MAAMyB,OAAO,GAAGtD,aAAa,CAAC;IAC5BG,WAAW;AACXwB,IAAAA,SAAS,EAAEA,CAACoC,IAAI,EAAEtC,KAAK,EAAElB,QAAQ,KAC/ByD,kBAAkB,CAAC,MAAM,EAAED,IAAI,EAAEtC,KAAK,EAAElB,QAAQ,CAAC;AACnDsB,IAAAA,YAAY,EAAEA,CAACkC,IAAI,EAAEtC,KAAK,EAAElB,QAAQ,KAClCyD,kBAAkB,CAAC,SAAS,EAAED,IAAI,EAAEtC,KAAK,EAAElB,QAAQ,CAAC;IACtDyB,IAAI,EAAEA,MAAMe,GAAG,CAACO,OAAO,CAACtB,IAAI,EAAE;IAC9BC,OAAO,EAAEA,MAAMc,GAAG,CAACO,OAAO,CAACrB,OAAO,EAAE;IACpCH,EAAE,EAAG6C,CAAC,IAAK5B,GAAG,CAACO,OAAO,CAACxB,EAAE,CAAC6C,CAAC,CAAC;AAC5BzC,IAAAA,UAAU,EAAG6B,IAAI,IAAK7B,UAAU,CAAC6B,IAAI,CAAC;IACtCtB,KAAK;IACLC,OAAO,EAAEA,MAAM;AACbK,MAAAA,GAAG,CAACO,OAAO,CAAC3B,SAAS,GAAG8C,iBAAiB,CAAA;AACzC1B,MAAAA,GAAG,CAACO,OAAO,CAACzB,YAAY,GAAG6C,oBAAoB,CAAA;AAC/C3B,MAAAA,GAAG,CAACjD,mBAAmB,CAACR,cAAc,EAAEkF,SAAS,CAAC,CAAA;AAClDzB,MAAAA,GAAG,CAACjD,mBAAmB,CAACP,aAAa,EAAEiF,SAAS,CAAC,CAAA;KAClD;IACDtD,SAAS,EAAGX,QAAQ,IAAK;AACvB;AACA;AACA,MAAA,IAAIiD,gBAAgB,IAAID,eAAe,KAAKC,gBAAgB,EAAE;AAC5DD,QAAAA,eAAe,GAAGC,gBAAgB,CAAA;AAClC;AACAjD,QAAAA,QAAQ,EAAE,CAAA;AACZ,OAAA;AACF,KAAA;AACF,GAAC,CAAC,CAAA;AAEFwC,EAAAA,GAAG,CAACT,gBAAgB,CAAChD,cAAc,EAAEkF,SAAS,CAAC,CAAA;AAC/CzB,EAAAA,GAAG,CAACT,gBAAgB,CAAC/C,aAAa,EAAEiF,SAAS,CAAC,CAAA;AAE9CzB,EAAAA,GAAG,CAACO,OAAO,CAAC3B,SAAS,GAAG,YAAY;IAClC,IAAIiD,GAAG,GAAGH,iBAAiB,CAACI,KAAK,CAAC9B,GAAG,CAACO,OAAO,EAAEwB,SAAgB,CAAC,CAAA;AAChE,IAAA,IAAIpB,QAAQ,EAAEJ,OAAO,CAACX,MAAM,EAAE,CAAA;AAC9B,IAAA,OAAOiC,GAAG,CAAA;GACX,CAAA;AAED7B,EAAAA,GAAG,CAACO,OAAO,CAACzB,YAAY,GAAG,YAAY;IACrC,IAAI+C,GAAG,GAAGF,oBAAoB,CAACG,KAAK,CAAC9B,GAAG,CAACO,OAAO,EAAEwB,SAAgB,CAAC,CAAA;AACnE,IAAA,IAAIpB,QAAQ,EAAEJ,OAAO,CAACX,MAAM,EAAE,CAAA;AAC9B,IAAA,OAAOiC,GAAG,CAAA;GACX,CAAA;AAED,EAAA,OAAOtB,OAAO,CAAA;AAChB,CAAA;AAEO,SAASyB,iBAAiBA,CAAC9E,IAAuB,EAAiB;AACxE,EAAA,MAAM8C,GAAG,GACP9C,IAAI,EAAEc,MAAM,KACX,OAAOH,QAAQ,KAAK,WAAW,GAAGG,MAAM,GAAIiC,SAAiB,CAAC,CAAA;AACjE,EAAA,OAAOF,oBAAoB,CAAC;AAC1B/B,IAAAA,MAAM,EAAEgC,GAAG;IACXE,aAAa,EAAEA,MAAM;MACnB,MAAM+B,QAAQ,GAAGjC,GAAG,CAAC7C,QAAQ,CAACmD,IAAI,CAAC4B,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA;AACvEhB,MAAAA,OAAO,CAACC,GAAG,CAACY,QAAQ,CAAC,CAAA;MACrB,OAAO9B,SAAS,CAAC8B,QAAQ,EAAEjC,GAAG,CAACO,OAAO,CAAC7B,KAAK,CAAC,CAAA;KAC9C;AACDS,IAAAA,UAAU,EAAG6B,IAAI,IACd,CAAEhB,EAAAA,GAAG,CAAC7C,QAAQ,CAACiD,QAAS,CAAA,EAAEJ,GAAG,CAAC7C,QAAQ,CAACkD,MAAO,IAAGW,IAAK,CAAA,CAAA;AAC3D,GAAC,CAAC,CAAA;AACJ,CAAA;AAEO,SAASqB,mBAAmBA,CACjCnF,IAGC,GAAG;EACFoF,cAAc,EAAE,CAAC,GAAG,CAAA;AACtB,CAAC,EACc;AACf,EAAA,MAAMC,OAAO,GAAGrF,IAAI,CAACoF,cAAc,CAAA;EACnC,IAAItD,KAAK,GAAG9B,IAAI,CAACsF,YAAY,IAAID,OAAO,CAACzE,MAAM,GAAG,CAAC,CAAA;AACnD,EAAA,IAAI2E,YAAY,GAAG;IACjB5C,GAAG,EAAEC,eAAe,EAAC;GACN,CAAA;AAEjB,EAAA,MAAM1C,WAAW,GAAGA,MAAM+C,SAAS,CAACoC,OAAO,CAACvD,KAAK,CAAC,EAAGyD,YAAY,CAAC,CAAA;AAElE,EAAA,OAAOxF,aAAa,CAAC;IACnBG,WAAW;AACXwB,IAAAA,SAAS,EAAEA,CAACH,IAAI,EAAEC,KAAK,KAAK;AAC1B+D,MAAAA,YAAY,GAAG/D,KAAK,CAAA;AACpB6D,MAAAA,OAAO,CAAC/D,IAAI,CAACC,IAAI,CAAC,CAAA;AAClBO,MAAAA,KAAK,EAAE,CAAA;KACR;AACDF,IAAAA,YAAY,EAAEA,CAACL,IAAI,EAAEC,KAAK,KAAK;AAC7B+D,MAAAA,YAAY,GAAG/D,KAAK,CAAA;AACpB6D,MAAAA,OAAO,CAACvD,KAAK,CAAC,GAAGP,IAAI,CAAA;KACtB;IACDQ,IAAI,EAAEA,MAAM;AACVD,MAAAA,KAAK,EAAE,CAAA;KACR;IACDE,OAAO,EAAEA,MAAM;AACbF,MAAAA,KAAK,GAAG0D,IAAI,CAACC,GAAG,CAAC3D,KAAK,GAAG,CAAC,EAAEuD,OAAO,CAACzE,MAAM,GAAG,CAAC,CAAC,CAAA;KAChD;IACDiB,EAAE,EAAG6C,CAAC,IAAK;MACT5C,KAAK,GAAG0D,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAC5D,KAAK,GAAG4C,CAAC,EAAE,CAAC,CAAC,EAAEW,OAAO,CAACzE,MAAM,GAAG,CAAC,CAAC,CAAA;KAC7D;IACDqB,UAAU,EAAGV,IAAI,IAAKA,IAAAA;AACxB,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA,SAAS0B,SAASA,CAACa,IAAY,EAAEtC,KAAmB,EAAmB;AACrE,EAAA,IAAImE,SAAS,GAAG7B,IAAI,CAAC8B,OAAO,CAAC,GAAG,CAAC,CAAA;AACjC,EAAA,IAAIC,WAAW,GAAG/B,IAAI,CAAC8B,OAAO,CAAC,GAAG,CAAC,CAAA;EAEnC,OAAO;IACL9B,IAAI;AACJZ,IAAAA,QAAQ,EAAEY,IAAI,CAACgC,SAAS,CACtB,CAAC,EACDH,SAAS,GAAG,CAAC,GACTE,WAAW,GAAG,CAAC,GACbL,IAAI,CAACC,GAAG,CAACE,SAAS,EAAEE,WAAW,CAAC,GAChCF,SAAS,GACXE,WAAW,GAAG,CAAC,GACbA,WAAW,GACX/B,IAAI,CAAClD,MACb,CAAC;AACDwC,IAAAA,IAAI,EAAEuC,SAAS,GAAG,CAAC,CAAC,GAAG7B,IAAI,CAACgC,SAAS,CAACH,SAAS,CAAC,GAAG,EAAE;IACrDxC,MAAM,EACJ0C,WAAW,GAAG,CAAC,CAAC,GACZ/B,IAAI,CAACmB,KAAK,CAACY,WAAW,EAAEF,SAAS,KAAK,CAAC,CAAC,GAAG5C,SAAS,GAAG4C,SAAS,CAAC,GACjE,EAAE;IACRnE,KAAK,EAAEA,KAAK,IAAI,EAAC;GAClB,CAAA;AACH,CAAA;;AAEA;AACA,SAASoB,eAAeA,GAAG;AACzB,EAAA,OAAO,CAAC4C,IAAI,CAACO,MAAM,EAAE,GAAG,CAAC,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACF,SAAS,CAAC,CAAC,CAAC,CAAA;AACtD;;;;"}
@@ -4818,7 +4818,7 @@ var drawChart = (function (exports) {
4818
4818
  </script>
4819
4819
  <script>
4820
4820
  /*<!--*/
4821
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"9881-1"}]}],"isRoot":true},"nodeParts":{"9881-1":{"renderedLength":9537,"gzipLength":2784,"brotliLength":0,"metaUid":"9881-0"}},"nodeMetas":{"9881-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"9881-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"4.6.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4821
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/history/src/index.ts","uid":"26ef-1"}]}],"isRoot":true},"nodeParts":{"26ef-1":{"renderedLength":9821,"gzipLength":2853,"brotliLength":0,"metaUid":"26ef-0"}},"nodeMetas":{"26ef-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"26ef-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"4.6.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4822
4822
 
4823
4823
  const run = () => {
4824
4824
  const width = window.innerWidth;
@@ -8,7 +8,7 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "packages/history/src/index.ts",
11
- "uid": "9881-3"
11
+ "uid": "26ef-3"
12
12
  }
13
13
  ]
14
14
  }
@@ -16,18 +16,18 @@
16
16
  "isRoot": true
17
17
  },
18
18
  "nodeParts": {
19
- "9881-3": {
20
- "renderedLength": 9537,
21
- "gzipLength": 2784,
19
+ "26ef-3": {
20
+ "renderedLength": 9821,
21
+ "gzipLength": 2853,
22
22
  "brotliLength": 0,
23
- "metaUid": "9881-2"
23
+ "metaUid": "26ef-2"
24
24
  }
25
25
  },
26
26
  "nodeMetas": {
27
- "9881-2": {
27
+ "26ef-2": {
28
28
  "id": "/packages/history/src/index.ts",
29
29
  "moduleParts": {
30
- "index.production.js": "9881-3"
30
+ "index.production.js": "26ef-3"
31
31
  },
32
32
  "imported": [],
33
33
  "importedBy": [],
@@ -63,11 +63,11 @@ declare function createHistory(opts: {
63
63
  * @returns A history instance
64
64
  */
65
65
  declare function createBrowserHistory(opts?: {
66
- getHref?: () => string;
66
+ parseLocation?: () => HistoryLocation;
67
67
  createHref?: (path: string) => string;
68
68
  window?: any;
69
69
  }): RouterHistory;
70
- declare function createHashHistory({ window: win, }: {
70
+ declare function createHashHistory(opts?: {
71
71
  window?: any;
72
72
  }): RouterHistory;
73
73
  declare function createMemoryHistory(opts?: {
@@ -138,9 +138,9 @@
138
138
  */
139
139
  function createBrowserHistory(opts) {
140
140
  const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
141
- const getHref = opts?.getHref ?? (() => `${win.location.pathname}${win.location.search}${win.location.hash}`);
142
141
  const createHref = opts?.createHref ?? (path => path);
143
- let currentLocation = parseLocation(getHref(), win.history.state);
142
+ const parseLocation = opts?.parseLocation ?? (() => parseHref(`${win.location.pathname}${win.location.search}${win.location.hash}`, win.history.state));
143
+ let currentLocation = parseLocation();
144
144
  let rollbackLocation;
145
145
  const getLocation = () => currentLocation;
146
146
  let next;
@@ -177,14 +177,15 @@
177
177
  };
178
178
 
179
179
  // This function queues up a call to update the browser history
180
- const queueHistoryAction = (type, path, state, onUpdate) => {
181
- const href = createHref(path);
180
+ const queueHistoryAction = (type, destHref, state, onUpdate) => {
181
+ console.log(destHref);
182
+ const href = createHref(destHref);
182
183
  if (!scheduled) {
183
184
  rollbackLocation = currentLocation;
184
185
  }
185
186
 
186
187
  // Update the location in memory
187
- currentLocation = parseLocation(href, state);
188
+ currentLocation = parseHref(destHref, state);
188
189
 
189
190
  // Keep track of the next location we need to flush to the URL
190
191
  next = {
@@ -201,19 +202,19 @@
201
202
  }
202
203
  };
203
204
  const onPushPop = () => {
204
- currentLocation = parseLocation(getHref(), win.history.state);
205
+ currentLocation = parseLocation();
205
206
  history.notify();
206
207
  };
207
208
  var originalPushState = win.history.pushState;
208
209
  var originalReplaceState = win.history.replaceState;
209
210
  const history = createHistory({
210
211
  getLocation,
211
- pushState: (path, state, onUpdate) => queueHistoryAction('push', path, state, onUpdate),
212
- replaceState: (path, state, onUpdate) => queueHistoryAction('replace', path, state, onUpdate),
212
+ pushState: (href, state, onUpdate) => queueHistoryAction('push', href, state, onUpdate),
213
+ replaceState: (href, state, onUpdate) => queueHistoryAction('replace', href, state, onUpdate),
213
214
  back: () => win.history.back(),
214
215
  forward: () => win.history.forward(),
215
216
  go: n => win.history.go(n),
216
- createHref: path => createHref(path),
217
+ createHref: href => createHref(href),
217
218
  flush,
218
219
  destroy: () => {
219
220
  win.history.pushState = originalPushState;
@@ -245,13 +246,16 @@
245
246
  };
246
247
  return history;
247
248
  }
248
- function createHashHistory({
249
- window: win
250
- }) {
249
+ function createHashHistory(opts) {
250
+ const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
251
251
  return createBrowserHistory({
252
- getHref: () => win.location.hash.substring(1),
253
- createHref: path => `#${path}`,
254
- window: win
252
+ window: win,
253
+ parseLocation: () => {
254
+ const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/';
255
+ console.log(hashHref);
256
+ return parseHref(hashHref, win.history.state);
257
+ },
258
+ createHref: href => `${win.location.pathname}${win.location.search}#${href}`
255
259
  });
256
260
  }
257
261
  function createMemoryHistory(opts = {
@@ -262,7 +266,7 @@
262
266
  let currentState = {
263
267
  key: createRandomKey()
264
268
  };
265
- const getLocation = () => parseLocation(entries[index], currentState);
269
+ const getLocation = () => parseHref(entries[index], currentState);
266
270
  return createHistory({
267
271
  getLocation,
268
272
  pushState: (path, state) => {
@@ -286,7 +290,7 @@
286
290
  createHref: path => path
287
291
  });
288
292
  }
289
- function parseLocation(href, state) {
293
+ function parseHref(href, state) {
290
294
  let hashIndex = href.indexOf('#');
291
295
  let searchIndex = href.indexOf('?');
292
296
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
1
+ {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n parseLocation?: () => HistoryLocation\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const createHref = opts?.createHref ?? ((path) => path)\n const parseLocation =\n opts?.parseLocation ??\n (() =>\n parseHref(\n `${win.location.pathname}${win.location.search}${win.location.hash}`,\n win.history.state,\n ))\n\n let currentLocation = parseLocation()\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n destHref: string,\n state: any,\n onUpdate: () => void,\n ) => {\n console.log(destHref)\n const href = createHref(destHref)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseHref(destHref, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation()\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (href, state, onUpdate) =>\n queueHistoryAction('push', href, state, onUpdate),\n replaceState: (href, state, onUpdate) =>\n queueHistoryAction('replace', href, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (href) => createHref(href),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n window: win,\n parseLocation: () => {\n const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/'\n console.log(hashHref)\n return parseHref(hashHref, win.history.state)\n },\n createHref: (href) =>\n `${win.location.pathname}${win.location.search}#${href}`,\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 = () => parseHref(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseHref(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","parseLocation","parseHref","pathname","search","hash","history","currentLocation","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","destHref","console","log","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","hashHref","split","slice","join","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","substring","random","toString"],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TanStackHistory={})}(this,(function(e){"use strict";const t="pushstate",r="popstate",n="beforeunload",o=e=>(e.preventDefault(),e.returnValue=""),i=()=>{removeEventListener(n,o,{capture:!0})};function s(e){let t=e.getLocation(),r=new Set,s=[];const c=()=>{t=e.getLocation(),r.forEach((e=>e()))},h=t=>{if("undefined"!=typeof document&&s.length)for(let t of s)if(!window.confirm(t.message))return void e.onBlocked?.(c);t()};return{get location(){return t},subscribe:e=>(r.add(e),()=>{r.delete(e)}),push:(t,r)=>{r=a(r),h((()=>{e.pushState(t,r,c)}))},replace:(t,r)=>{r=a(r),h((()=>{e.replaceState(t,r,c)}))},go:t=>{h((()=>{e.go(t)}))},back:()=>{h((()=>{e.back()}))},forward:()=>{h((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>{const t={message:e};return s.push(t),1===s.length&&addEventListener(n,o,{capture:!0}),()=>{s=s.filter((e=>e!==t)),s.length||i()}},flush:()=>e.flush?.(),destroy:()=>e.destroy?.(),notify:c}}function a(e){return e||(e={}),{...e,key:u()}}function c(e){const n=e?.window??("undefined"!=typeof document?window:void 0),o=e?.getHref??(()=>`${n.location.pathname}${n.location.search}${n.location.hash}`),i=e?.createHref??(e=>e);let a,c=h(o(),n.history.state);let u,f,l=!0;const d=()=>{l=!1,(()=>{u&&(n.history[u.isPush?"pushState":"replaceState"](u.state,"",u.href),u=void 0,f=void 0,a=void 0)})(),l=!0},p=(e,t,r,n)=>{const o=i(t);f||(a=c),c=h(o,r),u={href:o,state:r,isPush:u?.isPush||"push"===e},n(),f||(f=Promise.resolve().then((()=>d())))},y=()=>{c=h(o(),n.history.state),v.notify()};var g=n.history.pushState,m=n.history.replaceState;const v=s({getLocation:()=>c,pushState:(e,t,r)=>p("push",e,t,r),replaceState:(e,t,r)=>p("replace",e,t,r),back:()=>n.history.back(),forward:()=>n.history.forward(),go:e=>n.history.go(e),createHref:e=>i(e),flush:d,destroy:()=>{n.history.pushState=g,n.history.replaceState=m,n.removeEventListener(t,y),n.removeEventListener(r,y)},onBlocked:e=>{a&&c!==a&&(c=a,e())}});return n.addEventListener(t,y),n.addEventListener(r,y),n.history.pushState=function(){let e=g.apply(n.history,arguments);return l&&v.notify(),e},n.history.replaceState=function(){let e=m.apply(n.history,arguments);return l&&v.notify(),e},v}function h(e,t){let r=e.indexOf("#"),n=e.indexOf("?");return{href:e,pathname:e.substring(0,r>0?n>0?Math.min(r,n):r:n>0?n:e.length),hash:r>-1?e.substring(r):"",search:n>-1?e.slice(n,-1===r?void 0:r):"",state:t||{}}}function u(){return(Math.random()+1).toString(36).substring(7)}e.createBrowserHistory=c,e.createHashHistory=function({window:e}){return c({getHref:()=>e.location.hash.substring(1),createHref:e=>`#${e}`,window:e})},e.createHistory=s,e.createMemoryHistory=function(e={initialEntries:["/"]}){const t=e.initialEntries;let r=e.initialIndex??t.length-1,n={key:u()};return s({getLocation:()=>h(t[r],n),pushState:(e,o)=>{n=o,t.push(e),r++},replaceState:(e,o)=>{n=o,t[r]=e},back:()=>{r--},forward:()=>{r=Math.min(r+1,t.length-1)},go:e=>{r=Math.min(Math.max(r+e,0),t.length-1)},createHref:e=>e})}}));
11
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TanStackHistory={})}(this,(function(e){"use strict";const t="pushstate",o="popstate",n="beforeunload",r=e=>(e.preventDefault(),e.returnValue=""),i=()=>{removeEventListener(n,r,{capture:!0})};function a(e){let t=e.getLocation(),o=new Set,a=[];const c=()=>{t=e.getLocation(),o.forEach((e=>e()))},h=t=>{if("undefined"!=typeof document&&a.length)for(let t of a)if(!window.confirm(t.message))return void e.onBlocked?.(c);t()};return{get location(){return t},subscribe:e=>(o.add(e),()=>{o.delete(e)}),push:(t,o)=>{o=s(o),h((()=>{e.pushState(t,o,c)}))},replace:(t,o)=>{o=s(o),h((()=>{e.replaceState(t,o,c)}))},go:t=>{h((()=>{e.go(t)}))},back:()=>{h((()=>{e.back()}))},forward:()=>{h((()=>{e.forward()}))},createHref:t=>e.createHref(t),block:e=>{const t={message:e};return a.push(t),1===a.length&&addEventListener(n,r,{capture:!0}),()=>{a=a.filter((e=>e!==t)),a.length||i()}},flush:()=>e.flush?.(),destroy:()=>e.destroy?.(),notify:c}}function s(e){return e||(e={}),{...e,key:u()}}function c(e){const n=e?.window??("undefined"!=typeof document?window:void 0),r=e?.createHref??(e=>e),i=e?.parseLocation??(()=>h(`${n.location.pathname}${n.location.search}${n.location.hash}`,n.history.state));let s,c=i();let u,l,f=!0;const d=()=>{f=!1,(()=>{u&&(n.history[u.isPush?"pushState":"replaceState"](u.state,"",u.href),u=void 0,l=void 0,s=void 0)})(),f=!0},p=(e,t,o,n)=>{console.log(t);const i=r(t);l||(s=c),c=h(t,o),u={href:i,state:o,isPush:u?.isPush||"push"===e},n(),l||(l=Promise.resolve().then((()=>d())))},y=()=>{c=i(),v.notify()};var g=n.history.pushState,m=n.history.replaceState;const v=a({getLocation:()=>c,pushState:(e,t,o)=>p("push",e,t,o),replaceState:(e,t,o)=>p("replace",e,t,o),back:()=>n.history.back(),forward:()=>n.history.forward(),go:e=>n.history.go(e),createHref:e=>r(e),flush:d,destroy:()=>{n.history.pushState=g,n.history.replaceState=m,n.removeEventListener(t,y),n.removeEventListener(o,y)},onBlocked:e=>{s&&c!==s&&(c=s,e())}});return n.addEventListener(t,y),n.addEventListener(o,y),n.history.pushState=function(){let e=g.apply(n.history,arguments);return f&&v.notify(),e},n.history.replaceState=function(){let e=m.apply(n.history,arguments);return f&&v.notify(),e},v}function h(e,t){let o=e.indexOf("#"),n=e.indexOf("?");return{href:e,pathname:e.substring(0,o>0?n>0?Math.min(o,n):o:n>0?n:e.length),hash:o>-1?e.substring(o):"",search:n>-1?e.slice(n,-1===o?void 0:o):"",state:t||{}}}function u(){return(Math.random()+1).toString(36).substring(7)}e.createBrowserHistory=c,e.createHashHistory=function(e){const t=e?.window??("undefined"!=typeof document?window:void 0);return c({window:t,parseLocation:()=>{const e=t.location.hash.split("#").slice(1).join("#")??"/";return console.log(e),h(e,t.history.state)},createHref:e=>`${t.location.pathname}${t.location.search}#${e}`})},e.createHistory=a,e.createMemoryHistory=function(e={initialEntries:["/"]}){const t=e.initialEntries;let o=e.initialIndex??t.length-1,n={key:u()};return a({getLocation:()=>h(t[o],n),pushState:(e,r)=>{n=r,t.push(e),o++},replaceState:(e,r)=>{n=r,t[o]=e},back:()=>{o--},forward:()=>{o=Math.min(o+1,t.length-1)},go:e=>{o=Math.min(Math.max(o+e,0),t.length-1)},createHref:e=>e})}}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const getHref =\n opts?.getHref ??\n (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)\n\n const createHref = opts?.createHref ?? ((path) => path)\n\n let currentLocation = parseLocation(getHref(), win.history.state)\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n path: string,\n state: any,\n onUpdate: () => void,\n ) => {\n const href = createHref(path)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseLocation(href, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation(getHref(), win.history.state)\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (path, state, onUpdate) =>\n queueHistoryAction('push', path, state, onUpdate),\n replaceState: (path, state, onUpdate) =>\n queueHistoryAction('replace', path, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (path) => createHref(path),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory({\n window: win,\n}: {\n window?: any\n}): RouterHistory {\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","rollbackLocation","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","fn","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState","max"],"mappings":"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"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: HistoryLocation\n subscribe: (cb: () => void) => () => void\n push: (path: string, state?: any) => void\n replace: (path: string, state?: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n createHref: (href: string) => string\n block: (message: string) => () => void\n flush: () => void\n destroy: () => void\n notify: () => void\n}\n\nexport interface HistoryLocation extends ParsedPath {\n state: HistoryState\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface HistoryState {\n key: string\n}\n\ntype Blocker = {\n message: string\n}\n\nconst pushStateEvent = 'pushstate'\nconst popStateEvent = 'popstate'\nconst beforeUnloadEvent = 'beforeunload'\n\nconst beforeUnloadListener = (event: Event) => {\n event.preventDefault()\n // @ts-ignore\n return (event.returnValue = '')\n}\n\nconst stopBlocking = () => {\n removeEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n}\n\nexport function createHistory(opts: {\n getLocation: () => HistoryLocation\n pushState: (path: string, state: any, onUpdate: () => void) => void\n replaceState: (path: string, state: any, onUpdate: () => void) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n createHref: (path: string) => string\n flush?: () => void\n destroy?: () => void\n onBlocked?: (onUpdate: () => void) => void\n}): RouterHistory {\n let location = opts.getLocation()\n let subscribers = new Set<() => void>()\n let blockers: Blocker[] = []\n\n const onUpdate = () => {\n location = opts.getLocation()\n subscribers.forEach((subscriber) => subscriber())\n }\n\n const tryNavigation = (task: () => void) => {\n if (typeof document !== 'undefined' && blockers.length) {\n for (let blocker of blockers) {\n if (!window.confirm(blocker.message)) {\n opts.onBlocked?.(onUpdate)\n return\n }\n }\n }\n\n task()\n }\n\n return {\n get location() {\n return location\n },\n subscribe: (cb: () => void) => {\n subscribers.add(cb)\n\n return () => {\n subscribers.delete(cb)\n }\n },\n push: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.pushState(path, state, onUpdate)\n })\n },\n replace: (path: string, state: any) => {\n state = assignKey(state)\n tryNavigation(() => {\n opts.replaceState(path, state, onUpdate)\n })\n },\n go: (index) => {\n tryNavigation(() => {\n opts.go(index)\n })\n },\n back: () => {\n tryNavigation(() => {\n opts.back()\n })\n },\n forward: () => {\n tryNavigation(() => {\n opts.forward()\n })\n },\n createHref: (str) => opts.createHref(str),\n block: (message) => {\n const payload: Blocker = {\n message,\n }\n\n blockers.push(payload)\n\n if (blockers.length === 1) {\n addEventListener(beforeUnloadEvent, beforeUnloadListener, {\n capture: true,\n })\n }\n\n return () => {\n blockers = blockers.filter((b) => b !== payload)\n\n if (!blockers.length) {\n stopBlocking()\n }\n }\n },\n flush: () => opts.flush?.(),\n destroy: () => opts.destroy?.(),\n notify: onUpdate,\n }\n}\n\nfunction assignKey(state: HistoryState) {\n if (!state) {\n state = {} as HistoryState\n }\n return {\n ...state,\n key: createRandomKey(),\n }\n}\n\n/**\n * Creates a history object that can be used to interact with the browser's\n * navigation. This is a lightweight API wrapping the browser's native methods.\n * It is designed to work with TanStack Router, but could be used as a standalone API as well.\n * IMPORTANT: This API implements history throttling via a microtask to prevent\n * excessive calls to the history API. In some browsers, calling history.pushState or\n * history.replaceState in quick succession can cause the browser to ignore subsequent\n * calls. This API smooths out those differences and ensures that your application\n * state will *eventually* match the browser state. In most cases, this is not a problem,\n * but if you need to ensure that the browser state is up to date, you can use the\n * `history.flush` method to immediately flush all pending state changes to the browser URL.\n * @param opts\n * @param opts.getHref A function that returns the current href (path + search + hash)\n * @param opts.createHref A function that takes a path and returns a href (path + search + hash)\n * @returns A history instance\n */\nexport function createBrowserHistory(opts?: {\n parseLocation?: () => HistoryLocation\n createHref?: (path: string) => string\n window?: any\n}): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n\n const createHref = opts?.createHref ?? ((path) => path)\n const parseLocation =\n opts?.parseLocation ??\n (() =>\n parseHref(\n `${win.location.pathname}${win.location.search}${win.location.hash}`,\n win.history.state,\n ))\n\n let currentLocation = parseLocation()\n let rollbackLocation: HistoryLocation | undefined\n\n const getLocation = () => currentLocation\n\n let next:\n | undefined\n | {\n // This is the latest location that we were attempting to push/replace\n href: string\n // This is the latest state that we were attempting to push/replace\n state: any\n // This is the latest type that we were attempting to push/replace\n isPush: boolean\n }\n\n // Because we are proactively updating the location\n // in memory before actually updating the browser history,\n // we need to track when we are doing this so we don't\n // notify subscribers twice on the last update.\n let tracking = true\n\n // We need to track the current scheduled update to prevent\n // multiple updates from being scheduled at the same time.\n let scheduled: Promise<void> | undefined\n\n // This function is a wrapper to prevent any of the callback's\n // side effects from causing a subscriber notification\n const untrack = (fn: () => void) => {\n tracking = false\n fn()\n tracking = true\n }\n\n // This function flushes the next update to the browser history\n const flush = () => {\n // Do not notify subscribers about this push/replace call\n untrack(() => {\n if (!next) return\n win.history[next.isPush ? 'pushState' : 'replaceState'](\n next.state,\n '',\n next.href,\n )\n // Reset the nextIsPush flag and clear the scheduled update\n next = undefined\n scheduled = undefined\n rollbackLocation = undefined\n })\n }\n\n // This function queues up a call to update the browser history\n const queueHistoryAction = (\n type: 'push' | 'replace',\n destHref: string,\n state: any,\n onUpdate: () => void,\n ) => {\n console.log(destHref)\n const href = createHref(destHref)\n\n if (!scheduled) {\n rollbackLocation = currentLocation\n }\n\n // Update the location in memory\n currentLocation = parseHref(destHref, state)\n\n // Keep track of the next location we need to flush to the URL\n next = {\n href,\n state,\n isPush: next?.isPush || type === 'push',\n }\n\n // Notify subscribers\n onUpdate()\n\n if (!scheduled) {\n // Schedule an update to the browser history\n scheduled = Promise.resolve().then(() => flush())\n }\n }\n\n const onPushPop = () => {\n currentLocation = parseLocation()\n history.notify()\n }\n\n var originalPushState = win.history.pushState\n var originalReplaceState = win.history.replaceState\n\n const history = createHistory({\n getLocation,\n pushState: (href, state, onUpdate) =>\n queueHistoryAction('push', href, state, onUpdate),\n replaceState: (href, state, onUpdate) =>\n queueHistoryAction('replace', href, state, onUpdate),\n back: () => win.history.back(),\n forward: () => win.history.forward(),\n go: (n) => win.history.go(n),\n createHref: (href) => createHref(href),\n flush,\n destroy: () => {\n win.history.pushState = originalPushState\n win.history.replaceState = originalReplaceState\n win.removeEventListener(pushStateEvent, onPushPop)\n win.removeEventListener(popStateEvent, onPushPop)\n },\n onBlocked: (onUpdate) => {\n // If a navigation is blocked, we need to rollback the location\n // that we optimistically updated in memory.\n if (rollbackLocation && currentLocation !== rollbackLocation) {\n currentLocation = rollbackLocation\n // Notify subscribers\n onUpdate()\n }\n },\n })\n\n win.addEventListener(pushStateEvent, onPushPop)\n win.addEventListener(popStateEvent, onPushPop)\n\n win.history.pushState = function () {\n let res = originalPushState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n win.history.replaceState = function () {\n let res = originalReplaceState.apply(win.history, arguments as any)\n if (tracking) history.notify()\n return res\n }\n\n return history\n}\n\nexport function createHashHistory(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n window: win,\n parseLocation: () => {\n const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/'\n console.log(hashHref)\n return parseHref(hashHref, win.history.state)\n },\n createHref: (href) =>\n `${win.location.pathname}${win.location.search}#${href}`,\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 = () => parseHref(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseHref(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","parseLocation","parseHref","pathname","search","hash","history","rollbackLocation","currentLocation","next","scheduled","tracking","isPush","href","fn","queueHistoryAction","type","destHref","console","log","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","hashHref","split","join","initialEntries","entries","initialIndex","currentState","max"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/history",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.249",
4
+ "version": "0.0.1-beta.251",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/history",
7
7
  "homepage": "https://tanstack.com",
package/src/index.ts CHANGED
@@ -179,7 +179,7 @@ function assignKey(state: HistoryState) {
179
179
  * @returns A history instance
180
180
  */
181
181
  export function createBrowserHistory(opts?: {
182
- getHref?: () => string
182
+ parseLocation?: () => HistoryLocation
183
183
  createHref?: (path: string) => string
184
184
  window?: any
185
185
  }): RouterHistory {
@@ -187,13 +187,16 @@ export function createBrowserHistory(opts?: {
187
187
  opts?.window ??
188
188
  (typeof document !== 'undefined' ? window : (undefined as any))
189
189
 
190
- const getHref =
191
- opts?.getHref ??
192
- (() => `${win.location.pathname}${win.location.search}${win.location.hash}`)
193
-
194
190
  const createHref = opts?.createHref ?? ((path) => path)
195
-
196
- let currentLocation = parseLocation(getHref(), win.history.state)
191
+ const parseLocation =
192
+ opts?.parseLocation ??
193
+ (() =>
194
+ parseHref(
195
+ `${win.location.pathname}${win.location.search}${win.location.hash}`,
196
+ win.history.state,
197
+ ))
198
+
199
+ let currentLocation = parseLocation()
197
200
  let rollbackLocation: HistoryLocation | undefined
198
201
 
199
202
  const getLocation = () => currentLocation
@@ -247,18 +250,19 @@ export function createBrowserHistory(opts?: {
247
250
  // This function queues up a call to update the browser history
248
251
  const queueHistoryAction = (
249
252
  type: 'push' | 'replace',
250
- path: string,
253
+ destHref: string,
251
254
  state: any,
252
255
  onUpdate: () => void,
253
256
  ) => {
254
- const href = createHref(path)
257
+ console.log(destHref)
258
+ const href = createHref(destHref)
255
259
 
256
260
  if (!scheduled) {
257
261
  rollbackLocation = currentLocation
258
262
  }
259
263
 
260
264
  // Update the location in memory
261
- currentLocation = parseLocation(href, state)
265
+ currentLocation = parseHref(destHref, state)
262
266
 
263
267
  // Keep track of the next location we need to flush to the URL
264
268
  next = {
@@ -277,7 +281,7 @@ export function createBrowserHistory(opts?: {
277
281
  }
278
282
 
279
283
  const onPushPop = () => {
280
- currentLocation = parseLocation(getHref(), win.history.state)
284
+ currentLocation = parseLocation()
281
285
  history.notify()
282
286
  }
283
287
 
@@ -286,14 +290,14 @@ export function createBrowserHistory(opts?: {
286
290
 
287
291
  const history = createHistory({
288
292
  getLocation,
289
- pushState: (path, state, onUpdate) =>
290
- queueHistoryAction('push', path, state, onUpdate),
291
- replaceState: (path, state, onUpdate) =>
292
- queueHistoryAction('replace', path, state, onUpdate),
293
+ pushState: (href, state, onUpdate) =>
294
+ queueHistoryAction('push', href, state, onUpdate),
295
+ replaceState: (href, state, onUpdate) =>
296
+ queueHistoryAction('replace', href, state, onUpdate),
293
297
  back: () => win.history.back(),
294
298
  forward: () => win.history.forward(),
295
299
  go: (n) => win.history.go(n),
296
- createHref: (path) => createHref(path),
300
+ createHref: (href) => createHref(href),
297
301
  flush,
298
302
  destroy: () => {
299
303
  win.history.pushState = originalPushState
@@ -330,15 +334,19 @@ export function createBrowserHistory(opts?: {
330
334
  return history
331
335
  }
332
336
 
333
- export function createHashHistory({
334
- window: win,
335
- }: {
336
- window?: any
337
- }): RouterHistory {
337
+ export function createHashHistory(opts?: { window?: any }): RouterHistory {
338
+ const win =
339
+ opts?.window ??
340
+ (typeof document !== 'undefined' ? window : (undefined as any))
338
341
  return createBrowserHistory({
339
- getHref: () => win.location.hash.substring(1),
340
- createHref: (path) => `#${path}`,
341
342
  window: win,
343
+ parseLocation: () => {
344
+ const hashHref = win.location.hash.split('#').slice(1).join('#') ?? '/'
345
+ console.log(hashHref)
346
+ return parseHref(hashHref, win.history.state)
347
+ },
348
+ createHref: (href) =>
349
+ `${win.location.pathname}${win.location.search}#${href}`,
342
350
  })
343
351
  }
344
352
 
@@ -356,7 +364,7 @@ export function createMemoryHistory(
356
364
  key: createRandomKey(),
357
365
  } as HistoryState
358
366
 
359
- const getLocation = () => parseLocation(entries[index]!, currentState)
367
+ const getLocation = () => parseHref(entries[index]!, currentState)
360
368
 
361
369
  return createHistory({
362
370
  getLocation,
@@ -382,7 +390,7 @@ export function createMemoryHistory(
382
390
  })
383
391
  }
384
392
 
385
- function parseLocation(href: string, state: HistoryState): HistoryLocation {
393
+ function parseHref(href: string, state: HistoryState): HistoryLocation {
386
394
  let hashIndex = href.indexOf('#')
387
395
  let searchIndex = href.indexOf('?')
388
396