@tanstack/router-core 0.0.1-beta.2 → 0.0.1-beta.21

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.
@@ -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: TRouteInfo['params']\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 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: (\n loaderOpts?: { withPending?: boolean } & (\n | { preload: true; maxAge: number; gcMaxAge: number }\n | { preload?: false; maxAge?: never; gcMaxAge?: never }\n ),\n ) => Promise<TRouteInfo['routeLoaderData']>\n fetch: (opts?: { maxAge?: number }) => Promise<TRouteInfo['routeLoaderData']>\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 elementTypes.some((d) => typeof route.options[d] === 'function')\n )\n },\n load: async (loaderOpts) => {\n const now = Date.now()\n const minMaxAge = loaderOpts?.preload\n ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)\n : 0\n\n // If this is a preload, add it to the preload cache\n if (loaderOpts?.preload && minMaxAge > 0) {\n // If the match is currently active, don't preload it\n if (\n router.state.matches.find((d) => d.matchId === routeMatch.matchId)\n ) {\n return\n }\n\n router.matchCache[routeMatch.matchId] = {\n gc: now + loaderOpts.gcMaxAge,\n match: routeMatch as RouteMatch<any, any>,\n }\n }\n\n // If the match is invalid, errored or idle, trigger it to load\n if (\n (routeMatch.status === 'success' && routeMatch.getIsInvalid()) ||\n routeMatch.status === 'error' ||\n routeMatch.status === 'idle'\n ) {\n const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined\n\n routeMatch.fetch({ maxAge })\n }\n },\n fetch: 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 // 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 routeMatch.__[type] = await router.options.createElement!(\n routeElement,\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","some","d","load","loaderOpts","minMaxAge","preload","Math","max","maxAge","gcMaxAge","state","matches","find","matchId","matchCache","gc","match","undefined","fetch","id","random","loadPromise","loaderPromise","elementsPromise","all","map","type","routeElement","createElement","dataPromise","then","data","params","signal","updatedAt","loaderMaxAge","defaultLoaderMaxAge","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 {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { Router } from './router'\nimport { replaceEqualDeep } 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: TRouteInfo['allParams']\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 invalidAt: number\n __: {\n component?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>\n errorComponent?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>\n pendingComponent?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>\n loadPromise?: Promise<void>\n componentsPromise?: Promise<void>\n dataPromise?: Promise<TRouteInfo['routeLoaderData']>\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 notify: () => void\n resolve: () => void\n }\n cancel: () => void\n load: (\n loaderOpts?:\n | { preload: true; maxAge: number; gcMaxAge: number }\n | { preload?: false; maxAge?: never; gcMaxAge?: never },\n ) => Promise<TRouteInfo['routeLoaderData']>\n fetch: (opts?: { maxAge?: number }) => Promise<TRouteInfo['routeLoaderData']>\n invalidate: () => void\n hasLoaders: () => boolean\n}\n\nconst componentTypes = [\n 'component',\n 'errorComponent',\n 'pendingComponent',\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 parentMatch?: RouteMatch<any, any>\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 isFetching: false,\n isInvalid: false,\n invalidAt: Infinity,\n // pendingActions: [],\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 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\n componentTypes.map(async (type) => {\n const component = routeMatch.options[type]\n\n if (typeof routeMatch.__[type] !== 'function') {\n routeMatch.__[type] = component\n }\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 },\n invalidate: () => {\n routeMatch.isInvalid = true\n },\n hasLoaders: () => {\n return !!(\n route.options.loader ||\n componentTypes.some((d) => route.options[d]?.preload)\n )\n },\n load: async (loaderOpts) => {\n const now = Date.now()\n const minMaxAge = loaderOpts?.preload\n ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)\n : 0\n\n // If this is a preload, add it to the preload cache\n if (loaderOpts?.preload && minMaxAge > 0) {\n // If the match is currently active, don't preload it\n if (\n router.state.matches.find((d) => d.matchId === routeMatch.matchId)\n ) {\n return\n }\n\n router.matchCache[routeMatch.matchId] = {\n gc: now + loaderOpts.gcMaxAge,\n match: routeMatch as RouteMatch<any, any>,\n }\n }\n\n // If the match is invalid, errored or idle, trigger it to load\n if (\n (routeMatch.status === 'success' && routeMatch.getIsInvalid()) ||\n routeMatch.status === 'error' ||\n routeMatch.status === 'idle'\n ) {\n const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined\n\n await routeMatch.fetch({ maxAge })\n }\n },\n fetch: async (opts) => {\n const loadId = '' + Date.now() + Math.random()\n routeMatch.__.latestId = loadId\n const checkLatest = async () => {\n if (loadId !== routeMatch.__.latestId) {\n // warning(true, 'Data loader is out of date!')\n return new Promise(() => {})\n }\n }\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 routeMatch.__.componentsPromise = (async () => {\n // then run all component and data loaders in parallel\n // For each component type, potentially load it asynchronously\n\n await Promise.all(\n componentTypes.map(async (type) => {\n const component = routeMatch.options[type]\n\n if (routeMatch.__[type]?.preload) {\n routeMatch.__[type] = await router.options.loadComponent!(\n component,\n )\n }\n }),\n )\n })()\n\n routeMatch.__.dataPromise = Promise.resolve().then(async () => {\n try {\n if (routeMatch.options.loader) {\n const data = await router.loadMatchData(routeMatch)\n await checkLatest()\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\n return routeMatch.routeLoaderData\n } catch (err) {\n await checkLatest()\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n\n routeMatch.error = err\n routeMatch.status = 'error'\n routeMatch.updatedAt = Date.now()\n\n throw err\n }\n })\n\n const after = async () => {\n await checkLatest()\n routeMatch.isFetching = false\n delete routeMatch.__.loadPromise\n routeMatch.__.notify()\n }\n\n try {\n await Promise.all([\n routeMatch.__.componentsPromise,\n routeMatch.__.dataPromise.catch(() => {}),\n ])\n after()\n } catch {\n after()\n }\n })\n\n await routeMatch.__.loadPromise\n await checkLatest()\n },\n }\n\n if (!routeMatch.hasLoaders()) {\n routeMatch.status = 'success'\n }\n\n return routeMatch\n}\n"],"names":["componentTypes","createRouteMatch","router","route","opts","routeMatch","_extends","routeSearch","search","childMatches","status","routeLoaderData","loaderData","isFetching","isInvalid","invalidAt","Infinity","getIsInvalid","now","Date","__","abortController","AbortController","latestId","resolve","notify","validate","parentSearch","parentMatch","location","prevSearch","validator","options","validateSearch","parse","nextSearch","replaceEqualDeep","map","type","component","err","console","error","Error","cause","code","cancel","abort","invalidate","hasLoaders","loader","some","d","preload","load","loaderOpts","minMaxAge","Math","max","maxAge","gcMaxAge","state","matches","find","matchId","matchCache","gc","match","undefined","fetch","loadId","random","checkLatest","Promise","loadPromise","componentsPromise","all","loadComponent","dataPromise","then","data","loadMatchData","updatedAt","loaderMaxAge","defaultLoaderMaxAge","process","env","NODE_ENV","after","catch"],"mappings":"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"}
@@ -23,9 +23,22 @@ var utils = require('./utils.js');
23
23
 
24
24
  var _window$document;
25
25
  // Detect if we're in the DOM
26
- const isServer = Boolean(typeof window === 'undefined' || !((_window$document = window.document) != null && _window$document.createElement)); // This is the default history object if none is defined
27
-
28
- const createDefaultHistory = () => !isServer ? index.createBrowserHistory() : index.createMemoryHistory();
26
+ const isServer = typeof window === 'undefined' || !((_window$document = window.document) != null && _window$document.createElement); // This is the default history object if none is defined
27
+
28
+ const createDefaultHistory = () => isServer ? index.createMemoryHistory() : index.createBrowserHistory();
29
+
30
+ function getInitialRouterState() {
31
+ return {
32
+ status: 'idle',
33
+ location: null,
34
+ matches: [],
35
+ actions: {},
36
+ loaders: {},
37
+ lastUpdated: Date.now(),
38
+ isFetching: false,
39
+ isPreloading: false
40
+ };
41
+ }
29
42
 
30
43
  function createRouter(userOptions) {
31
44
  var _userOptions$stringif, _userOptions$parseSea;
@@ -43,30 +56,24 @@ function createRouter(userOptions) {
43
56
  });
44
57
 
45
58
  let router = {
59
+ types: undefined,
60
+ // public api
46
61
  history,
47
62
  options: originalOptions,
48
63
  listeners: [],
49
- removeActionQueue: [],
50
64
  // Resolved after construction
51
65
  basepath: '',
52
66
  routeTree: undefined,
53
67
  routesById: {},
54
68
  location: undefined,
55
- allRouteInfo: undefined,
56
69
  //
57
70
  navigationPromise: Promise.resolve(),
58
71
  resolveNavigation: () => {},
59
72
  matchCache: {},
60
- state: {
61
- status: 'idle',
62
- location: null,
63
- matches: [],
64
- actions: {},
65
- loaders: {},
66
- loaderData: {},
67
- lastUpdated: Date.now(),
68
- isFetching: false,
69
- isPreloading: false
73
+ state: getInitialRouterState(),
74
+ reset: () => {
75
+ router.state = getInitialRouterState();
76
+ router.notify();
70
77
  },
71
78
  startedLoadingAt: Date.now(),
72
79
  subscribe: listener => {
@@ -79,13 +86,39 @@ function createRouter(userOptions) {
79
86
  return router.routesById[id];
80
87
  },
81
88
  notify: () => {
82
- router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
83
- isFetching: router.state.status === 'loading' || router.state.matches.some(d => d.isFetching),
84
- isPreloading: Object.values(router.matchCache).some(d => d.match.isFetching && !router.state.matches.find(dd => dd.matchId === d.match.matchId))
85
- });
86
- route.cascadeLoaderData(router.state.matches);
89
+ const isFetching = router.state.status === 'loading' || router.state.matches.some(d => d.isFetching);
90
+ const isPreloading = Object.values(router.matchCache).some(d => d.match.isFetching && !router.state.matches.find(dd => dd.matchId === d.match.matchId));
91
+
92
+ if (router.state.isFetching !== isFetching || router.state.isPreloading !== isPreloading) {
93
+ router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
94
+ isFetching,
95
+ isPreloading
96
+ });
97
+ }
98
+
99
+ cascadeLoaderData(router.state.matches);
87
100
  router.listeners.forEach(listener => listener(router));
88
101
  },
102
+ dehydrateState: () => {
103
+ return _rollupPluginBabelHelpers["extends"]({}, utils.pick(router.state, ['status', 'location', 'lastUpdated']), {
104
+ matches: router.state.matches.map(match => utils.pick(match, ['matchId', 'status', 'routeLoaderData', 'loaderData', 'isInvalid', 'invalidAt']))
105
+ });
106
+ },
107
+ hydrateState: dehydratedState => {
108
+ // Match the routes
109
+ const matches = router.matchRoutes(router.location.pathname, {
110
+ strictParseParams: true
111
+ });
112
+ matches.forEach((match, index) => {
113
+ const dehydratedMatch = dehydratedState.matches[index];
114
+ tinyInvariant["default"](dehydratedMatch, 'Oh no! Dehydrated route matches did not match the active state of the router 😬');
115
+ Object.assign(match, dehydratedMatch);
116
+ });
117
+ matches.forEach(match => match.__.validate());
118
+ router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, dehydratedState, {
119
+ matches
120
+ });
121
+ },
89
122
  mount: () => {
90
123
  const next = router.__.buildLocation({
91
124
  to: '.',
@@ -97,12 +130,14 @@ function createRouter(userOptions) {
97
130
 
98
131
  if (next.href !== router.location.href) {
99
132
  router.__.commitLocation(next, true);
100
- } else {
101
- router.loadLocation();
102
133
  }
103
134
 
104
- const unsub = history.listen(event => {
105
- router.loadLocation(router.__.parseLocation(event.location, router.location));
135
+ if (!router.state.matches.length) {
136
+ router.load();
137
+ }
138
+
139
+ const unsub = router.history.listen(event => {
140
+ router.load(router.__.parseLocation(event.location, router.location));
106
141
  }); // addEventListener does not exist in React Native, but window does
107
142
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
108
143
 
@@ -113,16 +148,30 @@ function createRouter(userOptions) {
113
148
  }
114
149
 
115
150
  return () => {
116
- unsub(); // Be sure to unsubscribe if a new handler is set
151
+ unsub();
117
152
 
118
- window.removeEventListener('visibilitychange', router.onFocus);
119
- window.removeEventListener('focus', router.onFocus);
153
+ if (!isServer && window.removeEventListener) {
154
+ // Be sure to unsubscribe if a new handler is set
155
+ window.removeEventListener('visibilitychange', router.onFocus);
156
+ window.removeEventListener('focus', router.onFocus);
157
+ }
120
158
  };
121
159
  },
122
160
  onFocus: () => {
123
- router.loadLocation();
161
+ router.load();
124
162
  },
125
163
  update: opts => {
164
+ const newHistory = (opts == null ? void 0 : opts.history) !== router.history;
165
+
166
+ if (!router.location || newHistory) {
167
+ if (opts != null && opts.history) {
168
+ router.history = opts.history;
169
+ }
170
+
171
+ router.location = router.__.parseLocation(router.history.location);
172
+ router.state.location = router.location;
173
+ }
174
+
126
175
  Object.assign(router.options, opts);
127
176
  const {
128
177
  basepath,
@@ -143,49 +192,41 @@ function createRouter(userOptions) {
143
192
  match.cancel();
144
193
  });
145
194
  },
146
- loadLocation: async next => {
195
+ load: async next => {
147
196
  const id = Math.random();
148
197
  router.startedLoadingAt = id;
149
198
 
150
199
  if (next) {
151
200
  // Ingest the new location
152
201
  router.location = next;
153
- } // Clear out old actions
154
-
202
+ } // Cancel any pending matches
155
203
 
156
- router.removeActionQueue.forEach(_ref => {
157
- let {
158
- action,
159
- actionState
160
- } = _ref;
161
-
162
- if (router.state.currentAction === actionState) {
163
- router.state.currentAction = undefined;
164
- }
165
-
166
- if (action.current === actionState) {
167
- action.current = undefined;
168
- }
169
- });
170
- router.removeActionQueue = []; // Cancel any pending matches
171
204
 
172
205
  router.cancelMatches(); // Match the routes
173
206
 
174
- const matches = router.matchRoutes(location.pathname, {
207
+ const matches = router.matchRoutes(router.location.pathname, {
175
208
  strictParseParams: true
176
209
  });
177
- router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
178
- pending: {
210
+
211
+ if (typeof document !== 'undefined') {
212
+ router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
213
+ pending: {
214
+ matches: matches,
215
+ location: router.location
216
+ },
217
+ status: 'loading'
218
+ });
219
+ } else {
220
+ router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
179
221
  matches: matches,
180
- location: router.location
181
- },
182
- status: 'loading'
183
- });
222
+ location: router.location,
223
+ status: 'loading'
224
+ });
225
+ }
226
+
184
227
  router.notify(); // Load the matches
185
228
 
186
- await router.loadMatches(matches, {
187
- withPending: true
188
- });
229
+ await router.loadMatches(matches);
189
230
 
190
231
  if (router.startedLoadingAt !== id) {
191
232
  // Ignore side-effects of match loading
@@ -202,9 +243,12 @@ function createRouter(userOptions) {
202
243
  exiting.push(d);
203
244
  }
204
245
  });
246
+ const entering = matches.filter(d => {
247
+ return !previousMatches.find(dd => dd.matchId === d.matchId);
248
+ });
205
249
  const now = Date.now();
206
250
  exiting.forEach(d => {
207
- var _ref2, _d$options$loaderGcMa, _ref3, _d$options$loaderMaxA;
251
+ var _ref, _d$options$loaderGcMa, _ref2, _d$options$loaderMaxA;
208
252
 
209
253
  d.__.onExit == null ? void 0 : d.__.onExit({
210
254
  params: d.params,
@@ -216,7 +260,7 @@ function createRouter(userOptions) {
216
260
  d.error = undefined;
217
261
  }
218
262
 
219
- const gc = Math.max((_ref2 = (_d$options$loaderGcMa = d.options.loaderGcMaxAge) != null ? _d$options$loaderGcMa : router.options.defaultLoaderGcMaxAge) != null ? _ref2 : 0, (_ref3 = (_d$options$loaderMaxA = d.options.loaderMaxAge) != null ? _d$options$loaderMaxA : router.options.defaultLoaderMaxAge) != null ? _ref3 : 0);
263
+ const gc = Math.max((_ref = (_d$options$loaderGcMa = d.options.loaderGcMaxAge) != null ? _d$options$loaderGcMa : router.options.defaultLoaderGcMaxAge) != null ? _ref : 0, (_ref2 = (_d$options$loaderMaxA = d.options.loaderMaxAge) != null ? _d$options$loaderMaxA : router.options.defaultLoaderMaxAge) != null ? _ref2 : 0);
220
264
 
221
265
  if (gc > 0) {
222
266
  router.matchCache[d.matchId] = {
@@ -231,9 +275,6 @@ function createRouter(userOptions) {
231
275
  search: d.routeSearch
232
276
  });
233
277
  });
234
- const entering = matches.filter(d => {
235
- return !previousMatches.find(dd => dd.matchId === d.matchId);
236
- });
237
278
  entering.forEach(d => {
238
279
  d.__.onExit = d.options.onMatch == null ? void 0 : d.options.onMatch({
239
280
  params: d.params,
@@ -242,16 +283,18 @@ function createRouter(userOptions) {
242
283
  delete router.matchCache[d.matchId];
243
284
  });
244
285
 
245
- if (matches.some(d => d.status === 'loading')) {
246
- router.notify();
247
- await Promise.all(matches.map(d => d.__.loaderPromise || Promise.resolve()));
248
- }
249
-
250
286
  if (router.startedLoadingAt !== id) {
251
287
  // Ignore side-effects of match loading
252
288
  return;
253
289
  }
254
290
 
291
+ matches.forEach(match => {
292
+ // Clear actions
293
+ if (match.action) {
294
+ match.action.current = undefined;
295
+ match.action.submissions = [];
296
+ }
297
+ });
255
298
  router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
256
299
  location: router.location,
257
300
  matches,
@@ -292,7 +335,7 @@ function createRouter(userOptions) {
292
335
  return matches;
293
336
  },
294
337
  preloadRoute: async function preloadRoute(navigateOpts, loaderOpts) {
295
- var _ref4, _ref5, _loaderOpts$maxAge, _ref6, _ref7, _loaderOpts$gcMaxAge;
338
+ var _ref3, _ref4, _loaderOpts$maxAge, _ref5, _ref6, _loaderOpts$gcMaxAge;
296
339
 
297
340
  if (navigateOpts === void 0) {
298
341
  navigateOpts = router.location;
@@ -304,8 +347,8 @@ function createRouter(userOptions) {
304
347
  });
305
348
  await router.loadMatches(matches, {
306
349
  preload: true,
307
- maxAge: (_ref4 = (_ref5 = (_loaderOpts$maxAge = loaderOpts.maxAge) != null ? _loaderOpts$maxAge : router.options.defaultPreloadMaxAge) != null ? _ref5 : router.options.defaultLoaderMaxAge) != null ? _ref4 : 0,
308
- gcMaxAge: (_ref6 = (_ref7 = (_loaderOpts$gcMaxAge = loaderOpts.gcMaxAge) != null ? _loaderOpts$gcMaxAge : router.options.defaultPreloadGcMaxAge) != null ? _ref7 : router.options.defaultLoaderGcMaxAge) != null ? _ref6 : 0
350
+ maxAge: (_ref3 = (_ref4 = (_loaderOpts$maxAge = loaderOpts.maxAge) != null ? _loaderOpts$maxAge : router.options.defaultPreloadMaxAge) != null ? _ref4 : router.options.defaultLoaderMaxAge) != null ? _ref3 : 0,
351
+ gcMaxAge: (_ref5 = (_ref6 = (_loaderOpts$gcMaxAge = loaderOpts.gcMaxAge) != null ? _loaderOpts$gcMaxAge : router.options.defaultPreloadGcMaxAge) != null ? _ref6 : router.options.defaultLoaderGcMaxAge) != null ? _ref5 : 0
309
352
  });
310
353
  return matches;
311
354
  },
@@ -381,6 +424,7 @@ function createRouter(userOptions) {
381
424
  const interpolatedPath = path.interpolatePath(foundRoute.routePath, params);
382
425
  const matchId = path.interpolatePath(foundRoute.routeId, params, true);
383
426
  const match = existingMatches.find(d => d.matchId === matchId) || ((_router$matchCache$ma = router.matchCache[matchId]) == null ? void 0 : _router$matchCache$ma.match) || routeMatch.createRouteMatch(router, foundRoute, {
427
+ parentMatch,
384
428
  matchId,
385
429
  params,
386
430
  pathname: path.joinPaths([pathname, interpolatedPath])
@@ -395,7 +439,7 @@ function createRouter(userOptions) {
395
439
  };
396
440
 
397
441
  recurse([router.routeTree]);
398
- route.cascadeLoaderData(matches);
442
+ cascadeLoaderData(matches);
399
443
  return matches;
400
444
  },
401
445
  loadMatches: async (resolvedMatches, loaderOpts) => {
@@ -404,18 +448,51 @@ function createRouter(userOptions) {
404
448
  match.__.validate();
405
449
 
406
450
  match.load(loaderOpts);
451
+ const search = match.search;
407
452
 
408
- if (match.status === 'loading') {
409
- // If requested, start the pending timers
410
- if (loaderOpts != null && loaderOpts.withPending) match.__.startPending(); // Wait for the first sign of activity from the match
411
- // This might be completion, error, or a pending state
453
+ if (search.__data && search.__data.matchId !== match.matchId) {
454
+ return;
455
+ }
412
456
 
457
+ if (match.__.loadPromise) {
458
+ // Wait for the first sign of activity from the match
413
459
  await match.__.loadPromise;
414
460
  }
415
461
  });
416
462
  router.notify();
417
463
  await Promise.all(matchPromises);
418
464
  },
465
+ loadMatchData: async routeMatch => {
466
+ if (isServer || !router.options.useServerData) {
467
+ var _await$routeMatch$opt;
468
+
469
+ return (_await$routeMatch$opt = await (routeMatch.options.loader == null ? void 0 : routeMatch.options.loader({
470
+ // parentLoaderPromise: routeMatch.parentMatch?.__.dataPromise,
471
+ params: routeMatch.params,
472
+ search: routeMatch.routeSearch,
473
+ signal: routeMatch.__.abortController.signal
474
+ }))) != null ? _await$routeMatch$opt : {};
475
+ } else {
476
+ const next = router.buildNext({
477
+ to: '.',
478
+ search: d => _rollupPluginBabelHelpers["extends"]({}, d != null ? d : {}, {
479
+ __data: {
480
+ matchId: routeMatch.matchId
481
+ }
482
+ })
483
+ });
484
+ const res = await fetch(next.href, {
485
+ method: 'GET' // signal: routeMatch.__.abortController.signal,
486
+
487
+ });
488
+
489
+ if (res.ok) {
490
+ return res.json();
491
+ }
492
+
493
+ throw new Error('Failed to fetch match data');
494
+ }
495
+ },
419
496
  invalidateRoute: opts => {
420
497
  var _router$state$pending5, _router$state$pending6;
421
498
 
@@ -460,7 +537,7 @@ function createRouter(userOptions) {
460
537
  to: next.pathname
461
538
  }));
462
539
  },
463
- navigate: async _ref8 => {
540
+ navigate: async _ref7 => {
464
541
  let {
465
542
  from,
466
543
  to = '.',
@@ -468,7 +545,7 @@ function createRouter(userOptions) {
468
545
  hash,
469
546
  replace,
470
547
  params
471
- } = _ref8;
548
+ } = _ref7;
472
549
  // If this link simply reloads the current route,
473
550
  // make sure it has a new key so it will trigger a data refresh
474
551
  // If this `to` is a valid external URL, return
@@ -492,8 +569,8 @@ function createRouter(userOptions) {
492
569
  params
493
570
  });
494
571
  },
495
- buildLink: _ref9 => {
496
- var _preload, _ref10;
572
+ buildLink: _ref8 => {
573
+ var _preload, _ref9;
497
574
 
498
575
  let {
499
576
  from,
@@ -509,7 +586,7 @@ function createRouter(userOptions) {
509
586
  preloadGcMaxAge: userPreloadGcMaxAge,
510
587
  preloadDelay: userPreloadDelay,
511
588
  disabled
512
- } = _ref9;
589
+ } = _ref8;
513
590
 
514
591
  // If this link simply reloads the current route,
515
592
  // make sure it has a new key so it will trigger a data refresh
@@ -533,7 +610,7 @@ function createRouter(userOptions) {
533
610
  };
534
611
  const next = router.buildNext(nextOpts);
535
612
  preload = (_preload = preload) != null ? _preload : router.options.defaultPreload;
536
- const preloadDelay = (_ref10 = userPreloadDelay != null ? userPreloadDelay : router.options.defaultPreloadDelay) != null ? _ref10 : 0; // Compare path/hash for matches
613
+ const preloadDelay = (_ref9 = userPreloadDelay != null ? userPreloadDelay : router.options.defaultPreloadDelay) != null ? _ref9 : 0; // Compare path/hash for matches
537
614
 
538
615
  const pathIsEqual = router.state.location.pathname === next.pathname;
539
616
  const currentPathSplit = router.state.location.pathname.split('/');
@@ -634,11 +711,7 @@ function createRouter(userOptions) {
634
711
  const recurseRoutes = (routeConfigs, parent) => {
635
712
  return routeConfigs.map(routeConfig => {
636
713
  const routeOptions = routeConfig.options;
637
- const route$1 = route.createRoute(routeConfig, routeOptions, parent, router); // {
638
- // pendingMs: routeOptions.pendingMs ?? router.defaultPendingMs,
639
- // pendingMinMs: routeOptions.pendingMinMs ?? router.defaultPendingMinMs,
640
- // }
641
-
714
+ const route$1 = route.createRoute(routeConfig, routeOptions, parent, router);
642
715
  const existingRoute = router.routesById[route$1.routeId];
643
716
 
644
717
  if (existingRoute) {
@@ -748,9 +821,9 @@ function createRouter(userOptions) {
748
821
  pathname: next.pathname,
749
822
  hash: next.hash,
750
823
  search: next.searchStr
751
- }, {
824
+ }, _rollupPluginBabelHelpers["extends"]({
752
825
  id
753
- });
826
+ }, next.state));
754
827
  } else {
755
828
  history.push({
756
829
  pathname: next.pathname,
@@ -773,8 +846,6 @@ function createRouter(userOptions) {
773
846
  }
774
847
  }
775
848
  };
776
- router.location = router.__.parseLocation(history.location);
777
- router.state.location = router.location;
778
849
  router.update(userOptions); // Allow frameworks to hook into the router creation
779
850
 
780
851
  router.options.createRouter == null ? void 0 : router.options.createRouter(router);
@@ -785,5 +856,15 @@ function isCtrlEvent(e) {
785
856
  return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);
786
857
  }
787
858
 
859
+ function cascadeLoaderData(matches) {
860
+ matches.forEach((match, index) => {
861
+ const parent = matches[index - 1];
862
+
863
+ if (parent) {
864
+ match.loaderData = utils.replaceEqualDeep(match.loaderData, _rollupPluginBabelHelpers["extends"]({}, parent.loaderData, match.routeLoaderData));
865
+ }
866
+ });
867
+ }
868
+
788
869
  exports.createRouter = createRouter;
789
870
  //# sourceMappingURL=router.js.map