| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 var __create = Object.create; 2 var __defProp = Object.defineProperty; 3 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 4 var __getOwnPropNames = Object.getOwnPropertyNames; 5 var __getProtoOf = Object.getPrototypeOf; 6 var __hasOwnProp = Object.prototype.hasOwnProperty; 7 var __commonJS = (cb, mod) => function __require() { 8 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 9 }; 10 var __copyProps = (to, from, except, desc) => { 11 if (from && typeof from === "object" || typeof from === "function") { 12 for (let key of __getOwnPropNames(from)) 13 if (!__hasOwnProp.call(to, key) && key !== except) 14 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 15 } 16 return to; 17 }; 18 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 19 // If the importer is in node compatibility mode or this is not an ESM 20 // file that has been converted to a CommonJS file using a Babel- 21 // compatible transform (i.e. "__esModule" has not been set), then set 22 // "default" to the CommonJS "module.exports" for node compatibility. 23 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 24 mod 25 )); 26 27 // vendor-external:react/jsx-runtime 28 var require_jsx_runtime = __commonJS({ 29 "vendor-external:react/jsx-runtime"(exports, module) { 30 module.exports = window.ReactJSXRuntime; 31 } 32 }); 33 34 // vendor-external:react 35 var require_react = __commonJS({ 36 "vendor-external:react"(exports, module) { 37 module.exports = window.React; 38 } 39 }); 40 41 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js 42 var require_use_sync_external_store_shim_development = __commonJS({ 43 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { 44 "use strict"; 45 (function() { 46 function is(x, y) { 47 return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; 48 } 49 function useSyncExternalStore$2(subscribe2, getSnapshot) { 50 didWarnOld18Alpha || void 0 === React13.startTransition || (didWarnOld18Alpha = true, console.error( 51 "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." 52 )); 53 var value = getSnapshot(); 54 if (!didWarnUncachedGetSnapshot) { 55 var cachedValue = getSnapshot(); 56 objectIs(value, cachedValue) || (console.error( 57 "The result of getSnapshot should be cached to avoid an infinite loop" 58 ), didWarnUncachedGetSnapshot = true); 59 } 60 cachedValue = useState5({ 61 inst: { value, getSnapshot } 62 }); 63 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; 64 useLayoutEffect3( 65 function() { 66 inst.value = value; 67 inst.getSnapshot = getSnapshot; 68 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 69 }, 70 [subscribe2, value, getSnapshot] 71 ); 72 useEffect6( 73 function() { 74 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 75 return subscribe2(function() { 76 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 77 }); 78 }, 79 [subscribe2] 80 ); 81 useDebugValue(value); 82 return value; 83 } 84 function checkIfSnapshotChanged(inst) { 85 var latestGetSnapshot = inst.getSnapshot; 86 inst = inst.value; 87 try { 88 var nextValue = latestGetSnapshot(); 89 return !objectIs(inst, nextValue); 90 } catch (error) { 91 return true; 92 } 93 } 94 function useSyncExternalStore$1(subscribe2, getSnapshot) { 95 return getSnapshot(); 96 } 97 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 98 var React13 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState5 = React13.useState, useEffect6 = React13.useEffect, useLayoutEffect3 = React13.useLayoutEffect, useDebugValue = React13.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; 99 exports.useSyncExternalStore = void 0 !== React13.useSyncExternalStore ? React13.useSyncExternalStore : shim; 100 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 101 })(); 102 } 103 }); 104 105 // node_modules/use-sync-external-store/shim/index.js 106 var require_shim = __commonJS({ 107 "node_modules/use-sync-external-store/shim/index.js"(exports, module) { 108 "use strict"; 109 if (false) { 110 module.exports = null; 111 } else { 112 module.exports = require_use_sync_external_store_shim_development(); 113 } 114 } 115 }); 116 117 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js 118 var require_with_selector_development = __commonJS({ 119 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports) { 120 "use strict"; 121 (function() { 122 function is(x, y) { 123 return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; 124 } 125 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 126 var React13 = require_react(), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore = shim.useSyncExternalStore, useRef7 = React13.useRef, useEffect6 = React13.useEffect, useMemo3 = React13.useMemo, useDebugValue = React13.useDebugValue; 127 exports.useSyncExternalStoreWithSelector = function(subscribe2, getSnapshot, getServerSnapshot, selector, isEqual) { 128 var instRef = useRef7(null); 129 if (null === instRef.current) { 130 var inst = { hasValue: false, value: null }; 131 instRef.current = inst; 132 } else inst = instRef.current; 133 instRef = useMemo3( 134 function() { 135 function memoizedSelector(nextSnapshot) { 136 if (!hasMemo) { 137 hasMemo = true; 138 memoizedSnapshot = nextSnapshot; 139 nextSnapshot = selector(nextSnapshot); 140 if (void 0 !== isEqual && inst.hasValue) { 141 var currentSelection = inst.value; 142 if (isEqual(currentSelection, nextSnapshot)) 143 return memoizedSelection = currentSelection; 144 } 145 return memoizedSelection = nextSnapshot; 146 } 147 currentSelection = memoizedSelection; 148 if (objectIs(memoizedSnapshot, nextSnapshot)) 149 return currentSelection; 150 var nextSelection = selector(nextSnapshot); 151 if (void 0 !== isEqual && isEqual(currentSelection, nextSelection)) 152 return memoizedSnapshot = nextSnapshot, currentSelection; 153 memoizedSnapshot = nextSnapshot; 154 return memoizedSelection = nextSelection; 155 } 156 var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot; 157 return [ 158 function() { 159 return memoizedSelector(getSnapshot()); 160 }, 161 null === maybeGetServerSnapshot ? void 0 : function() { 162 return memoizedSelector(maybeGetServerSnapshot()); 163 } 164 ]; 165 }, 166 [getSnapshot, getServerSnapshot, selector, isEqual] 167 ); 168 var value = useSyncExternalStore(subscribe2, instRef[0], instRef[1]); 169 useEffect6( 170 function() { 171 inst.hasValue = true; 172 inst.value = value; 173 }, 174 [value] 175 ); 176 useDebugValue(value); 177 return value; 178 }; 179 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 180 })(); 181 } 182 }); 183 184 // node_modules/use-sync-external-store/shim/with-selector.js 185 var require_with_selector = __commonJS({ 186 "node_modules/use-sync-external-store/shim/with-selector.js"(exports, module) { 187 "use strict"; 188 if (false) { 189 module.exports = null; 190 } else { 191 module.exports = require_with_selector_development(); 192 } 193 } 194 }); 195 196 // vendor-external:react-dom 197 var require_react_dom = __commonJS({ 198 "vendor-external:react-dom"(exports, module) { 199 module.exports = window.ReactDOM; 200 } 201 }); 202 203 // package-external:@wordpress/private-apis 204 var require_private_apis = __commonJS({ 205 "package-external:@wordpress/private-apis"(exports, module) { 206 module.exports = window.wp.privateApis; 207 } 208 }); 209 210 // node_modules/@tanstack/store/dist/esm/scheduler.js 211 var __storeToDerived = /* @__PURE__ */ new WeakMap(); 212 var __derivedToStore = /* @__PURE__ */ new WeakMap(); 213 var __depsThatHaveWrittenThisTick = { 214 current: [] 215 }; 216 var __isFlushing = false; 217 var __batchDepth = 0; 218 var __pendingUpdates = /* @__PURE__ */ new Set(); 219 var __initialBatchValues = /* @__PURE__ */ new Map(); 220 function __flush_internals(relatedVals) { 221 for (const derived of relatedVals) { 222 if (__depsThatHaveWrittenThisTick.current.includes(derived)) { 223 continue; 224 } 225 __depsThatHaveWrittenThisTick.current.push(derived); 226 derived.recompute(); 227 const stores = __derivedToStore.get(derived); 228 if (stores) { 229 for (const store of stores) { 230 const relatedLinkedDerivedVals = __storeToDerived.get(store); 231 if (!(relatedLinkedDerivedVals == null ? void 0 : relatedLinkedDerivedVals.length)) continue; 232 __flush_internals(relatedLinkedDerivedVals); 233 } 234 } 235 } 236 } 237 function __notifyListeners(store) { 238 const value = { 239 prevVal: store.prevState, 240 currentVal: store.state 241 }; 242 for (const listener of store.listeners) { 243 listener(value); 244 } 245 } 246 function __notifyDerivedListeners(derived) { 247 const value = { 248 prevVal: derived.prevState, 249 currentVal: derived.state 250 }; 251 for (const listener of derived.listeners) { 252 listener(value); 253 } 254 } 255 function __flush(store) { 256 if (__batchDepth > 0 && !__initialBatchValues.has(store)) { 257 __initialBatchValues.set(store, store.prevState); 258 } 259 __pendingUpdates.add(store); 260 if (__batchDepth > 0) return; 261 if (__isFlushing) return; 262 try { 263 __isFlushing = true; 264 while (__pendingUpdates.size > 0) { 265 const stores = Array.from(__pendingUpdates); 266 __pendingUpdates.clear(); 267 for (const store2 of stores) { 268 const prevState = __initialBatchValues.get(store2) ?? store2.prevState; 269 store2.prevState = prevState; 270 __notifyListeners(store2); 271 } 272 for (const store2 of stores) { 273 const derivedVals = __storeToDerived.get(store2); 274 if (!derivedVals) continue; 275 __depsThatHaveWrittenThisTick.current.push(store2); 276 __flush_internals(derivedVals); 277 } 278 for (const store2 of stores) { 279 const derivedVals = __storeToDerived.get(store2); 280 if (!derivedVals) continue; 281 for (const derived of derivedVals) { 282 __notifyDerivedListeners(derived); 283 } 284 } 285 } 286 } finally { 287 __isFlushing = false; 288 __depsThatHaveWrittenThisTick.current = []; 289 __initialBatchValues.clear(); 290 } 291 } 292 function batch(fn) { 293 __batchDepth++; 294 try { 295 fn(); 296 } finally { 297 __batchDepth--; 298 if (__batchDepth === 0) { 299 const pendingUpdateToFlush = __pendingUpdates.values().next().value; 300 if (pendingUpdateToFlush) { 301 __flush(pendingUpdateToFlush); 302 } 303 } 304 } 305 } 306 307 // node_modules/@tanstack/store/dist/esm/types.js 308 function isUpdaterFunction(updater) { 309 return typeof updater === "function"; 310 } 311 312 // node_modules/@tanstack/store/dist/esm/store.js 313 var Store = class { 314 constructor(initialState, options) { 315 this.listeners = /* @__PURE__ */ new Set(); 316 this.subscribe = (listener) => { 317 var _a, _b; 318 this.listeners.add(listener); 319 const unsub = (_b = (_a = this.options) == null ? void 0 : _a.onSubscribe) == null ? void 0 : _b.call(_a, listener, this); 320 return () => { 321 this.listeners.delete(listener); 322 unsub == null ? void 0 : unsub(); 323 }; 324 }; 325 this.prevState = initialState; 326 this.state = initialState; 327 this.options = options; 328 } 329 setState(updater) { 330 var _a, _b, _c; 331 this.prevState = this.state; 332 if ((_a = this.options) == null ? void 0 : _a.updateFn) { 333 this.state = this.options.updateFn(this.prevState)(updater); 334 } else { 335 if (isUpdaterFunction(updater)) { 336 this.state = updater(this.prevState); 337 } else { 338 this.state = updater; 339 } 340 } 341 (_c = (_b = this.options) == null ? void 0 : _b.onUpdate) == null ? void 0 : _c.call(_b); 342 __flush(this); 343 } 344 }; 345 346 // node_modules/@tanstack/history/dist/esm/index.js 347 var stateIndexKey = "__TSR_index"; 348 var popStateEvent = "popstate"; 349 var beforeUnloadEvent = "beforeunload"; 350 function createHistory(opts) { 351 let location = opts.getLocation(); 352 const subscribers = /* @__PURE__ */ new Set(); 353 const notify = (action) => { 354 location = opts.getLocation(); 355 subscribers.forEach((subscriber) => subscriber({ location, action })); 356 }; 357 const handleIndexChange = (action) => { 358 if (opts.notifyOnIndexChange ?? true) notify(action); 359 else location = opts.getLocation(); 360 }; 361 const tryNavigation = async ({ 362 task, 363 navigateOpts, 364 ...actionInfo 365 }) => { 366 const ignoreBlocker = navigateOpts?.ignoreBlocker ?? false; 367 if (ignoreBlocker) { 368 task(); 369 return; 370 } 371 const blockers = opts.getBlockers?.() ?? []; 372 const isPushOrReplace = actionInfo.type === "PUSH" || actionInfo.type === "REPLACE"; 373 if (typeof document !== "undefined" && blockers.length && isPushOrReplace) { 374 for (const blocker of blockers) { 375 const nextLocation = parseHref(actionInfo.path, actionInfo.state); 376 const isBlocked = await blocker.blockerFn({ 377 currentLocation: location, 378 nextLocation, 379 action: actionInfo.type 380 }); 381 if (isBlocked) { 382 opts.onBlocked?.(); 383 return; 384 } 385 } 386 } 387 task(); 388 }; 389 return { 390 get location() { 391 return location; 392 }, 393 get length() { 394 return opts.getLength(); 395 }, 396 subscribers, 397 subscribe: (cb) => { 398 subscribers.add(cb); 399 return () => { 400 subscribers.delete(cb); 401 }; 402 }, 403 push: (path, state, navigateOpts) => { 404 const currentIndex = location.state[stateIndexKey]; 405 state = assignKeyAndIndex(currentIndex + 1, state); 406 tryNavigation({ 407 task: () => { 408 opts.pushState(path, state); 409 notify({ type: "PUSH" }); 410 }, 411 navigateOpts, 412 type: "PUSH", 413 path, 414 state 415 }); 416 }, 417 replace: (path, state, navigateOpts) => { 418 const currentIndex = location.state[stateIndexKey]; 419 state = assignKeyAndIndex(currentIndex, state); 420 tryNavigation({ 421 task: () => { 422 opts.replaceState(path, state); 423 notify({ type: "REPLACE" }); 424 }, 425 navigateOpts, 426 type: "REPLACE", 427 path, 428 state 429 }); 430 }, 431 go: (index, navigateOpts) => { 432 tryNavigation({ 433 task: () => { 434 opts.go(index); 435 handleIndexChange({ type: "GO", index }); 436 }, 437 navigateOpts, 438 type: "GO" 439 }); 440 }, 441 back: (navigateOpts) => { 442 tryNavigation({ 443 task: () => { 444 opts.back(navigateOpts?.ignoreBlocker ?? false); 445 handleIndexChange({ type: "BACK" }); 446 }, 447 navigateOpts, 448 type: "BACK" 449 }); 450 }, 451 forward: (navigateOpts) => { 452 tryNavigation({ 453 task: () => { 454 opts.forward(navigateOpts?.ignoreBlocker ?? false); 455 handleIndexChange({ type: "FORWARD" }); 456 }, 457 navigateOpts, 458 type: "FORWARD" 459 }); 460 }, 461 canGoBack: () => location.state[stateIndexKey] !== 0, 462 createHref: (str) => opts.createHref(str), 463 block: (blocker) => { 464 if (!opts.setBlockers) return () => { 465 }; 466 const blockers = opts.getBlockers?.() ?? []; 467 opts.setBlockers([...blockers, blocker]); 468 return () => { 469 const blockers2 = opts.getBlockers?.() ?? []; 470 opts.setBlockers?.(blockers2.filter((b) => b !== blocker)); 471 }; 472 }, 473 flush: () => opts.flush?.(), 474 destroy: () => opts.destroy?.(), 475 notify 476 }; 477 } 478 function assignKeyAndIndex(index, state) { 479 if (!state) { 480 state = {}; 481 } 482 const key = createRandomKey(); 483 return { 484 ...state, 485 key, 486 // TODO: Remove in v2 - use __TSR_key instead 487 __TSR_key: key, 488 [stateIndexKey]: index 489 }; 490 } 491 function createBrowserHistory(opts) { 492 const win = opts?.window ?? (typeof document !== "undefined" ? window : void 0); 493 const originalPushState = win.history.pushState; 494 const originalReplaceState = win.history.replaceState; 495 let blockers = []; 496 const _getBlockers = () => blockers; 497 const _setBlockers = (newBlockers) => blockers = newBlockers; 498 const createHref = opts?.createHref ?? ((path) => path); 499 const parseLocation = opts?.parseLocation ?? (() => parseHref( 500 `$win.location.pathname}$win.location.search}$win.location.hash}`, 501 win.history.state 502 )); 503 if (!win.history.state?.__TSR_key && !win.history.state?.key) { 504 const addedKey = createRandomKey(); 505 win.history.replaceState( 506 { 507 [stateIndexKey]: 0, 508 key: addedKey, 509 // TODO: Remove in v2 - use __TSR_key instead 510 __TSR_key: addedKey 511 }, 512 "" 513 ); 514 } 515 let currentLocation = parseLocation(); 516 let rollbackLocation; 517 let nextPopIsGo = false; 518 let ignoreNextPop = false; 519 let skipBlockerNextPop = false; 520 let ignoreNextBeforeUnload = false; 521 const getLocation = () => currentLocation; 522 let next; 523 let scheduled; 524 const flush = () => { 525 if (!next) { 526 return; 527 } 528 history._ignoreSubscribers = true; 529 (next.isPush ? win.history.pushState : win.history.replaceState)( 530 next.state, 531 "", 532 next.href 533 ); 534 history._ignoreSubscribers = false; 535 next = void 0; 536 scheduled = void 0; 537 rollbackLocation = void 0; 538 }; 539 const queueHistoryAction = (type, destHref, state) => { 540 const href = createHref(destHref); 541 if (!scheduled) { 542 rollbackLocation = currentLocation; 543 } 544 currentLocation = parseHref(destHref, state); 545 next = { 546 href, 547 state, 548 isPush: next?.isPush || type === "push" 549 }; 550 if (!scheduled) { 551 scheduled = Promise.resolve().then(() => flush()); 552 } 553 }; 554 const onPushPop = (type) => { 555 currentLocation = parseLocation(); 556 history.notify({ type }); 557 }; 558 const onPushPopEvent = async () => { 559 if (ignoreNextPop) { 560 ignoreNextPop = false; 561 return; 562 } 563 const nextLocation = parseLocation(); 564 const delta = nextLocation.state[stateIndexKey] - currentLocation.state[stateIndexKey]; 565 const isForward = delta === 1; 566 const isBack = delta === -1; 567 const isGo = !isForward && !isBack || nextPopIsGo; 568 nextPopIsGo = false; 569 const action = isGo ? "GO" : isBack ? "BACK" : "FORWARD"; 570 const notify = isGo ? { 571 type: "GO", 572 index: delta 573 } : { 574 type: isBack ? "BACK" : "FORWARD" 575 }; 576 if (skipBlockerNextPop) { 577 skipBlockerNextPop = false; 578 } else { 579 const blockers2 = _getBlockers(); 580 if (typeof document !== "undefined" && blockers2.length) { 581 for (const blocker of blockers2) { 582 const isBlocked = await blocker.blockerFn({ 583 currentLocation, 584 nextLocation, 585 action 586 }); 587 if (isBlocked) { 588 ignoreNextPop = true; 589 win.history.go(1); 590 history.notify(notify); 591 return; 592 } 593 } 594 } 595 } 596 currentLocation = parseLocation(); 597 history.notify(notify); 598 }; 599 const onBeforeUnload = (e) => { 600 if (ignoreNextBeforeUnload) { 601 ignoreNextBeforeUnload = false; 602 return; 603 } 604 let shouldBlock = false; 605 const blockers2 = _getBlockers(); 606 if (typeof document !== "undefined" && blockers2.length) { 607 for (const blocker of blockers2) { 608 const shouldHaveBeforeUnload = blocker.enableBeforeUnload ?? true; 609 if (shouldHaveBeforeUnload === true) { 610 shouldBlock = true; 611 break; 612 } 613 if (typeof shouldHaveBeforeUnload === "function" && shouldHaveBeforeUnload() === true) { 614 shouldBlock = true; 615 break; 616 } 617 } 618 } 619 if (shouldBlock) { 620 e.preventDefault(); 621 return e.returnValue = ""; 622 } 623 return; 624 }; 625 const history = createHistory({ 626 getLocation, 627 getLength: () => win.history.length, 628 pushState: (href, state) => queueHistoryAction("push", href, state), 629 replaceState: (href, state) => queueHistoryAction("replace", href, state), 630 back: (ignoreBlocker) => { 631 if (ignoreBlocker) skipBlockerNextPop = true; 632 ignoreNextBeforeUnload = true; 633 return win.history.back(); 634 }, 635 forward: (ignoreBlocker) => { 636 if (ignoreBlocker) skipBlockerNextPop = true; 637 ignoreNextBeforeUnload = true; 638 win.history.forward(); 639 }, 640 go: (n) => { 641 nextPopIsGo = true; 642 win.history.go(n); 643 }, 644 createHref: (href) => createHref(href), 645 flush, 646 destroy: () => { 647 win.history.pushState = originalPushState; 648 win.history.replaceState = originalReplaceState; 649 win.removeEventListener(beforeUnloadEvent, onBeforeUnload, { 650 capture: true 651 }); 652 win.removeEventListener(popStateEvent, onPushPopEvent); 653 }, 654 onBlocked: () => { 655 if (rollbackLocation && currentLocation !== rollbackLocation) { 656 currentLocation = rollbackLocation; 657 } 658 }, 659 getBlockers: _getBlockers, 660 setBlockers: _setBlockers, 661 notifyOnIndexChange: false 662 }); 663 win.addEventListener(beforeUnloadEvent, onBeforeUnload, { capture: true }); 664 win.addEventListener(popStateEvent, onPushPopEvent); 665 win.history.pushState = function(...args) { 666 const res = originalPushState.apply(win.history, args); 667 if (!history._ignoreSubscribers) onPushPop("PUSH"); 668 return res; 669 }; 670 win.history.replaceState = function(...args) { 671 const res = originalReplaceState.apply(win.history, args); 672 if (!history._ignoreSubscribers) onPushPop("REPLACE"); 673 return res; 674 }; 675 return history; 676 } 677 function createMemoryHistory(opts = { 678 initialEntries: ["/"] 679 }) { 680 const entries = opts.initialEntries; 681 let index = opts.initialIndex ? Math.min(Math.max(opts.initialIndex, 0), entries.length - 1) : entries.length - 1; 682 const states = entries.map( 683 (_entry, index2) => assignKeyAndIndex(index2, void 0) 684 ); 685 const getLocation = () => parseHref(entries[index], states[index]); 686 return createHistory({ 687 getLocation, 688 getLength: () => entries.length, 689 pushState: (path, state) => { 690 if (index < entries.length - 1) { 691 entries.splice(index + 1); 692 states.splice(index + 1); 693 } 694 states.push(state); 695 entries.push(path); 696 index = Math.max(entries.length - 1, 0); 697 }, 698 replaceState: (path, state) => { 699 states[index] = state; 700 entries[index] = path; 701 }, 702 back: () => { 703 index = Math.max(index - 1, 0); 704 }, 705 forward: () => { 706 index = Math.min(index + 1, entries.length - 1); 707 }, 708 go: (n) => { 709 index = Math.min(Math.max(index + n, 0), entries.length - 1); 710 }, 711 createHref: (path) => path 712 }); 713 } 714 function parseHref(href, state) { 715 const hashIndex = href.indexOf("#"); 716 const searchIndex = href.indexOf("?"); 717 const addedKey = createRandomKey(); 718 return { 719 href, 720 pathname: href.substring( 721 0, 722 hashIndex > 0 ? searchIndex > 0 ? Math.min(hashIndex, searchIndex) : hashIndex : searchIndex > 0 ? searchIndex : href.length 723 ), 724 hash: hashIndex > -1 ? href.substring(hashIndex) : "", 725 search: searchIndex > -1 ? href.slice(searchIndex, hashIndex === -1 ? void 0 : hashIndex) : "", 726 state: state || { [stateIndexKey]: 0, key: addedKey, __TSR_key: addedKey } 727 }; 728 } 729 function createRandomKey() { 730 return (Math.random() + 1).toString(36).substring(7); 731 } 732 733 // node_modules/@tanstack/router-core/dist/esm/utils.js 734 function last(arr) { 735 return arr[arr.length - 1]; 736 } 737 function isFunction(d) { 738 return typeof d === "function"; 739 } 740 function functionalUpdate(updater, previous) { 741 if (isFunction(updater)) { 742 return updater(previous); 743 } 744 return updater; 745 } 746 var hasOwn = Object.prototype.hasOwnProperty; 747 function replaceEqualDeep(prev, _next) { 748 if (prev === _next) { 749 return prev; 750 } 751 const next = _next; 752 const array = isPlainArray(prev) && isPlainArray(next); 753 if (!array && !(isPlainObject(prev) && isPlainObject(next))) return next; 754 const prevItems = array ? prev : getEnumerableOwnKeys(prev); 755 if (!prevItems) return next; 756 const nextItems = array ? next : getEnumerableOwnKeys(next); 757 if (!nextItems) return next; 758 const prevSize = prevItems.length; 759 const nextSize = nextItems.length; 760 const copy = array ? new Array(nextSize) : {}; 761 let equalItems = 0; 762 for (let i = 0; i < nextSize; i++) { 763 const key = array ? i : nextItems[i]; 764 const p = prev[key]; 765 const n = next[key]; 766 if (p === n) { 767 copy[key] = p; 768 if (array ? i < prevSize : hasOwn.call(prev, key)) equalItems++; 769 continue; 770 } 771 if (p === null || n === null || typeof p !== "object" || typeof n !== "object") { 772 copy[key] = n; 773 continue; 774 } 775 const v = replaceEqualDeep(p, n); 776 copy[key] = v; 777 if (v === p) equalItems++; 778 } 779 return prevSize === nextSize && equalItems === prevSize ? prev : copy; 780 } 781 function getEnumerableOwnKeys(o) { 782 const keys = []; 783 const names = Object.getOwnPropertyNames(o); 784 for (const name of names) { 785 if (!Object.prototype.propertyIsEnumerable.call(o, name)) return false; 786 keys.push(name); 787 } 788 const symbols = Object.getOwnPropertySymbols(o); 789 for (const symbol of symbols) { 790 if (!Object.prototype.propertyIsEnumerable.call(o, symbol)) return false; 791 keys.push(symbol); 792 } 793 return keys; 794 } 795 function isPlainObject(o) { 796 if (!hasObjectPrototype(o)) { 797 return false; 798 } 799 const ctor = o.constructor; 800 if (typeof ctor === "undefined") { 801 return true; 802 } 803 const prot = ctor.prototype; 804 if (!hasObjectPrototype(prot)) { 805 return false; 806 } 807 if (!prot.hasOwnProperty("isPrototypeOf")) { 808 return false; 809 } 810 return true; 811 } 812 function hasObjectPrototype(o) { 813 return Object.prototype.toString.call(o) === "[object Object]"; 814 } 815 function isPlainArray(value) { 816 return Array.isArray(value) && value.length === Object.keys(value).length; 817 } 818 function deepEqual(a, b, opts) { 819 if (a === b) { 820 return true; 821 } 822 if (typeof a !== typeof b) { 823 return false; 824 } 825 if (Array.isArray(a) && Array.isArray(b)) { 826 if (a.length !== b.length) return false; 827 for (let i = 0, l = a.length; i < l; i++) { 828 if (!deepEqual(a[i], b[i], opts)) return false; 829 } 830 return true; 831 } 832 if (isPlainObject(a) && isPlainObject(b)) { 833 const ignoreUndefined = opts?.ignoreUndefined ?? true; 834 if (opts?.partial) { 835 for (const k in b) { 836 if (!ignoreUndefined || b[k] !== void 0) { 837 if (!deepEqual(a[k], b[k], opts)) return false; 838 } 839 } 840 return true; 841 } 842 let aCount = 0; 843 if (!ignoreUndefined) { 844 aCount = Object.keys(a).length; 845 } else { 846 for (const k in a) { 847 if (a[k] !== void 0) aCount++; 848 } 849 } 850 let bCount = 0; 851 for (const k in b) { 852 if (!ignoreUndefined || b[k] !== void 0) { 853 bCount++; 854 if (bCount > aCount || !deepEqual(a[k], b[k], opts)) return false; 855 } 856 } 857 return aCount === bCount; 858 } 859 return false; 860 } 861 function createControlledPromise(onResolve) { 862 let resolveLoadPromise; 863 let rejectLoadPromise; 864 const controlledPromise = new Promise((resolve, reject) => { 865 resolveLoadPromise = resolve; 866 rejectLoadPromise = reject; 867 }); 868 controlledPromise.status = "pending"; 869 controlledPromise.resolve = (value) => { 870 controlledPromise.status = "resolved"; 871 controlledPromise.value = value; 872 resolveLoadPromise(value); 873 onResolve?.(value); 874 }; 875 controlledPromise.reject = (e) => { 876 controlledPromise.status = "rejected"; 877 rejectLoadPromise(e); 878 }; 879 return controlledPromise; 880 } 881 function isPromise(value) { 882 return Boolean( 883 value && typeof value === "object" && typeof value.then === "function" 884 ); 885 } 886 function findLast(array, predicate) { 887 for (let i = array.length - 1; i >= 0; i--) { 888 const item = array[i]; 889 if (predicate(item)) return item; 890 } 891 return void 0; 892 } 893 var DECODE_IGNORE_LIST = Array.from( 894 (/* @__PURE__ */ new Map([ 895 ["%", "%25"], 896 ["\\", "%5C"], 897 ["/", "%2F"], 898 [";", "%3B"], 899 [":", "%3A"], 900 ["@", "%40"], 901 ["&", "%26"], 902 ["=", "%3D"], 903 ["+", "%2B"], 904 ["$", "%24"], 905 [",", "%2C"] 906 ])).values() 907 ); 908 function decodePathSegment(part, decodeIgnore = DECODE_IGNORE_LIST, startIndex = 0) { 909 function decode2(part2) { 910 try { 911 return decodeURIComponent(part2); 912 } catch { 913 return part2.replaceAll(/%[0-9A-Fa-f]{2}/g, (match) => { 914 try { 915 return decodeURIComponent(match); 916 } catch { 917 return match; 918 } 919 }); 920 } 921 } 922 if (part === "" || !part.match(/%[0-9A-Fa-f]{2}/g)) return part; 923 for (let i = startIndex; i < decodeIgnore.length; i++) { 924 const char = decodeIgnore[i]; 925 if (char && part.includes(char)) { 926 const partsToDecode = part.split(char); 927 const partsToJoin = []; 928 for (const partToDecode of partsToDecode) { 929 partsToJoin.push(decodePathSegment(partToDecode, decodeIgnore, i + 1)); 930 } 931 return partsToJoin.join(char); 932 } 933 } 934 return decode2(part); 935 } 936 937 // node_modules/tiny-invariant/dist/esm/tiny-invariant.js 938 var isProduction = false; 939 var prefix = "Invariant failed"; 940 function invariant(condition, message) { 941 if (condition) { 942 return; 943 } 944 if (isProduction) { 945 throw new Error(prefix); 946 } 947 var provided = typeof message === "function" ? message() : message; 948 var value = provided ? "".concat(prefix, ": ").concat(provided) : prefix; 949 throw new Error(value); 950 } 951 952 // node_modules/@tanstack/router-core/dist/esm/path.js 953 var SEGMENT_TYPE_PATHNAME = 0; 954 var SEGMENT_TYPE_PARAM = 1; 955 var SEGMENT_TYPE_WILDCARD = 2; 956 var SEGMENT_TYPE_OPTIONAL_PARAM = 3; 957 function joinPaths(paths) { 958 return cleanPath( 959 paths.filter((val) => { 960 return val !== void 0; 961 }).join("/") 962 ); 963 } 964 function cleanPath(path) { 965 return path.replace(/\/{2,}/g, "/"); 966 } 967 function trimPathLeft(path) { 968 return path === "/" ? path : path.replace(/^\/{1,}/, ""); 969 } 970 function trimPathRight(path) { 971 return path === "/" ? path : path.replace(/\/{1,}$/, ""); 972 } 973 function trimPath(path) { 974 return trimPathRight(trimPathLeft(path)); 975 } 976 function removeTrailingSlash(value, basepath) { 977 if (value?.endsWith("/") && value !== "/" && value !== `$basepath}/`) { 978 return value.slice(0, -1); 979 } 980 return value; 981 } 982 function exactPathTest(pathName1, pathName2, basepath) { 983 return removeTrailingSlash(pathName1, basepath) === removeTrailingSlash(pathName2, basepath); 984 } 985 function segmentToString(segment) { 986 const { type, value } = segment; 987 if (type === SEGMENT_TYPE_PATHNAME) { 988 return value; 989 } 990 const { prefixSegment, suffixSegment } = segment; 991 if (type === SEGMENT_TYPE_PARAM) { 992 const param = value.substring(1); 993 if (prefixSegment && suffixSegment) { 994 return `$prefixSegment}{$$param}}$suffixSegment}`; 995 } else if (prefixSegment) { 996 return `$prefixSegment}{$$param}}`; 997 } else if (suffixSegment) { 998 return `{$$param}}$suffixSegment}`; 999 } 1000 } 1001 if (type === SEGMENT_TYPE_OPTIONAL_PARAM) { 1002 const param = value.substring(1); 1003 if (prefixSegment && suffixSegment) { 1004 return `$prefixSegment}{-$$param}}$suffixSegment}`; 1005 } else if (prefixSegment) { 1006 return `$prefixSegment}{-$$param}}`; 1007 } else if (suffixSegment) { 1008 return `{-$$param}}$suffixSegment}`; 1009 } 1010 return `{-$$param}}`; 1011 } 1012 if (type === SEGMENT_TYPE_WILDCARD) { 1013 if (prefixSegment && suffixSegment) { 1014 return `$prefixSegment}{$}$suffixSegment}`; 1015 } else if (prefixSegment) { 1016 return `$prefixSegment}{$}`; 1017 } else if (suffixSegment) { 1018 return `{$}$suffixSegment}`; 1019 } 1020 } 1021 return value; 1022 } 1023 function resolvePath({ 1024 base, 1025 to, 1026 trailingSlash = "never", 1027 parseCache 1028 }) { 1029 let baseSegments = parsePathname(base, parseCache).slice(); 1030 const toSegments = parsePathname(to, parseCache); 1031 if (baseSegments.length > 1 && last(baseSegments)?.value === "/") { 1032 baseSegments.pop(); 1033 } 1034 for (let index = 0, length = toSegments.length; index < length; index++) { 1035 const toSegment = toSegments[index]; 1036 const value = toSegment.value; 1037 if (value === "/") { 1038 if (!index) { 1039 baseSegments = [toSegment]; 1040 } else if (index === length - 1) { 1041 baseSegments.push(toSegment); 1042 } else ; 1043 } else if (value === "..") { 1044 baseSegments.pop(); 1045 } else if (value === ".") ; 1046 else { 1047 baseSegments.push(toSegment); 1048 } 1049 } 1050 if (baseSegments.length > 1) { 1051 if (last(baseSegments).value === "/") { 1052 if (trailingSlash === "never") { 1053 baseSegments.pop(); 1054 } 1055 } else if (trailingSlash === "always") { 1056 baseSegments.push({ type: SEGMENT_TYPE_PATHNAME, value: "/" }); 1057 } 1058 } 1059 const segmentValues = baseSegments.map(segmentToString); 1060 const joined = joinPaths(segmentValues); 1061 return joined; 1062 } 1063 var parsePathname = (pathname, cache) => { 1064 if (!pathname) return []; 1065 const cached = cache?.get(pathname); 1066 if (cached) return cached; 1067 const parsed = baseParsePathname(pathname); 1068 cache?.set(pathname, parsed); 1069 return parsed; 1070 }; 1071 var PARAM_RE = /^\$.{1,}$/; 1072 var PARAM_W_CURLY_BRACES_RE = /^(.*?)\{(\$[a-zA-Z_$][a-zA-Z0-9_$]*)\}(.*)$/; 1073 var OPTIONAL_PARAM_W_CURLY_BRACES_RE = /^(.*?)\{-(\$[a-zA-Z_$][a-zA-Z0-9_$]*)\}(.*)$/; 1074 var WILDCARD_RE = /^\$$/; 1075 var WILDCARD_W_CURLY_BRACES_RE = /^(.*?)\{\$\}(.*)$/; 1076 function baseParsePathname(pathname) { 1077 pathname = cleanPath(pathname); 1078 const segments = []; 1079 if (pathname.slice(0, 1) === "/") { 1080 pathname = pathname.substring(1); 1081 segments.push({ 1082 type: SEGMENT_TYPE_PATHNAME, 1083 value: "/" 1084 }); 1085 } 1086 if (!pathname) { 1087 return segments; 1088 } 1089 const split = pathname.split("/").filter(Boolean); 1090 segments.push( 1091 ...split.map((part) => { 1092 const wildcardBracesMatch = part.match(WILDCARD_W_CURLY_BRACES_RE); 1093 if (wildcardBracesMatch) { 1094 const prefix2 = wildcardBracesMatch[1]; 1095 const suffix = wildcardBracesMatch[2]; 1096 return { 1097 type: SEGMENT_TYPE_WILDCARD, 1098 value: "$", 1099 prefixSegment: prefix2 || void 0, 1100 suffixSegment: suffix || void 0 1101 }; 1102 } 1103 const optionalParamBracesMatch = part.match( 1104 OPTIONAL_PARAM_W_CURLY_BRACES_RE 1105 ); 1106 if (optionalParamBracesMatch) { 1107 const prefix2 = optionalParamBracesMatch[1]; 1108 const paramName = optionalParamBracesMatch[2]; 1109 const suffix = optionalParamBracesMatch[3]; 1110 return { 1111 type: SEGMENT_TYPE_OPTIONAL_PARAM, 1112 value: paramName, 1113 // Now just $paramName (no prefix) 1114 prefixSegment: prefix2 || void 0, 1115 suffixSegment: suffix || void 0 1116 }; 1117 } 1118 const paramBracesMatch = part.match(PARAM_W_CURLY_BRACES_RE); 1119 if (paramBracesMatch) { 1120 const prefix2 = paramBracesMatch[1]; 1121 const paramName = paramBracesMatch[2]; 1122 const suffix = paramBracesMatch[3]; 1123 return { 1124 type: SEGMENT_TYPE_PARAM, 1125 value: "" + paramName, 1126 prefixSegment: prefix2 || void 0, 1127 suffixSegment: suffix || void 0 1128 }; 1129 } 1130 if (PARAM_RE.test(part)) { 1131 const paramName = part.substring(1); 1132 return { 1133 type: SEGMENT_TYPE_PARAM, 1134 value: "$" + paramName, 1135 prefixSegment: void 0, 1136 suffixSegment: void 0 1137 }; 1138 } 1139 if (WILDCARD_RE.test(part)) { 1140 return { 1141 type: SEGMENT_TYPE_WILDCARD, 1142 value: "$", 1143 prefixSegment: void 0, 1144 suffixSegment: void 0 1145 }; 1146 } 1147 return { 1148 type: SEGMENT_TYPE_PATHNAME, 1149 value: decodePathSegment(part) 1150 }; 1151 }) 1152 ); 1153 if (pathname.slice(-1) === "/") { 1154 pathname = pathname.substring(1); 1155 segments.push({ 1156 type: SEGMENT_TYPE_PATHNAME, 1157 value: "/" 1158 }); 1159 } 1160 return segments; 1161 } 1162 function interpolatePath({ 1163 path, 1164 params, 1165 leaveWildcards, 1166 leaveParams, 1167 decodeCharMap, 1168 parseCache 1169 }) { 1170 const interpolatedPathSegments = parsePathname(path, parseCache); 1171 function encodeParam(key) { 1172 const value = params[key]; 1173 const isValueString = typeof value === "string"; 1174 if (key === "*" || key === "_splat") { 1175 return isValueString ? encodeURI(value) : value; 1176 } else { 1177 return isValueString ? encodePathParam(value, decodeCharMap) : value; 1178 } 1179 } 1180 let isMissingParams = false; 1181 const usedParams = {}; 1182 const interpolatedPath = joinPaths( 1183 interpolatedPathSegments.map((segment) => { 1184 if (segment.type === SEGMENT_TYPE_PATHNAME) { 1185 return segment.value; 1186 } 1187 if (segment.type === SEGMENT_TYPE_WILDCARD) { 1188 usedParams._splat = params._splat; 1189 usedParams["*"] = params._splat; 1190 const segmentPrefix = segment.prefixSegment || ""; 1191 const segmentSuffix = segment.suffixSegment || ""; 1192 if (!params._splat) { 1193 isMissingParams = true; 1194 if (leaveWildcards) { 1195 return `$segmentPrefix}$segment.value}$segmentSuffix}`; 1196 } 1197 if (segmentPrefix || segmentSuffix) { 1198 return `$segmentPrefix}$segmentSuffix}`; 1199 } 1200 return void 0; 1201 } 1202 const value = encodeParam("_splat"); 1203 if (leaveWildcards) { 1204 return `$segmentPrefix}$segment.value}$value ?? ""}$segmentSuffix}`; 1205 } 1206 return `$segmentPrefix}$value}$segmentSuffix}`; 1207 } 1208 if (segment.type === SEGMENT_TYPE_PARAM) { 1209 const key = segment.value.substring(1); 1210 if (!isMissingParams && !(key in params)) { 1211 isMissingParams = true; 1212 } 1213 usedParams[key] = params[key]; 1214 const segmentPrefix = segment.prefixSegment || ""; 1215 const segmentSuffix = segment.suffixSegment || ""; 1216 if (leaveParams) { 1217 const value = encodeParam(segment.value); 1218 return `$segmentPrefix}$segment.value}$value ?? ""}$segmentSuffix}`; 1219 } 1220 return `$segmentPrefix}$encodeParam(key) ?? "undefined"}$segmentSuffix}`; 1221 } 1222 if (segment.type === SEGMENT_TYPE_OPTIONAL_PARAM) { 1223 const key = segment.value.substring(1); 1224 const segmentPrefix = segment.prefixSegment || ""; 1225 const segmentSuffix = segment.suffixSegment || ""; 1226 if (!(key in params) || params[key] == null) { 1227 if (leaveWildcards) { 1228 return `$segmentPrefix}$key}$segmentSuffix}`; 1229 } 1230 if (segmentPrefix || segmentSuffix) { 1231 return `$segmentPrefix}$segmentSuffix}`; 1232 } 1233 return void 0; 1234 } 1235 usedParams[key] = params[key]; 1236 if (leaveParams) { 1237 const value = encodeParam(segment.value); 1238 return `$segmentPrefix}$segment.value}$value ?? ""}$segmentSuffix}`; 1239 } 1240 if (leaveWildcards) { 1241 return `$segmentPrefix}$key}$encodeParam(key) ?? ""}$segmentSuffix}`; 1242 } 1243 return `$segmentPrefix}$encodeParam(key) ?? ""}$segmentSuffix}`; 1244 } 1245 return segment.value; 1246 }) 1247 ); 1248 return { usedParams, interpolatedPath, isMissingParams }; 1249 } 1250 function encodePathParam(value, decodeCharMap) { 1251 let encoded = encodeURIComponent(value); 1252 if (decodeCharMap) { 1253 for (const [encodedChar, char] of decodeCharMap) { 1254 encoded = encoded.replaceAll(encodedChar, char); 1255 } 1256 } 1257 return encoded; 1258 } 1259 function matchPathname(currentPathname, matchLocation, parseCache) { 1260 const pathParams = matchByPath(currentPathname, matchLocation, parseCache); 1261 if (matchLocation.to && !pathParams) { 1262 return; 1263 } 1264 return pathParams ?? {}; 1265 } 1266 function matchByPath(from, { 1267 to, 1268 fuzzy, 1269 caseSensitive 1270 }, parseCache) { 1271 const stringTo = to; 1272 const baseSegments = parsePathname( 1273 from.startsWith("/") ? from : `/$from}`, 1274 parseCache 1275 ); 1276 const routeSegments = parsePathname( 1277 stringTo.startsWith("/") ? stringTo : `/$stringTo}`, 1278 parseCache 1279 ); 1280 const params = {}; 1281 const result = isMatch( 1282 baseSegments, 1283 routeSegments, 1284 params, 1285 fuzzy, 1286 caseSensitive 1287 ); 1288 return result ? params : void 0; 1289 } 1290 function isMatch(baseSegments, routeSegments, params, fuzzy, caseSensitive) { 1291 let baseIndex = 0; 1292 let routeIndex = 0; 1293 while (baseIndex < baseSegments.length || routeIndex < routeSegments.length) { 1294 const baseSegment = baseSegments[baseIndex]; 1295 const routeSegment = routeSegments[routeIndex]; 1296 if (routeSegment) { 1297 if (routeSegment.type === SEGMENT_TYPE_WILDCARD) { 1298 const remainingBaseSegments = baseSegments.slice(baseIndex); 1299 let _splat; 1300 if (routeSegment.prefixSegment || routeSegment.suffixSegment) { 1301 if (!baseSegment) return false; 1302 const prefix2 = routeSegment.prefixSegment || ""; 1303 const suffix = routeSegment.suffixSegment || ""; 1304 const baseValue = baseSegment.value; 1305 if ("prefixSegment" in routeSegment) { 1306 if (!baseValue.startsWith(prefix2)) { 1307 return false; 1308 } 1309 } 1310 if ("suffixSegment" in routeSegment) { 1311 if (!baseSegments[baseSegments.length - 1]?.value.endsWith(suffix)) { 1312 return false; 1313 } 1314 } 1315 let rejoinedSplat = decodeURI( 1316 joinPaths(remainingBaseSegments.map((d) => d.value)) 1317 ); 1318 if (prefix2 && rejoinedSplat.startsWith(prefix2)) { 1319 rejoinedSplat = rejoinedSplat.slice(prefix2.length); 1320 } 1321 if (suffix && rejoinedSplat.endsWith(suffix)) { 1322 rejoinedSplat = rejoinedSplat.slice( 1323 0, 1324 rejoinedSplat.length - suffix.length 1325 ); 1326 } 1327 _splat = rejoinedSplat; 1328 } else { 1329 _splat = decodeURI( 1330 joinPaths(remainingBaseSegments.map((d) => d.value)) 1331 ); 1332 } 1333 params["*"] = _splat; 1334 params["_splat"] = _splat; 1335 return true; 1336 } 1337 if (routeSegment.type === SEGMENT_TYPE_PATHNAME) { 1338 if (routeSegment.value === "/" && !baseSegment?.value) { 1339 routeIndex++; 1340 continue; 1341 } 1342 if (baseSegment) { 1343 if (caseSensitive) { 1344 if (routeSegment.value !== baseSegment.value) { 1345 return false; 1346 } 1347 } else if (routeSegment.value.toLowerCase() !== baseSegment.value.toLowerCase()) { 1348 return false; 1349 } 1350 baseIndex++; 1351 routeIndex++; 1352 continue; 1353 } else { 1354 return false; 1355 } 1356 } 1357 if (routeSegment.type === SEGMENT_TYPE_PARAM) { 1358 if (!baseSegment) { 1359 return false; 1360 } 1361 if (baseSegment.value === "/") { 1362 return false; 1363 } 1364 let _paramValue = ""; 1365 let matched = false; 1366 if (routeSegment.prefixSegment || routeSegment.suffixSegment) { 1367 const prefix2 = routeSegment.prefixSegment || ""; 1368 const suffix = routeSegment.suffixSegment || ""; 1369 const baseValue = baseSegment.value; 1370 if (prefix2 && !baseValue.startsWith(prefix2)) { 1371 return false; 1372 } 1373 if (suffix && !baseValue.endsWith(suffix)) { 1374 return false; 1375 } 1376 let paramValue = baseValue; 1377 if (prefix2 && paramValue.startsWith(prefix2)) { 1378 paramValue = paramValue.slice(prefix2.length); 1379 } 1380 if (suffix && paramValue.endsWith(suffix)) { 1381 paramValue = paramValue.slice(0, paramValue.length - suffix.length); 1382 } 1383 _paramValue = decodeURIComponent(paramValue); 1384 matched = true; 1385 } else { 1386 _paramValue = decodeURIComponent(baseSegment.value); 1387 matched = true; 1388 } 1389 if (matched) { 1390 params[routeSegment.value.substring(1)] = _paramValue; 1391 baseIndex++; 1392 } 1393 routeIndex++; 1394 continue; 1395 } 1396 if (routeSegment.type === SEGMENT_TYPE_OPTIONAL_PARAM) { 1397 if (!baseSegment) { 1398 routeIndex++; 1399 continue; 1400 } 1401 if (baseSegment.value === "/") { 1402 routeIndex++; 1403 continue; 1404 } 1405 let _paramValue = ""; 1406 let matched = false; 1407 if (routeSegment.prefixSegment || routeSegment.suffixSegment) { 1408 const prefix2 = routeSegment.prefixSegment || ""; 1409 const suffix = routeSegment.suffixSegment || ""; 1410 const baseValue = baseSegment.value; 1411 if ((!prefix2 || baseValue.startsWith(prefix2)) && (!suffix || baseValue.endsWith(suffix))) { 1412 let paramValue = baseValue; 1413 if (prefix2 && paramValue.startsWith(prefix2)) { 1414 paramValue = paramValue.slice(prefix2.length); 1415 } 1416 if (suffix && paramValue.endsWith(suffix)) { 1417 paramValue = paramValue.slice( 1418 0, 1419 paramValue.length - suffix.length 1420 ); 1421 } 1422 _paramValue = decodeURIComponent(paramValue); 1423 matched = true; 1424 } 1425 } else { 1426 let shouldMatchOptional = true; 1427 for (let lookAhead = routeIndex + 1; lookAhead < routeSegments.length; lookAhead++) { 1428 const futureRouteSegment = routeSegments[lookAhead]; 1429 if (futureRouteSegment?.type === SEGMENT_TYPE_PATHNAME && futureRouteSegment.value === baseSegment.value) { 1430 shouldMatchOptional = false; 1431 break; 1432 } 1433 if (futureRouteSegment?.type === SEGMENT_TYPE_PARAM || futureRouteSegment?.type === SEGMENT_TYPE_WILDCARD) { 1434 if (baseSegments.length < routeSegments.length) { 1435 shouldMatchOptional = false; 1436 } 1437 break; 1438 } 1439 } 1440 if (shouldMatchOptional) { 1441 _paramValue = decodeURIComponent(baseSegment.value); 1442 matched = true; 1443 } 1444 } 1445 if (matched) { 1446 params[routeSegment.value.substring(1)] = _paramValue; 1447 baseIndex++; 1448 } 1449 routeIndex++; 1450 continue; 1451 } 1452 } 1453 if (baseIndex < baseSegments.length && routeIndex >= routeSegments.length) { 1454 params["**"] = joinPaths( 1455 baseSegments.slice(baseIndex).map((d) => d.value) 1456 ); 1457 return !!fuzzy && routeSegments[routeSegments.length - 1]?.value !== "/"; 1458 } 1459 if (routeIndex < routeSegments.length && baseIndex >= baseSegments.length) { 1460 for (let i = routeIndex; i < routeSegments.length; i++) { 1461 if (routeSegments[i]?.type !== SEGMENT_TYPE_OPTIONAL_PARAM) { 1462 return false; 1463 } 1464 } 1465 break; 1466 } 1467 break; 1468 } 1469 return true; 1470 } 1471 1472 // node_modules/@tanstack/router-core/dist/esm/process-route-tree.js 1473 var SLASH_SCORE = 0.75; 1474 var STATIC_SEGMENT_SCORE = 1; 1475 var REQUIRED_PARAM_BASE_SCORE = 0.5; 1476 var OPTIONAL_PARAM_BASE_SCORE = 0.4; 1477 var WILDCARD_PARAM_BASE_SCORE = 0.25; 1478 var STATIC_AFTER_DYNAMIC_BONUS_SCORE = 0.2; 1479 var BOTH_PRESENCE_BASE_SCORE = 0.05; 1480 var PREFIX_PRESENCE_BASE_SCORE = 0.02; 1481 var SUFFIX_PRESENCE_BASE_SCORE = 0.01; 1482 var PREFIX_LENGTH_SCORE_MULTIPLIER = 2e-4; 1483 var SUFFIX_LENGTH_SCORE_MULTIPLIER = 1e-4; 1484 function handleParam(segment, baseScore) { 1485 if (segment.prefixSegment && segment.suffixSegment) { 1486 return baseScore + BOTH_PRESENCE_BASE_SCORE + PREFIX_LENGTH_SCORE_MULTIPLIER * segment.prefixSegment.length + SUFFIX_LENGTH_SCORE_MULTIPLIER * segment.suffixSegment.length; 1487 } 1488 if (segment.prefixSegment) { 1489 return baseScore + PREFIX_PRESENCE_BASE_SCORE + PREFIX_LENGTH_SCORE_MULTIPLIER * segment.prefixSegment.length; 1490 } 1491 if (segment.suffixSegment) { 1492 return baseScore + SUFFIX_PRESENCE_BASE_SCORE + SUFFIX_LENGTH_SCORE_MULTIPLIER * segment.suffixSegment.length; 1493 } 1494 return baseScore; 1495 } 1496 function sortRoutes(routes) { 1497 const scoredRoutes = []; 1498 routes.forEach((d, i) => { 1499 if (d.isRoot || !d.path) { 1500 return; 1501 } 1502 const trimmed = trimPathLeft(d.fullPath); 1503 let parsed = parsePathname(trimmed); 1504 let skip = 0; 1505 while (parsed.length > skip + 1 && parsed[skip]?.value === "/") { 1506 skip++; 1507 } 1508 if (skip > 0) parsed = parsed.slice(skip); 1509 let optionalParamCount = 0; 1510 let hasStaticAfter = false; 1511 const scores = parsed.map((segment, index) => { 1512 if (segment.value === "/") { 1513 return SLASH_SCORE; 1514 } 1515 if (segment.type === SEGMENT_TYPE_PATHNAME) { 1516 return STATIC_SEGMENT_SCORE; 1517 } 1518 let baseScore = void 0; 1519 if (segment.type === SEGMENT_TYPE_PARAM) { 1520 baseScore = REQUIRED_PARAM_BASE_SCORE; 1521 } else if (segment.type === SEGMENT_TYPE_OPTIONAL_PARAM) { 1522 baseScore = OPTIONAL_PARAM_BASE_SCORE; 1523 optionalParamCount++; 1524 } else { 1525 baseScore = WILDCARD_PARAM_BASE_SCORE; 1526 } 1527 for (let i2 = index + 1; i2 < parsed.length; i2++) { 1528 const nextSegment = parsed[i2]; 1529 if (nextSegment.type === SEGMENT_TYPE_PATHNAME && nextSegment.value !== "/") { 1530 hasStaticAfter = true; 1531 return handleParam( 1532 segment, 1533 baseScore + STATIC_AFTER_DYNAMIC_BONUS_SCORE 1534 ); 1535 } 1536 } 1537 return handleParam(segment, baseScore); 1538 }); 1539 scoredRoutes.push({ 1540 child: d, 1541 trimmed, 1542 parsed, 1543 index: i, 1544 scores, 1545 optionalParamCount, 1546 hasStaticAfter 1547 }); 1548 }); 1549 const flatRoutes = scoredRoutes.sort((a, b) => { 1550 const minLength = Math.min(a.scores.length, b.scores.length); 1551 for (let i = 0; i < minLength; i++) { 1552 if (a.scores[i] !== b.scores[i]) { 1553 return b.scores[i] - a.scores[i]; 1554 } 1555 } 1556 if (a.scores.length !== b.scores.length) { 1557 if (a.optionalParamCount !== b.optionalParamCount) { 1558 if (a.hasStaticAfter === b.hasStaticAfter) { 1559 return a.optionalParamCount - b.optionalParamCount; 1560 } else if (a.hasStaticAfter && !b.hasStaticAfter) { 1561 return -1; 1562 } else if (!a.hasStaticAfter && b.hasStaticAfter) { 1563 return 1; 1564 } 1565 } 1566 return b.scores.length - a.scores.length; 1567 } 1568 for (let i = 0; i < minLength; i++) { 1569 if (a.parsed[i].value !== b.parsed[i].value) { 1570 return a.parsed[i].value > b.parsed[i].value ? 1 : -1; 1571 } 1572 } 1573 return a.index - b.index; 1574 }).map((d, i) => { 1575 d.child.rank = i; 1576 return d.child; 1577 }); 1578 return flatRoutes; 1579 } 1580 function processRouteTree({ 1581 routeTree, 1582 initRoute 1583 }) { 1584 const routesById = {}; 1585 const routesByPath = {}; 1586 const recurseRoutes = (childRoutes) => { 1587 childRoutes.forEach((childRoute, i) => { 1588 initRoute?.(childRoute, i); 1589 const existingRoute = routesById[childRoute.id]; 1590 invariant( 1591 !existingRoute, 1592 `Duplicate routes found with id: $String(childRoute.id)}` 1593 ); 1594 routesById[childRoute.id] = childRoute; 1595 if (!childRoute.isRoot && childRoute.path) { 1596 const trimmedFullPath = trimPathRight(childRoute.fullPath); 1597 if (!routesByPath[trimmedFullPath] || childRoute.fullPath.endsWith("/")) { 1598 routesByPath[trimmedFullPath] = childRoute; 1599 } 1600 } 1601 const children = childRoute.children; 1602 if (children?.length) { 1603 recurseRoutes(children); 1604 } 1605 }); 1606 }; 1607 recurseRoutes([routeTree]); 1608 const flatRoutes = sortRoutes(Object.values(routesById)); 1609 return { routesById, routesByPath, flatRoutes }; 1610 } 1611 1612 // node_modules/@tanstack/router-core/dist/esm/not-found.js 1613 function notFound(options = {}) { 1614 options.isNotFound = true; 1615 if (options.throw) throw options; 1616 return options; 1617 } 1618 function isNotFound(obj) { 1619 return !!obj?.isNotFound; 1620 } 1621 1622 // node_modules/@tanstack/router-core/dist/esm/scroll-restoration.js 1623 function getSafeSessionStorage() { 1624 try { 1625 if (typeof window !== "undefined" && typeof window.sessionStorage === "object") { 1626 return window.sessionStorage; 1627 } 1628 } catch { 1629 } 1630 return void 0; 1631 } 1632 var storageKey = "tsr-scroll-restoration-v1_3"; 1633 var throttle = (fn, wait) => { 1634 let timeout; 1635 return (...args) => { 1636 if (!timeout) { 1637 timeout = setTimeout(() => { 1638 fn(...args); 1639 timeout = null; 1640 }, wait); 1641 } 1642 }; 1643 }; 1644 function createScrollRestorationCache() { 1645 const safeSessionStorage = getSafeSessionStorage(); 1646 if (!safeSessionStorage) { 1647 return null; 1648 } 1649 const persistedState = safeSessionStorage.getItem(storageKey); 1650 let state = persistedState ? JSON.parse(persistedState) : {}; 1651 return { 1652 state, 1653 // This setter is simply to make sure that we set the sessionStorage right 1654 // after the state is updated. It doesn't necessarily need to be a functional 1655 // update. 1656 set: (updater) => (state = functionalUpdate(updater, state) || state, safeSessionStorage.setItem(storageKey, JSON.stringify(state))) 1657 }; 1658 } 1659 var scrollRestorationCache = createScrollRestorationCache(); 1660 var defaultGetScrollRestorationKey = (location) => { 1661 return location.state.__TSR_key || location.href; 1662 }; 1663 function getCssSelector(el) { 1664 const path = []; 1665 let parent; 1666 while (parent = el.parentNode) { 1667 path.push( 1668 `$el.tagName}:nth-child($Array.prototype.indexOf.call(parent.children, el) + 1})` 1669 ); 1670 el = parent; 1671 } 1672 return `$path.reverse().join(" > ")}`.toLowerCase(); 1673 } 1674 var ignoreScroll = false; 1675 function restoreScroll({ 1676 storageKey: storageKey2, 1677 key, 1678 behavior, 1679 shouldScrollRestoration, 1680 scrollToTopSelectors, 1681 location 1682 }) { 1683 let byKey; 1684 try { 1685 byKey = JSON.parse(sessionStorage.getItem(storageKey2) || "{}"); 1686 } catch (error) { 1687 console.error(error); 1688 return; 1689 } 1690 const resolvedKey = key || window.history.state?.__TSR_key; 1691 const elementEntries = byKey[resolvedKey]; 1692 ignoreScroll = true; 1693 scroll: { 1694 if (shouldScrollRestoration && elementEntries && Object.keys(elementEntries).length > 0) { 1695 for (const elementSelector in elementEntries) { 1696 const entry = elementEntries[elementSelector]; 1697 if (elementSelector === "window") { 1698 window.scrollTo({ 1699 top: entry.scrollY, 1700 left: entry.scrollX, 1701 behavior 1702 }); 1703 } else if (elementSelector) { 1704 const element = document.querySelector(elementSelector); 1705 if (element) { 1706 element.scrollLeft = entry.scrollX; 1707 element.scrollTop = entry.scrollY; 1708 } 1709 } 1710 } 1711 break scroll; 1712 } 1713 const hash = (location ?? window.location).hash.split("#", 2)[1]; 1714 if (hash) { 1715 const hashScrollIntoViewOptions = window.history.state?.__hashScrollIntoViewOptions ?? true; 1716 if (hashScrollIntoViewOptions) { 1717 const el = document.getElementById(hash); 1718 if (el) { 1719 el.scrollIntoView(hashScrollIntoViewOptions); 1720 } 1721 } 1722 break scroll; 1723 } 1724 const scrollOptions = { top: 0, left: 0, behavior }; 1725 window.scrollTo(scrollOptions); 1726 if (scrollToTopSelectors) { 1727 for (const selector of scrollToTopSelectors) { 1728 if (selector === "window") continue; 1729 const element = typeof selector === "function" ? selector() : document.querySelector(selector); 1730 if (element) element.scrollTo(scrollOptions); 1731 } 1732 } 1733 } 1734 ignoreScroll = false; 1735 } 1736 function setupScrollRestoration(router, force) { 1737 if (!scrollRestorationCache && !router.isServer) { 1738 return; 1739 } 1740 const shouldScrollRestoration = force ?? router.options.scrollRestoration ?? false; 1741 if (shouldScrollRestoration) { 1742 router.isScrollRestoring = true; 1743 } 1744 if (router.isServer || router.isScrollRestorationSetup || !scrollRestorationCache) { 1745 return; 1746 } 1747 router.isScrollRestorationSetup = true; 1748 ignoreScroll = false; 1749 const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey; 1750 window.history.scrollRestoration = "manual"; 1751 const onScroll = (event) => { 1752 if (ignoreScroll || !router.isScrollRestoring) { 1753 return; 1754 } 1755 let elementSelector = ""; 1756 if (event.target === document || event.target === window) { 1757 elementSelector = "window"; 1758 } else { 1759 const attrId = event.target.getAttribute( 1760 "data-scroll-restoration-id" 1761 ); 1762 if (attrId) { 1763 elementSelector = `[data-scroll-restoration-id="$attrId}"]`; 1764 } else { 1765 elementSelector = getCssSelector(event.target); 1766 } 1767 } 1768 const restoreKey = getKey(router.state.location); 1769 scrollRestorationCache.set((state) => { 1770 const keyEntry = state[restoreKey] ||= {}; 1771 const elementEntry = keyEntry[elementSelector] ||= {}; 1772 if (elementSelector === "window") { 1773 elementEntry.scrollX = window.scrollX || 0; 1774 elementEntry.scrollY = window.scrollY || 0; 1775 } else if (elementSelector) { 1776 const element = document.querySelector(elementSelector); 1777 if (element) { 1778 elementEntry.scrollX = element.scrollLeft || 0; 1779 elementEntry.scrollY = element.scrollTop || 0; 1780 } 1781 } 1782 return state; 1783 }); 1784 }; 1785 if (typeof document !== "undefined") { 1786 document.addEventListener("scroll", throttle(onScroll, 100), true); 1787 } 1788 router.subscribe("onRendered", (event) => { 1789 const cacheKey = getKey(event.toLocation); 1790 if (!router.resetNextScroll) { 1791 router.resetNextScroll = true; 1792 return; 1793 } 1794 if (typeof router.options.scrollRestoration === "function") { 1795 const shouldRestore = router.options.scrollRestoration({ 1796 location: router.latestLocation 1797 }); 1798 if (!shouldRestore) { 1799 return; 1800 } 1801 } 1802 restoreScroll({ 1803 storageKey, 1804 key: cacheKey, 1805 behavior: router.options.scrollRestorationBehavior, 1806 shouldScrollRestoration: router.isScrollRestoring, 1807 scrollToTopSelectors: router.options.scrollToTopSelectors, 1808 location: router.history.location 1809 }); 1810 if (router.isScrollRestoring) { 1811 scrollRestorationCache.set((state) => { 1812 state[cacheKey] ||= {}; 1813 return state; 1814 }); 1815 } 1816 }); 1817 } 1818 function handleHashScroll(router) { 1819 if (typeof document !== "undefined" && document.querySelector) { 1820 const hashScrollIntoViewOptions = router.state.location.state.__hashScrollIntoViewOptions ?? true; 1821 if (hashScrollIntoViewOptions && router.state.location.hash !== "") { 1822 const el = document.getElementById(router.state.location.hash); 1823 if (el) { 1824 el.scrollIntoView(hashScrollIntoViewOptions); 1825 } 1826 } 1827 } 1828 } 1829 1830 // node_modules/@tanstack/router-core/dist/esm/qss.js 1831 function encode(obj, stringify = String) { 1832 const result = new URLSearchParams(); 1833 for (const key in obj) { 1834 const val = obj[key]; 1835 if (val !== void 0) { 1836 result.set(key, stringify(val)); 1837 } 1838 } 1839 return result.toString(); 1840 } 1841 function toValue(str) { 1842 if (!str) return ""; 1843 if (str === "false") return false; 1844 if (str === "true") return true; 1845 return +str * 0 === 0 && +str + "" === str ? +str : str; 1846 } 1847 function decode(str) { 1848 const searchParams = new URLSearchParams(str); 1849 const result = {}; 1850 for (const [key, value] of searchParams.entries()) { 1851 const previousValue = result[key]; 1852 if (previousValue == null) { 1853 result[key] = toValue(value); 1854 } else if (Array.isArray(previousValue)) { 1855 previousValue.push(toValue(value)); 1856 } else { 1857 result[key] = [previousValue, toValue(value)]; 1858 } 1859 } 1860 return result; 1861 } 1862 1863 // node_modules/@tanstack/router-core/dist/esm/searchParams.js 1864 var defaultParseSearch = parseSearchWith(JSON.parse); 1865 var defaultStringifySearch = stringifySearchWith( 1866 JSON.stringify, 1867 JSON.parse 1868 ); 1869 function parseSearchWith(parser) { 1870 return (searchStr) => { 1871 if (searchStr[0] === "?") { 1872 searchStr = searchStr.substring(1); 1873 } 1874 const query = decode(searchStr); 1875 for (const key in query) { 1876 const value = query[key]; 1877 if (typeof value === "string") { 1878 try { 1879 query[key] = parser(value); 1880 } catch (_err) { 1881 } 1882 } 1883 } 1884 return query; 1885 }; 1886 } 1887 function stringifySearchWith(stringify, parser) { 1888 const hasParser = typeof parser === "function"; 1889 function stringifyValue(val) { 1890 if (typeof val === "object" && val !== null) { 1891 try { 1892 return stringify(val); 1893 } catch (_err) { 1894 } 1895 } else if (hasParser && typeof val === "string") { 1896 try { 1897 parser(val); 1898 return stringify(val); 1899 } catch (_err) { 1900 } 1901 } 1902 return val; 1903 } 1904 return (search) => { 1905 const searchStr = encode(search, stringifyValue); 1906 return searchStr ? `?$searchStr}` : ""; 1907 }; 1908 } 1909 1910 // node_modules/@tanstack/router-core/dist/esm/root.js 1911 var rootRouteId = "__root__"; 1912 1913 // node_modules/@tanstack/router-core/dist/esm/redirect.js 1914 function redirect(opts) { 1915 opts.statusCode = opts.statusCode || opts.code || 307; 1916 if (!opts.reloadDocument && typeof opts.href === "string") { 1917 try { 1918 new URL(opts.href); 1919 opts.reloadDocument = true; 1920 } catch { 1921 } 1922 } 1923 const headers = new Headers(opts.headers); 1924 if (opts.href && headers.get("Location") === null) { 1925 headers.set("Location", opts.href); 1926 } 1927 const response = new Response(null, { 1928 status: opts.statusCode, 1929 headers 1930 }); 1931 response.options = opts; 1932 if (opts.throw) { 1933 throw response; 1934 } 1935 return response; 1936 } 1937 function isRedirect(obj) { 1938 return obj instanceof Response && !!obj.options; 1939 } 1940 1941 // node_modules/@tanstack/router-core/dist/esm/lru-cache.js 1942 function createLRUCache(max) { 1943 const cache = /* @__PURE__ */ new Map(); 1944 let oldest; 1945 let newest; 1946 const touch = (entry) => { 1947 if (!entry.next) return; 1948 if (!entry.prev) { 1949 entry.next.prev = void 0; 1950 oldest = entry.next; 1951 entry.next = void 0; 1952 if (newest) { 1953 entry.prev = newest; 1954 newest.next = entry; 1955 } 1956 } else { 1957 entry.prev.next = entry.next; 1958 entry.next.prev = entry.prev; 1959 entry.next = void 0; 1960 if (newest) { 1961 newest.next = entry; 1962 entry.prev = newest; 1963 } 1964 } 1965 newest = entry; 1966 }; 1967 return { 1968 get(key) { 1969 const entry = cache.get(key); 1970 if (!entry) return void 0; 1971 touch(entry); 1972 return entry.value; 1973 }, 1974 set(key, value) { 1975 if (cache.size >= max && oldest) { 1976 const toDelete = oldest; 1977 cache.delete(toDelete.key); 1978 if (toDelete.next) { 1979 oldest = toDelete.next; 1980 toDelete.next.prev = void 0; 1981 } 1982 if (toDelete === newest) { 1983 newest = void 0; 1984 } 1985 } 1986 const existing = cache.get(key); 1987 if (existing) { 1988 existing.value = value; 1989 touch(existing); 1990 } else { 1991 const entry = { key, value, prev: newest }; 1992 if (newest) newest.next = entry; 1993 newest = entry; 1994 if (!oldest) oldest = entry; 1995 cache.set(key, entry); 1996 } 1997 } 1998 }; 1999 } 2000 2001 // node_modules/@tanstack/router-core/dist/esm/load-matches.js 2002 var triggerOnReady = (inner) => { 2003 if (!inner.rendered) { 2004 inner.rendered = true; 2005 return inner.onReady?.(); 2006 } 2007 }; 2008 var resolvePreload = (inner, matchId) => { 2009 return !!(inner.preload && !inner.router.state.matches.some((d) => d.id === matchId)); 2010 }; 2011 var _handleNotFound = (inner, err) => { 2012 const routeCursor = inner.router.routesById[err.routeId ?? ""] ?? inner.router.routeTree; 2013 if (!routeCursor.options.notFoundComponent && inner.router.options?.defaultNotFoundComponent) { 2014 routeCursor.options.notFoundComponent = inner.router.options.defaultNotFoundComponent; 2015 } 2016 invariant( 2017 routeCursor.options.notFoundComponent, 2018 "No notFoundComponent found. Please set a notFoundComponent on your route or provide a defaultNotFoundComponent to the router." 2019 ); 2020 const matchForRoute = inner.matches.find((m) => m.routeId === routeCursor.id); 2021 invariant(matchForRoute, "Could not find match for route: " + routeCursor.id); 2022 inner.updateMatch(matchForRoute.id, (prev) => ({ 2023 ...prev, 2024 status: "notFound", 2025 error: err, 2026 isFetching: false 2027 })); 2028 if (err.routerCode === "BEFORE_LOAD" && routeCursor.parentRoute) { 2029 err.routeId = routeCursor.parentRoute.id; 2030 _handleNotFound(inner, err); 2031 } 2032 }; 2033 var handleRedirectAndNotFound = (inner, match, err) => { 2034 if (!isRedirect(err) && !isNotFound(err)) return; 2035 if (isRedirect(err) && err.redirectHandled && !err.options.reloadDocument) { 2036 throw err; 2037 } 2038 if (match) { 2039 match._nonReactive.beforeLoadPromise?.resolve(); 2040 match._nonReactive.loaderPromise?.resolve(); 2041 match._nonReactive.beforeLoadPromise = void 0; 2042 match._nonReactive.loaderPromise = void 0; 2043 const status = isRedirect(err) ? "redirected" : "notFound"; 2044 inner.updateMatch(match.id, (prev) => ({ 2045 ...prev, 2046 status, 2047 isFetching: false, 2048 error: err 2049 })); 2050 if (isNotFound(err) && !err.routeId) { 2051 err.routeId = match.routeId; 2052 } 2053 match._nonReactive.loadPromise?.resolve(); 2054 } 2055 if (isRedirect(err)) { 2056 inner.rendered = true; 2057 err.options._fromLocation = inner.location; 2058 err.redirectHandled = true; 2059 err = inner.router.resolveRedirect(err); 2060 throw err; 2061 } else { 2062 _handleNotFound(inner, err); 2063 throw err; 2064 } 2065 }; 2066 var shouldSkipLoader = (inner, matchId) => { 2067 const match = inner.router.getMatch(matchId); 2068 if (!inner.router.isServer && match._nonReactive.dehydrated) { 2069 return true; 2070 } 2071 if (inner.router.isServer && match.ssr === false) { 2072 return true; 2073 } 2074 return false; 2075 }; 2076 var handleSerialError = (inner, index, err, routerCode) => { 2077 const { id: matchId, routeId } = inner.matches[index]; 2078 const route = inner.router.looseRoutesById[routeId]; 2079 if (err instanceof Promise) { 2080 throw err; 2081 } 2082 err.routerCode = routerCode; 2083 inner.firstBadMatchIndex ??= index; 2084 handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), err); 2085 try { 2086 route.options.onError?.(err); 2087 } catch (errorHandlerErr) { 2088 err = errorHandlerErr; 2089 handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), err); 2090 } 2091 inner.updateMatch(matchId, (prev) => { 2092 prev._nonReactive.beforeLoadPromise?.resolve(); 2093 prev._nonReactive.beforeLoadPromise = void 0; 2094 prev._nonReactive.loadPromise?.resolve(); 2095 return { 2096 ...prev, 2097 error: err, 2098 status: "error", 2099 isFetching: false, 2100 updatedAt: Date.now(), 2101 abortController: new AbortController() 2102 }; 2103 }); 2104 }; 2105 var isBeforeLoadSsr = (inner, matchId, index, route) => { 2106 const existingMatch = inner.router.getMatch(matchId); 2107 const parentMatchId = inner.matches[index - 1]?.id; 2108 const parentMatch = parentMatchId ? inner.router.getMatch(parentMatchId) : void 0; 2109 if (inner.router.isShell()) { 2110 existingMatch.ssr = matchId === rootRouteId; 2111 return; 2112 } 2113 if (parentMatch?.ssr === false) { 2114 existingMatch.ssr = false; 2115 return; 2116 } 2117 const parentOverride = (tempSsr2) => { 2118 if (tempSsr2 === true && parentMatch?.ssr === "data-only") { 2119 return "data-only"; 2120 } 2121 return tempSsr2; 2122 }; 2123 const defaultSsr = inner.router.options.defaultSsr ?? true; 2124 if (route.options.ssr === void 0) { 2125 existingMatch.ssr = parentOverride(defaultSsr); 2126 return; 2127 } 2128 if (typeof route.options.ssr !== "function") { 2129 existingMatch.ssr = parentOverride(route.options.ssr); 2130 return; 2131 } 2132 const { search, params } = existingMatch; 2133 const ssrFnContext = { 2134 search: makeMaybe(search, existingMatch.searchError), 2135 params: makeMaybe(params, existingMatch.paramsError), 2136 location: inner.location, 2137 matches: inner.matches.map((match) => ({ 2138 index: match.index, 2139 pathname: match.pathname, 2140 fullPath: match.fullPath, 2141 staticData: match.staticData, 2142 id: match.id, 2143 routeId: match.routeId, 2144 search: makeMaybe(match.search, match.searchError), 2145 params: makeMaybe(match.params, match.paramsError), 2146 ssr: match.ssr 2147 })) 2148 }; 2149 const tempSsr = route.options.ssr(ssrFnContext); 2150 if (isPromise(tempSsr)) { 2151 return tempSsr.then((ssr) => { 2152 existingMatch.ssr = parentOverride(ssr ?? defaultSsr); 2153 }); 2154 } 2155 existingMatch.ssr = parentOverride(tempSsr ?? defaultSsr); 2156 return; 2157 }; 2158 var setupPendingTimeout = (inner, matchId, route, match) => { 2159 if (match._nonReactive.pendingTimeout !== void 0) return; 2160 const pendingMs = route.options.pendingMs ?? inner.router.options.defaultPendingMs; 2161 const shouldPending = !!(inner.onReady && !inner.router.isServer && !resolvePreload(inner, matchId) && (route.options.loader || route.options.beforeLoad || routeNeedsPreload(route)) && typeof pendingMs === "number" && pendingMs !== Infinity && (route.options.pendingComponent ?? inner.router.options?.defaultPendingComponent)); 2162 if (shouldPending) { 2163 const pendingTimeout = setTimeout(() => { 2164 triggerOnReady(inner); 2165 }, pendingMs); 2166 match._nonReactive.pendingTimeout = pendingTimeout; 2167 } 2168 }; 2169 var preBeforeLoadSetup = (inner, matchId, route) => { 2170 const existingMatch = inner.router.getMatch(matchId); 2171 if (!existingMatch._nonReactive.beforeLoadPromise && !existingMatch._nonReactive.loaderPromise) 2172 return; 2173 setupPendingTimeout(inner, matchId, route, existingMatch); 2174 const then = () => { 2175 const match = inner.router.getMatch(matchId); 2176 if (match.preload && (match.status === "redirected" || match.status === "notFound")) { 2177 handleRedirectAndNotFound(inner, match, match.error); 2178 } 2179 }; 2180 return existingMatch._nonReactive.beforeLoadPromise ? existingMatch._nonReactive.beforeLoadPromise.then(then) : then(); 2181 }; 2182 var executeBeforeLoad = (inner, matchId, index, route) => { 2183 const match = inner.router.getMatch(matchId); 2184 const prevLoadPromise = match._nonReactive.loadPromise; 2185 match._nonReactive.loadPromise = createControlledPromise(() => { 2186 prevLoadPromise?.resolve(); 2187 }); 2188 const { paramsError, searchError } = match; 2189 if (paramsError) { 2190 handleSerialError(inner, index, paramsError, "PARSE_PARAMS"); 2191 } 2192 if (searchError) { 2193 handleSerialError(inner, index, searchError, "VALIDATE_SEARCH"); 2194 } 2195 setupPendingTimeout(inner, matchId, route, match); 2196 const abortController = new AbortController(); 2197 const parentMatchId = inner.matches[index - 1]?.id; 2198 const parentMatch = parentMatchId ? inner.router.getMatch(parentMatchId) : void 0; 2199 const parentMatchContext = parentMatch?.context ?? inner.router.options.context ?? void 0; 2200 const context = { ...parentMatchContext, ...match.__routeContext }; 2201 let isPending = false; 2202 const pending = () => { 2203 if (isPending) return; 2204 isPending = true; 2205 inner.updateMatch(matchId, (prev) => ({ 2206 ...prev, 2207 isFetching: "beforeLoad", 2208 fetchCount: prev.fetchCount + 1, 2209 abortController, 2210 context 2211 })); 2212 }; 2213 const resolve = () => { 2214 match._nonReactive.beforeLoadPromise?.resolve(); 2215 match._nonReactive.beforeLoadPromise = void 0; 2216 inner.updateMatch(matchId, (prev) => ({ 2217 ...prev, 2218 isFetching: false 2219 })); 2220 }; 2221 if (!route.options.beforeLoad) { 2222 batch(() => { 2223 pending(); 2224 resolve(); 2225 }); 2226 return; 2227 } 2228 match._nonReactive.beforeLoadPromise = createControlledPromise(); 2229 const { search, params, cause } = match; 2230 const preload = resolvePreload(inner, matchId); 2231 const beforeLoadFnContext = { 2232 search, 2233 abortController, 2234 params, 2235 preload, 2236 context, 2237 location: inner.location, 2238 navigate: (opts) => inner.router.navigate({ 2239 ...opts, 2240 _fromLocation: inner.location 2241 }), 2242 buildLocation: inner.router.buildLocation, 2243 cause: preload ? "preload" : cause, 2244 matches: inner.matches, 2245 ...inner.router.options.additionalContext 2246 }; 2247 const updateContext = (beforeLoadContext2) => { 2248 if (beforeLoadContext2 === void 0) { 2249 batch(() => { 2250 pending(); 2251 resolve(); 2252 }); 2253 return; 2254 } 2255 if (isRedirect(beforeLoadContext2) || isNotFound(beforeLoadContext2)) { 2256 pending(); 2257 handleSerialError(inner, index, beforeLoadContext2, "BEFORE_LOAD"); 2258 } 2259 batch(() => { 2260 pending(); 2261 inner.updateMatch(matchId, (prev) => ({ 2262 ...prev, 2263 __beforeLoadContext: beforeLoadContext2, 2264 context: { 2265 ...prev.context, 2266 ...beforeLoadContext2 2267 } 2268 })); 2269 resolve(); 2270 }); 2271 }; 2272 let beforeLoadContext; 2273 try { 2274 beforeLoadContext = route.options.beforeLoad(beforeLoadFnContext); 2275 if (isPromise(beforeLoadContext)) { 2276 pending(); 2277 return beforeLoadContext.catch((err) => { 2278 handleSerialError(inner, index, err, "BEFORE_LOAD"); 2279 }).then(updateContext); 2280 } 2281 } catch (err) { 2282 pending(); 2283 handleSerialError(inner, index, err, "BEFORE_LOAD"); 2284 } 2285 updateContext(beforeLoadContext); 2286 return; 2287 }; 2288 var handleBeforeLoad = (inner, index) => { 2289 const { id: matchId, routeId } = inner.matches[index]; 2290 const route = inner.router.looseRoutesById[routeId]; 2291 const serverSsr = () => { 2292 if (inner.router.isServer) { 2293 const maybePromise = isBeforeLoadSsr(inner, matchId, index, route); 2294 if (isPromise(maybePromise)) return maybePromise.then(queueExecution); 2295 } 2296 return queueExecution(); 2297 }; 2298 const execute = () => executeBeforeLoad(inner, matchId, index, route); 2299 const queueExecution = () => { 2300 if (shouldSkipLoader(inner, matchId)) return; 2301 const result = preBeforeLoadSetup(inner, matchId, route); 2302 return isPromise(result) ? result.then(execute) : execute(); 2303 }; 2304 return serverSsr(); 2305 }; 2306 var executeHead = (inner, matchId, route) => { 2307 const match = inner.router.getMatch(matchId); 2308 if (!match) { 2309 return; 2310 } 2311 if (!route.options.head && !route.options.scripts && !route.options.headers) { 2312 return; 2313 } 2314 const assetContext = { 2315 matches: inner.matches, 2316 match, 2317 params: match.params, 2318 loaderData: match.loaderData 2319 }; 2320 return Promise.all([ 2321 route.options.head?.(assetContext), 2322 route.options.scripts?.(assetContext), 2323 route.options.headers?.(assetContext) 2324 ]).then(([headFnContent, scripts, headers]) => { 2325 const meta = headFnContent?.meta; 2326 const links = headFnContent?.links; 2327 const headScripts = headFnContent?.scripts; 2328 const styles = headFnContent?.styles; 2329 return { 2330 meta, 2331 links, 2332 headScripts, 2333 headers, 2334 scripts, 2335 styles 2336 }; 2337 }); 2338 }; 2339 var getLoaderContext = (inner, matchId, index, route) => { 2340 const parentMatchPromise = inner.matchPromises[index - 1]; 2341 const { params, loaderDeps, abortController, context, cause } = inner.router.getMatch(matchId); 2342 const preload = resolvePreload(inner, matchId); 2343 return { 2344 params, 2345 deps: loaderDeps, 2346 preload: !!preload, 2347 parentMatchPromise, 2348 abortController, 2349 context, 2350 location: inner.location, 2351 navigate: (opts) => inner.router.navigate({ 2352 ...opts, 2353 _fromLocation: inner.location 2354 }), 2355 cause: preload ? "preload" : cause, 2356 route, 2357 ...inner.router.options.additionalContext 2358 }; 2359 }; 2360 var runLoader = async (inner, matchId, index, route) => { 2361 try { 2362 const match = inner.router.getMatch(matchId); 2363 try { 2364 if (!inner.router.isServer || match.ssr === true) { 2365 loadRouteChunk(route); 2366 } 2367 const loaderResult = route.options.loader?.( 2368 getLoaderContext(inner, matchId, index, route) 2369 ); 2370 const loaderResultIsPromise = route.options.loader && isPromise(loaderResult); 2371 const willLoadSomething = !!(loaderResultIsPromise || route._lazyPromise || route._componentsPromise || route.options.head || route.options.scripts || route.options.headers || match._nonReactive.minPendingPromise); 2372 if (willLoadSomething) { 2373 inner.updateMatch(matchId, (prev) => ({ 2374 ...prev, 2375 isFetching: "loader" 2376 })); 2377 } 2378 if (route.options.loader) { 2379 const loaderData = loaderResultIsPromise ? await loaderResult : loaderResult; 2380 handleRedirectAndNotFound( 2381 inner, 2382 inner.router.getMatch(matchId), 2383 loaderData 2384 ); 2385 if (loaderData !== void 0) { 2386 inner.updateMatch(matchId, (prev) => ({ 2387 ...prev, 2388 loaderData 2389 })); 2390 } 2391 } 2392 if (route._lazyPromise) await route._lazyPromise; 2393 const headResult = executeHead(inner, matchId, route); 2394 const head = headResult ? await headResult : void 0; 2395 const pendingPromise = match._nonReactive.minPendingPromise; 2396 if (pendingPromise) await pendingPromise; 2397 if (route._componentsPromise) await route._componentsPromise; 2398 inner.updateMatch(matchId, (prev) => ({ 2399 ...prev, 2400 error: void 0, 2401 status: "success", 2402 isFetching: false, 2403 updatedAt: Date.now(), 2404 ...head 2405 })); 2406 } catch (e) { 2407 let error = e; 2408 const pendingPromise = match._nonReactive.minPendingPromise; 2409 if (pendingPromise) await pendingPromise; 2410 if (isNotFound(e)) { 2411 await route.options.notFoundComponent?.preload?.(); 2412 } 2413 handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), e); 2414 try { 2415 route.options.onError?.(e); 2416 } catch (onErrorError) { 2417 error = onErrorError; 2418 handleRedirectAndNotFound( 2419 inner, 2420 inner.router.getMatch(matchId), 2421 onErrorError 2422 ); 2423 } 2424 const headResult = executeHead(inner, matchId, route); 2425 const head = headResult ? await headResult : void 0; 2426 inner.updateMatch(matchId, (prev) => ({ 2427 ...prev, 2428 error, 2429 status: "error", 2430 isFetching: false, 2431 ...head 2432 })); 2433 } 2434 } catch (err) { 2435 const match = inner.router.getMatch(matchId); 2436 if (match) { 2437 const headResult = executeHead(inner, matchId, route); 2438 if (headResult) { 2439 const head = await headResult; 2440 inner.updateMatch(matchId, (prev) => ({ 2441 ...prev, 2442 ...head 2443 })); 2444 } 2445 match._nonReactive.loaderPromise = void 0; 2446 } 2447 handleRedirectAndNotFound(inner, match, err); 2448 } 2449 }; 2450 var loadRouteMatch = async (inner, index) => { 2451 const { id: matchId, routeId } = inner.matches[index]; 2452 let loaderShouldRunAsync = false; 2453 let loaderIsRunningAsync = false; 2454 const route = inner.router.looseRoutesById[routeId]; 2455 if (shouldSkipLoader(inner, matchId)) { 2456 if (inner.router.isServer) { 2457 const headResult = executeHead(inner, matchId, route); 2458 if (headResult) { 2459 const head = await headResult; 2460 inner.updateMatch(matchId, (prev) => ({ 2461 ...prev, 2462 ...head 2463 })); 2464 } 2465 return inner.router.getMatch(matchId); 2466 } 2467 } else { 2468 const prevMatch = inner.router.getMatch(matchId); 2469 if (prevMatch._nonReactive.loaderPromise) { 2470 if (prevMatch.status === "success" && !inner.sync && !prevMatch.preload) { 2471 return prevMatch; 2472 } 2473 await prevMatch._nonReactive.loaderPromise; 2474 const match2 = inner.router.getMatch(matchId); 2475 if (match2.error) { 2476 handleRedirectAndNotFound(inner, match2, match2.error); 2477 } 2478 } else { 2479 const age = Date.now() - prevMatch.updatedAt; 2480 const preload = resolvePreload(inner, matchId); 2481 const staleAge = preload ? route.options.preloadStaleTime ?? inner.router.options.defaultPreloadStaleTime ?? 3e4 : route.options.staleTime ?? inner.router.options.defaultStaleTime ?? 0; 2482 const shouldReloadOption = route.options.shouldReload; 2483 const shouldReload = typeof shouldReloadOption === "function" ? shouldReloadOption(getLoaderContext(inner, matchId, index, route)) : shouldReloadOption; 2484 const nextPreload = !!preload && !inner.router.state.matches.some((d) => d.id === matchId); 2485 const match2 = inner.router.getMatch(matchId); 2486 match2._nonReactive.loaderPromise = createControlledPromise(); 2487 if (nextPreload !== match2.preload) { 2488 inner.updateMatch(matchId, (prev) => ({ 2489 ...prev, 2490 preload: nextPreload 2491 })); 2492 } 2493 const { status, invalid } = match2; 2494 loaderShouldRunAsync = status === "success" && (invalid || (shouldReload ?? age > staleAge)); 2495 if (preload && route.options.preload === false) ; 2496 else if (loaderShouldRunAsync && !inner.sync) { 2497 loaderIsRunningAsync = true; 2498 (async () => { 2499 try { 2500 await runLoader(inner, matchId, index, route); 2501 const match3 = inner.router.getMatch(matchId); 2502 match3._nonReactive.loaderPromise?.resolve(); 2503 match3._nonReactive.loadPromise?.resolve(); 2504 match3._nonReactive.loaderPromise = void 0; 2505 } catch (err) { 2506 if (isRedirect(err)) { 2507 await inner.router.navigate(err.options); 2508 } 2509 } 2510 })(); 2511 } else if (status !== "success" || loaderShouldRunAsync && inner.sync) { 2512 await runLoader(inner, matchId, index, route); 2513 } else { 2514 const headResult = executeHead(inner, matchId, route); 2515 if (headResult) { 2516 const head = await headResult; 2517 inner.updateMatch(matchId, (prev) => ({ 2518 ...prev, 2519 ...head 2520 })); 2521 } 2522 } 2523 } 2524 } 2525 const match = inner.router.getMatch(matchId); 2526 if (!loaderIsRunningAsync) { 2527 match._nonReactive.loaderPromise?.resolve(); 2528 match._nonReactive.loadPromise?.resolve(); 2529 } 2530 clearTimeout(match._nonReactive.pendingTimeout); 2531 match._nonReactive.pendingTimeout = void 0; 2532 if (!loaderIsRunningAsync) match._nonReactive.loaderPromise = void 0; 2533 match._nonReactive.dehydrated = void 0; 2534 const nextIsFetching = loaderIsRunningAsync ? match.isFetching : false; 2535 if (nextIsFetching !== match.isFetching || match.invalid !== false) { 2536 inner.updateMatch(matchId, (prev) => ({ 2537 ...prev, 2538 isFetching: nextIsFetching, 2539 invalid: false 2540 })); 2541 return inner.router.getMatch(matchId); 2542 } else { 2543 return match; 2544 } 2545 }; 2546 async function loadMatches(arg) { 2547 const inner = Object.assign(arg, { 2548 matchPromises: [] 2549 }); 2550 if (!inner.router.isServer && inner.router.state.matches.some((d) => d._forcePending)) { 2551 triggerOnReady(inner); 2552 } 2553 try { 2554 for (let i = 0; i < inner.matches.length; i++) { 2555 const beforeLoad = handleBeforeLoad(inner, i); 2556 if (isPromise(beforeLoad)) await beforeLoad; 2557 } 2558 const max = inner.firstBadMatchIndex ?? inner.matches.length; 2559 for (let i = 0; i < max; i++) { 2560 inner.matchPromises.push(loadRouteMatch(inner, i)); 2561 } 2562 await Promise.all(inner.matchPromises); 2563 const readyPromise = triggerOnReady(inner); 2564 if (isPromise(readyPromise)) await readyPromise; 2565 } catch (err) { 2566 if (isNotFound(err) && !inner.preload) { 2567 const readyPromise = triggerOnReady(inner); 2568 if (isPromise(readyPromise)) await readyPromise; 2569 throw err; 2570 } 2571 if (isRedirect(err)) { 2572 throw err; 2573 } 2574 } 2575 return inner.matches; 2576 } 2577 async function loadRouteChunk(route) { 2578 if (!route._lazyLoaded && route._lazyPromise === void 0) { 2579 if (route.lazyFn) { 2580 route._lazyPromise = route.lazyFn().then((lazyRoute) => { 2581 const { id: _id, ...options } = lazyRoute.options; 2582 Object.assign(route.options, options); 2583 route._lazyLoaded = true; 2584 route._lazyPromise = void 0; 2585 }); 2586 } else { 2587 route._lazyLoaded = true; 2588 } 2589 } 2590 if (!route._componentsLoaded && route._componentsPromise === void 0) { 2591 const loadComponents = () => { 2592 const preloads = []; 2593 for (const type of componentTypes) { 2594 const preload = route.options[type]?.preload; 2595 if (preload) preloads.push(preload()); 2596 } 2597 if (preloads.length) 2598 return Promise.all(preloads).then(() => { 2599 route._componentsLoaded = true; 2600 route._componentsPromise = void 0; 2601 }); 2602 route._componentsLoaded = true; 2603 route._componentsPromise = void 0; 2604 return; 2605 }; 2606 route._componentsPromise = route._lazyPromise ? route._lazyPromise.then(loadComponents) : loadComponents(); 2607 } 2608 return route._componentsPromise; 2609 } 2610 function makeMaybe(value, error) { 2611 if (error) { 2612 return { status: "error", error }; 2613 } 2614 return { status: "success", value }; 2615 } 2616 function routeNeedsPreload(route) { 2617 for (const componentType of componentTypes) { 2618 if (route.options[componentType]?.preload) { 2619 return true; 2620 } 2621 } 2622 return false; 2623 } 2624 var componentTypes = [ 2625 "component", 2626 "errorComponent", 2627 "pendingComponent", 2628 "notFoundComponent" 2629 ]; 2630 2631 // node_modules/@tanstack/router-core/dist/esm/rewrite.js 2632 function composeRewrites(rewrites) { 2633 return { 2634 input: ({ url }) => { 2635 for (const rewrite of rewrites) { 2636 url = executeRewriteInput(rewrite, url); 2637 } 2638 return url; 2639 }, 2640 output: ({ url }) => { 2641 for (let i = rewrites.length - 1; i >= 0; i--) { 2642 url = executeRewriteOutput(rewrites[i], url); 2643 } 2644 return url; 2645 } 2646 }; 2647 } 2648 function rewriteBasepath(opts) { 2649 const trimmedBasepath = trimPath(opts.basepath); 2650 const normalizedBasepath = `/$trimmedBasepath}`; 2651 const normalizedBasepathWithSlash = `$normalizedBasepath}/`; 2652 const checkBasepath = opts.caseSensitive ? normalizedBasepath : normalizedBasepath.toLowerCase(); 2653 const checkBasepathWithSlash = opts.caseSensitive ? normalizedBasepathWithSlash : normalizedBasepathWithSlash.toLowerCase(); 2654 return { 2655 input: ({ url }) => { 2656 const pathname = opts.caseSensitive ? url.pathname : url.pathname.toLowerCase(); 2657 if (pathname === checkBasepath) { 2658 url.pathname = "/"; 2659 } else if (pathname.startsWith(checkBasepathWithSlash)) { 2660 url.pathname = url.pathname.slice(normalizedBasepath.length); 2661 } 2662 return url; 2663 }, 2664 output: ({ url }) => { 2665 url.pathname = joinPaths(["/", trimmedBasepath, url.pathname]); 2666 return url; 2667 } 2668 }; 2669 } 2670 function executeRewriteInput(rewrite, url) { 2671 const res = rewrite?.input?.({ url }); 2672 if (res) { 2673 if (typeof res === "string") { 2674 return new URL(res); 2675 } else if (res instanceof URL) { 2676 return res; 2677 } 2678 } 2679 return url; 2680 } 2681 function executeRewriteOutput(rewrite, url) { 2682 const res = rewrite?.output?.({ url }); 2683 if (res) { 2684 if (typeof res === "string") { 2685 return new URL(res); 2686 } else if (res instanceof URL) { 2687 return res; 2688 } 2689 } 2690 return url; 2691 } 2692 2693 // node_modules/@tanstack/router-core/dist/esm/router.js 2694 function getLocationChangeInfo(routerState) { 2695 const fromLocation = routerState.resolvedLocation; 2696 const toLocation = routerState.location; 2697 const pathChanged = fromLocation?.pathname !== toLocation.pathname; 2698 const hrefChanged = fromLocation?.href !== toLocation.href; 2699 const hashChanged = fromLocation?.hash !== toLocation.hash; 2700 return { fromLocation, toLocation, pathChanged, hrefChanged, hashChanged }; 2701 } 2702 var RouterCore = class { 2703 /** 2704 * @deprecated Use the `createRouter` function instead 2705 */ 2706 constructor(options) { 2707 this.tempLocationKey = `$Math.round( 2708 Math.random() * 1e7 2709 )}`; 2710 this.resetNextScroll = true; 2711 this.shouldViewTransition = void 0; 2712 this.isViewTransitionTypesSupported = void 0; 2713 this.subscribers = /* @__PURE__ */ new Set(); 2714 this.isScrollRestoring = false; 2715 this.isScrollRestorationSetup = false; 2716 this.startTransition = (fn) => fn(); 2717 this.update = (newOptions) => { 2718 if (newOptions.notFoundRoute) { 2719 console.warn( 2720 "The notFoundRoute API is deprecated and will be removed in the next major version. See https://tanstack.com/router/v1/docs/framework/react/guide/not-found-errors#migrating-from-notfoundroute for more info." 2721 ); 2722 } 2723 const prevOptions = this.options; 2724 const prevBasepath = this.basepath ?? prevOptions?.basepath ?? "/"; 2725 const basepathWasUnset = this.basepath === void 0; 2726 const prevRewriteOption = prevOptions?.rewrite; 2727 this.options = { 2728 ...prevOptions, 2729 ...newOptions 2730 }; 2731 this.isServer = this.options.isServer ?? typeof document === "undefined"; 2732 this.pathParamsDecodeCharMap = this.options.pathParamsAllowedCharacters ? new Map( 2733 this.options.pathParamsAllowedCharacters.map((char) => [ 2734 encodeURIComponent(char), 2735 char 2736 ]) 2737 ) : void 0; 2738 if (!this.history || this.options.history && this.options.history !== this.history) { 2739 if (!this.options.history) { 2740 if (!this.isServer) { 2741 this.history = createBrowserHistory(); 2742 } 2743 } else { 2744 this.history = this.options.history; 2745 } 2746 } 2747 this.origin = this.options.origin; 2748 if (!this.origin) { 2749 if (!this.isServer && window?.origin && window.origin !== "null") { 2750 this.origin = window.origin; 2751 } else { 2752 this.origin = "http://localhost"; 2753 } 2754 } 2755 if (this.history) { 2756 this.updateLatestLocation(); 2757 } 2758 if (this.options.routeTree !== this.routeTree) { 2759 this.routeTree = this.options.routeTree; 2760 this.buildRouteTree(); 2761 } 2762 if (!this.__store && this.latestLocation) { 2763 this.__store = new Store(getInitialRouterState(this.latestLocation), { 2764 onUpdate: () => { 2765 this.__store.state = { 2766 ...this.state, 2767 cachedMatches: this.state.cachedMatches.filter( 2768 (d) => !["redirected"].includes(d.status) 2769 ) 2770 }; 2771 } 2772 }); 2773 setupScrollRestoration(this); 2774 } 2775 let needsLocationUpdate = false; 2776 const nextBasepath = this.options.basepath ?? "/"; 2777 const nextRewriteOption = this.options.rewrite; 2778 const basepathChanged = basepathWasUnset || prevBasepath !== nextBasepath; 2779 const rewriteChanged = prevRewriteOption !== nextRewriteOption; 2780 if (basepathChanged || rewriteChanged) { 2781 this.basepath = nextBasepath; 2782 const rewrites = []; 2783 if (trimPath(nextBasepath) !== "") { 2784 rewrites.push( 2785 rewriteBasepath({ 2786 basepath: nextBasepath 2787 }) 2788 ); 2789 } 2790 if (nextRewriteOption) { 2791 rewrites.push(nextRewriteOption); 2792 } 2793 this.rewrite = rewrites.length === 0 ? void 0 : rewrites.length === 1 ? rewrites[0] : composeRewrites(rewrites); 2794 if (this.history) { 2795 this.updateLatestLocation(); 2796 } 2797 needsLocationUpdate = true; 2798 } 2799 if (needsLocationUpdate && this.__store) { 2800 this.__store.state = { 2801 ...this.state, 2802 location: this.latestLocation 2803 }; 2804 } 2805 if (typeof window !== "undefined" && "CSS" in window && typeof window.CSS?.supports === "function") { 2806 this.isViewTransitionTypesSupported = window.CSS.supports( 2807 "selector(:active-view-transition-type(a)" 2808 ); 2809 } 2810 }; 2811 this.updateLatestLocation = () => { 2812 this.latestLocation = this.parseLocation( 2813 this.history.location, 2814 this.latestLocation 2815 ); 2816 }; 2817 this.buildRouteTree = () => { 2818 const { routesById, routesByPath, flatRoutes } = processRouteTree({ 2819 routeTree: this.routeTree, 2820 initRoute: (route, i) => { 2821 route.init({ 2822 originalIndex: i 2823 }); 2824 } 2825 }); 2826 this.routesById = routesById; 2827 this.routesByPath = routesByPath; 2828 this.flatRoutes = flatRoutes; 2829 const notFoundRoute = this.options.notFoundRoute; 2830 if (notFoundRoute) { 2831 notFoundRoute.init({ 2832 originalIndex: 99999999999 2833 }); 2834 this.routesById[notFoundRoute.id] = notFoundRoute; 2835 } 2836 }; 2837 this.subscribe = (eventType, fn) => { 2838 const listener = { 2839 eventType, 2840 fn 2841 }; 2842 this.subscribers.add(listener); 2843 return () => { 2844 this.subscribers.delete(listener); 2845 }; 2846 }; 2847 this.emit = (routerEvent) => { 2848 this.subscribers.forEach((listener) => { 2849 if (listener.eventType === routerEvent.type) { 2850 listener.fn(routerEvent); 2851 } 2852 }); 2853 }; 2854 this.parseLocation = (locationToParse, previousLocation) => { 2855 const parse = ({ 2856 href, 2857 state 2858 }) => { 2859 const fullUrl = new URL(href, this.origin); 2860 const url = executeRewriteInput(this.rewrite, fullUrl); 2861 const parsedSearch = this.options.parseSearch(url.search); 2862 const searchStr = this.options.stringifySearch(parsedSearch); 2863 url.search = searchStr; 2864 const fullPath = url.href.replace(url.origin, ""); 2865 const { pathname, hash } = url; 2866 return { 2867 href: fullPath, 2868 publicHref: href, 2869 url: url.href, 2870 pathname, 2871 searchStr, 2872 search: replaceEqualDeep(previousLocation?.search, parsedSearch), 2873 hash: hash.split("#").reverse()[0] ?? "", 2874 state: replaceEqualDeep(previousLocation?.state, state) 2875 }; 2876 }; 2877 const location = parse(locationToParse); 2878 const { __tempLocation, __tempKey } = location.state; 2879 if (__tempLocation && (!__tempKey || __tempKey === this.tempLocationKey)) { 2880 const parsedTempLocation = parse(__tempLocation); 2881 parsedTempLocation.state.key = location.state.key; 2882 parsedTempLocation.state.__TSR_key = location.state.__TSR_key; 2883 delete parsedTempLocation.state.__tempLocation; 2884 return { 2885 ...parsedTempLocation, 2886 maskedLocation: location 2887 }; 2888 } 2889 return location; 2890 }; 2891 this.resolvePathWithBase = (from, path) => { 2892 const resolvedPath = resolvePath({ 2893 base: from, 2894 to: cleanPath(path), 2895 trailingSlash: this.options.trailingSlash, 2896 parseCache: this.parsePathnameCache 2897 }); 2898 return resolvedPath; 2899 }; 2900 this.matchRoutes = (pathnameOrNext, locationSearchOrOpts, opts) => { 2901 if (typeof pathnameOrNext === "string") { 2902 return this.matchRoutesInternal( 2903 { 2904 pathname: pathnameOrNext, 2905 search: locationSearchOrOpts 2906 }, 2907 opts 2908 ); 2909 } 2910 return this.matchRoutesInternal(pathnameOrNext, locationSearchOrOpts); 2911 }; 2912 this.parsePathnameCache = createLRUCache(1e3); 2913 this.getMatchedRoutes = (pathname, routePathname) => { 2914 return getMatchedRoutes({ 2915 pathname, 2916 routePathname, 2917 caseSensitive: this.options.caseSensitive, 2918 routesByPath: this.routesByPath, 2919 routesById: this.routesById, 2920 flatRoutes: this.flatRoutes, 2921 parseCache: this.parsePathnameCache 2922 }); 2923 }; 2924 this.cancelMatch = (id) => { 2925 const match = this.getMatch(id); 2926 if (!match) return; 2927 match.abortController.abort(); 2928 clearTimeout(match._nonReactive.pendingTimeout); 2929 match._nonReactive.pendingTimeout = void 0; 2930 }; 2931 this.cancelMatches = () => { 2932 this.state.pendingMatches?.forEach((match) => { 2933 this.cancelMatch(match.id); 2934 }); 2935 }; 2936 this.buildLocation = (opts) => { 2937 const build = (dest = {}) => { 2938 const currentLocation = dest._fromLocation || this.latestLocation; 2939 const allCurrentLocationMatches = this.matchRoutes(currentLocation, { 2940 _buildLocation: true 2941 }); 2942 const lastMatch = last(allCurrentLocationMatches); 2943 if (dest.from && true && dest._isNavigate) { 2944 const allFromMatches = this.getMatchedRoutes( 2945 dest.from, 2946 void 0 2947 ).matchedRoutes; 2948 const matchedFrom = findLast(allCurrentLocationMatches, (d) => { 2949 return comparePaths(d.fullPath, dest.from); 2950 }); 2951 const matchedCurrent = findLast(allFromMatches, (d) => { 2952 return comparePaths(d.fullPath, lastMatch.fullPath); 2953 }); 2954 if (!matchedFrom && !matchedCurrent) { 2955 console.warn(`Could not find match for from: $dest.from}`); 2956 } 2957 } 2958 const defaultedFromPath = dest.unsafeRelative === "path" ? currentLocation.pathname : dest.from ?? lastMatch.fullPath; 2959 const fromPath = this.resolvePathWithBase(defaultedFromPath, "."); 2960 const fromSearch = lastMatch.search; 2961 const fromParams = { ...lastMatch.params }; 2962 const nextTo = dest.to ? this.resolvePathWithBase(fromPath, `$dest.to}`) : this.resolvePathWithBase(fromPath, "."); 2963 const nextParams = dest.params === false || dest.params === null ? {} : (dest.params ?? true) === true ? fromParams : Object.assign( 2964 fromParams, 2965 functionalUpdate(dest.params, fromParams) 2966 ); 2967 const interpolatedNextTo = interpolatePath({ 2968 path: nextTo, 2969 params: nextParams, 2970 parseCache: this.parsePathnameCache 2971 }).interpolatedPath; 2972 const destRoutes = this.matchRoutes(interpolatedNextTo, void 0, { 2973 _buildLocation: true 2974 }).map((d) => this.looseRoutesById[d.routeId]); 2975 if (Object.keys(nextParams).length > 0) { 2976 for (const route of destRoutes) { 2977 const fn = route.options.params?.stringify ?? route.options.stringifyParams; 2978 if (fn) { 2979 Object.assign(nextParams, fn(nextParams)); 2980 } 2981 } 2982 } 2983 const nextPathname = decodePathSegment( 2984 interpolatePath({ 2985 // Use the original template path for interpolation 2986 // This preserves the original parameter syntax including optional parameters 2987 path: nextTo, 2988 params: nextParams, 2989 leaveWildcards: false, 2990 leaveParams: opts.leaveParams, 2991 decodeCharMap: this.pathParamsDecodeCharMap, 2992 parseCache: this.parsePathnameCache 2993 }).interpolatedPath 2994 ); 2995 let nextSearch = fromSearch; 2996 if (opts._includeValidateSearch && this.options.search?.strict) { 2997 const validatedSearch = {}; 2998 destRoutes.forEach((route) => { 2999 if (route.options.validateSearch) { 3000 try { 3001 Object.assign( 3002 validatedSearch, 3003 validateSearch(route.options.validateSearch, { 3004 ...validatedSearch, 3005 ...nextSearch 3006 }) 3007 ); 3008 } catch { 3009 } 3010 } 3011 }); 3012 nextSearch = validatedSearch; 3013 } 3014 nextSearch = applySearchMiddleware({ 3015 search: nextSearch, 3016 dest, 3017 destRoutes, 3018 _includeValidateSearch: opts._includeValidateSearch 3019 }); 3020 nextSearch = replaceEqualDeep(fromSearch, nextSearch); 3021 const searchStr = this.options.stringifySearch(nextSearch); 3022 const hash = dest.hash === true ? currentLocation.hash : dest.hash ? functionalUpdate(dest.hash, currentLocation.hash) : void 0; 3023 const hashStr = hash ? `#$hash}` : ""; 3024 let nextState = dest.state === true ? currentLocation.state : dest.state ? functionalUpdate(dest.state, currentLocation.state) : {}; 3025 nextState = replaceEqualDeep(currentLocation.state, nextState); 3026 const fullPath = `$nextPathname}$searchStr}$hashStr}`; 3027 const url = new URL(fullPath, this.origin); 3028 const rewrittenUrl = executeRewriteOutput(this.rewrite, url); 3029 return { 3030 publicHref: rewrittenUrl.pathname + rewrittenUrl.search + rewrittenUrl.hash, 3031 href: fullPath, 3032 url: rewrittenUrl.href, 3033 pathname: nextPathname, 3034 search: nextSearch, 3035 searchStr, 3036 state: nextState, 3037 hash: hash ?? "", 3038 unmaskOnReload: dest.unmaskOnReload 3039 }; 3040 }; 3041 const buildWithMatches = (dest = {}, maskedDest) => { 3042 const next = build(dest); 3043 let maskedNext = maskedDest ? build(maskedDest) : void 0; 3044 if (!maskedNext) { 3045 let params = {}; 3046 const foundMask = this.options.routeMasks?.find((d) => { 3047 const match = matchPathname( 3048 next.pathname, 3049 { 3050 to: d.from, 3051 caseSensitive: false, 3052 fuzzy: false 3053 }, 3054 this.parsePathnameCache 3055 ); 3056 if (match) { 3057 params = match; 3058 return true; 3059 } 3060 return false; 3061 }); 3062 if (foundMask) { 3063 const { from: _from, ...maskProps } = foundMask; 3064 maskedDest = { 3065 from: opts.from, 3066 ...maskProps, 3067 params 3068 }; 3069 maskedNext = build(maskedDest); 3070 } 3071 } 3072 if (maskedNext) { 3073 next.maskedLocation = maskedNext; 3074 } 3075 return next; 3076 }; 3077 if (opts.mask) { 3078 return buildWithMatches(opts, { 3079 from: opts.from, 3080 ...opts.mask 3081 }); 3082 } 3083 return buildWithMatches(opts); 3084 }; 3085 this.commitLocation = ({ 3086 viewTransition, 3087 ignoreBlocker, 3088 ...next 3089 }) => { 3090 const isSameState = () => { 3091 const ignoredProps = [ 3092 "key", 3093 // TODO: Remove in v2 - use __TSR_key instead 3094 "__TSR_key", 3095 "__TSR_index", 3096 "__hashScrollIntoViewOptions" 3097 ]; 3098 ignoredProps.forEach((prop) => { 3099 next.state[prop] = this.latestLocation.state[prop]; 3100 }); 3101 const isEqual = deepEqual(next.state, this.latestLocation.state); 3102 ignoredProps.forEach((prop) => { 3103 delete next.state[prop]; 3104 }); 3105 return isEqual; 3106 }; 3107 const isSameUrl = trimPathRight(this.latestLocation.href) === trimPathRight(next.href); 3108 const previousCommitPromise = this.commitLocationPromise; 3109 this.commitLocationPromise = createControlledPromise(() => { 3110 previousCommitPromise?.resolve(); 3111 }); 3112 if (isSameUrl && isSameState()) { 3113 this.load(); 3114 } else { 3115 let { maskedLocation, hashScrollIntoView, ...nextHistory } = next; 3116 if (maskedLocation) { 3117 nextHistory = { 3118 ...maskedLocation, 3119 state: { 3120 ...maskedLocation.state, 3121 __tempKey: void 0, 3122 __tempLocation: { 3123 ...nextHistory, 3124 search: nextHistory.searchStr, 3125 state: { 3126 ...nextHistory.state, 3127 __tempKey: void 0, 3128 __tempLocation: void 0, 3129 __TSR_key: void 0, 3130 key: void 0 3131 // TODO: Remove in v2 - use __TSR_key instead 3132 } 3133 } 3134 } 3135 }; 3136 if (nextHistory.unmaskOnReload ?? this.options.unmaskOnReload ?? false) { 3137 nextHistory.state.__tempKey = this.tempLocationKey; 3138 } 3139 } 3140 nextHistory.state.__hashScrollIntoViewOptions = hashScrollIntoView ?? this.options.defaultHashScrollIntoView ?? true; 3141 this.shouldViewTransition = viewTransition; 3142 this.history[next.replace ? "replace" : "push"]( 3143 nextHistory.publicHref, 3144 nextHistory.state, 3145 { ignoreBlocker } 3146 ); 3147 } 3148 this.resetNextScroll = next.resetScroll ?? true; 3149 if (!this.history.subscribers.size) { 3150 this.load(); 3151 } 3152 return this.commitLocationPromise; 3153 }; 3154 this.buildAndCommitLocation = ({ 3155 replace, 3156 resetScroll, 3157 hashScrollIntoView, 3158 viewTransition, 3159 ignoreBlocker, 3160 href, 3161 ...rest 3162 } = {}) => { 3163 if (href) { 3164 const currentIndex = this.history.location.state.__TSR_index; 3165 const parsed = parseHref(href, { 3166 __TSR_index: replace ? currentIndex : currentIndex + 1 3167 }); 3168 rest.to = parsed.pathname; 3169 rest.search = this.options.parseSearch(parsed.search); 3170 rest.hash = parsed.hash.slice(1); 3171 } 3172 const location = this.buildLocation({ 3173 ...rest, 3174 _includeValidateSearch: true 3175 }); 3176 return this.commitLocation({ 3177 ...location, 3178 viewTransition, 3179 replace, 3180 resetScroll, 3181 hashScrollIntoView, 3182 ignoreBlocker 3183 }); 3184 }; 3185 this.navigate = ({ to, reloadDocument, href, ...rest }) => { 3186 if (!reloadDocument && href) { 3187 try { 3188 new URL(`$href}`); 3189 reloadDocument = true; 3190 } catch { 3191 } 3192 } 3193 if (reloadDocument) { 3194 if (!href) { 3195 const location = this.buildLocation({ to, ...rest }); 3196 href = location.url; 3197 } 3198 if (rest.replace) { 3199 window.location.replace(href); 3200 } else { 3201 window.location.href = href; 3202 } 3203 return Promise.resolve(); 3204 } 3205 return this.buildAndCommitLocation({ 3206 ...rest, 3207 href, 3208 to, 3209 _isNavigate: true 3210 }); 3211 }; 3212 this.beforeLoad = () => { 3213 this.cancelMatches(); 3214 this.updateLatestLocation(); 3215 if (this.isServer) { 3216 const nextLocation = this.buildLocation({ 3217 to: this.latestLocation.pathname, 3218 search: true, 3219 params: true, 3220 hash: true, 3221 state: true, 3222 _includeValidateSearch: true 3223 }); 3224 const normalizeUrl = (url) => { 3225 try { 3226 return encodeURI(decodeURI(url)); 3227 } catch { 3228 return url; 3229 } 3230 }; 3231 if (trimPath(normalizeUrl(this.latestLocation.href)) !== trimPath(normalizeUrl(nextLocation.href))) { 3232 let href = nextLocation.url; 3233 if (this.origin && href.startsWith(this.origin)) { 3234 href = href.replace(this.origin, "") || "/"; 3235 } 3236 throw redirect({ href }); 3237 } 3238 } 3239 const pendingMatches = this.matchRoutes(this.latestLocation); 3240 this.__store.setState((s) => ({ 3241 ...s, 3242 status: "pending", 3243 statusCode: 200, 3244 isLoading: true, 3245 location: this.latestLocation, 3246 pendingMatches, 3247 // If a cached moved to pendingMatches, remove it from cachedMatches 3248 cachedMatches: s.cachedMatches.filter( 3249 (d) => !pendingMatches.some((e) => e.id === d.id) 3250 ) 3251 })); 3252 }; 3253 this.load = async (opts) => { 3254 let redirect2; 3255 let notFound2; 3256 let loadPromise; 3257 loadPromise = new Promise((resolve) => { 3258 this.startTransition(async () => { 3259 try { 3260 this.beforeLoad(); 3261 const next = this.latestLocation; 3262 const prevLocation = this.state.resolvedLocation; 3263 if (!this.state.redirect) { 3264 this.emit({ 3265 type: "onBeforeNavigate", 3266 ...getLocationChangeInfo({ 3267 resolvedLocation: prevLocation, 3268 location: next 3269 }) 3270 }); 3271 } 3272 this.emit({ 3273 type: "onBeforeLoad", 3274 ...getLocationChangeInfo({ 3275 resolvedLocation: prevLocation, 3276 location: next 3277 }) 3278 }); 3279 await loadMatches({ 3280 router: this, 3281 sync: opts?.sync, 3282 matches: this.state.pendingMatches, 3283 location: next, 3284 updateMatch: this.updateMatch, 3285 // eslint-disable-next-line @typescript-eslint/require-await 3286 onReady: async () => { 3287 this.startViewTransition(async () => { 3288 let exitingMatches; 3289 let enteringMatches; 3290 let stayingMatches; 3291 batch(() => { 3292 this.__store.setState((s) => { 3293 const previousMatches = s.matches; 3294 const newMatches = s.pendingMatches || s.matches; 3295 exitingMatches = previousMatches.filter( 3296 (match) => !newMatches.some((d) => d.id === match.id) 3297 ); 3298 enteringMatches = newMatches.filter( 3299 (match) => !previousMatches.some((d) => d.id === match.id) 3300 ); 3301 stayingMatches = previousMatches.filter( 3302 (match) => newMatches.some((d) => d.id === match.id) 3303 ); 3304 return { 3305 ...s, 3306 isLoading: false, 3307 loadedAt: Date.now(), 3308 matches: newMatches, 3309 pendingMatches: void 0, 3310 cachedMatches: [ 3311 ...s.cachedMatches, 3312 ...exitingMatches.filter((d) => d.status !== "error") 3313 ] 3314 }; 3315 }); 3316 this.clearExpiredCache(); 3317 }); 3318 [ 3319 [exitingMatches, "onLeave"], 3320 [enteringMatches, "onEnter"], 3321 [stayingMatches, "onStay"] 3322 ].forEach(([matches, hook]) => { 3323 matches.forEach((match) => { 3324 this.looseRoutesById[match.routeId].options[hook]?.(match); 3325 }); 3326 }); 3327 }); 3328 } 3329 }); 3330 } catch (err) { 3331 if (isRedirect(err)) { 3332 redirect2 = err; 3333 if (!this.isServer) { 3334 this.navigate({ 3335 ...redirect2.options, 3336 replace: true, 3337 ignoreBlocker: true 3338 }); 3339 } 3340 } else if (isNotFound(err)) { 3341 notFound2 = err; 3342 } 3343 this.__store.setState((s) => ({ 3344 ...s, 3345 statusCode: redirect2 ? redirect2.status : notFound2 ? 404 : s.matches.some((d) => d.status === "error") ? 500 : 200, 3346 redirect: redirect2 3347 })); 3348 } 3349 if (this.latestLoadPromise === loadPromise) { 3350 this.commitLocationPromise?.resolve(); 3351 this.latestLoadPromise = void 0; 3352 this.commitLocationPromise = void 0; 3353 } 3354 resolve(); 3355 }); 3356 }); 3357 this.latestLoadPromise = loadPromise; 3358 await loadPromise; 3359 while (this.latestLoadPromise && loadPromise !== this.latestLoadPromise) { 3360 await this.latestLoadPromise; 3361 } 3362 let newStatusCode = void 0; 3363 if (this.hasNotFoundMatch()) { 3364 newStatusCode = 404; 3365 } else if (this.__store.state.matches.some((d) => d.status === "error")) { 3366 newStatusCode = 500; 3367 } 3368 if (newStatusCode !== void 0) { 3369 this.__store.setState((s) => ({ 3370 ...s, 3371 statusCode: newStatusCode 3372 })); 3373 } 3374 }; 3375 this.startViewTransition = (fn) => { 3376 const shouldViewTransition = this.shouldViewTransition ?? this.options.defaultViewTransition; 3377 delete this.shouldViewTransition; 3378 if (shouldViewTransition && typeof document !== "undefined" && "startViewTransition" in document && typeof document.startViewTransition === "function") { 3379 let startViewTransitionParams; 3380 if (typeof shouldViewTransition === "object" && this.isViewTransitionTypesSupported) { 3381 const next = this.latestLocation; 3382 const prevLocation = this.state.resolvedLocation; 3383 const resolvedViewTransitionTypes = typeof shouldViewTransition.types === "function" ? shouldViewTransition.types( 3384 getLocationChangeInfo({ 3385 resolvedLocation: prevLocation, 3386 location: next 3387 }) 3388 ) : shouldViewTransition.types; 3389 if (resolvedViewTransitionTypes === false) { 3390 fn(); 3391 return; 3392 } 3393 startViewTransitionParams = { 3394 update: fn, 3395 types: resolvedViewTransitionTypes 3396 }; 3397 } else { 3398 startViewTransitionParams = fn; 3399 } 3400 document.startViewTransition(startViewTransitionParams); 3401 } else { 3402 fn(); 3403 } 3404 }; 3405 this.updateMatch = (id, updater) => { 3406 const matchesKey = this.state.pendingMatches?.some((d) => d.id === id) ? "pendingMatches" : this.state.matches.some((d) => d.id === id) ? "matches" : this.state.cachedMatches.some((d) => d.id === id) ? "cachedMatches" : ""; 3407 if (matchesKey) { 3408 this.__store.setState((s) => ({ 3409 ...s, 3410 [matchesKey]: s[matchesKey]?.map((d) => d.id === id ? updater(d) : d) 3411 })); 3412 } 3413 }; 3414 this.getMatch = (matchId) => { 3415 const findFn = (d) => d.id === matchId; 3416 return this.state.cachedMatches.find(findFn) ?? this.state.pendingMatches?.find(findFn) ?? this.state.matches.find(findFn); 3417 }; 3418 this.invalidate = (opts) => { 3419 const invalidate = (d) => { 3420 if (opts?.filter?.(d) ?? true) { 3421 return { 3422 ...d, 3423 invalid: true, 3424 ...opts?.forcePending || d.status === "error" ? { status: "pending", error: void 0 } : void 0 3425 }; 3426 } 3427 return d; 3428 }; 3429 this.__store.setState((s) => ({ 3430 ...s, 3431 matches: s.matches.map(invalidate), 3432 cachedMatches: s.cachedMatches.map(invalidate), 3433 pendingMatches: s.pendingMatches?.map(invalidate) 3434 })); 3435 this.shouldViewTransition = false; 3436 return this.load({ sync: opts?.sync }); 3437 }; 3438 this.resolveRedirect = (redirect2) => { 3439 if (!redirect2.options.href) { 3440 const location = this.buildLocation(redirect2.options); 3441 let href = location.url; 3442 if (this.origin && href.startsWith(this.origin)) { 3443 href = href.replace(this.origin, "") || "/"; 3444 } 3445 redirect2.options.href = location.href; 3446 redirect2.headers.set("Location", href); 3447 } 3448 if (!redirect2.headers.get("Location")) { 3449 redirect2.headers.set("Location", redirect2.options.href); 3450 } 3451 return redirect2; 3452 }; 3453 this.clearCache = (opts) => { 3454 const filter = opts?.filter; 3455 if (filter !== void 0) { 3456 this.__store.setState((s) => { 3457 return { 3458 ...s, 3459 cachedMatches: s.cachedMatches.filter( 3460 (m) => !filter(m) 3461 ) 3462 }; 3463 }); 3464 } else { 3465 this.__store.setState((s) => { 3466 return { 3467 ...s, 3468 cachedMatches: [] 3469 }; 3470 }); 3471 } 3472 }; 3473 this.clearExpiredCache = () => { 3474 const filter = (d) => { 3475 const route = this.looseRoutesById[d.routeId]; 3476 if (!route.options.loader) { 3477 return true; 3478 } 3479 const gcTime = (d.preload ? route.options.preloadGcTime ?? this.options.defaultPreloadGcTime : route.options.gcTime ?? this.options.defaultGcTime) ?? 5 * 60 * 1e3; 3480 const isError = d.status === "error"; 3481 if (isError) return true; 3482 const gcEligible = Date.now() - d.updatedAt >= gcTime; 3483 return gcEligible; 3484 }; 3485 this.clearCache({ filter }); 3486 }; 3487 this.loadRouteChunk = loadRouteChunk; 3488 this.preloadRoute = async (opts) => { 3489 const next = this.buildLocation(opts); 3490 let matches = this.matchRoutes(next, { 3491 throwOnError: true, 3492 preload: true, 3493 dest: opts 3494 }); 3495 const activeMatchIds = new Set( 3496 [...this.state.matches, ...this.state.pendingMatches ?? []].map( 3497 (d) => d.id 3498 ) 3499 ); 3500 const loadedMatchIds = /* @__PURE__ */ new Set([ 3501 ...activeMatchIds, 3502 ...this.state.cachedMatches.map((d) => d.id) 3503 ]); 3504 batch(() => { 3505 matches.forEach((match) => { 3506 if (!loadedMatchIds.has(match.id)) { 3507 this.__store.setState((s) => ({ 3508 ...s, 3509 cachedMatches: [...s.cachedMatches, match] 3510 })); 3511 } 3512 }); 3513 }); 3514 try { 3515 matches = await loadMatches({ 3516 router: this, 3517 matches, 3518 location: next, 3519 preload: true, 3520 updateMatch: (id, updater) => { 3521 if (activeMatchIds.has(id)) { 3522 matches = matches.map((d) => d.id === id ? updater(d) : d); 3523 } else { 3524 this.updateMatch(id, updater); 3525 } 3526 } 3527 }); 3528 return matches; 3529 } catch (err) { 3530 if (isRedirect(err)) { 3531 if (err.options.reloadDocument) { 3532 return void 0; 3533 } 3534 return await this.preloadRoute({ 3535 ...err.options, 3536 _fromLocation: next 3537 }); 3538 } 3539 if (!isNotFound(err)) { 3540 console.error(err); 3541 } 3542 return void 0; 3543 } 3544 }; 3545 this.matchRoute = (location, opts) => { 3546 const matchLocation = { 3547 ...location, 3548 to: location.to ? this.resolvePathWithBase( 3549 location.from || "", 3550 location.to 3551 ) : void 0, 3552 params: location.params || {}, 3553 leaveParams: true 3554 }; 3555 const next = this.buildLocation(matchLocation); 3556 if (opts?.pending && this.state.status !== "pending") { 3557 return false; 3558 } 3559 const pending = opts?.pending === void 0 ? !this.state.isLoading : opts.pending; 3560 const baseLocation = pending ? this.latestLocation : this.state.resolvedLocation || this.state.location; 3561 const match = matchPathname( 3562 baseLocation.pathname, 3563 { 3564 ...opts, 3565 to: next.pathname 3566 }, 3567 this.parsePathnameCache 3568 ); 3569 if (!match) { 3570 return false; 3571 } 3572 if (location.params) { 3573 if (!deepEqual(match, location.params, { partial: true })) { 3574 return false; 3575 } 3576 } 3577 if (match && (opts?.includeSearch ?? true)) { 3578 return deepEqual(baseLocation.search, next.search, { partial: true }) ? match : false; 3579 } 3580 return match; 3581 }; 3582 this.hasNotFoundMatch = () => { 3583 return this.__store.state.matches.some( 3584 (d) => d.status === "notFound" || d.globalNotFound 3585 ); 3586 }; 3587 this.update({ 3588 defaultPreloadDelay: 50, 3589 defaultPendingMs: 1e3, 3590 defaultPendingMinMs: 500, 3591 context: void 0, 3592 ...options, 3593 caseSensitive: options.caseSensitive ?? false, 3594 notFoundMode: options.notFoundMode ?? "fuzzy", 3595 stringifySearch: options.stringifySearch ?? defaultStringifySearch, 3596 parseSearch: options.parseSearch ?? defaultParseSearch 3597 }); 3598 if (typeof document !== "undefined") { 3599 self.__TSR_ROUTER__ = this; 3600 } 3601 } 3602 isShell() { 3603 return !!this.options.isShell; 3604 } 3605 isPrerendering() { 3606 return !!this.options.isPrerendering; 3607 } 3608 get state() { 3609 return this.__store.state; 3610 } 3611 get looseRoutesById() { 3612 return this.routesById; 3613 } 3614 matchRoutesInternal(next, opts) { 3615 const { foundRoute, matchedRoutes, routeParams } = this.getMatchedRoutes( 3616 next.pathname, 3617 opts?.dest?.to 3618 ); 3619 let isGlobalNotFound = false; 3620 if ( 3621 // If we found a route, and it's not an index route and we have left over path 3622 foundRoute ? foundRoute.path !== "/" && routeParams["**"] : ( 3623 // Or if we didn't find a route and we have left over path 3624 trimPathRight(next.pathname) 3625 ) 3626 ) { 3627 if (this.options.notFoundRoute) { 3628 matchedRoutes.push(this.options.notFoundRoute); 3629 } else { 3630 isGlobalNotFound = true; 3631 } 3632 } 3633 const globalNotFoundRouteId = (() => { 3634 if (!isGlobalNotFound) { 3635 return void 0; 3636 } 3637 if (this.options.notFoundMode !== "root") { 3638 for (let i = matchedRoutes.length - 1; i >= 0; i--) { 3639 const route = matchedRoutes[i]; 3640 if (route.children) { 3641 return route.id; 3642 } 3643 } 3644 } 3645 return rootRouteId; 3646 })(); 3647 const matches = []; 3648 const getParentContext = (parentMatch) => { 3649 const parentMatchId = parentMatch?.id; 3650 const parentContext = !parentMatchId ? this.options.context ?? void 0 : parentMatch.context ?? this.options.context ?? void 0; 3651 return parentContext; 3652 }; 3653 matchedRoutes.forEach((route, index) => { 3654 const parentMatch = matches[index - 1]; 3655 const [preMatchSearch, strictMatchSearch, searchError] = (() => { 3656 const parentSearch = parentMatch?.search ?? next.search; 3657 const parentStrictSearch = parentMatch?._strictSearch ?? void 0; 3658 try { 3659 const strictSearch = validateSearch(route.options.validateSearch, { ...parentSearch }) ?? void 0; 3660 return [ 3661 { 3662 ...parentSearch, 3663 ...strictSearch 3664 }, 3665 { ...parentStrictSearch, ...strictSearch }, 3666 void 0 3667 ]; 3668 } catch (err) { 3669 let searchParamError = err; 3670 if (!(err instanceof SearchParamError)) { 3671 searchParamError = new SearchParamError(err.message, { 3672 cause: err 3673 }); 3674 } 3675 if (opts?.throwOnError) { 3676 throw searchParamError; 3677 } 3678 return [parentSearch, {}, searchParamError]; 3679 } 3680 })(); 3681 const loaderDeps = route.options.loaderDeps?.({ 3682 search: preMatchSearch 3683 }) ?? ""; 3684 const loaderDepsHash = loaderDeps ? JSON.stringify(loaderDeps) : ""; 3685 const { interpolatedPath, usedParams } = interpolatePath({ 3686 path: route.fullPath, 3687 params: routeParams, 3688 decodeCharMap: this.pathParamsDecodeCharMap 3689 }); 3690 const matchId = interpolatePath({ 3691 path: route.id, 3692 params: routeParams, 3693 leaveWildcards: true, 3694 decodeCharMap: this.pathParamsDecodeCharMap, 3695 parseCache: this.parsePathnameCache 3696 }).interpolatedPath + loaderDepsHash; 3697 const existingMatch = this.getMatch(matchId); 3698 const previousMatch = this.state.matches.find( 3699 (d) => d.routeId === route.id 3700 ); 3701 const strictParams = existingMatch?._strictParams ?? usedParams; 3702 let paramsError = void 0; 3703 if (!existingMatch) { 3704 const strictParseParams = route.options.params?.parse ?? route.options.parseParams; 3705 if (strictParseParams) { 3706 try { 3707 Object.assign( 3708 strictParams, 3709 strictParseParams(strictParams) 3710 ); 3711 } catch (err) { 3712 paramsError = new PathParamError(err.message, { 3713 cause: err 3714 }); 3715 if (opts?.throwOnError) { 3716 throw paramsError; 3717 } 3718 } 3719 } 3720 } 3721 Object.assign(routeParams, strictParams); 3722 const cause = previousMatch ? "stay" : "enter"; 3723 let match; 3724 if (existingMatch) { 3725 match = { 3726 ...existingMatch, 3727 cause, 3728 params: previousMatch ? replaceEqualDeep(previousMatch.params, routeParams) : routeParams, 3729 _strictParams: strictParams, 3730 search: previousMatch ? replaceEqualDeep(previousMatch.search, preMatchSearch) : replaceEqualDeep(existingMatch.search, preMatchSearch), 3731 _strictSearch: strictMatchSearch 3732 }; 3733 } else { 3734 const status = route.options.loader || route.options.beforeLoad || route.lazyFn || routeNeedsPreload(route) ? "pending" : "success"; 3735 match = { 3736 id: matchId, 3737 index, 3738 routeId: route.id, 3739 params: previousMatch ? replaceEqualDeep(previousMatch.params, routeParams) : routeParams, 3740 _strictParams: strictParams, 3741 pathname: interpolatedPath, 3742 updatedAt: Date.now(), 3743 search: previousMatch ? replaceEqualDeep(previousMatch.search, preMatchSearch) : preMatchSearch, 3744 _strictSearch: strictMatchSearch, 3745 searchError: void 0, 3746 status, 3747 isFetching: false, 3748 error: void 0, 3749 paramsError, 3750 __routeContext: void 0, 3751 _nonReactive: { 3752 loadPromise: createControlledPromise() 3753 }, 3754 __beforeLoadContext: void 0, 3755 context: {}, 3756 abortController: new AbortController(), 3757 fetchCount: 0, 3758 cause, 3759 loaderDeps: previousMatch ? replaceEqualDeep(previousMatch.loaderDeps, loaderDeps) : loaderDeps, 3760 invalid: false, 3761 preload: false, 3762 links: void 0, 3763 scripts: void 0, 3764 headScripts: void 0, 3765 meta: void 0, 3766 staticData: route.options.staticData || {}, 3767 fullPath: route.fullPath 3768 }; 3769 } 3770 if (!opts?.preload) { 3771 match.globalNotFound = globalNotFoundRouteId === route.id; 3772 } 3773 match.searchError = searchError; 3774 const parentContext = getParentContext(parentMatch); 3775 match.context = { 3776 ...parentContext, 3777 ...match.__routeContext, 3778 ...match.__beforeLoadContext 3779 }; 3780 matches.push(match); 3781 }); 3782 matches.forEach((match, index) => { 3783 const route = this.looseRoutesById[match.routeId]; 3784 const existingMatch = this.getMatch(match.id); 3785 if (!existingMatch && opts?._buildLocation !== true) { 3786 const parentMatch = matches[index - 1]; 3787 const parentContext = getParentContext(parentMatch); 3788 if (route.options.context) { 3789 const contextFnContext = { 3790 deps: match.loaderDeps, 3791 params: match.params, 3792 context: parentContext ?? {}, 3793 location: next, 3794 navigate: (opts2) => this.navigate({ ...opts2, _fromLocation: next }), 3795 buildLocation: this.buildLocation, 3796 cause: match.cause, 3797 abortController: match.abortController, 3798 preload: !!match.preload, 3799 matches 3800 }; 3801 match.__routeContext = route.options.context(contextFnContext) ?? void 0; 3802 } 3803 match.context = { 3804 ...parentContext, 3805 ...match.__routeContext, 3806 ...match.__beforeLoadContext 3807 }; 3808 } 3809 }); 3810 return matches; 3811 } 3812 }; 3813 var SearchParamError = class extends Error { 3814 }; 3815 var PathParamError = class extends Error { 3816 }; 3817 var normalize = (str) => str.endsWith("/") && str.length > 1 ? str.slice(0, -1) : str; 3818 function comparePaths(a, b) { 3819 return normalize(a) === normalize(b); 3820 } 3821 function getInitialRouterState(location) { 3822 return { 3823 loadedAt: 0, 3824 isLoading: false, 3825 isTransitioning: false, 3826 status: "idle", 3827 resolvedLocation: void 0, 3828 location, 3829 matches: [], 3830 pendingMatches: [], 3831 cachedMatches: [], 3832 statusCode: 200 3833 }; 3834 } 3835 function validateSearch(validateSearch2, input) { 3836 if (validateSearch2 == null) return {}; 3837 if ("~standard" in validateSearch2) { 3838 const result = validateSearch2["~standard"].validate(input); 3839 if (result instanceof Promise) 3840 throw new SearchParamError("Async validation not supported"); 3841 if (result.issues) 3842 throw new SearchParamError(JSON.stringify(result.issues, void 0, 2), { 3843 cause: result 3844 }); 3845 return result.value; 3846 } 3847 if ("parse" in validateSearch2) { 3848 return validateSearch2.parse(input); 3849 } 3850 if (typeof validateSearch2 === "function") { 3851 return validateSearch2(input); 3852 } 3853 return {}; 3854 } 3855 function getMatchedRoutes({ 3856 pathname, 3857 routePathname, 3858 caseSensitive, 3859 routesByPath, 3860 routesById, 3861 flatRoutes, 3862 parseCache 3863 }) { 3864 let routeParams = {}; 3865 const trimmedPath = trimPathRight(pathname); 3866 const getMatchedParams = (route) => { 3867 const result = matchPathname( 3868 trimmedPath, 3869 { 3870 to: route.fullPath, 3871 caseSensitive: route.options?.caseSensitive ?? caseSensitive, 3872 // we need fuzzy matching for `notFoundMode: 'fuzzy'` 3873 fuzzy: true 3874 }, 3875 parseCache 3876 ); 3877 return result; 3878 }; 3879 let foundRoute = routePathname !== void 0 ? routesByPath[routePathname] : void 0; 3880 if (foundRoute) { 3881 routeParams = getMatchedParams(foundRoute); 3882 } else { 3883 let fuzzyMatch = void 0; 3884 for (const route of flatRoutes) { 3885 const matchedParams = getMatchedParams(route); 3886 if (matchedParams) { 3887 if (route.path !== "/" && matchedParams["**"]) { 3888 if (!fuzzyMatch) { 3889 fuzzyMatch = { foundRoute: route, routeParams: matchedParams }; 3890 } 3891 } else { 3892 foundRoute = route; 3893 routeParams = matchedParams; 3894 break; 3895 } 3896 } 3897 } 3898 if (!foundRoute && fuzzyMatch) { 3899 foundRoute = fuzzyMatch.foundRoute; 3900 routeParams = fuzzyMatch.routeParams; 3901 } 3902 } 3903 let routeCursor = foundRoute || routesById[rootRouteId]; 3904 const matchedRoutes = [routeCursor]; 3905 while (routeCursor.parentRoute) { 3906 routeCursor = routeCursor.parentRoute; 3907 matchedRoutes.push(routeCursor); 3908 } 3909 matchedRoutes.reverse(); 3910 return { matchedRoutes, routeParams, foundRoute }; 3911 } 3912 function applySearchMiddleware({ 3913 search, 3914 dest, 3915 destRoutes, 3916 _includeValidateSearch 3917 }) { 3918 const allMiddlewares = destRoutes.reduce( 3919 (acc, route) => { 3920 const middlewares = []; 3921 if ("search" in route.options) { 3922 if (route.options.search?.middlewares) { 3923 middlewares.push(...route.options.search.middlewares); 3924 } 3925 } else if (route.options.preSearchFilters || route.options.postSearchFilters) { 3926 const legacyMiddleware = ({ 3927 search: search2, 3928 next 3929 }) => { 3930 let nextSearch = search2; 3931 if ("preSearchFilters" in route.options && route.options.preSearchFilters) { 3932 nextSearch = route.options.preSearchFilters.reduce( 3933 (prev, next2) => next2(prev), 3934 search2 3935 ); 3936 } 3937 const result = next(nextSearch); 3938 if ("postSearchFilters" in route.options && route.options.postSearchFilters) { 3939 return route.options.postSearchFilters.reduce( 3940 (prev, next2) => next2(prev), 3941 result 3942 ); 3943 } 3944 return result; 3945 }; 3946 middlewares.push(legacyMiddleware); 3947 } 3948 if (_includeValidateSearch && route.options.validateSearch) { 3949 const validate = ({ search: search2, next }) => { 3950 const result = next(search2); 3951 try { 3952 const validatedSearch = { 3953 ...result, 3954 ...validateSearch(route.options.validateSearch, result) ?? void 0 3955 }; 3956 return validatedSearch; 3957 } catch { 3958 return result; 3959 } 3960 }; 3961 middlewares.push(validate); 3962 } 3963 return acc.concat(middlewares); 3964 }, 3965 [] 3966 ) ?? []; 3967 const final = ({ search: search2 }) => { 3968 if (!dest.search) { 3969 return {}; 3970 } 3971 if (dest.search === true) { 3972 return search2; 3973 } 3974 return functionalUpdate(dest.search, search2); 3975 }; 3976 allMiddlewares.push(final); 3977 const applyNext = (index, currentSearch) => { 3978 if (index >= allMiddlewares.length) { 3979 return currentSearch; 3980 } 3981 const middleware = allMiddlewares[index]; 3982 const next = (newSearch) => { 3983 return applyNext(index + 1, newSearch); 3984 }; 3985 return middleware({ search: currentSearch, next }); 3986 }; 3987 return applyNext(0, search); 3988 } 3989 3990 // node_modules/@tanstack/router-core/dist/esm/link.js 3991 var preloadWarning = "Error preloading route! \u261D\uFE0F"; 3992 3993 // node_modules/@tanstack/router-core/dist/esm/route.js 3994 var BaseRoute = class { 3995 constructor(options) { 3996 this.init = (opts) => { 3997 this.originalIndex = opts.originalIndex; 3998 const options2 = this.options; 3999 const isRoot = !options2?.path && !options2?.id; 4000 this.parentRoute = this.options.getParentRoute?.(); 4001 if (isRoot) { 4002 this._path = rootRouteId; 4003 } else if (!this.parentRoute) { 4004 invariant( 4005 false, 4006 `Child Route instances must pass a 'getParentRoute: () => ParentRoute' option that returns a Route instance.` 4007 ); 4008 } 4009 let path = isRoot ? rootRouteId : options2?.path; 4010 if (path && path !== "/") { 4011 path = trimPathLeft(path); 4012 } 4013 const customId = options2?.id || path; 4014 let id = isRoot ? rootRouteId : joinPaths([ 4015 this.parentRoute.id === rootRouteId ? "" : this.parentRoute.id, 4016 customId 4017 ]); 4018 if (path === rootRouteId) { 4019 path = "/"; 4020 } 4021 if (id !== rootRouteId) { 4022 id = joinPaths(["/", id]); 4023 } 4024 const fullPath = id === rootRouteId ? "/" : joinPaths([this.parentRoute.fullPath, path]); 4025 this._path = path; 4026 this._id = id; 4027 this._fullPath = fullPath; 4028 this._to = fullPath; 4029 }; 4030 this.clone = (other) => { 4031 this._path = other._path; 4032 this._id = other._id; 4033 this._fullPath = other._fullPath; 4034 this._to = other._to; 4035 this.options.getParentRoute = other.options.getParentRoute; 4036 this.children = other.children; 4037 }; 4038 this.addChildren = (children) => { 4039 return this._addFileChildren(children); 4040 }; 4041 this._addFileChildren = (children) => { 4042 if (Array.isArray(children)) { 4043 this.children = children; 4044 } 4045 if (typeof children === "object" && children !== null) { 4046 this.children = Object.values(children); 4047 } 4048 return this; 4049 }; 4050 this._addFileTypes = () => { 4051 return this; 4052 }; 4053 this.updateLoader = (options2) => { 4054 Object.assign(this.options, options2); 4055 return this; 4056 }; 4057 this.update = (options2) => { 4058 Object.assign(this.options, options2); 4059 return this; 4060 }; 4061 this.lazy = (lazyFn2) => { 4062 this.lazyFn = lazyFn2; 4063 return this; 4064 }; 4065 this.options = options || {}; 4066 this.isRoot = !options?.getParentRoute; 4067 if (options?.id && options?.path) { 4068 throw new Error(`Route cannot have both an 'id' and a 'path' option.`); 4069 } 4070 } 4071 get to() { 4072 return this._to; 4073 } 4074 get id() { 4075 return this._id; 4076 } 4077 get path() { 4078 return this._path; 4079 } 4080 get fullPath() { 4081 return this._fullPath; 4082 } 4083 }; 4084 var BaseRootRoute = class extends BaseRoute { 4085 constructor(options) { 4086 super(options); 4087 } 4088 }; 4089 4090 // node_modules/@tanstack/react-router/dist/esm/CatchBoundary.js 4091 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); 4092 var React = __toESM(require_react(), 1); 4093 function CatchBoundary(props) { 4094 const errorComponent = props.errorComponent ?? ErrorComponent; 4095 return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( 4096 CatchBoundaryImpl, 4097 { 4098 getResetKey: props.getResetKey, 4099 onCatch: props.onCatch, 4100 children: ({ error, reset }) => { 4101 if (error) { 4102 return React.createElement(errorComponent, { 4103 error, 4104 reset 4105 }); 4106 } 4107 return props.children; 4108 } 4109 } 4110 ); 4111 } 4112 var CatchBoundaryImpl = class extends React.Component { 4113 constructor() { 4114 super(...arguments); 4115 this.state = { error: null }; 4116 } 4117 static getDerivedStateFromProps(props) { 4118 return { resetKey: props.getResetKey() }; 4119 } 4120 static getDerivedStateFromError(error) { 4121 return { error }; 4122 } 4123 reset() { 4124 this.setState({ error: null }); 4125 } 4126 componentDidUpdate(prevProps, prevState) { 4127 if (prevState.error && prevState.resetKey !== this.state.resetKey) { 4128 this.reset(); 4129 } 4130 } 4131 componentDidCatch(error, errorInfo) { 4132 if (this.props.onCatch) { 4133 this.props.onCatch(error, errorInfo); 4134 } 4135 } 4136 render() { 4137 return this.props.children({ 4138 error: this.state.resetKey !== this.props.getResetKey() ? null : this.state.error, 4139 reset: () => { 4140 this.reset(); 4141 } 4142 }); 4143 } 4144 }; 4145 function ErrorComponent({ error }) { 4146 const [show, setShow] = React.useState(true); 4147 return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: ".5rem", maxWidth: "100%" }, children: [ 4148 /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: ".5rem" }, children: [ 4149 /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { style: { fontSize: "1rem" }, children: "Something went wrong!" }), 4150 /* @__PURE__ */ (0, import_jsx_runtime.jsx)( 4151 "button", 4152 { 4153 style: { 4154 appearance: "none", 4155 fontSize: ".6em", 4156 border: "1px solid currentColor", 4157 padding: ".1rem .2rem", 4158 fontWeight: "bold", 4159 borderRadius: ".25rem" 4160 }, 4161 onClick: () => setShow((d) => !d), 4162 children: show ? "Hide Error" : "Show Error" 4163 } 4164 ) 4165 ] }), 4166 /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: ".25rem" } }), 4167 show ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)( 4168 "pre", 4169 { 4170 style: { 4171 fontSize: ".7em", 4172 border: "1px solid red", 4173 borderRadius: ".25rem", 4174 padding: ".3rem", 4175 color: "red", 4176 overflow: "auto" 4177 }, 4178 children: error.message ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children: error.message }) : null 4179 } 4180 ) }) : null 4181 ] }); 4182 } 4183 4184 // node_modules/@tanstack/react-router/dist/esm/ClientOnly.js 4185 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); 4186 var import_react = __toESM(require_react(), 1); 4187 function ClientOnly({ children, fallback = null }) { 4188 return useHydrated() ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react.default.Fragment, { children }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react.default.Fragment, { children: fallback }); 4189 } 4190 function useHydrated() { 4191 return import_react.default.useSyncExternalStore( 4192 subscribe, 4193 () => true, 4194 () => false 4195 ); 4196 } 4197 function subscribe() { 4198 return () => { 4199 }; 4200 } 4201 4202 // node_modules/tiny-warning/dist/tiny-warning.esm.js 4203 var isProduction2 = false; 4204 function warning(condition, message) { 4205 if (!isProduction2) { 4206 if (condition) { 4207 return; 4208 } 4209 var text = "Warning: " + message; 4210 if (typeof console !== "undefined") { 4211 console.warn(text); 4212 } 4213 try { 4214 throw Error(text); 4215 } catch (x) { 4216 } 4217 } 4218 } 4219 var tiny_warning_esm_default = warning; 4220 4221 // node_modules/@tanstack/react-router/dist/esm/route.js 4222 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); 4223 var import_react3 = __toESM(require_react(), 1); 4224 4225 // node_modules/@tanstack/react-router/dist/esm/useMatch.js 4226 var React5 = __toESM(require_react(), 1); 4227 4228 // node_modules/@tanstack/react-store/dist/esm/index.js 4229 var import_with_selector = __toESM(require_with_selector(), 1); 4230 function useStore(store, selector = (d) => d, options = {}) { 4231 const equal = options.equal ?? shallow; 4232 const slice = (0, import_with_selector.useSyncExternalStoreWithSelector)( 4233 store.subscribe, 4234 () => store.state, 4235 () => store.state, 4236 selector, 4237 equal 4238 ); 4239 return slice; 4240 } 4241 function shallow(objA, objB) { 4242 if (Object.is(objA, objB)) { 4243 return true; 4244 } 4245 if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) { 4246 return false; 4247 } 4248 if (objA instanceof Map && objB instanceof Map) { 4249 if (objA.size !== objB.size) return false; 4250 for (const [k, v] of objA) { 4251 if (!objB.has(k) || !Object.is(v, objB.get(k))) return false; 4252 } 4253 return true; 4254 } 4255 if (objA instanceof Set && objB instanceof Set) { 4256 if (objA.size !== objB.size) return false; 4257 for (const v of objA) { 4258 if (!objB.has(v)) return false; 4259 } 4260 return true; 4261 } 4262 if (objA instanceof Date && objB instanceof Date) { 4263 if (objA.getTime() !== objB.getTime()) return false; 4264 return true; 4265 } 4266 const keysA = getOwnKeys(objA); 4267 if (keysA.length !== getOwnKeys(objB).length) { 4268 return false; 4269 } 4270 for (let i = 0; i < keysA.length; i++) { 4271 if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) { 4272 return false; 4273 } 4274 } 4275 return true; 4276 } 4277 function getOwnKeys(obj) { 4278 return Object.keys(obj).concat( 4279 Object.getOwnPropertySymbols(obj) 4280 ); 4281 } 4282 4283 // node_modules/@tanstack/react-router/dist/esm/useRouterState.js 4284 var import_react2 = __toESM(require_react(), 1); 4285 4286 // node_modules/@tanstack/react-router/dist/esm/useRouter.js 4287 var React3 = __toESM(require_react(), 1); 4288 4289 // node_modules/@tanstack/react-router/dist/esm/routerContext.js 4290 var React2 = __toESM(require_react(), 1); 4291 var routerContext = React2.createContext(null); 4292 function getRouterContext() { 4293 if (typeof document === "undefined") { 4294 return routerContext; 4295 } 4296 if (window.__TSR_ROUTER_CONTEXT__) { 4297 return window.__TSR_ROUTER_CONTEXT__; 4298 } 4299 window.__TSR_ROUTER_CONTEXT__ = routerContext; 4300 return routerContext; 4301 } 4302 4303 // node_modules/@tanstack/react-router/dist/esm/useRouter.js 4304 function useRouter(opts) { 4305 const value = React3.useContext(getRouterContext()); 4306 tiny_warning_esm_default( 4307 !((opts?.warn ?? true) && !value), 4308 "useRouter must be used inside a <RouterProvider> component!" 4309 ); 4310 return value; 4311 } 4312 4313 // node_modules/@tanstack/react-router/dist/esm/useRouterState.js 4314 function useRouterState(opts) { 4315 const contextRouter = useRouter({ 4316 warn: opts?.router === void 0 4317 }); 4318 const router = opts?.router || contextRouter; 4319 const previousResult = (0, import_react2.useRef)(void 0); 4320 return useStore(router.__store, (state) => { 4321 if (opts?.select) { 4322 if (opts.structuralSharing ?? router.options.defaultStructuralSharing) { 4323 const newSlice = replaceEqualDeep( 4324 previousResult.current, 4325 opts.select(state) 4326 ); 4327 previousResult.current = newSlice; 4328 return newSlice; 4329 } 4330 return opts.select(state); 4331 } 4332 return state; 4333 }); 4334 } 4335 4336 // node_modules/@tanstack/react-router/dist/esm/matchContext.js 4337 var React4 = __toESM(require_react(), 1); 4338 var matchContext = React4.createContext(void 0); 4339 var dummyMatchContext = React4.createContext( 4340 void 0 4341 ); 4342 4343 // node_modules/@tanstack/react-router/dist/esm/useMatch.js 4344 function useMatch(opts) { 4345 const nearestMatchId = React5.useContext( 4346 opts.from ? dummyMatchContext : matchContext 4347 ); 4348 const matchSelection = useRouterState({ 4349 select: (state) => { 4350 const match = state.matches.find( 4351 (d) => opts.from ? opts.from === d.routeId : d.id === nearestMatchId 4352 ); 4353 invariant( 4354 !((opts.shouldThrow ?? true) && !match), 4355 `Could not find $opts.from ? `an active match from "$opts.from}"` : "a nearest match!"}` 4356 ); 4357 if (match === void 0) { 4358 return void 0; 4359 } 4360 return opts.select ? opts.select(match) : match; 4361 }, 4362 structuralSharing: opts.structuralSharing 4363 }); 4364 return matchSelection; 4365 } 4366 4367 // node_modules/@tanstack/react-router/dist/esm/useLoaderData.js 4368 function useLoaderData(opts) { 4369 return useMatch({ 4370 from: opts.from, 4371 strict: opts.strict, 4372 structuralSharing: opts.structuralSharing, 4373 select: (s) => { 4374 return opts.select ? opts.select(s.loaderData) : s.loaderData; 4375 } 4376 }); 4377 } 4378 4379 // node_modules/@tanstack/react-router/dist/esm/useLoaderDeps.js 4380 function useLoaderDeps(opts) { 4381 const { select, ...rest } = opts; 4382 return useMatch({ 4383 ...rest, 4384 select: (s) => { 4385 return select ? select(s.loaderDeps) : s.loaderDeps; 4386 } 4387 }); 4388 } 4389 4390 // node_modules/@tanstack/react-router/dist/esm/useParams.js 4391 function useParams(opts) { 4392 return useMatch({ 4393 from: opts.from, 4394 shouldThrow: opts.shouldThrow, 4395 structuralSharing: opts.structuralSharing, 4396 strict: opts.strict, 4397 select: (match) => { 4398 const params = opts.strict === false ? match.params : match._strictParams; 4399 return opts.select ? opts.select(params) : params; 4400 } 4401 }); 4402 } 4403 4404 // node_modules/@tanstack/react-router/dist/esm/useSearch.js 4405 function useSearch(opts) { 4406 return useMatch({ 4407 from: opts.from, 4408 strict: opts.strict, 4409 shouldThrow: opts.shouldThrow, 4410 structuralSharing: opts.structuralSharing, 4411 select: (match) => { 4412 return opts.select ? opts.select(match.search) : match.search; 4413 } 4414 }); 4415 } 4416 4417 // node_modules/@tanstack/react-router/dist/esm/useNavigate.js 4418 var React6 = __toESM(require_react(), 1); 4419 function useNavigate(_defaultOpts) { 4420 const router = useRouter(); 4421 return React6.useCallback( 4422 (options) => { 4423 return router.navigate({ 4424 ...options, 4425 from: options.from ?? _defaultOpts?.from 4426 }); 4427 }, 4428 [_defaultOpts?.from, router] 4429 ); 4430 } 4431 4432 // node_modules/@tanstack/react-router/dist/esm/link.js 4433 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); 4434 var React8 = __toESM(require_react(), 1); 4435 var import_react_dom = __toESM(require_react_dom(), 1); 4436 4437 // node_modules/@tanstack/react-router/dist/esm/utils.js 4438 var React7 = __toESM(require_react(), 1); 4439 var useLayoutEffect2 = typeof window !== "undefined" ? React7.useLayoutEffect : React7.useEffect; 4440 function usePrevious(value) { 4441 const ref = React7.useRef({ 4442 value, 4443 prev: null 4444 }); 4445 const current = ref.current.value; 4446 if (value !== current) { 4447 ref.current = { 4448 value, 4449 prev: current 4450 }; 4451 } 4452 return ref.current.prev; 4453 } 4454 function useIntersectionObserver(ref, callback, intersectionObserverOptions2 = {}, options = {}) { 4455 React7.useEffect(() => { 4456 if (!ref.current || options.disabled || typeof IntersectionObserver !== "function") { 4457 return; 4458 } 4459 const observer = new IntersectionObserver(([entry]) => { 4460 callback(entry); 4461 }, intersectionObserverOptions2); 4462 observer.observe(ref.current); 4463 return () => { 4464 observer.disconnect(); 4465 }; 4466 }, [callback, intersectionObserverOptions2, options.disabled, ref]); 4467 } 4468 function useForwardedRef(ref) { 4469 const innerRef = React7.useRef(null); 4470 React7.useImperativeHandle(ref, () => innerRef.current, []); 4471 return innerRef; 4472 } 4473 4474 // node_modules/@tanstack/react-router/dist/esm/link.js 4475 function useLinkProps(options, forwardedRef) { 4476 const router = useRouter(); 4477 const [isTransitioning, setIsTransitioning] = React8.useState(false); 4478 const hasRenderFetched = React8.useRef(false); 4479 const innerRef = useForwardedRef(forwardedRef); 4480 const { 4481 // custom props 4482 activeProps, 4483 inactiveProps, 4484 activeOptions, 4485 to, 4486 preload: userPreload, 4487 preloadDelay: userPreloadDelay, 4488 hashScrollIntoView, 4489 replace, 4490 startTransition: startTransition2, 4491 resetScroll, 4492 viewTransition, 4493 // element props 4494 children, 4495 target, 4496 disabled, 4497 style, 4498 className, 4499 onClick, 4500 onFocus, 4501 onMouseEnter, 4502 onMouseLeave, 4503 onTouchStart, 4504 ignoreBlocker, 4505 // prevent these from being returned 4506 params: _params, 4507 search: _search, 4508 hash: _hash, 4509 state: _state, 4510 mask: _mask, 4511 reloadDocument: _reloadDocument, 4512 unsafeRelative: _unsafeRelative, 4513 from: _from, 4514 _fromLocation, 4515 ...propsSafeToSpread 4516 } = options; 4517 const currentSearch = useRouterState({ 4518 select: (s) => s.location.search, 4519 structuralSharing: true 4520 }); 4521 const from = options.from; 4522 const _options = React8.useMemo( 4523 () => { 4524 return { ...options, from }; 4525 }, 4526 // eslint-disable-next-line react-hooks/exhaustive-deps 4527 [ 4528 router, 4529 currentSearch, 4530 from, 4531 options._fromLocation, 4532 options.hash, 4533 options.to, 4534 options.search, 4535 options.params, 4536 options.state, 4537 options.mask, 4538 options.unsafeRelative 4539 ] 4540 ); 4541 const next = React8.useMemo( 4542 () => router.buildLocation({ ..._options }), 4543 [router, _options] 4544 ); 4545 const hrefOption = React8.useMemo(() => { 4546 if (disabled) { 4547 return void 0; 4548 } 4549 let href = next.maskedLocation ? next.maskedLocation.url : next.url; 4550 let external = false; 4551 if (router.origin) { 4552 if (href.startsWith(router.origin)) { 4553 href = router.history.createHref(href.replace(router.origin, "")) || "/"; 4554 } else { 4555 external = true; 4556 } 4557 } 4558 return { href, external }; 4559 }, [disabled, next.maskedLocation, next.url, router.origin, router.history]); 4560 const externalLink = React8.useMemo(() => { 4561 if (hrefOption?.external) { 4562 return hrefOption.href; 4563 } 4564 try { 4565 new URL(to); 4566 return to; 4567 } catch { 4568 } 4569 return void 0; 4570 }, [to, hrefOption]); 4571 const preload = options.reloadDocument || externalLink ? false : userPreload ?? router.options.defaultPreload; 4572 const preloadDelay = userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0; 4573 const isActive = useRouterState({ 4574 select: (s) => { 4575 if (externalLink) return false; 4576 if (activeOptions?.exact) { 4577 const testExact = exactPathTest( 4578 s.location.pathname, 4579 next.pathname, 4580 router.basepath 4581 ); 4582 if (!testExact) { 4583 return false; 4584 } 4585 } else { 4586 const currentPathSplit = removeTrailingSlash( 4587 s.location.pathname, 4588 router.basepath 4589 ); 4590 const nextPathSplit = removeTrailingSlash( 4591 next.pathname, 4592 router.basepath 4593 ); 4594 const pathIsFuzzyEqual = currentPathSplit.startsWith(nextPathSplit) && (currentPathSplit.length === nextPathSplit.length || currentPathSplit[nextPathSplit.length] === "/"); 4595 if (!pathIsFuzzyEqual) { 4596 return false; 4597 } 4598 } 4599 if (activeOptions?.includeSearch ?? true) { 4600 const searchTest = deepEqual(s.location.search, next.search, { 4601 partial: !activeOptions?.exact, 4602 ignoreUndefined: !activeOptions?.explicitUndefined 4603 }); 4604 if (!searchTest) { 4605 return false; 4606 } 4607 } 4608 if (activeOptions?.includeHash) { 4609 return s.location.hash === next.hash; 4610 } 4611 return true; 4612 } 4613 }); 4614 const doPreload = React8.useCallback(() => { 4615 router.preloadRoute({ ..._options }).catch((err) => { 4616 console.warn(err); 4617 console.warn(preloadWarning); 4618 }); 4619 }, [router, _options]); 4620 const preloadViewportIoCallback = React8.useCallback( 4621 (entry) => { 4622 if (entry?.isIntersecting) { 4623 doPreload(); 4624 } 4625 }, 4626 [doPreload] 4627 ); 4628 useIntersectionObserver( 4629 innerRef, 4630 preloadViewportIoCallback, 4631 intersectionObserverOptions, 4632 { disabled: !!disabled || !(preload === "viewport") } 4633 ); 4634 React8.useEffect(() => { 4635 if (hasRenderFetched.current) { 4636 return; 4637 } 4638 if (!disabled && preload === "render") { 4639 doPreload(); 4640 hasRenderFetched.current = true; 4641 } 4642 }, [disabled, doPreload, preload]); 4643 const handleClick = (e) => { 4644 const elementTarget = e.currentTarget.getAttribute("target"); 4645 const effectiveTarget = target !== void 0 ? target : elementTarget; 4646 if (!disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!effectiveTarget || effectiveTarget === "_self") && e.button === 0) { 4647 e.preventDefault(); 4648 (0, import_react_dom.flushSync)(() => { 4649 setIsTransitioning(true); 4650 }); 4651 const unsub = router.subscribe("onResolved", () => { 4652 unsub(); 4653 setIsTransitioning(false); 4654 }); 4655 router.navigate({ 4656 ..._options, 4657 replace, 4658 resetScroll, 4659 hashScrollIntoView, 4660 startTransition: startTransition2, 4661 viewTransition, 4662 ignoreBlocker 4663 }); 4664 } 4665 }; 4666 if (externalLink) { 4667 return { 4668 ...propsSafeToSpread, 4669 ref: innerRef, 4670 href: externalLink, 4671 ...children && { children }, 4672 ...target && { target }, 4673 ...disabled && { disabled }, 4674 ...style && { style }, 4675 ...className && { className }, 4676 ...onClick && { onClick }, 4677 ...onFocus && { onFocus }, 4678 ...onMouseEnter && { onMouseEnter }, 4679 ...onMouseLeave && { onMouseLeave }, 4680 ...onTouchStart && { onTouchStart } 4681 }; 4682 } 4683 const handleFocus = (_) => { 4684 if (disabled) return; 4685 if (preload) { 4686 doPreload(); 4687 } 4688 }; 4689 const handleTouchStart = handleFocus; 4690 const handleEnter = (e) => { 4691 if (disabled || !preload) return; 4692 if (!preloadDelay) { 4693 doPreload(); 4694 } else { 4695 const eventTarget = e.target; 4696 if (timeoutMap.has(eventTarget)) { 4697 return; 4698 } 4699 const id = setTimeout(() => { 4700 timeoutMap.delete(eventTarget); 4701 doPreload(); 4702 }, preloadDelay); 4703 timeoutMap.set(eventTarget, id); 4704 } 4705 }; 4706 const handleLeave = (e) => { 4707 if (disabled || !preload || !preloadDelay) return; 4708 const eventTarget = e.target; 4709 const id = timeoutMap.get(eventTarget); 4710 if (id) { 4711 clearTimeout(id); 4712 timeoutMap.delete(eventTarget); 4713 } 4714 }; 4715 const resolvedActiveProps = isActive ? functionalUpdate(activeProps, {}) ?? STATIC_ACTIVE_OBJECT : STATIC_EMPTY_OBJECT; 4716 const resolvedInactiveProps = isActive ? STATIC_EMPTY_OBJECT : functionalUpdate(inactiveProps, {}) ?? STATIC_EMPTY_OBJECT; 4717 const resolvedClassName = [ 4718 className, 4719 resolvedActiveProps.className, 4720 resolvedInactiveProps.className 4721 ].filter(Boolean).join(" "); 4722 const resolvedStyle = (style || resolvedActiveProps.style || resolvedInactiveProps.style) && { 4723 ...style, 4724 ...resolvedActiveProps.style, 4725 ...resolvedInactiveProps.style 4726 }; 4727 return { 4728 ...propsSafeToSpread, 4729 ...resolvedActiveProps, 4730 ...resolvedInactiveProps, 4731 href: hrefOption?.href, 4732 ref: innerRef, 4733 onClick: composeHandlers([onClick, handleClick]), 4734 onFocus: composeHandlers([onFocus, handleFocus]), 4735 onMouseEnter: composeHandlers([onMouseEnter, handleEnter]), 4736 onMouseLeave: composeHandlers([onMouseLeave, handleLeave]), 4737 onTouchStart: composeHandlers([onTouchStart, handleTouchStart]), 4738 disabled: !!disabled, 4739 target, 4740 ...resolvedStyle && { style: resolvedStyle }, 4741 ...resolvedClassName && { className: resolvedClassName }, 4742 ...disabled && STATIC_DISABLED_PROPS, 4743 ...isActive && STATIC_ACTIVE_PROPS, 4744 ...isTransitioning && STATIC_TRANSITIONING_PROPS 4745 }; 4746 } 4747 var STATIC_EMPTY_OBJECT = {}; 4748 var STATIC_ACTIVE_OBJECT = { className: "active" }; 4749 var STATIC_DISABLED_PROPS = { role: "link", "aria-disabled": true }; 4750 var STATIC_ACTIVE_PROPS = { "data-status": "active", "aria-current": "page" }; 4751 var STATIC_TRANSITIONING_PROPS = { "data-transitioning": "transitioning" }; 4752 var timeoutMap = /* @__PURE__ */ new WeakMap(); 4753 var intersectionObserverOptions = { 4754 rootMargin: "100px" 4755 }; 4756 var composeHandlers = (handlers) => (e) => { 4757 for (const handler of handlers) { 4758 if (!handler) continue; 4759 if (e.defaultPrevented) return; 4760 handler(e); 4761 } 4762 }; 4763 function createLink(Comp) { 4764 return React8.forwardRef(function CreatedLink(props, ref) { 4765 return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Link, { ...props, _asChild: Comp, ref }); 4766 }); 4767 } 4768 var Link = React8.forwardRef( 4769 (props, ref) => { 4770 const { _asChild, ...rest } = props; 4771 const { 4772 type: _type, 4773 ref: innerRef, 4774 ...linkProps 4775 } = useLinkProps(rest, ref); 4776 const children = typeof rest.children === "function" ? rest.children({ 4777 isActive: linkProps["data-status"] === "active" 4778 }) : rest.children; 4779 if (_asChild === void 0) { 4780 delete linkProps.disabled; 4781 } 4782 return React8.createElement( 4783 _asChild ? _asChild : "a", 4784 { 4785 ...linkProps, 4786 ref: innerRef 4787 }, 4788 children 4789 ); 4790 } 4791 ); 4792 function isCtrlEvent(e) { 4793 return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey); 4794 } 4795 4796 // node_modules/@tanstack/react-router/dist/esm/route.js 4797 var Route = class extends BaseRoute { 4798 /** 4799 * @deprecated Use the `createRoute` function instead. 4800 */ 4801 constructor(options) { 4802 super(options); 4803 this.useMatch = (opts) => { 4804 return useMatch({ 4805 select: opts?.select, 4806 from: this.id, 4807 structuralSharing: opts?.structuralSharing 4808 }); 4809 }; 4810 this.useRouteContext = (opts) => { 4811 return useMatch({ 4812 ...opts, 4813 from: this.id, 4814 select: (d) => opts?.select ? opts.select(d.context) : d.context 4815 }); 4816 }; 4817 this.useSearch = (opts) => { 4818 return useSearch({ 4819 select: opts?.select, 4820 structuralSharing: opts?.structuralSharing, 4821 from: this.id 4822 }); 4823 }; 4824 this.useParams = (opts) => { 4825 return useParams({ 4826 select: opts?.select, 4827 structuralSharing: opts?.structuralSharing, 4828 from: this.id 4829 }); 4830 }; 4831 this.useLoaderDeps = (opts) => { 4832 return useLoaderDeps({ ...opts, from: this.id }); 4833 }; 4834 this.useLoaderData = (opts) => { 4835 return useLoaderData({ ...opts, from: this.id }); 4836 }; 4837 this.useNavigate = () => { 4838 return useNavigate({ from: this.fullPath }); 4839 }; 4840 this.Link = import_react3.default.forwardRef( 4841 (props, ref) => { 4842 return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Link, { ref, from: this.fullPath, ...props }); 4843 } 4844 ); 4845 this.$$typeof = /* @__PURE__ */ Symbol.for("react.memo"); 4846 } 4847 }; 4848 function createRoute(options) { 4849 return new Route( 4850 // TODO: Help us TypeChris, you're our only hope! 4851 options 4852 ); 4853 } 4854 var RootRoute = class extends BaseRootRoute { 4855 /** 4856 * @deprecated `RootRoute` is now an internal implementation detail. Use `createRootRoute()` instead. 4857 */ 4858 constructor(options) { 4859 super(options); 4860 this.useMatch = (opts) => { 4861 return useMatch({ 4862 select: opts?.select, 4863 from: this.id, 4864 structuralSharing: opts?.structuralSharing 4865 }); 4866 }; 4867 this.useRouteContext = (opts) => { 4868 return useMatch({ 4869 ...opts, 4870 from: this.id, 4871 select: (d) => opts?.select ? opts.select(d.context) : d.context 4872 }); 4873 }; 4874 this.useSearch = (opts) => { 4875 return useSearch({ 4876 select: opts?.select, 4877 structuralSharing: opts?.structuralSharing, 4878 from: this.id 4879 }); 4880 }; 4881 this.useParams = (opts) => { 4882 return useParams({ 4883 select: opts?.select, 4884 structuralSharing: opts?.structuralSharing, 4885 from: this.id 4886 }); 4887 }; 4888 this.useLoaderDeps = (opts) => { 4889 return useLoaderDeps({ ...opts, from: this.id }); 4890 }; 4891 this.useLoaderData = (opts) => { 4892 return useLoaderData({ ...opts, from: this.id }); 4893 }; 4894 this.useNavigate = () => { 4895 return useNavigate({ from: this.fullPath }); 4896 }; 4897 this.Link = import_react3.default.forwardRef( 4898 (props, ref) => { 4899 return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Link, { ref, from: this.fullPath, ...props }); 4900 } 4901 ); 4902 this.$$typeof = /* @__PURE__ */ Symbol.for("react.memo"); 4903 } 4904 }; 4905 function createRootRoute(options) { 4906 return new RootRoute(options); 4907 } 4908 4909 // node_modules/@tanstack/react-router/dist/esm/fileRoute.js 4910 function createFileRoute(path) { 4911 if (typeof path === "object") { 4912 return new FileRoute(path, { 4913 silent: true 4914 }).createRoute(path); 4915 } 4916 return new FileRoute(path, { 4917 silent: true 4918 }).createRoute; 4919 } 4920 var FileRoute = class { 4921 constructor(path, _opts) { 4922 this.path = path; 4923 this.createRoute = (options) => { 4924 tiny_warning_esm_default( 4925 this.silent, 4926 "FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead." 4927 ); 4928 const route = createRoute(options); 4929 route.isRoot = false; 4930 return route; 4931 }; 4932 this.silent = _opts?.silent; 4933 } 4934 }; 4935 var LazyRoute = class { 4936 constructor(opts) { 4937 this.useMatch = (opts2) => { 4938 return useMatch({ 4939 select: opts2?.select, 4940 from: this.options.id, 4941 structuralSharing: opts2?.structuralSharing 4942 }); 4943 }; 4944 this.useRouteContext = (opts2) => { 4945 return useMatch({ 4946 from: this.options.id, 4947 select: (d) => opts2?.select ? opts2.select(d.context) : d.context 4948 }); 4949 }; 4950 this.useSearch = (opts2) => { 4951 return useSearch({ 4952 select: opts2?.select, 4953 structuralSharing: opts2?.structuralSharing, 4954 from: this.options.id 4955 }); 4956 }; 4957 this.useParams = (opts2) => { 4958 return useParams({ 4959 select: opts2?.select, 4960 structuralSharing: opts2?.structuralSharing, 4961 from: this.options.id 4962 }); 4963 }; 4964 this.useLoaderDeps = (opts2) => { 4965 return useLoaderDeps({ ...opts2, from: this.options.id }); 4966 }; 4967 this.useLoaderData = (opts2) => { 4968 return useLoaderData({ ...opts2, from: this.options.id }); 4969 }; 4970 this.useNavigate = () => { 4971 const router = useRouter(); 4972 return useNavigate({ from: router.routesById[this.options.id].fullPath }); 4973 }; 4974 this.options = opts; 4975 this.$$typeof = /* @__PURE__ */ Symbol.for("react.memo"); 4976 } 4977 }; 4978 function createLazyRoute(id) { 4979 return (opts) => { 4980 return new LazyRoute({ 4981 id, 4982 ...opts 4983 }); 4984 }; 4985 } 4986 function createLazyFileRoute(id) { 4987 if (typeof id === "object") { 4988 return new LazyRoute(id); 4989 } 4990 return (opts) => new LazyRoute({ id, ...opts }); 4991 } 4992 4993 // node_modules/@tanstack/react-router/dist/esm/Matches.js 4994 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); 4995 var React11 = __toESM(require_react(), 1); 4996 4997 // node_modules/@tanstack/react-router/dist/esm/Transitioner.js 4998 var React9 = __toESM(require_react(), 1); 4999 function Transitioner() { 5000 const router = useRouter(); 5001 const mountLoadForRouter = React9.useRef({ router, mounted: false }); 5002 const [isTransitioning, setIsTransitioning] = React9.useState(false); 5003 const { hasPendingMatches, isLoading } = useRouterState({ 5004 select: (s) => ({ 5005 isLoading: s.isLoading, 5006 hasPendingMatches: s.matches.some((d) => d.status === "pending") 5007 }), 5008 structuralSharing: true 5009 }); 5010 const previousIsLoading = usePrevious(isLoading); 5011 const isAnyPending = isLoading || isTransitioning || hasPendingMatches; 5012 const previousIsAnyPending = usePrevious(isAnyPending); 5013 const isPagePending = isLoading || hasPendingMatches; 5014 const previousIsPagePending = usePrevious(isPagePending); 5015 router.startTransition = (fn) => { 5016 setIsTransitioning(true); 5017 React9.startTransition(() => { 5018 fn(); 5019 setIsTransitioning(false); 5020 }); 5021 }; 5022 React9.useEffect(() => { 5023 const unsub = router.history.subscribe(router.load); 5024 const nextLocation = router.buildLocation({ 5025 to: router.latestLocation.pathname, 5026 search: true, 5027 params: true, 5028 hash: true, 5029 state: true, 5030 _includeValidateSearch: true 5031 }); 5032 if (trimPathRight(router.latestLocation.href) !== trimPathRight(nextLocation.href)) { 5033 router.commitLocation({ ...nextLocation, replace: true }); 5034 } 5035 return () => { 5036 unsub(); 5037 }; 5038 }, [router, router.history]); 5039 useLayoutEffect2(() => { 5040 if ( 5041 // if we are hydrating from SSR, loading is triggered in ssr-client 5042 typeof window !== "undefined" && router.ssr || mountLoadForRouter.current.router === router && mountLoadForRouter.current.mounted 5043 ) { 5044 return; 5045 } 5046 mountLoadForRouter.current = { router, mounted: true }; 5047 const tryLoad = async () => { 5048 try { 5049 await router.load(); 5050 } catch (err) { 5051 console.error(err); 5052 } 5053 }; 5054 tryLoad(); 5055 }, [router]); 5056 useLayoutEffect2(() => { 5057 if (previousIsLoading && !isLoading) { 5058 router.emit({ 5059 type: "onLoad", 5060 // When the new URL has committed, when the new matches have been loaded into state.matches 5061 ...getLocationChangeInfo(router.state) 5062 }); 5063 } 5064 }, [previousIsLoading, router, isLoading]); 5065 useLayoutEffect2(() => { 5066 if (previousIsPagePending && !isPagePending) { 5067 router.emit({ 5068 type: "onBeforeRouteMount", 5069 ...getLocationChangeInfo(router.state) 5070 }); 5071 } 5072 }, [isPagePending, previousIsPagePending, router]); 5073 useLayoutEffect2(() => { 5074 if (previousIsAnyPending && !isAnyPending) { 5075 router.emit({ 5076 type: "onResolved", 5077 ...getLocationChangeInfo(router.state) 5078 }); 5079 router.__store.setState((s) => ({ 5080 ...s, 5081 status: "idle", 5082 resolvedLocation: s.location 5083 })); 5084 handleHashScroll(router); 5085 } 5086 }, [isAnyPending, previousIsAnyPending, router]); 5087 return null; 5088 } 5089 5090 // node_modules/@tanstack/react-router/dist/esm/Match.js 5091 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); 5092 var React10 = __toESM(require_react(), 1); 5093 5094 // node_modules/@tanstack/react-router/dist/esm/not-found.js 5095 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); 5096 function CatchNotFound(props) { 5097 const resetKey = useRouterState({ 5098 select: (s) => `not-found-$s.location.pathname}-$s.status}` 5099 }); 5100 return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( 5101 CatchBoundary, 5102 { 5103 getResetKey: () => resetKey, 5104 onCatch: (error, errorInfo) => { 5105 if (isNotFound(error)) { 5106 props.onCatch?.(error, errorInfo); 5107 } else { 5108 throw error; 5109 } 5110 }, 5111 errorComponent: ({ error }) => { 5112 if (isNotFound(error)) { 5113 return props.fallback?.(error); 5114 } else { 5115 throw error; 5116 } 5117 }, 5118 children: props.children 5119 } 5120 ); 5121 } 5122 function DefaultGlobalNotFound() { 5123 return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { children: "Not Found" }); 5124 } 5125 5126 // node_modules/@tanstack/react-router/dist/esm/SafeFragment.js 5127 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); 5128 function SafeFragment(props) { 5129 return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: props.children }); 5130 } 5131 5132 // node_modules/@tanstack/react-router/dist/esm/renderRouteNotFound.js 5133 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); 5134 function renderRouteNotFound(router, route, data) { 5135 if (!route.options.notFoundComponent) { 5136 if (router.options.defaultNotFoundComponent) { 5137 return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(router.options.defaultNotFoundComponent, { data }); 5138 } 5139 if (true) { 5140 tiny_warning_esm_default( 5141 route.options.notFoundComponent, 5142 `A notFoundError was encountered on the route with ID "$route.id}", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)` 5143 ); 5144 } 5145 return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DefaultGlobalNotFound, {}); 5146 } 5147 return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(route.options.notFoundComponent, { data }); 5148 } 5149 5150 // node_modules/@tanstack/react-router/dist/esm/scroll-restoration.js 5151 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); 5152 5153 // node_modules/@tanstack/react-router/dist/esm/ScriptOnce.js 5154 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); 5155 function ScriptOnce({ children }) { 5156 const router = useRouter(); 5157 if (!router.isServer) { 5158 return null; 5159 } 5160 return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)( 5161 "script", 5162 { 5163 nonce: router.options.ssr?.nonce, 5164 className: "$tsr", 5165 dangerouslySetInnerHTML: { 5166 __html: [children].filter(Boolean).join("\n") + ";$_TSR.c()" 5167 } 5168 } 5169 ); 5170 } 5171 5172 // node_modules/@tanstack/react-router/dist/esm/scroll-restoration.js 5173 function ScrollRestoration() { 5174 const router = useRouter(); 5175 if (!router.isScrollRestoring || !router.isServer) { 5176 return null; 5177 } 5178 if (typeof router.options.scrollRestoration === "function") { 5179 const shouldRestore = router.options.scrollRestoration({ 5180 location: router.latestLocation 5181 }); 5182 if (!shouldRestore) { 5183 return null; 5184 } 5185 } 5186 const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey; 5187 const userKey = getKey(router.latestLocation); 5188 const resolvedKey = userKey !== defaultGetScrollRestorationKey(router.latestLocation) ? userKey : void 0; 5189 const restoreScrollOptions = { 5190 storageKey, 5191 shouldScrollRestoration: true 5192 }; 5193 if (resolvedKey) { 5194 restoreScrollOptions.key = resolvedKey; 5195 } 5196 return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( 5197 ScriptOnce, 5198 { 5199 children: `($restoreScroll.toString()})($JSON.stringify(restoreScrollOptions)})` 5200 } 5201 ); 5202 } 5203 5204 // node_modules/@tanstack/react-router/dist/esm/Match.js 5205 var Match = React10.memo(function MatchImpl({ 5206 matchId 5207 }) { 5208 const router = useRouter(); 5209 const matchState = useRouterState({ 5210 select: (s) => { 5211 const match = s.matches.find((d) => d.id === matchId); 5212 invariant( 5213 match, 5214 `Could not find match for matchId "$matchId}". Please file an issue!` 5215 ); 5216 return { 5217 routeId: match.routeId, 5218 ssr: match.ssr, 5219 _displayPending: match._displayPending 5220 }; 5221 }, 5222 structuralSharing: true 5223 }); 5224 const route = router.routesById[matchState.routeId]; 5225 const PendingComponent = route.options.pendingComponent ?? router.options.defaultPendingComponent; 5226 const pendingElement = PendingComponent ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PendingComponent, {}) : null; 5227 const routeErrorComponent = route.options.errorComponent ?? router.options.defaultErrorComponent; 5228 const routeOnCatch = route.options.onCatch ?? router.options.defaultOnCatch; 5229 const routeNotFoundComponent = route.isRoot ? ( 5230 // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component 5231 route.options.notFoundComponent ?? router.options.notFoundRoute?.options.component 5232 ) : route.options.notFoundComponent; 5233 const resolvedNoSsr = matchState.ssr === false || matchState.ssr === "data-only"; 5234 const ResolvedSuspenseBoundary = ( 5235 // If we're on the root route, allow forcefully wrapping in suspense 5236 (!route.isRoot || route.options.wrapInSuspense || resolvedNoSsr) && (route.options.wrapInSuspense ?? PendingComponent ?? (route.options.errorComponent?.preload || resolvedNoSsr)) ? React10.Suspense : SafeFragment 5237 ); 5238 const ResolvedCatchBoundary = routeErrorComponent ? CatchBoundary : SafeFragment; 5239 const ResolvedNotFoundBoundary = routeNotFoundComponent ? CatchNotFound : SafeFragment; 5240 const resetKey = useRouterState({ 5241 select: (s) => s.loadedAt 5242 }); 5243 const parentRouteId = useRouterState({ 5244 select: (s) => { 5245 const index = s.matches.findIndex((d) => d.id === matchId); 5246 return s.matches[index - 1]?.routeId; 5247 } 5248 }); 5249 const ShellComponent = route.isRoot ? route.options.shellComponent ?? SafeFragment : SafeFragment; 5250 return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(ShellComponent, { children: [ 5251 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(matchContext.Provider, { value: matchId, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ResolvedSuspenseBoundary, { fallback: pendingElement, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( 5252 ResolvedCatchBoundary, 5253 { 5254 getResetKey: () => resetKey, 5255 errorComponent: routeErrorComponent || ErrorComponent, 5256 onCatch: (error, errorInfo) => { 5257 if (isNotFound(error)) throw error; 5258 tiny_warning_esm_default(false, `Error in route match: $matchId}`); 5259 routeOnCatch?.(error, errorInfo); 5260 }, 5261 children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( 5262 ResolvedNotFoundBoundary, 5263 { 5264 fallback: (error) => { 5265 if (!routeNotFoundComponent || error.routeId && error.routeId !== matchState.routeId || !error.routeId && !route.isRoot) 5266 throw error; 5267 return React10.createElement(routeNotFoundComponent, error); 5268 }, 5269 children: resolvedNoSsr || matchState._displayPending ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ClientOnly, { fallback: pendingElement, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MatchInner, { matchId }) }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MatchInner, { matchId }) 5270 } 5271 ) 5272 } 5273 ) }) }), 5274 parentRouteId === rootRouteId && router.options.scrollRestoration ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [ 5275 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(OnRendered, {}), 5276 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ScrollRestoration, {}) 5277 ] }) : null 5278 ] }); 5279 }); 5280 function OnRendered() { 5281 const router = useRouter(); 5282 const prevLocationRef = React10.useRef( 5283 void 0 5284 ); 5285 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( 5286 "script", 5287 { 5288 suppressHydrationWarning: true, 5289 ref: (el) => { 5290 if (el && (prevLocationRef.current === void 0 || prevLocationRef.current.href !== router.latestLocation.href)) { 5291 router.emit({ 5292 type: "onRendered", 5293 ...getLocationChangeInfo(router.state) 5294 }); 5295 prevLocationRef.current = router.latestLocation; 5296 } 5297 } 5298 }, 5299 router.latestLocation.state.__TSR_key 5300 ); 5301 } 5302 var MatchInner = React10.memo(function MatchInnerImpl({ 5303 matchId 5304 }) { 5305 const router = useRouter(); 5306 const { match, key, routeId } = useRouterState({ 5307 select: (s) => { 5308 const match2 = s.matches.find((d) => d.id === matchId); 5309 const routeId2 = match2.routeId; 5310 const remountFn = router.routesById[routeId2].options.remountDeps ?? router.options.defaultRemountDeps; 5311 const remountDeps = remountFn?.({ 5312 routeId: routeId2, 5313 loaderDeps: match2.loaderDeps, 5314 params: match2._strictParams, 5315 search: match2._strictSearch 5316 }); 5317 const key2 = remountDeps ? JSON.stringify(remountDeps) : void 0; 5318 return { 5319 key: key2, 5320 routeId: routeId2, 5321 match: { 5322 id: match2.id, 5323 status: match2.status, 5324 error: match2.error, 5325 _forcePending: match2._forcePending, 5326 _displayPending: match2._displayPending 5327 } 5328 }; 5329 }, 5330 structuralSharing: true 5331 }); 5332 const route = router.routesById[routeId]; 5333 const out = React10.useMemo(() => { 5334 const Comp = route.options.component ?? router.options.defaultComponent; 5335 if (Comp) { 5336 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Comp, {}, key); 5337 } 5338 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Outlet, {}); 5339 }, [key, route.options.component, router.options.defaultComponent]); 5340 if (match._displayPending) { 5341 throw router.getMatch(match.id)?._nonReactive.displayPendingPromise; 5342 } 5343 if (match._forcePending) { 5344 throw router.getMatch(match.id)?._nonReactive.minPendingPromise; 5345 } 5346 if (match.status === "pending") { 5347 const pendingMinMs = route.options.pendingMinMs ?? router.options.defaultPendingMinMs; 5348 if (pendingMinMs) { 5349 const routerMatch = router.getMatch(match.id); 5350 if (routerMatch && !routerMatch._nonReactive.minPendingPromise) { 5351 if (!router.isServer) { 5352 const minPendingPromise = createControlledPromise(); 5353 routerMatch._nonReactive.minPendingPromise = minPendingPromise; 5354 setTimeout(() => { 5355 minPendingPromise.resolve(); 5356 routerMatch._nonReactive.minPendingPromise = void 0; 5357 }, pendingMinMs); 5358 } 5359 } 5360 } 5361 throw router.getMatch(match.id)?._nonReactive.loadPromise; 5362 } 5363 if (match.status === "notFound") { 5364 invariant(isNotFound(match.error), "Expected a notFound error"); 5365 return renderRouteNotFound(router, route, match.error); 5366 } 5367 if (match.status === "redirected") { 5368 invariant(isRedirect(match.error), "Expected a redirect error"); 5369 throw router.getMatch(match.id)?._nonReactive.loadPromise; 5370 } 5371 if (match.status === "error") { 5372 if (router.isServer) { 5373 const RouteErrorComponent = (route.options.errorComponent ?? router.options.defaultErrorComponent) || ErrorComponent; 5374 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( 5375 RouteErrorComponent, 5376 { 5377 error: match.error, 5378 reset: void 0, 5379 info: { 5380 componentStack: "" 5381 } 5382 } 5383 ); 5384 } 5385 throw match.error; 5386 } 5387 return out; 5388 }); 5389 var Outlet = React10.memo(function OutletImpl() { 5390 const router = useRouter(); 5391 const matchId = React10.useContext(matchContext); 5392 const routeId = useRouterState({ 5393 select: (s) => s.matches.find((d) => d.id === matchId)?.routeId 5394 }); 5395 const route = router.routesById[routeId]; 5396 const parentGlobalNotFound = useRouterState({ 5397 select: (s) => { 5398 const matches = s.matches; 5399 const parentMatch = matches.find((d) => d.id === matchId); 5400 invariant( 5401 parentMatch, 5402 `Could not find parent match for matchId "$matchId}"` 5403 ); 5404 return parentMatch.globalNotFound; 5405 } 5406 }); 5407 const childMatchId = useRouterState({ 5408 select: (s) => { 5409 const matches = s.matches; 5410 const index = matches.findIndex((d) => d.id === matchId); 5411 return matches[index + 1]?.id; 5412 } 5413 }); 5414 const pendingElement = router.options.defaultPendingComponent ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(router.options.defaultPendingComponent, {}) : null; 5415 if (parentGlobalNotFound) { 5416 return renderRouteNotFound(router, route, void 0); 5417 } 5418 if (!childMatchId) { 5419 return null; 5420 } 5421 const nextMatch = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Match, { matchId: childMatchId }); 5422 if (matchId === rootRouteId) { 5423 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(React10.Suspense, { fallback: pendingElement, children: nextMatch }); 5424 } 5425 return nextMatch; 5426 }); 5427 5428 // node_modules/@tanstack/react-router/dist/esm/Matches.js 5429 function Matches() { 5430 const router = useRouter(); 5431 const rootRoute = router.routesById[rootRouteId]; 5432 const PendingComponent = rootRoute.options.pendingComponent ?? router.options.defaultPendingComponent; 5433 const pendingElement = PendingComponent ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PendingComponent, {}) : null; 5434 const ResolvedSuspense = router.isServer || typeof document !== "undefined" && router.ssr ? SafeFragment : React11.Suspense; 5435 const inner = /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(ResolvedSuspense, { fallback: pendingElement, children: [ 5436 !router.isServer && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Transitioner, {}), 5437 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(MatchesInner, {}) 5438 ] }); 5439 return router.options.InnerWrap ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(router.options.InnerWrap, { children: inner }) : inner; 5440 } 5441 function MatchesInner() { 5442 const router = useRouter(); 5443 const matchId = useRouterState({ 5444 select: (s) => { 5445 return s.matches[0]?.id; 5446 } 5447 }); 5448 const resetKey = useRouterState({ 5449 select: (s) => s.loadedAt 5450 }); 5451 const matchComponent = matchId ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Match, { matchId }) : null; 5452 return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(matchContext.Provider, { value: matchId, children: router.options.disableGlobalCatchBoundary ? matchComponent : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( 5453 CatchBoundary, 5454 { 5455 getResetKey: () => resetKey, 5456 errorComponent: ErrorComponent, 5457 onCatch: (error) => { 5458 tiny_warning_esm_default( 5459 false, 5460 `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!` 5461 ); 5462 tiny_warning_esm_default(false, error.message || error.toString()); 5463 }, 5464 children: matchComponent 5465 } 5466 ) }); 5467 } 5468 function useMatches(opts) { 5469 return useRouterState({ 5470 select: (state) => { 5471 const matches = state.matches; 5472 return opts?.select ? opts.select(matches) : matches; 5473 }, 5474 structuralSharing: opts?.structuralSharing 5475 }); 5476 } 5477 5478 // node_modules/@tanstack/react-router/dist/esm/router.js 5479 var createRouter = (options) => { 5480 return new Router(options); 5481 }; 5482 var Router = class extends RouterCore { 5483 constructor(options) { 5484 super(options); 5485 } 5486 }; 5487 if (typeof globalThis !== "undefined") { 5488 globalThis.createFileRoute = createFileRoute; 5489 globalThis.createLazyFileRoute = createLazyFileRoute; 5490 } else if (typeof window !== "undefined") { 5491 window.createFileRoute = createFileRoute; 5492 window.createLazyFileRoute = createLazyFileRoute; 5493 } 5494 5495 // node_modules/@tanstack/react-router/dist/esm/RouterProvider.js 5496 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); 5497 function RouterContextProvider({ 5498 router, 5499 children, 5500 ...rest 5501 }) { 5502 if (Object.keys(rest).length > 0) { 5503 router.update({ 5504 ...router.options, 5505 ...rest, 5506 context: { 5507 ...router.options.context, 5508 ...rest.context 5509 } 5510 }); 5511 } 5512 const routerContext2 = getRouterContext(); 5513 const provider = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(routerContext2.Provider, { value: router, children }); 5514 if (router.options.Wrap) { 5515 return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(router.options.Wrap, { children: provider }); 5516 } 5517 return provider; 5518 } 5519 function RouterProvider({ router, ...rest }) { 5520 return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RouterContextProvider, { router, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Matches, {}) }); 5521 } 5522 5523 // node_modules/@tanstack/react-router/dist/esm/useBlocker.js 5524 var React12 = __toESM(require_react(), 1); 5525 function _resolveBlockerOpts(opts, condition) { 5526 if (opts === void 0) { 5527 return { 5528 shouldBlockFn: () => true, 5529 withResolver: false 5530 }; 5531 } 5532 if ("shouldBlockFn" in opts) { 5533 return opts; 5534 } 5535 if (typeof opts === "function") { 5536 const shouldBlock2 = Boolean(condition ?? true); 5537 const _customBlockerFn2 = async () => { 5538 if (shouldBlock2) return await opts(); 5539 return false; 5540 }; 5541 return { 5542 shouldBlockFn: _customBlockerFn2, 5543 enableBeforeUnload: shouldBlock2, 5544 withResolver: false 5545 }; 5546 } 5547 const shouldBlock = Boolean(opts.condition ?? true); 5548 const fn = opts.blockerFn; 5549 const _customBlockerFn = async () => { 5550 if (shouldBlock && fn !== void 0) { 5551 return await fn(); 5552 } 5553 return shouldBlock; 5554 }; 5555 return { 5556 shouldBlockFn: _customBlockerFn, 5557 enableBeforeUnload: shouldBlock, 5558 withResolver: fn === void 0 5559 }; 5560 } 5561 function useBlocker(opts, condition) { 5562 const { 5563 shouldBlockFn, 5564 enableBeforeUnload = true, 5565 disabled = false, 5566 withResolver = false 5567 } = _resolveBlockerOpts(opts, condition); 5568 const router = useRouter(); 5569 const { history } = router; 5570 const [resolver, setResolver] = React12.useState({ 5571 status: "idle", 5572 current: void 0, 5573 next: void 0, 5574 action: void 0, 5575 proceed: void 0, 5576 reset: void 0 5577 }); 5578 React12.useEffect(() => { 5579 const blockerFnComposed = async (blockerFnArgs) => { 5580 function getLocation(location) { 5581 const parsedLocation = router.parseLocation(location); 5582 const matchedRoutes = router.getMatchedRoutes( 5583 parsedLocation.pathname, 5584 void 0 5585 ); 5586 if (matchedRoutes.foundRoute === void 0) { 5587 throw new Error(`No route found for location $location.href}`); 5588 } 5589 return { 5590 routeId: matchedRoutes.foundRoute.id, 5591 fullPath: matchedRoutes.foundRoute.fullPath, 5592 pathname: parsedLocation.pathname, 5593 params: matchedRoutes.routeParams, 5594 search: parsedLocation.search 5595 }; 5596 } 5597 const current = getLocation(blockerFnArgs.currentLocation); 5598 const next = getLocation(blockerFnArgs.nextLocation); 5599 const shouldBlock = await shouldBlockFn({ 5600 action: blockerFnArgs.action, 5601 current, 5602 next 5603 }); 5604 if (!withResolver) { 5605 return shouldBlock; 5606 } 5607 if (!shouldBlock) { 5608 return false; 5609 } 5610 const promise = new Promise((resolve) => { 5611 setResolver({ 5612 status: "blocked", 5613 current, 5614 next, 5615 action: blockerFnArgs.action, 5616 proceed: () => resolve(false), 5617 reset: () => resolve(true) 5618 }); 5619 }); 5620 const canNavigateAsync = await promise; 5621 setResolver({ 5622 status: "idle", 5623 current: void 0, 5624 next: void 0, 5625 action: void 0, 5626 proceed: void 0, 5627 reset: void 0 5628 }); 5629 return canNavigateAsync; 5630 }; 5631 return disabled ? void 0 : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload }); 5632 }, [ 5633 shouldBlockFn, 5634 enableBeforeUnload, 5635 disabled, 5636 withResolver, 5637 history, 5638 router 5639 ]); 5640 return resolver; 5641 } 5642 5643 // node_modules/@tanstack/react-router/dist/esm/useLocation.js 5644 function useLocation(opts) { 5645 return useRouterState({ 5646 select: (state) => opts?.select ? opts.select(state.location) : state.location 5647 }); 5648 } 5649 5650 // node_modules/@tanstack/react-router/dist/esm/useCanGoBack.js 5651 function useCanGoBack() { 5652 return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 }); 5653 } 5654 5655 // packages/route/build-module/lock-unlock.mjs 5656 var import_private_apis = __toESM(require_private_apis(), 1); 5657 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 5658 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 5659 "@wordpress/route" 5660 ); 5661 5662 // packages/route/build-module/private-apis.mjs 5663 var privateApis = {}; 5664 lock(privateApis, { 5665 // Router creation and setup 5666 createBrowserHistory, 5667 createLazyRoute, 5668 createMemoryHistory, 5669 createRouter, 5670 createRootRoute, 5671 createRoute, 5672 Outlet, 5673 RouterProvider, 5674 // Internal routing utilities 5675 redirect, 5676 createLink, 5677 useCanGoBack, 5678 useLoaderData, 5679 useLocation, 5680 useMatches, 5681 useRouter, 5682 useRouterState, 5683 useBlocker, 5684 // History utilities 5685 parseHref 5686 }); 5687 5688 // packages/route/build-module/index.mjs 5689 function useInvalidate() { 5690 const router = useRouter(); 5691 return () => router.invalidate(); 5692 } 5693 export { 5694 Link, 5695 notFound, 5696 privateApis, 5697 redirect, 5698 useInvalidate, 5699 useLinkProps, 5700 useNavigate, 5701 useParams, 5702 useSearch 5703 }; 5704 /*! Bundled license information: 5705 5706 use-sync-external-store/cjs/use-sync-external-store-shim.development.js: 5707 (** 5708 * @license React 5709 * use-sync-external-store-shim.development.js 5710 * 5711 * Copyright (c) Meta Platforms, Inc. and affiliates. 5712 * 5713 * This source code is licensed under the MIT license found in the 5714 * LICENSE file in the root directory of this source tree. 5715 *) 5716 5717 use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js: 5718 (** 5719 * @license React 5720 * use-sync-external-store-shim/with-selector.development.js 5721 * 5722 * Copyright (c) Meta Platforms, Inc. and affiliates. 5723 * 5724 * This source code is licensed under the MIT license found in the 5725 * LICENSE file in the root directory of this source tree. 5726 *) 5727 */
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sun Jul 5 08:20:13 2026 | Cross-referenced by PHPXref |