@tanstack/history 0.0.1-beta.250 → 0.0.1-beta.252
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 +19 -14
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +19 -14
- 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 +1 -1
- package/build/umd/index.development.js +19 -14
- 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 +29 -20
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;
|
|
@@ -244,9 +245,13 @@ function createBrowserHistory(opts) {
|
|
|
244
245
|
function createHashHistory(opts) {
|
|
245
246
|
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
246
247
|
return createBrowserHistory({
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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}`
|
|
250
255
|
});
|
|
251
256
|
}
|
|
252
257
|
function createMemoryHistory(opts = {
|
|
@@ -257,7 +262,7 @@ function createMemoryHistory(opts = {
|
|
|
257
262
|
let currentState = {
|
|
258
263
|
key: createRandomKey()
|
|
259
264
|
};
|
|
260
|
-
const getLocation = () =>
|
|
265
|
+
const getLocation = () => parseHref(entries[index], currentState);
|
|
261
266
|
return createHistory({
|
|
262
267
|
getLocation,
|
|
263
268
|
pushState: (path, state) => {
|
|
@@ -281,7 +286,7 @@ function createMemoryHistory(opts = {
|
|
|
281
286
|
createHref: path => path
|
|
282
287
|
});
|
|
283
288
|
}
|
|
284
|
-
function
|
|
289
|
+
function parseHref(href, state) {
|
|
285
290
|
let hashIndex = href.indexOf('#');
|
|
286
291
|
let searchIndex = href.indexOf('?');
|
|
287
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(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
|
|
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;
|
|
@@ -242,9 +243,13 @@ function createBrowserHistory(opts) {
|
|
|
242
243
|
function createHashHistory(opts) {
|
|
243
244
|
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
244
245
|
return createBrowserHistory({
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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}`
|
|
248
253
|
});
|
|
249
254
|
}
|
|
250
255
|
function createMemoryHistory(opts = {
|
|
@@ -255,7 +260,7 @@ function createMemoryHistory(opts = {
|
|
|
255
260
|
let currentState = {
|
|
256
261
|
key: createRandomKey()
|
|
257
262
|
};
|
|
258
|
-
const getLocation = () =>
|
|
263
|
+
const getLocation = () => parseHref(entries[index], currentState);
|
|
259
264
|
return createHistory({
|
|
260
265
|
getLocation,
|
|
261
266
|
pushState: (path, state) => {
|
|
@@ -279,7 +284,7 @@ function createMemoryHistory(opts = {
|
|
|
279
284
|
createHref: path => path
|
|
280
285
|
});
|
|
281
286
|
}
|
|
282
|
-
function
|
|
287
|
+
function parseHref(href, state) {
|
|
283
288
|
let hashIndex = href.indexOf('#');
|
|
284
289
|
let searchIndex = href.indexOf('?');
|
|
285
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(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":";;;;;;;;;;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,MAAMC,OAAO,GACXhD,IAAI,EAAEgD,OAAO,KACZ,MAAO,CAAEF,EAAAA,GAAG,CAAC7C,QAAQ,CAACgD,QAAS,GAAEH,GAAG,CAAC7C,QAAQ,CAACiD,MAAO,CAAA,EAAEJ,GAAG,CAAC7C,QAAQ,CAACkD,IAAK,CAAA,CAAC,CAAC,CAAA;EAE9E,MAAMlB,UAAU,GAAGjC,IAAI,EAAEiC,UAAU,KAAMV,IAAI,IAAKA,IAAI,CAAC,CAAA;AAEvD,EAAA,IAAI6B,eAAe,GAAGC,aAAa,CAACL,OAAO,EAAE,EAAEF,GAAG,CAACQ,OAAO,CAAC9B,KAAK,CAAC,CAAA;AACjE,EAAA,IAAI+B,gBAA6C,CAAA;AAEjD,EAAA,MAAMrD,WAAW,GAAGA,MAAMkD,eAAe,CAAA;AAEzC,EAAA,IAAII,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,CAACQ,OAAO,CAACE,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,EACxBzC,IAAY,EACZC,KAAU,EACVlB,QAAoB,KACjB;AACH,IAAA,MAAMwD,IAAI,GAAG7B,UAAU,CAACV,IAAI,CAAC,CAAA;IAE7B,IAAI,CAACmC,SAAS,EAAE;AACdH,MAAAA,gBAAgB,GAAGH,eAAe,CAAA;AACpC,KAAA;;AAEA;AACAA,IAAAA,eAAe,GAAGC,aAAa,CAACS,IAAI,EAAEtC,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,GAAGO,OAAO,CAACC,OAAO,EAAE,CAACC,IAAI,CAAC,MAAM3B,KAAK,EAAE,CAAC,CAAA;AACnD,KAAA;GACD,CAAA;EAED,MAAM4B,SAAS,GAAGA,MAAM;AACtBhB,IAAAA,eAAe,GAAGC,aAAa,CAACL,OAAO,EAAE,EAAEF,GAAG,CAACQ,OAAO,CAAC9B,KAAK,CAAC,CAAA;IAC7D8B,OAAO,CAACZ,MAAM,EAAE,CAAA;GACjB,CAAA;AAED,EAAA,IAAI2B,iBAAiB,GAAGvB,GAAG,CAACQ,OAAO,CAAC5B,SAAS,CAAA;AAC7C,EAAA,IAAI4C,oBAAoB,GAAGxB,GAAG,CAACQ,OAAO,CAAC1B,YAAY,CAAA;EAEnD,MAAM0B,OAAO,GAAGvD,aAAa,CAAC;IAC5BG,WAAW;AACXwB,IAAAA,SAAS,EAAEA,CAACH,IAAI,EAAEC,KAAK,EAAElB,QAAQ,KAC/ByD,kBAAkB,CAAC,MAAM,EAAExC,IAAI,EAAEC,KAAK,EAAElB,QAAQ,CAAC;AACnDsB,IAAAA,YAAY,EAAEA,CAACL,IAAI,EAAEC,KAAK,EAAElB,QAAQ,KAClCyD,kBAAkB,CAAC,SAAS,EAAExC,IAAI,EAAEC,KAAK,EAAElB,QAAQ,CAAC;IACtDyB,IAAI,EAAEA,MAAMe,GAAG,CAACQ,OAAO,CAACvB,IAAI,EAAE;IAC9BC,OAAO,EAAEA,MAAMc,GAAG,CAACQ,OAAO,CAACtB,OAAO,EAAE;IACpCH,EAAE,EAAG0C,CAAC,IAAKzB,GAAG,CAACQ,OAAO,CAACzB,EAAE,CAAC0C,CAAC,CAAC;AAC5BtC,IAAAA,UAAU,EAAGV,IAAI,IAAKU,UAAU,CAACV,IAAI,CAAC;IACtCiB,KAAK;IACLC,OAAO,EAAEA,MAAM;AACbK,MAAAA,GAAG,CAACQ,OAAO,CAAC5B,SAAS,GAAG2C,iBAAiB,CAAA;AACzCvB,MAAAA,GAAG,CAACQ,OAAO,CAAC1B,YAAY,GAAG0C,oBAAoB,CAAA;AAC/CxB,MAAAA,GAAG,CAACjD,mBAAmB,CAACR,cAAc,EAAE+E,SAAS,CAAC,CAAA;AAClDtB,MAAAA,GAAG,CAACjD,mBAAmB,CAACP,aAAa,EAAE8E,SAAS,CAAC,CAAA;KAClD;IACDnD,SAAS,EAAGX,QAAQ,IAAK;AACvB;AACA;AACA,MAAA,IAAIiD,gBAAgB,IAAIH,eAAe,KAAKG,gBAAgB,EAAE;AAC5DH,QAAAA,eAAe,GAAGG,gBAAgB,CAAA;AAClC;AACAjD,QAAAA,QAAQ,EAAE,CAAA;AACZ,OAAA;AACF,KAAA;AACF,GAAC,CAAC,CAAA;AAEFwC,EAAAA,GAAG,CAACT,gBAAgB,CAAChD,cAAc,EAAE+E,SAAS,CAAC,CAAA;AAC/CtB,EAAAA,GAAG,CAACT,gBAAgB,CAAC/C,aAAa,EAAE8E,SAAS,CAAC,CAAA;AAE9CtB,EAAAA,GAAG,CAACQ,OAAO,CAAC5B,SAAS,GAAG,YAAY;IAClC,IAAI8C,GAAG,GAAGH,iBAAiB,CAACI,KAAK,CAAC3B,GAAG,CAACQ,OAAO,EAAEoB,SAAgB,CAAC,CAAA;AAChE,IAAA,IAAIjB,QAAQ,EAAEH,OAAO,CAACZ,MAAM,EAAE,CAAA;AAC9B,IAAA,OAAO8B,GAAG,CAAA;GACX,CAAA;AAED1B,EAAAA,GAAG,CAACQ,OAAO,CAAC1B,YAAY,GAAG,YAAY;IACrC,IAAI4C,GAAG,GAAGF,oBAAoB,CAACG,KAAK,CAAC3B,GAAG,CAACQ,OAAO,EAAEoB,SAAgB,CAAC,CAAA;AACnE,IAAA,IAAIjB,QAAQ,EAAEH,OAAO,CAACZ,MAAM,EAAE,CAAA;AAC9B,IAAA,OAAO8B,GAAG,CAAA;GACX,CAAA;AAED,EAAA,OAAOlB,OAAO,CAAA;AAChB,CAAA;AAEO,SAASqB,iBAAiBA,CAAC3E,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;AAC1BG,IAAAA,OAAO,EAAEA,MAAMF,GAAG,CAAC7C,QAAQ,CAACkD,IAAI,CAACyB,SAAS,CAAC,CAAC,CAAC;AAC7C3C,IAAAA,UAAU,EAAGV,IAAI,IAAM,CAAA,CAAA,EAAGA,IAAK,CAAC,CAAA;AAChCT,IAAAA,MAAM,EAAEgC,GAAAA;AACV,GAAC,CAAC,CAAA;AACJ,CAAA;AAEO,SAAS+B,mBAAmBA,CACjC7E,IAGC,GAAG;EACF8E,cAAc,EAAE,CAAC,GAAG,CAAA;AACtB,CAAC,EACc;AACf,EAAA,MAAMC,OAAO,GAAG/E,IAAI,CAAC8E,cAAc,CAAA;EACnC,IAAIhD,KAAK,GAAG9B,IAAI,CAACgF,YAAY,IAAID,OAAO,CAACnE,MAAM,GAAG,CAAC,CAAA;AACnD,EAAA,IAAIqE,YAAY,GAAG;IACjBtC,GAAG,EAAEC,eAAe,EAAC;GACN,CAAA;AAEjB,EAAA,MAAM1C,WAAW,GAAGA,MAAMmD,aAAa,CAAC0B,OAAO,CAACjD,KAAK,CAAC,EAAGmD,YAAY,CAAC,CAAA;AAEtE,EAAA,OAAOlF,aAAa,CAAC;IACnBG,WAAW;AACXwB,IAAAA,SAAS,EAAEA,CAACH,IAAI,EAAEC,KAAK,KAAK;AAC1ByD,MAAAA,YAAY,GAAGzD,KAAK,CAAA;AACpBuD,MAAAA,OAAO,CAACzD,IAAI,CAACC,IAAI,CAAC,CAAA;AAClBO,MAAAA,KAAK,EAAE,CAAA;KACR;AACDF,IAAAA,YAAY,EAAEA,CAACL,IAAI,EAAEC,KAAK,KAAK;AAC7ByD,MAAAA,YAAY,GAAGzD,KAAK,CAAA;AACpBuD,MAAAA,OAAO,CAACjD,KAAK,CAAC,GAAGP,IAAI,CAAA;KACtB;IACDQ,IAAI,EAAEA,MAAM;AACVD,MAAAA,KAAK,EAAE,CAAA;KACR;IACDE,OAAO,EAAEA,MAAM;AACbF,MAAAA,KAAK,GAAGoD,IAAI,CAACC,GAAG,CAACrD,KAAK,GAAG,CAAC,EAAEiD,OAAO,CAACnE,MAAM,GAAG,CAAC,CAAC,CAAA;KAChD;IACDiB,EAAE,EAAG0C,CAAC,IAAK;MACTzC,KAAK,GAAGoD,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAACtD,KAAK,GAAGyC,CAAC,EAAE,CAAC,CAAC,EAAEQ,OAAO,CAACnE,MAAM,GAAG,CAAC,CAAC,CAAA;KAC7D;IACDqB,UAAU,EAAGV,IAAI,IAAKA,IAAAA;AACxB,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA,SAAS8B,aAAaA,CAACS,IAAY,EAAEtC,KAAmB,EAAmB;AACzE,EAAA,IAAI6D,SAAS,GAAGvB,IAAI,CAACwB,OAAO,CAAC,GAAG,CAAC,CAAA;AACjC,EAAA,IAAIC,WAAW,GAAGzB,IAAI,CAACwB,OAAO,CAAC,GAAG,CAAC,CAAA;EAEnC,OAAO;IACLxB,IAAI;AACJb,IAAAA,QAAQ,EAAEa,IAAI,CAACc,SAAS,CACtB,CAAC,EACDS,SAAS,GAAG,CAAC,GACTE,WAAW,GAAG,CAAC,GACbL,IAAI,CAACC,GAAG,CAACE,SAAS,EAAEE,WAAW,CAAC,GAChCF,SAAS,GACXE,WAAW,GAAG,CAAC,GACbA,WAAW,GACXzB,IAAI,CAAClD,MACb,CAAC;AACDuC,IAAAA,IAAI,EAAEkC,SAAS,GAAG,CAAC,CAAC,GAAGvB,IAAI,CAACc,SAAS,CAACS,SAAS,CAAC,GAAG,EAAE;IACrDnC,MAAM,EACJqC,WAAW,GAAG,CAAC,CAAC,GACZzB,IAAI,CAAC0B,KAAK,CAACD,WAAW,EAAEF,SAAS,KAAK,CAAC,CAAC,GAAGtC,SAAS,GAAGsC,SAAS,CAAC,GACjE,EAAE;IACR7D,KAAK,EAAEA,KAAK,IAAI,EAAC;GAClB,CAAA;AACH,CAAA;;AAEA;AACA,SAASoB,eAAeA,GAAG;AACzB,EAAA,OAAO,CAACsC,IAAI,CAACO,MAAM,EAAE,GAAG,CAAC,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACd,SAAS,CAAC,CAAC,CAAC,CAAA;AACtD;;;;"}
|
|
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/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":"d1b3-1"}]}],"isRoot":true},"nodeParts":{"d1b3-1":{"renderedLength":9821,"gzipLength":2853,"brotliLength":0,"metaUid":"d1b3-0"}},"nodeMetas":{"d1b3-0":{"id":"/packages/history/src/index.ts","moduleParts":{"index.production.js":"d1b3-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": "d1b3-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
|
+
"d1b3-3": {
|
|
20
|
+
"renderedLength": 9821,
|
|
21
|
+
"gzipLength": 2853,
|
|
22
22
|
"brotliLength": 0,
|
|
23
|
-
"metaUid": "
|
|
23
|
+
"metaUid": "d1b3-2"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"nodeMetas": {
|
|
27
|
-
"
|
|
27
|
+
"d1b3-2": {
|
|
28
28
|
"id": "/packages/history/src/index.ts",
|
|
29
29
|
"moduleParts": {
|
|
30
|
-
"index.production.js": "
|
|
30
|
+
"index.production.js": "d1b3-3"
|
|
31
31
|
},
|
|
32
32
|
"imported": [],
|
|
33
33
|
"importedBy": [],
|
package/build/types/index.d.ts
CHANGED
|
@@ -63,7 +63,7 @@ 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;
|
|
@@ -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;
|
|
@@ -248,9 +249,13 @@
|
|
|
248
249
|
function createHashHistory(opts) {
|
|
249
250
|
const win = opts?.window ?? (typeof document !== 'undefined' ? window : undefined);
|
|
250
251
|
return createBrowserHistory({
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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}`
|
|
254
259
|
});
|
|
255
260
|
}
|
|
256
261
|
function createMemoryHistory(opts = {
|
|
@@ -261,7 +266,7 @@
|
|
|
261
266
|
let currentState = {
|
|
262
267
|
key: createRandomKey()
|
|
263
268
|
};
|
|
264
|
-
const getLocation = () =>
|
|
269
|
+
const getLocation = () => parseHref(entries[index], currentState);
|
|
265
270
|
return createHistory({
|
|
266
271
|
getLocation,
|
|
267
272
|
pushState: (path, state) => {
|
|
@@ -285,7 +290,7 @@
|
|
|
285
290
|
createHref: path => path
|
|
286
291
|
});
|
|
287
292
|
}
|
|
288
|
-
function
|
|
293
|
+
function parseHref(href, state) {
|
|
289
294
|
let hashIndex = href.indexOf('#');
|
|
290
295
|
let searchIndex = href.indexOf('?');
|
|
291
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(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","currentLocation","parseLocation","history","rollbackLocation","next","tracking","scheduled","untrack","fn","isPush","href","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","currentState","Math","min","max","hashIndex","indexOf","searchIndex","slice","random","toString"],"mappings":"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"}
|
|
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(opts?: { window?: any }): RouterHistory {\n const win =\n opts?.window ??\n (typeof document !== 'undefined' ? window : (undefined as any))\n return createBrowserHistory({\n getHref: () => win.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n window: win,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {\n key: createRandomKey(),\n } as HistoryState\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n pushState: (path, state) => {\n currentState = state\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = state\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => {\n index = Math.min(Math.max(index + n, 0), entries.length - 1)\n },\n createHref: (path) => path,\n })\n}\n\nfunction parseLocation(href: string, state: HistoryState): HistoryLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n\n return {\n href,\n pathname: href.substring(\n 0,\n hashIndex > 0\n ? searchIndex > 0\n ? Math.min(hashIndex, searchIndex)\n : hashIndex\n : searchIndex > 0\n ? searchIndex\n : href.length,\n ),\n hash: hashIndex > -1 ? href.substring(hashIndex) : '',\n search:\n searchIndex > -1\n ? href.slice(searchIndex, hashIndex === -1 ? undefined : hashIndex)\n : '',\n state: state || {},\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["pushStateEvent","popStateEvent","beforeUnloadEvent","beforeUnloadListener","event","preventDefault","returnValue","stopBlocking","removeEventListener","capture","createHistory","opts","location","getLocation","subscribers","Set","blockers","onUpdate","forEach","subscriber","tryNavigation","task","document","length","blocker","window","confirm","message","onBlocked","subscribe","cb","add","delete","push","path","state","assignKey","pushState","replace","replaceState","go","index","back","forward","createHref","str","block","payload","addEventListener","filter","b","flush","destroy","notify","key","createRandomKey","createBrowserHistory","win","undefined","getHref","pathname","search","hash","rollbackLocation","currentLocation","parseLocation","history","next","scheduled","tracking","isPush","href","fn","queueHistoryAction","type","Promise","resolve","then","onPushPop","originalPushState","originalReplaceState","n","res","apply","arguments","hashIndex","indexOf","searchIndex","substring","Math","min","slice","random","toString","initialEntries","entries","initialIndex","currentState","max"],"mappings":"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"}
|
|
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
|
|
@@ -335,9 +339,14 @@ export function createHashHistory(opts?: { window?: any }): RouterHistory {
|
|
|
335
339
|
opts?.window ??
|
|
336
340
|
(typeof document !== 'undefined' ? window : (undefined as any))
|
|
337
341
|
return createBrowserHistory({
|
|
338
|
-
getHref: () => win.location.hash.substring(1),
|
|
339
|
-
createHref: (path) => `#${path}`,
|
|
340
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}`,
|
|
341
350
|
})
|
|
342
351
|
}
|
|
343
352
|
|
|
@@ -355,7 +364,7 @@ export function createMemoryHistory(
|
|
|
355
364
|
key: createRandomKey(),
|
|
356
365
|
} as HistoryState
|
|
357
366
|
|
|
358
|
-
const getLocation = () =>
|
|
367
|
+
const getLocation = () => parseHref(entries[index]!, currentState)
|
|
359
368
|
|
|
360
369
|
return createHistory({
|
|
361
370
|
getLocation,
|
|
@@ -381,7 +390,7 @@ export function createMemoryHistory(
|
|
|
381
390
|
})
|
|
382
391
|
}
|
|
383
392
|
|
|
384
|
-
function
|
|
393
|
+
function parseHref(href: string, state: HistoryState): HistoryLocation {
|
|
385
394
|
let hashIndex = href.indexOf('#')
|
|
386
395
|
let searchIndex = href.indexOf('?')
|
|
387
396
|
|