@tanstack/router-core 0.0.1-alpha.8 → 0.0.1-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,12 +28,10 @@ function createRouteMatch(router, route, opts) {
28
28
  isPending: false,
29
29
  isFetching: false,
30
30
  isInvalid: false,
31
+ invalidAt: Infinity,
31
32
  getIsInvalid: () => {
32
- var _ref, _routeMatch$options$l;
33
-
34
33
  const now = Date.now();
35
- const maxAge = (_ref = (_routeMatch$options$l = routeMatch.options.loaderMaxAge) != null ? _routeMatch$options$l : router.options.defaultLoaderMaxAge) != null ? _ref : 0;
36
- return routeMatch.isInvalid || routeMatch.updatedAt + maxAge < now;
34
+ return routeMatch.isInvalid || routeMatch.invalidAt < now;
37
35
  },
38
36
  __: {
39
37
  abortController: new AbortController(),
@@ -124,7 +122,7 @@ function createRouteMatch(router, route, opts) {
124
122
  hasLoaders: () => {
125
123
  return !!(route.options.loader || route.options.import || elementTypes.some(d => typeof route.options[d] === 'function'));
126
124
  },
127
- load: async () => {
125
+ load: async opts => {
128
126
  const id = '' + Date.now() + Math.random();
129
127
  routeMatch.__.latestId = id; // If the match was in an error state, set it
130
128
  // to a loading state again. Otherwise, keep it
@@ -179,6 +177,8 @@ function createRouteMatch(router, route, opts) {
179
177
 
180
178
  routeMatch.__.dataPromise = Promise.resolve().then(async () => {
181
179
  try {
180
+ var _ref, _ref2, _opts$maxAge;
181
+
182
182
  if (routeMatch.options.loader) {
183
183
  const data = await routeMatch.options.loader({
184
184
  params: routeMatch.params,
@@ -196,6 +196,7 @@ function createRouteMatch(router, route, opts) {
196
196
  routeMatch.error = undefined;
197
197
  routeMatch.status = 'success';
198
198
  routeMatch.updatedAt = Date.now();
199
+ routeMatch.invalidAt = routeMatch.updatedAt + ((_ref = (_ref2 = (_opts$maxAge = opts == null ? void 0 : opts.maxAge) != null ? _opts$maxAge : routeMatch.options.loaderMaxAge) != null ? _ref2 : router.options.defaultLoaderMaxAge) != null ? _ref : 0);
199
200
  } catch (err) {
200
201
  if (id !== routeMatch.__.latestId) {
201
202
  return routeMatch.__.loaderPromise;
@@ -1 +1 @@
1
- {"version":3,"file":"routeMatch.js","sources":["../../../../../src/routeMatch.ts"],"sourcesContent":["import { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport { AnyPathParams } from './routeConfig'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { Router } from './router'\nimport { replaceEqualDeep, Timeout } from './utils'\n\nexport interface RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> extends Route<TAllRouteInfo, TRouteInfo> {\n matchId: string\n pathname: string\n params: AnyPathParams\n parentMatch?: RouteMatch\n childMatches: RouteMatch[]\n routeSearch: TRouteInfo['searchSchema']\n search: TRouteInfo['fullSearchSchema']\n status: 'idle' | 'loading' | 'success' | 'error'\n updatedAt?: number\n error?: unknown\n isInvalid: boolean\n getIsInvalid: () => boolean\n loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n isPending: boolean\n __: {\n element?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n errorElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n catchElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n pendingElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n loadPromise?: Promise<void>\n loaderPromise?: Promise<void>\n importPromise?: Promise<void>\n elementsPromise?: Promise<void>\n dataPromise?: Promise<void>\n pendingTimeout?: Timeout\n pendingMinTimeout?: Timeout\n pendingMinPromise?: Promise<void>\n onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n abortController: AbortController\n latestId: string\n // setParentMatch: (parentMatch: RouteMatch) => void\n // addChildMatch: (childMatch: RouteMatch) => void\n validate: () => void\n startPending: () => void\n cancelPending: () => void\n notify: () => void\n resolve: () => void\n }\n cancel: () => void\n load: () => Promise<void>\n invalidate: () => void\n hasLoaders: () => boolean\n}\n\nconst elementTypes = [\n 'element',\n 'errorElement',\n 'catchElement',\n 'pendingElement',\n] as const\n\nexport function createRouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n>(\n router: Router<any, any>,\n route: Route<TAllRouteInfo, TRouteInfo>,\n opts: {\n matchId: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n): RouteMatch<TAllRouteInfo, TRouteInfo> {\n const routeMatch: RouteMatch<TAllRouteInfo, TRouteInfo> = {\n ...route,\n ...opts,\n router,\n routeSearch: {},\n search: {},\n childMatches: [],\n status: 'idle',\n routeLoaderData: {} as TRouteInfo['routeLoaderData'],\n loaderData: {} as TRouteInfo['loaderData'],\n isPending: false,\n isFetching: false,\n isInvalid: false,\n getIsInvalid: () => {\n const now = Date.now()\n const maxAge =\n routeMatch.options.loaderMaxAge ??\n router.options.defaultLoaderMaxAge ??\n 0\n return routeMatch.isInvalid || routeMatch.updatedAt! + maxAge < now\n },\n __: {\n abortController: new AbortController(),\n latestId: '',\n resolve: () => {},\n notify: () => {\n routeMatch.__.resolve()\n routeMatch.router.notify()\n },\n startPending: () => {\n const pendingMs =\n routeMatch.options.pendingMs ?? router.options.defaultPendingMs\n const pendingMinMs =\n routeMatch.options.pendingMinMs ?? router.options.defaultPendingMinMs\n\n if (\n routeMatch.__.pendingTimeout ||\n routeMatch.status !== 'loading' ||\n typeof pendingMs === 'undefined'\n ) {\n return\n }\n\n routeMatch.__.pendingTimeout = setTimeout(() => {\n routeMatch.isPending = true\n routeMatch.__.resolve()\n if (typeof pendingMinMs !== 'undefined') {\n routeMatch.__.pendingMinPromise = new Promise(\n (r) =>\n (routeMatch.__.pendingMinTimeout = setTimeout(r, pendingMinMs)),\n )\n }\n }, pendingMs)\n },\n cancelPending: () => {\n routeMatch.isPending = false\n clearTimeout(routeMatch.__.pendingTimeout)\n clearTimeout(routeMatch.__.pendingMinTimeout)\n delete routeMatch.__.pendingMinPromise\n },\n // setParentMatch: (parentMatch?: RouteMatch) => {\n // routeMatch.parentMatch = parentMatch\n // },\n // addChildMatch: (childMatch: RouteMatch) => {\n // if (\n // routeMatch.childMatches.find((d) => d.matchId === childMatch.matchId)\n // ) {\n // return\n // }\n\n // routeMatch.childMatches.push(childMatch)\n // },\n validate: () => {\n // Validate the search params and stabilize them\n const parentSearch =\n routeMatch.parentMatch?.search ?? router.location.search\n\n try {\n const prevSearch = routeMatch.routeSearch\n\n const validator =\n typeof routeMatch.options.validateSearch === 'object'\n ? routeMatch.options.validateSearch.parse\n : routeMatch.options.validateSearch\n\n let nextSearch = replaceEqualDeep(\n prevSearch,\n validator?.(parentSearch),\n )\n\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n routeMatch.isInvalid = true\n }\n\n routeMatch.routeSearch = nextSearch\n\n routeMatch.search = replaceEqualDeep(parentSearch, {\n ...parentSearch,\n ...nextSearch,\n })\n } catch (err: any) {\n console.error(err)\n const error = new (Error as any)('Invalid search params found', {\n cause: err,\n })\n error.code = 'INVALID_SEARCH_PARAMS'\n routeMatch.status = 'error'\n routeMatch.error = error\n // Do not proceed with loading the route\n return\n }\n },\n },\n cancel: () => {\n routeMatch.__.abortController?.abort()\n routeMatch.__.cancelPending()\n },\n invalidate: () => {\n routeMatch.isInvalid = true\n },\n hasLoaders: () => {\n return !!(\n route.options.loader ||\n route.options.import ||\n elementTypes.some((d) => typeof route.options[d] === 'function')\n )\n },\n load: async () => {\n const id = '' + Date.now() + Math.random()\n routeMatch.__.latestId = id\n\n // If the match was in an error state, set it\n // to a loading state again. Otherwise, keep it\n // as loading or resolved\n if (routeMatch.status === 'idle') {\n routeMatch.status = 'loading'\n }\n\n // We started loading the route, so it's no longer invalid\n routeMatch.isInvalid = false\n\n routeMatch.__.loadPromise = new Promise(async (resolve) => {\n // We are now fetching, even if it's in the background of a\n // resolved state\n routeMatch.isFetching = true\n routeMatch.__.resolve = resolve as () => void\n\n const loaderPromise = (async () => {\n const importer = routeMatch.options.import\n\n // First, run any importers\n if (importer) {\n routeMatch.__.importPromise = importer({\n params: routeMatch.params,\n // search: routeMatch.search,\n }).then((imported) => {\n routeMatch.__ = {\n ...routeMatch.__,\n ...imported,\n }\n })\n }\n\n // Wait for the importer to finish before\n // attempting to load elements and data\n await routeMatch.__.importPromise\n\n // Next, load the elements and data in parallel\n\n routeMatch.__.elementsPromise = (async () => {\n // then run all element and data loaders in parallel\n // For each element type, potentially load it asynchronously\n\n await Promise.all(\n elementTypes.map(async (type) => {\n const routeElement = routeMatch.options[type]\n\n if (routeMatch.__[type]) {\n return\n }\n\n if (typeof routeElement === 'function') {\n const res = await (routeElement as any)(routeMatch)\n\n routeMatch.__[type] = res\n } else {\n routeMatch.__[type] = routeMatch.options[type] as any\n }\n }),\n )\n })()\n\n routeMatch.__.dataPromise = Promise.resolve().then(async () => {\n try {\n if (routeMatch.options.loader) {\n const data = await routeMatch.options.loader({\n params: routeMatch.params,\n search: routeMatch.routeSearch,\n signal: routeMatch.__.abortController.signal,\n })\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n routeMatch.routeLoaderData = replaceEqualDeep(\n routeMatch.routeLoaderData,\n data,\n )\n }\n\n routeMatch.error = undefined\n routeMatch.status = 'success'\n routeMatch.updatedAt = Date.now()\n } catch (err) {\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n routeMatch.error = err\n routeMatch.status = 'error'\n routeMatch.updatedAt = Date.now()\n }\n })\n\n try {\n await Promise.all([\n routeMatch.__.elementsPromise,\n routeMatch.__.dataPromise,\n ])\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n if (routeMatch.__.pendingMinPromise) {\n await routeMatch.__.pendingMinPromise\n delete routeMatch.__.pendingMinPromise\n }\n } finally {\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n routeMatch.__.cancelPending()\n routeMatch.isPending = false\n routeMatch.isFetching = false\n routeMatch.__.notify()\n }\n })()\n\n routeMatch.__.loaderPromise = loaderPromise\n await loaderPromise\n\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n delete routeMatch.__.loaderPromise\n })\n\n return await routeMatch.__.loadPromise\n },\n }\n\n if (!routeMatch.hasLoaders()) {\n routeMatch.status = 'success'\n }\n\n return routeMatch\n}\n"],"names":["elementTypes","createRouteMatch","router","route","opts","routeMatch","_extends","routeSearch","search","childMatches","status","routeLoaderData","loaderData","isPending","isFetching","isInvalid","getIsInvalid","now","Date","maxAge","options","loaderMaxAge","defaultLoaderMaxAge","updatedAt","__","abortController","AbortController","latestId","resolve","notify","startPending","pendingMs","defaultPendingMs","pendingMinMs","defaultPendingMinMs","pendingTimeout","setTimeout","pendingMinPromise","Promise","r","pendingMinTimeout","cancelPending","clearTimeout","validate","parentSearch","parentMatch","location","prevSearch","validator","validateSearch","parse","nextSearch","replaceEqualDeep","err","console","error","Error","cause","code","cancel","abort","invalidate","hasLoaders","loader","import","some","d","load","id","Math","random","loadPromise","loaderPromise","importer","importPromise","params","then","imported","elementsPromise","all","map","type","routeElement","res","dataPromise","data","signal","undefined","process","env","NODE_ENV"],"mappings":"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"}
1
+ {"version":3,"file":"routeMatch.js","sources":["../../../../../src/routeMatch.ts"],"sourcesContent":["import { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport { AnyPathParams } from './routeConfig'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { Router } from './router'\nimport { replaceEqualDeep, Timeout } from './utils'\n\nexport interface RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> extends Route<TAllRouteInfo, TRouteInfo> {\n matchId: string\n pathname: string\n params: AnyPathParams\n parentMatch?: RouteMatch\n childMatches: RouteMatch[]\n routeSearch: TRouteInfo['searchSchema']\n search: TRouteInfo['fullSearchSchema']\n status: 'idle' | 'loading' | 'success' | 'error'\n updatedAt?: number\n error?: unknown\n isInvalid: boolean\n getIsInvalid: () => boolean\n loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n isPending: boolean\n invalidAt: number\n __: {\n element?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n errorElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n catchElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n pendingElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>\n loadPromise?: Promise<void>\n loaderPromise?: Promise<void>\n importPromise?: Promise<void>\n elementsPromise?: Promise<void>\n dataPromise?: Promise<void>\n pendingTimeout?: Timeout\n pendingMinTimeout?: Timeout\n pendingMinPromise?: Promise<void>\n onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n abortController: AbortController\n latestId: string\n // setParentMatch: (parentMatch: RouteMatch) => void\n // addChildMatch: (childMatch: RouteMatch) => void\n validate: () => void\n startPending: () => void\n cancelPending: () => void\n notify: () => void\n resolve: () => void\n }\n cancel: () => void\n load: (opts?: { maxAge?: number }) => Promise<void>\n invalidate: () => void\n hasLoaders: () => boolean\n}\n\nconst elementTypes = [\n 'element',\n 'errorElement',\n 'catchElement',\n 'pendingElement',\n] as const\n\nexport function createRouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n>(\n router: Router<any, any>,\n route: Route<TAllRouteInfo, TRouteInfo>,\n opts: {\n matchId: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n): RouteMatch<TAllRouteInfo, TRouteInfo> {\n const routeMatch: RouteMatch<TAllRouteInfo, TRouteInfo> = {\n ...route,\n ...opts,\n router,\n routeSearch: {},\n search: {},\n childMatches: [],\n status: 'idle',\n routeLoaderData: {} as TRouteInfo['routeLoaderData'],\n loaderData: {} as TRouteInfo['loaderData'],\n isPending: false,\n isFetching: false,\n isInvalid: false,\n invalidAt: Infinity,\n getIsInvalid: () => {\n const now = Date.now()\n return routeMatch.isInvalid || routeMatch.invalidAt < now\n },\n __: {\n abortController: new AbortController(),\n latestId: '',\n resolve: () => {},\n notify: () => {\n routeMatch.__.resolve()\n routeMatch.router.notify()\n },\n startPending: () => {\n const pendingMs =\n routeMatch.options.pendingMs ?? router.options.defaultPendingMs\n const pendingMinMs =\n routeMatch.options.pendingMinMs ?? router.options.defaultPendingMinMs\n\n if (\n routeMatch.__.pendingTimeout ||\n routeMatch.status !== 'loading' ||\n typeof pendingMs === 'undefined'\n ) {\n return\n }\n\n routeMatch.__.pendingTimeout = setTimeout(() => {\n routeMatch.isPending = true\n routeMatch.__.resolve()\n if (typeof pendingMinMs !== 'undefined') {\n routeMatch.__.pendingMinPromise = new Promise(\n (r) =>\n (routeMatch.__.pendingMinTimeout = setTimeout(r, pendingMinMs)),\n )\n }\n }, pendingMs)\n },\n cancelPending: () => {\n routeMatch.isPending = false\n clearTimeout(routeMatch.__.pendingTimeout)\n clearTimeout(routeMatch.__.pendingMinTimeout)\n delete routeMatch.__.pendingMinPromise\n },\n // setParentMatch: (parentMatch?: RouteMatch) => {\n // routeMatch.parentMatch = parentMatch\n // },\n // addChildMatch: (childMatch: RouteMatch) => {\n // if (\n // routeMatch.childMatches.find((d) => d.matchId === childMatch.matchId)\n // ) {\n // return\n // }\n\n // routeMatch.childMatches.push(childMatch)\n // },\n validate: () => {\n // Validate the search params and stabilize them\n const parentSearch =\n routeMatch.parentMatch?.search ?? router.location.search\n\n try {\n const prevSearch = routeMatch.routeSearch\n\n const validator =\n typeof routeMatch.options.validateSearch === 'object'\n ? routeMatch.options.validateSearch.parse\n : routeMatch.options.validateSearch\n\n let nextSearch = replaceEqualDeep(\n prevSearch,\n validator?.(parentSearch),\n )\n\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n routeMatch.isInvalid = true\n }\n\n routeMatch.routeSearch = nextSearch\n\n routeMatch.search = replaceEqualDeep(parentSearch, {\n ...parentSearch,\n ...nextSearch,\n })\n } catch (err: any) {\n console.error(err)\n const error = new (Error as any)('Invalid search params found', {\n cause: err,\n })\n error.code = 'INVALID_SEARCH_PARAMS'\n routeMatch.status = 'error'\n routeMatch.error = error\n // Do not proceed with loading the route\n return\n }\n },\n },\n cancel: () => {\n routeMatch.__.abortController?.abort()\n routeMatch.__.cancelPending()\n },\n invalidate: () => {\n routeMatch.isInvalid = true\n },\n hasLoaders: () => {\n return !!(\n route.options.loader ||\n route.options.import ||\n elementTypes.some((d) => typeof route.options[d] === 'function')\n )\n },\n load: async (opts) => {\n const id = '' + Date.now() + Math.random()\n routeMatch.__.latestId = id\n\n // If the match was in an error state, set it\n // to a loading state again. Otherwise, keep it\n // as loading or resolved\n if (routeMatch.status === 'idle') {\n routeMatch.status = 'loading'\n }\n\n // We started loading the route, so it's no longer invalid\n routeMatch.isInvalid = false\n\n routeMatch.__.loadPromise = new Promise(async (resolve) => {\n // We are now fetching, even if it's in the background of a\n // resolved state\n routeMatch.isFetching = true\n routeMatch.__.resolve = resolve as () => void\n\n const loaderPromise = (async () => {\n const importer = routeMatch.options.import\n\n // First, run any importers\n if (importer) {\n routeMatch.__.importPromise = importer({\n params: routeMatch.params,\n // search: routeMatch.search,\n }).then((imported) => {\n routeMatch.__ = {\n ...routeMatch.__,\n ...imported,\n }\n })\n }\n\n // Wait for the importer to finish before\n // attempting to load elements and data\n await routeMatch.__.importPromise\n\n // Next, load the elements and data in parallel\n\n routeMatch.__.elementsPromise = (async () => {\n // then run all element and data loaders in parallel\n // For each element type, potentially load it asynchronously\n\n await Promise.all(\n elementTypes.map(async (type) => {\n const routeElement = routeMatch.options[type]\n\n if (routeMatch.__[type]) {\n return\n }\n\n if (typeof routeElement === 'function') {\n const res = await (routeElement as any)(routeMatch)\n\n routeMatch.__[type] = res\n } else {\n routeMatch.__[type] = routeMatch.options[type] as any\n }\n }),\n )\n })()\n\n routeMatch.__.dataPromise = Promise.resolve().then(async () => {\n try {\n if (routeMatch.options.loader) {\n const data = await routeMatch.options.loader({\n params: routeMatch.params,\n search: routeMatch.routeSearch,\n signal: routeMatch.__.abortController.signal,\n })\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n routeMatch.routeLoaderData = replaceEqualDeep(\n routeMatch.routeLoaderData,\n data,\n )\n }\n\n routeMatch.error = undefined\n routeMatch.status = 'success'\n routeMatch.updatedAt = Date.now()\n routeMatch.invalidAt =\n routeMatch.updatedAt +\n (opts?.maxAge ??\n routeMatch.options.loaderMaxAge ??\n router.options.defaultLoaderMaxAge ??\n 0)\n } catch (err) {\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n routeMatch.error = err\n routeMatch.status = 'error'\n routeMatch.updatedAt = Date.now()\n }\n })\n\n try {\n await Promise.all([\n routeMatch.__.elementsPromise,\n routeMatch.__.dataPromise,\n ])\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n\n if (routeMatch.__.pendingMinPromise) {\n await routeMatch.__.pendingMinPromise\n delete routeMatch.__.pendingMinPromise\n }\n } finally {\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n routeMatch.__.cancelPending()\n routeMatch.isPending = false\n routeMatch.isFetching = false\n routeMatch.__.notify()\n }\n })()\n\n routeMatch.__.loaderPromise = loaderPromise\n await loaderPromise\n\n if (id !== routeMatch.__.latestId) {\n return routeMatch.__.loaderPromise\n }\n delete routeMatch.__.loaderPromise\n })\n\n return await routeMatch.__.loadPromise\n },\n }\n\n if (!routeMatch.hasLoaders()) {\n routeMatch.status = 'success'\n }\n\n return routeMatch\n}\n"],"names":["elementTypes","createRouteMatch","router","route","opts","routeMatch","_extends","routeSearch","search","childMatches","status","routeLoaderData","loaderData","isPending","isFetching","isInvalid","invalidAt","Infinity","getIsInvalid","now","Date","__","abortController","AbortController","latestId","resolve","notify","startPending","pendingMs","options","defaultPendingMs","pendingMinMs","defaultPendingMinMs","pendingTimeout","setTimeout","pendingMinPromise","Promise","r","pendingMinTimeout","cancelPending","clearTimeout","validate","parentSearch","parentMatch","location","prevSearch","validator","validateSearch","parse","nextSearch","replaceEqualDeep","err","console","error","Error","cause","code","cancel","abort","invalidate","hasLoaders","loader","import","some","d","load","id","Math","random","loadPromise","loaderPromise","importer","importPromise","params","then","imported","elementsPromise","all","map","type","routeElement","res","dataPromise","data","signal","undefined","updatedAt","maxAge","loaderMaxAge","defaultLoaderMaxAge","process","env","NODE_ENV"],"mappings":";;;;;;;;;;;;;;;;;AAoEA,MAAMA,YAAY,GAAG,CACnB,SADmB,EAEnB,cAFmB,EAGnB,cAHmB,EAInB,gBAJmB,CAArB,CAAA;AAOO,SAASC,gBAAT,CAILC,MAJK,EAKLC,KALK,EAMLC,IANK,EAWkC;AACvC,EAAA,MAAMC,UAAiD,GAAAC,oCAAA,CAAA,EAAA,EAClDH,KADkD,EAElDC,IAFkD,EAAA;IAGrDF,MAHqD;AAIrDK,IAAAA,WAAW,EAAE,EAJwC;AAKrDC,IAAAA,MAAM,EAAE,EAL6C;AAMrDC,IAAAA,YAAY,EAAE,EANuC;AAOrDC,IAAAA,MAAM,EAAE,MAP6C;AAQrDC,IAAAA,eAAe,EAAE,EARoC;AASrDC,IAAAA,UAAU,EAAE,EATyC;AAUrDC,IAAAA,SAAS,EAAE,KAV0C;AAWrDC,IAAAA,UAAU,EAAE,KAXyC;AAYrDC,IAAAA,SAAS,EAAE,KAZ0C;AAarDC,IAAAA,SAAS,EAAEC,QAb0C;AAcrDC,IAAAA,YAAY,EAAE,MAAM;AAClB,MAAA,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAL,EAAZ,CAAA;MACA,OAAOd,UAAU,CAACU,SAAX,IAAwBV,UAAU,CAACW,SAAX,GAAuBG,GAAtD,CAAA;KAhBmD;AAkBrDE,IAAAA,EAAE,EAAE;MACFC,eAAe,EAAE,IAAIC,eAAJ,EADf;AAEFC,MAAAA,QAAQ,EAAE,EAFR;MAGFC,OAAO,EAAE,MAAM,EAHb;AAIFC,MAAAA,MAAM,EAAE,MAAM;QACZrB,UAAU,CAACgB,EAAX,CAAcI,OAAd,EAAA,CAAA;;QACApB,UAAU,CAACH,MAAX,CAAkBwB,MAAlB,EAAA,CAAA;OANA;AAQFC,MAAAA,YAAY,EAAE,MAAM;AAAA,QAAA,IAAA,qBAAA,EAAA,sBAAA,CAAA;;AAClB,QAAA,MAAMC,SAAS,GAAA,CAAA,qBAAA,GACbvB,UAAU,CAACwB,OAAX,CAAmBD,SADN,KAAA,IAAA,GAAA,qBAAA,GACmB1B,MAAM,CAAC2B,OAAP,CAAeC,gBADjD,CAAA;AAEA,QAAA,MAAMC,YAAY,GAAA,CAAA,sBAAA,GAChB1B,UAAU,CAACwB,OAAX,CAAmBE,YADH,KAAA,IAAA,GAAA,sBAAA,GACmB7B,MAAM,CAAC2B,OAAP,CAAeG,mBADpD,CAAA;;AAGA,QAAA,IACE3B,UAAU,CAACgB,EAAX,CAAcY,cAAd,IACA5B,UAAU,CAACK,MAAX,KAAsB,SADtB,IAEA,OAAOkB,SAAP,KAAqB,WAHvB,EAIE;AACA,UAAA,OAAA;AACD,SAAA;;AAEDvB,QAAAA,UAAU,CAACgB,EAAX,CAAcY,cAAd,GAA+BC,UAAU,CAAC,MAAM;UAC9C7B,UAAU,CAACQ,SAAX,GAAuB,IAAvB,CAAA;;UACAR,UAAU,CAACgB,EAAX,CAAcI,OAAd,EAAA,CAAA;;AACA,UAAA,IAAI,OAAOM,YAAP,KAAwB,WAA5B,EAAyC;YACvC1B,UAAU,CAACgB,EAAX,CAAcc,iBAAd,GAAkC,IAAIC,OAAJ,CAC/BC,CAAD,IACGhC,UAAU,CAACgB,EAAX,CAAciB,iBAAd,GAAkCJ,UAAU,CAACG,CAAD,EAAIN,YAAJ,CAFf,CAAlC,CAAA;AAID,WAAA;SARsC,EAStCH,SATsC,CAAzC,CAAA;OAtBA;AAiCFW,MAAAA,aAAa,EAAE,MAAM;QACnBlC,UAAU,CAACQ,SAAX,GAAuB,KAAvB,CAAA;AACA2B,QAAAA,YAAY,CAACnC,UAAU,CAACgB,EAAX,CAAcY,cAAf,CAAZ,CAAA;AACAO,QAAAA,YAAY,CAACnC,UAAU,CAACgB,EAAX,CAAciB,iBAAf,CAAZ,CAAA;AACA,QAAA,OAAOjC,UAAU,CAACgB,EAAX,CAAcc,iBAArB,CAAA;OArCA;AAuCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACAM,MAAAA,QAAQ,EAAE,MAAM;AAAA,QAAA,IAAA,qBAAA,EAAA,sBAAA,CAAA;;AACd;AACA,QAAA,MAAMC,YAAY,GAAA,CAAA,qBAAA,GAAA,CAAA,sBAAA,GAChBrC,UAAU,CAACsC,WADK,KAAA,IAAA,GAAA,KAAA,CAAA,GAChB,sBAAwBnC,CAAAA,MADR,KACkBN,IAAAA,GAAAA,qBAAAA,GAAAA,MAAM,CAAC0C,QAAP,CAAgBpC,MADpD,CAAA;;QAGA,IAAI;AACF,UAAA,MAAMqC,UAAU,GAAGxC,UAAU,CAACE,WAA9B,CAAA;UAEA,MAAMuC,SAAS,GACb,OAAOzC,UAAU,CAACwB,OAAX,CAAmBkB,cAA1B,KAA6C,QAA7C,GACI1C,UAAU,CAACwB,OAAX,CAAmBkB,cAAnB,CAAkCC,KADtC,GAEI3C,UAAU,CAACwB,OAAX,CAAmBkB,cAHzB,CAAA;AAKA,UAAA,IAAIE,UAAU,GAAGC,sBAAgB,CAC/BL,UAD+B,EAE/BC,SAF+B,IAE/BA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,SAAS,CAAGJ,YAAH,CAFsB,CAAjC,CARE;;UAcF,IAAIG,UAAU,KAAKI,UAAnB,EAA+B;YAC7B5C,UAAU,CAACU,SAAX,GAAuB,IAAvB,CAAA;AACD,WAAA;;UAEDV,UAAU,CAACE,WAAX,GAAyB0C,UAAzB,CAAA;UAEA5C,UAAU,CAACG,MAAX,GAAoB0C,sBAAgB,CAACR,YAAD,EAC/BA,oCAAAA,CAAAA,EAAAA,EAAAA,YAD+B,EAE/BO,UAF+B,CAApC,CAAA,CAAA;SApBF,CAwBE,OAAOE,GAAP,EAAiB;UACjBC,OAAO,CAACC,KAAR,CAAcF,GAAd,CAAA,CAAA;AACA,UAAA,MAAME,KAAK,GAAG,IAAKC,KAAL,CAAmB,6BAAnB,EAAkD;AAC9DC,YAAAA,KAAK,EAAEJ,GAAAA;AADuD,WAAlD,CAAd,CAAA;UAGAE,KAAK,CAACG,IAAN,GAAa,uBAAb,CAAA;UACAnD,UAAU,CAACK,MAAX,GAAoB,OAApB,CAAA;AACAL,UAAAA,UAAU,CAACgD,KAAX,GAAmBA,KAAnB,CAPiB;;AASjB,UAAA,OAAA;AACD,SAAA;AACF,OAAA;KA7GkD;AA+GrDI,IAAAA,MAAM,EAAE,MAAM;AAAA,MAAA,IAAA,qBAAA,CAAA;;AACZ,MAAA,CAAA,qBAAA,GAAApD,UAAU,CAACgB,EAAX,CAAcC,eAAd,2CAA+BoC,KAA/B,EAAA,CAAA;;MACArD,UAAU,CAACgB,EAAX,CAAckB,aAAd,EAAA,CAAA;KAjHmD;AAmHrDoB,IAAAA,UAAU,EAAE,MAAM;MAChBtD,UAAU,CAACU,SAAX,GAAuB,IAAvB,CAAA;KApHmD;AAsHrD6C,IAAAA,UAAU,EAAE,MAAM;AAChB,MAAA,OAAO,CAAC,EACNzD,KAAK,CAAC0B,OAAN,CAAcgC,MAAd,IACA1D,KAAK,CAAC0B,OAAN,CAAciC,MADd,IAEA9D,YAAY,CAAC+D,IAAb,CAAmBC,CAAD,IAAO,OAAO7D,KAAK,CAAC0B,OAAN,CAAcmC,CAAd,CAAP,KAA4B,UAArD,CAHM,CAAR,CAAA;KAvHmD;IA6HrDC,IAAI,EAAE,MAAO7D,IAAP,IAAgB;MACpB,MAAM8D,EAAE,GAAG,EAAA,GAAK9C,IAAI,CAACD,GAAL,EAAL,GAAkBgD,IAAI,CAACC,MAAL,EAA7B,CAAA;AACA/D,MAAAA,UAAU,CAACgB,EAAX,CAAcG,QAAd,GAAyB0C,EAAzB,CAFoB;AAKpB;AACA;;AACA,MAAA,IAAI7D,UAAU,CAACK,MAAX,KAAsB,MAA1B,EAAkC;QAChCL,UAAU,CAACK,MAAX,GAAoB,SAApB,CAAA;AACD,OATmB;;;MAYpBL,UAAU,CAACU,SAAX,GAAuB,KAAvB,CAAA;MAEAV,UAAU,CAACgB,EAAX,CAAcgD,WAAd,GAA4B,IAAIjC,OAAJ,CAAY,MAAOX,OAAP,IAAmB;AACzD;AACA;QACApB,UAAU,CAACS,UAAX,GAAwB,IAAxB,CAAA;AACAT,QAAAA,UAAU,CAACgB,EAAX,CAAcI,OAAd,GAAwBA,OAAxB,CAAA;;QAEA,MAAM6C,aAAa,GAAG,CAAC,YAAY;UACjC,MAAMC,QAAQ,GAAGlE,UAAU,CAACwB,OAAX,CAAmBiC,MAApC,CADiC;;AAIjC,UAAA,IAAIS,QAAJ,EAAc;AACZlE,YAAAA,UAAU,CAACgB,EAAX,CAAcmD,aAAd,GAA8BD,QAAQ,CAAC;AACrCE,cAAAA,MAAM,EAAEpE,UAAU,CAACoE,MADkB;;AAAA,aAAD,CAAR,CAG3BC,IAH2B,CAGrBC,QAAD,IAAc;AACpBtE,cAAAA,UAAU,CAACgB,EAAX,GAAAf,oCAAA,CAAA,EAAA,EACKD,UAAU,CAACgB,EADhB,EAEKsD,QAFL,CAAA,CAAA;AAID,aAR6B,CAA9B,CAAA;AASD,WAdgC;AAiBjC;;;AACA,UAAA,MAAMtE,UAAU,CAACgB,EAAX,CAAcmD,aAApB,CAlBiC;;AAsBjCnE,UAAAA,UAAU,CAACgB,EAAX,CAAcuD,eAAd,GAAgC,CAAC,YAAY;AAC3C;AACA;YAEA,MAAMxC,OAAO,CAACyC,GAAR,CACJ7E,YAAY,CAAC8E,GAAb,CAAiB,MAAOC,IAAP,IAAgB;AAC/B,cAAA,MAAMC,YAAY,GAAG3E,UAAU,CAACwB,OAAX,CAAmBkD,IAAnB,CAArB,CAAA;;AAEA,cAAA,IAAI1E,UAAU,CAACgB,EAAX,CAAc0D,IAAd,CAAJ,EAAyB;AACvB,gBAAA,OAAA;AACD,eAAA;;AAED,cAAA,IAAI,OAAOC,YAAP,KAAwB,UAA5B,EAAwC;AACtC,gBAAA,MAAMC,GAAG,GAAG,MAAOD,YAAD,CAAsB3E,UAAtB,CAAlB,CAAA;AAEAA,gBAAAA,UAAU,CAACgB,EAAX,CAAc0D,IAAd,IAAsBE,GAAtB,CAAA;AACD,eAJD,MAIO;gBACL5E,UAAU,CAACgB,EAAX,CAAc0D,IAAd,CAAA,GAAsB1E,UAAU,CAACwB,OAAX,CAAmBkD,IAAnB,CAAtB,CAAA;AACD,eAAA;AACF,aAdD,CADI,CAAN,CAAA;AAiBD,WArB+B,GAAhC,CAAA;;UAuBA1E,UAAU,CAACgB,EAAX,CAAc6D,WAAd,GAA4B9C,OAAO,CAACX,OAAR,EAAA,CAAkBiD,IAAlB,CAAuB,YAAY;YAC7D,IAAI;AAAA,cAAA,IAAA,IAAA,EAAA,KAAA,EAAA,YAAA,CAAA;;AACF,cAAA,IAAIrE,UAAU,CAACwB,OAAX,CAAmBgC,MAAvB,EAA+B;gBAC7B,MAAMsB,IAAI,GAAG,MAAM9E,UAAU,CAACwB,OAAX,CAAmBgC,MAAnB,CAA0B;kBAC3CY,MAAM,EAAEpE,UAAU,CAACoE,MADwB;kBAE3CjE,MAAM,EAAEH,UAAU,CAACE,WAFwB;AAG3C6E,kBAAAA,MAAM,EAAE/E,UAAU,CAACgB,EAAX,CAAcC,eAAd,CAA8B8D,MAAAA;AAHK,iBAA1B,CAAnB,CAAA;;AAKA,gBAAA,IAAIlB,EAAE,KAAK7D,UAAU,CAACgB,EAAX,CAAcG,QAAzB,EAAmC;AACjC,kBAAA,OAAOnB,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,iBAAA;;gBAEDjE,UAAU,CAACM,eAAX,GAA6BuC,sBAAgB,CAC3C7C,UAAU,CAACM,eADgC,EAE3CwE,IAF2C,CAA7C,CAAA;AAID,eAAA;;cAED9E,UAAU,CAACgD,KAAX,GAAmBgC,SAAnB,CAAA;cACAhF,UAAU,CAACK,MAAX,GAAoB,SAApB,CAAA;AACAL,cAAAA,UAAU,CAACiF,SAAX,GAAuBlE,IAAI,CAACD,GAAL,EAAvB,CAAA;cACAd,UAAU,CAACW,SAAX,GACEX,UAAU,CAACiF,SAAX,IAAA,CAAA,IAAA,GAAA,CAAA,KAAA,GAAA,CAAA,YAAA,GACClF,IADD,IAAA,IAAA,GAAA,KAAA,CAAA,GACCA,IAAI,CAAEmF,MADP,KAAA,IAAA,GAAA,YAAA,GAEElF,UAAU,CAACwB,OAAX,CAAmB2D,YAFrB,KAGEtF,IAAAA,GAAAA,KAAAA,GAAAA,MAAM,CAAC2B,OAAP,CAAe4D,mBAHjB,KAIE,IAAA,GAAA,IAAA,GAAA,CAJF,CADF,CAAA;aApBF,CA0BE,OAAOtC,GAAP,EAAY;AACZ,cAAA,IAAIe,EAAE,KAAK7D,UAAU,CAACgB,EAAX,CAAcG,QAAzB,EAAmC;AACjC,gBAAA,OAAOnB,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,eAAA;;AAED,cAAA,IAAIoB,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAA7B,EAA2C;gBACzCxC,OAAO,CAACC,KAAR,CAAcF,GAAd,CAAA,CAAA;AACD,eAAA;;cACD9C,UAAU,CAACgD,KAAX,GAAmBF,GAAnB,CAAA;cACA9C,UAAU,CAACK,MAAX,GAAoB,OAApB,CAAA;AACAL,cAAAA,UAAU,CAACiF,SAAX,GAAuBlE,IAAI,CAACD,GAAL,EAAvB,CAAA;AACD,aAAA;AACF,WAvC2B,CAA5B,CAAA;;UAyCA,IAAI;AACF,YAAA,MAAMiB,OAAO,CAACyC,GAAR,CAAY,CAChBxE,UAAU,CAACgB,EAAX,CAAcuD,eADE,EAEhBvE,UAAU,CAACgB,EAAX,CAAc6D,WAFE,CAAZ,CAAN,CAAA;;AAIA,YAAA,IAAIhB,EAAE,KAAK7D,UAAU,CAACgB,EAAX,CAAcG,QAAzB,EAAmC;AACjC,cAAA,OAAOnB,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,aAAA;;AAED,YAAA,IAAIjE,UAAU,CAACgB,EAAX,CAAcc,iBAAlB,EAAqC;AACnC,cAAA,MAAM9B,UAAU,CAACgB,EAAX,CAAcc,iBAApB,CAAA;AACA,cAAA,OAAO9B,UAAU,CAACgB,EAAX,CAAcc,iBAArB,CAAA;AACD,aAAA;AACF,WAbD,SAaU;AACR,YAAA,IAAI+B,EAAE,KAAK7D,UAAU,CAACgB,EAAX,CAAcG,QAAzB,EAAmC;AACjC,cAAA,OAAOnB,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,aAAA;;YACDjE,UAAU,CAACgB,EAAX,CAAckB,aAAd,EAAA,CAAA;;YACAlC,UAAU,CAACQ,SAAX,GAAuB,KAAvB,CAAA;YACAR,UAAU,CAACS,UAAX,GAAwB,KAAxB,CAAA;;YACAT,UAAU,CAACgB,EAAX,CAAcK,MAAd,EAAA,CAAA;AACD,WAAA;AACF,SA5GqB,GAAtB,CAAA;;AA8GArB,QAAAA,UAAU,CAACgB,EAAX,CAAciD,aAAd,GAA8BA,aAA9B,CAAA;AACA,QAAA,MAAMA,aAAN,CAAA;;AAEA,QAAA,IAAIJ,EAAE,KAAK7D,UAAU,CAACgB,EAAX,CAAcG,QAAzB,EAAmC;AACjC,UAAA,OAAOnB,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,SAAA;;AACD,QAAA,OAAOjE,UAAU,CAACgB,EAAX,CAAciD,aAArB,CAAA;AACD,OA3H2B,CAA5B,CAAA;AA6HA,MAAA,OAAO,MAAMjE,UAAU,CAACgB,EAAX,CAAcgD,WAA3B,CAAA;AACD,KAAA;GAzQH,CAAA,CAAA;;AA4QA,EAAA,IAAI,CAAChE,UAAU,CAACuD,UAAX,EAAL,EAA8B;IAC5BvD,UAAU,CAACK,MAAX,GAAoB,SAApB,CAAA;AACD,GAAA;;AAED,EAAA,OAAOL,UAAP,CAAA;AACD;;;;"}
@@ -35,7 +35,8 @@ function createRouter(userOptions) {
35
35
  const originalOptions = _rollupPluginBabelHelpers["extends"]({
36
36
  defaultLoaderGcMaxAge: 5 * 60 * 1000,
37
37
  defaultLoaderMaxAge: 0,
38
- defaultLinkPreloadDelay: 50
38
+ defaultPreloadMaxAge: 2000,
39
+ defaultPreloadDelay: 50
39
40
  }, userOptions, {
40
41
  stringifySearch: (_userOptions$stringif = userOptions == null ? void 0 : userOptions.stringifySearch) != null ? _userOptions$stringif : searchParams.defaultStringifySearch,
41
42
  parseSearch: (_userOptions$parseSea = userOptions == null ? void 0 : userOptions.parseSearch) != null ? _userOptions$parseSea : searchParams.defaultParseSearch
@@ -432,7 +433,21 @@ function createRouter(userOptions) {
432
433
  delete router.matchCache[matchId];
433
434
  });
434
435
  },
435
- loadRoute: async function loadRoute(navigateOpts, loaderOpts) {
436
+ loadRoute: async function loadRoute(navigateOpts) {
437
+ if (navigateOpts === void 0) {
438
+ navigateOpts = router.location;
439
+ }
440
+
441
+ const next = router.buildNext(navigateOpts);
442
+ const matches = router.matchRoutes(next.pathname, {
443
+ strictParseParams: true
444
+ });
445
+ await router.loadMatches(matches);
446
+ return matches;
447
+ },
448
+ preloadRoute: async function preloadRoute(navigateOpts, loaderOpts) {
449
+ var _ref4, _ref5, _loaderOpts$maxAge, _ref6, _ref7, _loaderOpts$gcMaxAge;
450
+
436
451
  if (navigateOpts === void 0) {
437
452
  navigateOpts = router.location;
438
453
  }
@@ -443,7 +458,8 @@ function createRouter(userOptions) {
443
458
  });
444
459
  await router.loadMatches(matches, {
445
460
  preload: true,
446
- maxAge: loaderOpts.maxAge
461
+ maxAge: (_ref4 = (_ref5 = (_loaderOpts$maxAge = loaderOpts.maxAge) != null ? _loaderOpts$maxAge : router.options.defaultPreloadMaxAge) != null ? _ref5 : router.options.defaultLoaderMaxAge) != null ? _ref4 : 0,
462
+ gcMaxAge: (_ref6 = (_ref7 = (_loaderOpts$gcMaxAge = loaderOpts.gcMaxAge) != null ? _loaderOpts$gcMaxAge : router.options.defaultPreloadGcMaxAge) != null ? _ref7 : router.options.defaultLoaderGcMaxAge) != null ? _ref6 : 0
447
463
  });
448
464
  return matches;
449
465
  },
@@ -538,31 +554,30 @@ function createRouter(userOptions) {
538
554
  },
539
555
  loadMatches: async (resolvedMatches, loaderOpts) => {
540
556
  const now = Date.now();
557
+ const minMaxAge = loaderOpts != null && loaderOpts.preload ? Math.max(loaderOpts == null ? void 0 : loaderOpts.maxAge, loaderOpts == null ? void 0 : loaderOpts.gcMaxAge) : 0;
541
558
  const matchPromises = resolvedMatches.map(async match => {
542
559
  // Validate the match (loads search params etc)
543
- match.__.validate(); // // If the match doesn't have a loader, don't attempt to load it
544
- // if (!match.hasLoaders()) {
545
- // return
546
- // }
547
- // If this is a preload, add it to the preload cache
560
+ match.__.validate(); // If this is a preload, add it to the preload cache
548
561
 
549
562
 
550
- if (loaderOpts != null && loaderOpts.preload && (loaderOpts == null ? void 0 : loaderOpts.maxAge) > 0) {
563
+ if (loaderOpts != null && loaderOpts.preload && minMaxAge > 0) {
551
564
  // If the match is currently active, don't preload it
552
565
  if (router.state.matches.find(d => d.matchId === match.matchId)) {
553
566
  return;
554
567
  }
555
568
 
556
569
  router.matchCache[match.matchId] = {
557
- gc: now + loaderOpts.maxAge,
558
- // TODO: Should this use the route's maxAge?
570
+ gc: now + loaderOpts.gcMaxAge,
559
571
  match
560
572
  };
561
573
  } // If the match is invalid, errored or idle, trigger it to load
562
574
 
563
575
 
564
576
  if (match.status === 'success' && match.getIsInvalid() || match.status === 'error' || match.status === 'idle') {
565
- match.load();
577
+ const maxAge = loaderOpts != null && loaderOpts.preload ? loaderOpts == null ? void 0 : loaderOpts.maxAge : undefined;
578
+ match.load({
579
+ maxAge
580
+ });
566
581
  }
567
582
 
568
583
  if (match.status === 'loading') {
@@ -624,7 +639,7 @@ function createRouter(userOptions) {
624
639
  const next = router.buildNext(location);
625
640
  return router.commitLocation(next, location.replace);
626
641
  },
627
- navigate: async _ref4 => {
642
+ navigate: async _ref8 => {
628
643
  let {
629
644
  from,
630
645
  to = '.',
@@ -632,7 +647,7 @@ function createRouter(userOptions) {
632
647
  hash,
633
648
  replace,
634
649
  params
635
- } = _ref4;
650
+ } = _ref8;
636
651
  // If this link simply reloads the current route,
637
652
  // make sure it has a new key so it will trigger a data refresh
638
653
  // If this `to` is a valid external URL, return
@@ -656,8 +671,8 @@ function createRouter(userOptions) {
656
671
  params
657
672
  });
658
673
  },
659
- buildLink: _ref5 => {
660
- var _preload, _ref6, _ref7, _ref8;
674
+ buildLink: _ref9 => {
675
+ var _preload, _ref10;
661
676
 
662
677
  let {
663
678
  from,
@@ -670,9 +685,10 @@ function createRouter(userOptions) {
670
685
  activeOptions,
671
686
  preload,
672
687
  preloadMaxAge: userPreloadMaxAge,
688
+ preloadGcMaxAge: userPreloadGcMaxAge,
673
689
  preloadDelay: userPreloadDelay,
674
690
  disabled
675
- } = _ref5;
691
+ } = _ref9;
676
692
 
677
693
  // If this link simply reloads the current route,
678
694
  // make sure it has a new key so it will trigger a data refresh
@@ -695,9 +711,8 @@ function createRouter(userOptions) {
695
711
  replace
696
712
  };
697
713
  const next = router.buildNext(nextOpts);
698
- preload = (_preload = preload) != null ? _preload : router.options.defaultLinkPreload;
699
- const preloadMaxAge = (_ref6 = (_ref7 = userPreloadMaxAge != null ? userPreloadMaxAge : router.options.defaultLinkPreloadMaxAge) != null ? _ref7 : router.options.defaultLoaderGcMaxAge) != null ? _ref6 : 0;
700
- const preloadDelay = (_ref8 = userPreloadDelay != null ? userPreloadDelay : router.options.defaultLinkPreloadDelay) != null ? _ref8 : 0; // Compare path/hash for matches
714
+ preload = (_preload = preload) != null ? _preload : router.options.defaultPreload;
715
+ const preloadDelay = (_ref10 = userPreloadDelay != null ? userPreloadDelay : router.options.defaultPreloadDelay) != null ? _ref10 : 0; // Compare path/hash for matches
701
716
 
702
717
  const pathIsEqual = router.state.location.pathname === next.pathname;
703
718
  const currentPathSplit = router.state.location.pathname.split('/');
@@ -725,9 +740,10 @@ function createRouter(userOptions) {
725
740
 
726
741
 
727
742
  const handleFocus = e => {
728
- if (preload && preloadMaxAge > 0) {
729
- router.loadRoute(nextOpts, {
730
- maxAge: preloadMaxAge
743
+ if (preload) {
744
+ router.preloadRoute(nextOpts, {
745
+ maxAge: userPreloadMaxAge,
746
+ gcMaxAge: userPreloadGcMaxAge
731
747
  });
732
748
  }
733
749
  };
@@ -735,15 +751,16 @@ function createRouter(userOptions) {
735
751
  const handleEnter = e => {
736
752
  const target = e.target || {};
737
753
 
738
- if (preload && preloadMaxAge > 0) {
754
+ if (preload) {
739
755
  if (target.preloadTimeout) {
740
756
  return;
741
757
  }
742
758
 
743
759
  target.preloadTimeout = setTimeout(() => {
744
760
  target.preloadTimeout = null;
745
- router.loadRoute(nextOpts, {
746
- maxAge: preloadMaxAge
761
+ router.preloadRoute(nextOpts, {
762
+ maxAge: userPreloadMaxAge,
763
+ gcMaxAge: userPreloadGcMaxAge
747
764
  });
748
765
  }, preloadDelay);
749
766
  }