@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.
- package/build/cjs/packages/router-core/src/index.js +1 -1
- package/build/cjs/packages/router-core/src/qss.js +1 -0
- package/build/cjs/packages/router-core/src/qss.js.map +1 -1
- package/build/cjs/packages/router-core/src/route.js +9 -23
- package/build/cjs/packages/router-core/src/route.js.map +1 -1
- package/build/cjs/packages/router-core/src/routeConfig.js.map +1 -1
- package/build/cjs/packages/router-core/src/routeMatch.js +75 -121
- package/build/cjs/packages/router-core/src/routeMatch.js.map +1 -1
- package/build/cjs/packages/router-core/src/router.js +170 -89
- package/build/cjs/packages/router-core/src/router.js.map +1 -1
- package/build/cjs/packages/router-core/src/utils.js +7 -0
- package/build/cjs/packages/router-core/src/utils.js.map +1 -1
- package/build/esm/index.js +257 -227
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +137 -150
- package/build/types/index.d.ts +184 -186
- package/build/umd/index.development.js +257 -227
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -1
- package/src/frameworks.ts +1 -2
- package/src/index.ts +0 -1
- package/src/link.ts +3 -1
- package/src/qss.ts +1 -0
- package/src/route.ts +10 -26
- package/src/routeConfig.ts +25 -20
- package/src/routeInfo.ts +9 -2
- package/src/routeMatch.ts +94 -156
- package/src/router.ts +241 -104
- package/src/utils.ts +7 -0
|
@@ -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 =
|
|
27
|
-
|
|
28
|
-
const createDefaultHistory = () =>
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
105
|
-
router.
|
|
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();
|
|
151
|
+
unsub();
|
|
117
152
|
|
|
118
|
-
window.removeEventListener
|
|
119
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
} //
|
|
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
|
-
|
|
178
|
-
|
|
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
|
-
|
|
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
|
|
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((
|
|
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
|
|
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: (
|
|
308
|
-
gcMaxAge: (
|
|
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
|
-
|
|
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 (
|
|
409
|
-
|
|
410
|
-
|
|
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
|
|
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
|
-
} =
|
|
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:
|
|
496
|
-
var _preload,
|
|
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
|
-
} =
|
|
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 = (
|
|
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
|