@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.
- package/build/cjs/index.js +21 -17
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +21 -17
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +7 -7
- package/build/types/index.d.ts +2 -2
- package/build/umd/index.development.js +21 -17
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +33 -25
package/build/cjs/index.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
177
|
-
|
|
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 =
|
|
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(
|
|
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: (
|
|
208
|
-
replaceState: (
|
|
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:
|
|
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:
|
|
246
|
-
}) {
|
|
245
|
+
function createHashHistory(opts) {
|
|
246
|
+
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
247
247
|
return createBrowserHistory({
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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 = () =>
|
|
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
|
|
289
|
+
function parseHref(href, state) {
|
|
286
290
|
let hashIndex = href.indexOf('#');
|
|
287
291
|
let searchIndex = href.indexOf('?');
|
|
288
292
|
return {
|
package/build/cjs/index.js.map
CHANGED
|
@@ -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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"}
|
package/build/esm/index.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
175
|
-
|
|
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 =
|
|
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(
|
|
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: (
|
|
206
|
-
replaceState: (
|
|
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:
|
|
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:
|
|
244
|
-
}) {
|
|
243
|
+
function createHashHistory(opts) {
|
|
244
|
+
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
245
245
|
return createBrowserHistory({
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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 = () =>
|
|
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
|
|
287
|
+
function parseHref(href, state) {
|
|
284
288
|
let hashIndex = href.indexOf('#');
|
|
285
289
|
let searchIndex = href.indexOf('?');
|
|
286
290
|
return {
|
package/build/esm/index.js.map
CHANGED
|
@@ -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;;;;"}
|
package/build/stats-html.html
CHANGED
|
@@ -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":"
|
|
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;
|
package/build/stats-react.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"children": [
|
|
9
9
|
{
|
|
10
10
|
"name": "packages/history/src/index.ts",
|
|
11
|
-
"uid": "
|
|
11
|
+
"uid": "26ef-3"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
"isRoot": true
|
|
17
17
|
},
|
|
18
18
|
"nodeParts": {
|
|
19
|
-
"
|
|
20
|
-
"renderedLength":
|
|
21
|
-
"gzipLength":
|
|
19
|
+
"26ef-3": {
|
|
20
|
+
"renderedLength": 9821,
|
|
21
|
+
"gzipLength": 2853,
|
|
22
22
|
"brotliLength": 0,
|
|
23
|
-
"metaUid": "
|
|
23
|
+
"metaUid": "26ef-2"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"nodeMetas": {
|
|
27
|
-
"
|
|
27
|
+
"26ef-2": {
|
|
28
28
|
"id": "/packages/history/src/index.ts",
|
|
29
29
|
"moduleParts": {
|
|
30
|
-
"index.production.js": "
|
|
30
|
+
"index.production.js": "26ef-3"
|
|
31
31
|
},
|
|
32
32
|
"imported": [],
|
|
33
33
|
"importedBy": [],
|
package/build/types/index.d.ts
CHANGED
|
@@ -63,11 +63,11 @@ declare function createHistory(opts: {
|
|
|
63
63
|
* @returns A history instance
|
|
64
64
|
*/
|
|
65
65
|
declare function createBrowserHistory(opts?: {
|
|
66
|
-
|
|
66
|
+
parseLocation?: () => HistoryLocation;
|
|
67
67
|
createHref?: (path: string) => string;
|
|
68
68
|
window?: any;
|
|
69
69
|
}): RouterHistory;
|
|
70
|
-
declare function createHashHistory(
|
|
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
|
-
|
|
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,
|
|
181
|
-
|
|
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 =
|
|
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(
|
|
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: (
|
|
212
|
-
replaceState: (
|
|
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:
|
|
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:
|
|
250
|
-
}) {
|
|
249
|
+
function createHashHistory(opts) {
|
|
250
|
+
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
251
251
|
return createBrowserHistory({
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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 = () =>
|
|
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
|
|
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",
|
|
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
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
253
|
+
destHref: string,
|
|
251
254
|
state: any,
|
|
252
255
|
onUpdate: () => void,
|
|
253
256
|
) => {
|
|
254
|
-
|
|
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 =
|
|
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(
|
|
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: (
|
|
290
|
-
queueHistoryAction('push',
|
|
291
|
-
replaceState: (
|
|
292
|
-
queueHistoryAction('replace',
|
|
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: (
|
|
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
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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 = () =>
|
|
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
|
|
393
|
+
function parseHref(href: string, state: HistoryState): HistoryLocation {
|
|
386
394
|
let hashIndex = href.indexOf('#')
|
|
387
395
|
let searchIndex = href.indexOf('?')
|
|
388
396
|
|