@tanstack/router-core 0.0.1-alpha.7 → 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,32 +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
560
+ match.__.validate(); // If this is a preload, add it to the preload cache
544
561
 
545
562
 
546
- if (!match.hasLoaders()) {
547
- return;
548
- } // If this is a preload, add it to the preload cache
549
-
550
-
551
- if (loaderOpts != null && loaderOpts.preload && (loaderOpts == null ? void 0 : loaderOpts.maxAge) > 0) {
563
+ if (loaderOpts != null && loaderOpts.preload && minMaxAge > 0) {
552
564
  // If the match is currently active, don't preload it
553
565
  if (router.state.matches.find(d => d.matchId === match.matchId)) {
554
566
  return;
555
567
  }
556
568
 
557
569
  router.matchCache[match.matchId] = {
558
- gc: now + loaderOpts.maxAge,
559
- // TODO: Should this use the route's maxAge?
570
+ gc: now + loaderOpts.gcMaxAge,
560
571
  match
561
572
  };
562
573
  } // If the match is invalid, errored or idle, trigger it to load
563
574
 
564
575
 
565
576
  if (match.status === 'success' && match.getIsInvalid() || match.status === 'error' || match.status === 'idle') {
566
- match.load();
577
+ const maxAge = loaderOpts != null && loaderOpts.preload ? loaderOpts == null ? void 0 : loaderOpts.maxAge : undefined;
578
+ match.load({
579
+ maxAge
580
+ });
567
581
  }
568
582
 
569
583
  if (match.status === 'loading') {
@@ -625,7 +639,7 @@ function createRouter(userOptions) {
625
639
  const next = router.buildNext(location);
626
640
  return router.commitLocation(next, location.replace);
627
641
  },
628
- navigate: async _ref4 => {
642
+ navigate: async _ref8 => {
629
643
  let {
630
644
  from,
631
645
  to = '.',
@@ -633,7 +647,7 @@ function createRouter(userOptions) {
633
647
  hash,
634
648
  replace,
635
649
  params
636
- } = _ref4;
650
+ } = _ref8;
637
651
  // If this link simply reloads the current route,
638
652
  // make sure it has a new key so it will trigger a data refresh
639
653
  // If this `to` is a valid external URL, return
@@ -657,8 +671,8 @@ function createRouter(userOptions) {
657
671
  params
658
672
  });
659
673
  },
660
- buildLink: _ref5 => {
661
- var _preload, _ref6, _ref7, _ref8;
674
+ buildLink: _ref9 => {
675
+ var _preload, _ref10;
662
676
 
663
677
  let {
664
678
  from,
@@ -671,9 +685,10 @@ function createRouter(userOptions) {
671
685
  activeOptions,
672
686
  preload,
673
687
  preloadMaxAge: userPreloadMaxAge,
688
+ preloadGcMaxAge: userPreloadGcMaxAge,
674
689
  preloadDelay: userPreloadDelay,
675
690
  disabled
676
- } = _ref5;
691
+ } = _ref9;
677
692
 
678
693
  // If this link simply reloads the current route,
679
694
  // make sure it has a new key so it will trigger a data refresh
@@ -696,9 +711,8 @@ function createRouter(userOptions) {
696
711
  replace
697
712
  };
698
713
  const next = router.buildNext(nextOpts);
699
- preload = (_preload = preload) != null ? _preload : router.options.defaultLinkPreload;
700
- const preloadMaxAge = (_ref6 = (_ref7 = userPreloadMaxAge != null ? userPreloadMaxAge : router.options.defaultLinkPreloadMaxAge) != null ? _ref7 : router.options.defaultLoaderGcMaxAge) != null ? _ref6 : 0;
701
- 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
702
716
 
703
717
  const pathIsEqual = router.state.location.pathname === next.pathname;
704
718
  const currentPathSplit = router.state.location.pathname.split('/');
@@ -726,9 +740,10 @@ function createRouter(userOptions) {
726
740
 
727
741
 
728
742
  const handleFocus = e => {
729
- if (preload && preloadMaxAge > 0) {
730
- router.loadRoute(nextOpts, {
731
- maxAge: preloadMaxAge
743
+ if (preload) {
744
+ router.preloadRoute(nextOpts, {
745
+ maxAge: userPreloadMaxAge,
746
+ gcMaxAge: userPreloadGcMaxAge
732
747
  });
733
748
  }
734
749
  };
@@ -736,15 +751,16 @@ function createRouter(userOptions) {
736
751
  const handleEnter = e => {
737
752
  const target = e.target || {};
738
753
 
739
- if (preload && preloadMaxAge > 0) {
754
+ if (preload) {
740
755
  if (target.preloadTimeout) {
741
756
  return;
742
757
  }
743
758
 
744
759
  target.preloadTimeout = setTimeout(() => {
745
760
  target.preloadTimeout = null;
746
- router.loadRoute(nextOpts, {
747
- maxAge: preloadMaxAge
761
+ router.preloadRoute(nextOpts, {
762
+ maxAge: userPreloadMaxAge,
763
+ gcMaxAge: userPreloadGcMaxAge
748
764
  });
749
765
  }, preloadDelay);
750
766
  }