@tanstack/router-core 0.0.1-beta.2 → 0.0.1-beta.23
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/path.js +1 -4
- package/build/cjs/packages/router-core/src/path.js.map +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 +183 -89
- package/build/cjs/packages/router-core/src/router.js.map +1 -1
- package/build/cjs/packages/router-core/src/utils.js +7 -6
- package/build/cjs/packages/router-core/src/utils.js.map +1 -1
- package/build/esm/index.js +271 -237
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +139 -152
- package/build/types/index.d.ts +199 -191
- package/build/umd/index.development.js +271 -237
- 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/path.ts +0 -4
- package/src/qss.ts +1 -0
- package/src/route.ts +10 -26
- package/src/routeConfig.ts +30 -21
- package/src/routeInfo.ts +13 -3
- package/src/routeMatch.ts +94 -156
- package/src/router.ts +269 -109
- package/src/utils.ts +12 -5
|
@@ -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,25 @@ 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
|
|
65
|
+
context: {},
|
|
51
66
|
basepath: '',
|
|
52
67
|
routeTree: undefined,
|
|
53
68
|
routesById: {},
|
|
54
69
|
location: undefined,
|
|
55
|
-
allRouteInfo: undefined,
|
|
56
70
|
//
|
|
57
71
|
navigationPromise: Promise.resolve(),
|
|
58
72
|
resolveNavigation: () => {},
|
|
59
73
|
matchCache: {},
|
|
60
|
-
state:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
actions: {},
|
|
65
|
-
loaders: {},
|
|
66
|
-
loaderData: {},
|
|
67
|
-
lastUpdated: Date.now(),
|
|
68
|
-
isFetching: false,
|
|
69
|
-
isPreloading: false
|
|
74
|
+
state: getInitialRouterState(),
|
|
75
|
+
reset: () => {
|
|
76
|
+
router.state = getInitialRouterState();
|
|
77
|
+
router.notify();
|
|
70
78
|
},
|
|
71
79
|
startedLoadingAt: Date.now(),
|
|
72
80
|
subscribe: listener => {
|
|
@@ -79,13 +87,39 @@ function createRouter(userOptions) {
|
|
|
79
87
|
return router.routesById[id];
|
|
80
88
|
},
|
|
81
89
|
notify: () => {
|
|
82
|
-
router.state
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
const isFetching = router.state.status === 'loading' || router.state.matches.some(d => d.isFetching);
|
|
91
|
+
const isPreloading = Object.values(router.matchCache).some(d => d.match.isFetching && !router.state.matches.find(dd => dd.matchId === d.match.matchId));
|
|
92
|
+
|
|
93
|
+
if (router.state.isFetching !== isFetching || router.state.isPreloading !== isPreloading) {
|
|
94
|
+
router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
|
|
95
|
+
isFetching,
|
|
96
|
+
isPreloading
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
cascadeLoaderData(router.state.matches);
|
|
87
101
|
router.listeners.forEach(listener => listener(router));
|
|
88
102
|
},
|
|
103
|
+
dehydrateState: () => {
|
|
104
|
+
return _rollupPluginBabelHelpers["extends"]({}, utils.pick(router.state, ['status', 'location', 'lastUpdated']), {
|
|
105
|
+
matches: router.state.matches.map(match => utils.pick(match, ['matchId', 'status', 'routeLoaderData', 'loaderData', 'isInvalid', 'invalidAt']))
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
hydrateState: dehydratedState => {
|
|
109
|
+
// Match the routes
|
|
110
|
+
const matches = router.matchRoutes(router.location.pathname, {
|
|
111
|
+
strictParseParams: true
|
|
112
|
+
});
|
|
113
|
+
matches.forEach((match, index) => {
|
|
114
|
+
const dehydratedMatch = dehydratedState.matches[index];
|
|
115
|
+
tinyInvariant["default"](dehydratedMatch, 'Oh no! Dehydrated route matches did not match the active state of the router 😬');
|
|
116
|
+
Object.assign(match, dehydratedMatch);
|
|
117
|
+
});
|
|
118
|
+
matches.forEach(match => match.__.validate());
|
|
119
|
+
router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, dehydratedState, {
|
|
120
|
+
matches
|
|
121
|
+
});
|
|
122
|
+
},
|
|
89
123
|
mount: () => {
|
|
90
124
|
const next = router.__.buildLocation({
|
|
91
125
|
to: '.',
|
|
@@ -97,12 +131,14 @@ function createRouter(userOptions) {
|
|
|
97
131
|
|
|
98
132
|
if (next.href !== router.location.href) {
|
|
99
133
|
router.__.commitLocation(next, true);
|
|
100
|
-
} else {
|
|
101
|
-
router.loadLocation();
|
|
102
134
|
}
|
|
103
135
|
|
|
104
|
-
|
|
105
|
-
router.
|
|
136
|
+
if (!router.state.matches.length) {
|
|
137
|
+
router.load();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const unsub = router.history.listen(event => {
|
|
141
|
+
router.load(router.__.parseLocation(event.location, router.location));
|
|
106
142
|
}); // addEventListener does not exist in React Native, but window does
|
|
107
143
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
108
144
|
|
|
@@ -113,16 +149,30 @@ function createRouter(userOptions) {
|
|
|
113
149
|
}
|
|
114
150
|
|
|
115
151
|
return () => {
|
|
116
|
-
unsub();
|
|
152
|
+
unsub();
|
|
117
153
|
|
|
118
|
-
window.removeEventListener
|
|
119
|
-
|
|
154
|
+
if (!isServer && window.removeEventListener) {
|
|
155
|
+
// Be sure to unsubscribe if a new handler is set
|
|
156
|
+
window.removeEventListener('visibilitychange', router.onFocus);
|
|
157
|
+
window.removeEventListener('focus', router.onFocus);
|
|
158
|
+
}
|
|
120
159
|
};
|
|
121
160
|
},
|
|
122
161
|
onFocus: () => {
|
|
123
|
-
router.
|
|
162
|
+
router.load();
|
|
124
163
|
},
|
|
125
164
|
update: opts => {
|
|
165
|
+
const newHistory = (opts == null ? void 0 : opts.history) !== router.history;
|
|
166
|
+
|
|
167
|
+
if (!router.location || newHistory) {
|
|
168
|
+
if (opts != null && opts.history) {
|
|
169
|
+
router.history = opts.history;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
router.location = router.__.parseLocation(router.history.location);
|
|
173
|
+
router.state.location = router.location;
|
|
174
|
+
}
|
|
175
|
+
|
|
126
176
|
Object.assign(router.options, opts);
|
|
127
177
|
const {
|
|
128
178
|
basepath,
|
|
@@ -143,49 +193,53 @@ function createRouter(userOptions) {
|
|
|
143
193
|
match.cancel();
|
|
144
194
|
});
|
|
145
195
|
},
|
|
146
|
-
|
|
196
|
+
load: async next => {
|
|
147
197
|
const id = Math.random();
|
|
148
198
|
router.startedLoadingAt = id;
|
|
149
199
|
|
|
150
200
|
if (next) {
|
|
151
201
|
// Ingest the new location
|
|
152
202
|
router.location = next;
|
|
153
|
-
} //
|
|
203
|
+
} // Cancel any pending matches
|
|
154
204
|
|
|
155
205
|
|
|
156
|
-
router.
|
|
157
|
-
let {
|
|
158
|
-
action,
|
|
159
|
-
actionState
|
|
160
|
-
} = _ref;
|
|
206
|
+
router.cancelMatches(); // Match the routes
|
|
161
207
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
208
|
+
const matches = router.matchRoutes(router.location.pathname, {
|
|
209
|
+
strictParseParams: true
|
|
210
|
+
}); // Check if each match middleware to see if the route can be accessed
|
|
165
211
|
|
|
166
|
-
|
|
167
|
-
|
|
212
|
+
try {
|
|
213
|
+
await Promise.all(matches.map(match => match.options.beforeLoad == null ? void 0 : match.options.beforeLoad({
|
|
214
|
+
context: router.context
|
|
215
|
+
})));
|
|
216
|
+
} catch (err) {
|
|
217
|
+
if (err != null && err.then) {
|
|
218
|
+
await new Promise(() => {});
|
|
168
219
|
}
|
|
169
|
-
});
|
|
170
|
-
router.removeActionQueue = []; // Cancel any pending matches
|
|
171
220
|
|
|
172
|
-
|
|
221
|
+
throw err;
|
|
222
|
+
}
|
|
173
223
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
224
|
+
if (typeof document !== 'undefined') {
|
|
225
|
+
router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
|
|
226
|
+
pending: {
|
|
227
|
+
matches: matches,
|
|
228
|
+
location: router.location
|
|
229
|
+
},
|
|
230
|
+
status: 'loading'
|
|
231
|
+
});
|
|
232
|
+
} else {
|
|
233
|
+
router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
|
|
179
234
|
matches: matches,
|
|
180
|
-
location: router.location
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
235
|
+
location: router.location,
|
|
236
|
+
status: 'loading'
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
184
240
|
router.notify(); // Load the matches
|
|
185
241
|
|
|
186
|
-
await router.loadMatches(matches
|
|
187
|
-
withPending: true
|
|
188
|
-
});
|
|
242
|
+
await router.loadMatches(matches);
|
|
189
243
|
|
|
190
244
|
if (router.startedLoadingAt !== id) {
|
|
191
245
|
// Ignore side-effects of match loading
|
|
@@ -202,9 +256,12 @@ function createRouter(userOptions) {
|
|
|
202
256
|
exiting.push(d);
|
|
203
257
|
}
|
|
204
258
|
});
|
|
259
|
+
const entering = matches.filter(d => {
|
|
260
|
+
return !previousMatches.find(dd => dd.matchId === d.matchId);
|
|
261
|
+
});
|
|
205
262
|
const now = Date.now();
|
|
206
263
|
exiting.forEach(d => {
|
|
207
|
-
var
|
|
264
|
+
var _ref, _d$options$loaderGcMa, _ref2, _d$options$loaderMaxA;
|
|
208
265
|
|
|
209
266
|
d.__.onExit == null ? void 0 : d.__.onExit({
|
|
210
267
|
params: d.params,
|
|
@@ -216,7 +273,7 @@ function createRouter(userOptions) {
|
|
|
216
273
|
d.error = undefined;
|
|
217
274
|
}
|
|
218
275
|
|
|
219
|
-
const gc = Math.max((
|
|
276
|
+
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
277
|
|
|
221
278
|
if (gc > 0) {
|
|
222
279
|
router.matchCache[d.matchId] = {
|
|
@@ -231,27 +288,26 @@ function createRouter(userOptions) {
|
|
|
231
288
|
search: d.routeSearch
|
|
232
289
|
});
|
|
233
290
|
});
|
|
234
|
-
const entering = matches.filter(d => {
|
|
235
|
-
return !previousMatches.find(dd => dd.matchId === d.matchId);
|
|
236
|
-
});
|
|
237
291
|
entering.forEach(d => {
|
|
238
|
-
d.__.onExit = d.options.
|
|
292
|
+
d.__.onExit = d.options.onLoaded == null ? void 0 : d.options.onLoaded({
|
|
239
293
|
params: d.params,
|
|
240
294
|
search: d.search
|
|
241
295
|
});
|
|
242
296
|
delete router.matchCache[d.matchId];
|
|
243
297
|
});
|
|
244
298
|
|
|
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
299
|
if (router.startedLoadingAt !== id) {
|
|
251
300
|
// Ignore side-effects of match loading
|
|
252
301
|
return;
|
|
253
302
|
}
|
|
254
303
|
|
|
304
|
+
matches.forEach(match => {
|
|
305
|
+
// Clear actions
|
|
306
|
+
if (match.action) {
|
|
307
|
+
match.action.current = undefined;
|
|
308
|
+
match.action.submissions = [];
|
|
309
|
+
}
|
|
310
|
+
});
|
|
255
311
|
router.state = _rollupPluginBabelHelpers["extends"]({}, router.state, {
|
|
256
312
|
location: router.location,
|
|
257
313
|
matches,
|
|
@@ -292,7 +348,7 @@ function createRouter(userOptions) {
|
|
|
292
348
|
return matches;
|
|
293
349
|
},
|
|
294
350
|
preloadRoute: async function preloadRoute(navigateOpts, loaderOpts) {
|
|
295
|
-
var
|
|
351
|
+
var _ref3, _ref4, _loaderOpts$maxAge, _ref5, _ref6, _loaderOpts$gcMaxAge;
|
|
296
352
|
|
|
297
353
|
if (navigateOpts === void 0) {
|
|
298
354
|
navigateOpts = router.location;
|
|
@@ -304,8 +360,8 @@ function createRouter(userOptions) {
|
|
|
304
360
|
});
|
|
305
361
|
await router.loadMatches(matches, {
|
|
306
362
|
preload: true,
|
|
307
|
-
maxAge: (
|
|
308
|
-
gcMaxAge: (
|
|
363
|
+
maxAge: (_ref3 = (_ref4 = (_loaderOpts$maxAge = loaderOpts.maxAge) != null ? _loaderOpts$maxAge : router.options.defaultPreloadMaxAge) != null ? _ref4 : router.options.defaultLoaderMaxAge) != null ? _ref3 : 0,
|
|
364
|
+
gcMaxAge: (_ref5 = (_ref6 = (_loaderOpts$gcMaxAge = loaderOpts.gcMaxAge) != null ? _loaderOpts$gcMaxAge : router.options.defaultPreloadGcMaxAge) != null ? _ref6 : router.options.defaultLoaderGcMaxAge) != null ? _ref5 : 0
|
|
309
365
|
});
|
|
310
366
|
return matches;
|
|
311
367
|
},
|
|
@@ -381,6 +437,7 @@ function createRouter(userOptions) {
|
|
|
381
437
|
const interpolatedPath = path.interpolatePath(foundRoute.routePath, params);
|
|
382
438
|
const matchId = path.interpolatePath(foundRoute.routeId, params, true);
|
|
383
439
|
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, {
|
|
440
|
+
parentMatch,
|
|
384
441
|
matchId,
|
|
385
442
|
params,
|
|
386
443
|
pathname: path.joinPaths([pathname, interpolatedPath])
|
|
@@ -395,7 +452,7 @@ function createRouter(userOptions) {
|
|
|
395
452
|
};
|
|
396
453
|
|
|
397
454
|
recurse([router.routeTree]);
|
|
398
|
-
|
|
455
|
+
cascadeLoaderData(matches);
|
|
399
456
|
return matches;
|
|
400
457
|
},
|
|
401
458
|
loadMatches: async (resolvedMatches, loaderOpts) => {
|
|
@@ -404,18 +461,51 @@ function createRouter(userOptions) {
|
|
|
404
461
|
match.__.validate();
|
|
405
462
|
|
|
406
463
|
match.load(loaderOpts);
|
|
464
|
+
const search = match.search;
|
|
407
465
|
|
|
408
|
-
if (
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
// This might be completion, error, or a pending state
|
|
466
|
+
if (search.__data && search.__data.matchId !== match.matchId) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
412
469
|
|
|
470
|
+
if (match.__.loadPromise) {
|
|
471
|
+
// Wait for the first sign of activity from the match
|
|
413
472
|
await match.__.loadPromise;
|
|
414
473
|
}
|
|
415
474
|
});
|
|
416
475
|
router.notify();
|
|
417
476
|
await Promise.all(matchPromises);
|
|
418
477
|
},
|
|
478
|
+
loadMatchData: async routeMatch => {
|
|
479
|
+
if (isServer || !router.options.useServerData) {
|
|
480
|
+
var _await$routeMatch$opt;
|
|
481
|
+
|
|
482
|
+
return (_await$routeMatch$opt = await (routeMatch.options.loader == null ? void 0 : routeMatch.options.loader({
|
|
483
|
+
// parentLoaderPromise: routeMatch.parentMatch?.__.dataPromise,
|
|
484
|
+
params: routeMatch.params,
|
|
485
|
+
search: routeMatch.routeSearch,
|
|
486
|
+
signal: routeMatch.__.abortController.signal
|
|
487
|
+
}))) != null ? _await$routeMatch$opt : {};
|
|
488
|
+
} else {
|
|
489
|
+
const next = router.buildNext({
|
|
490
|
+
to: '.',
|
|
491
|
+
search: d => _rollupPluginBabelHelpers["extends"]({}, d != null ? d : {}, {
|
|
492
|
+
__data: {
|
|
493
|
+
matchId: routeMatch.matchId
|
|
494
|
+
}
|
|
495
|
+
})
|
|
496
|
+
});
|
|
497
|
+
const res = await fetch(next.href, {
|
|
498
|
+
method: 'GET' // signal: routeMatch.__.abortController.signal,
|
|
499
|
+
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
if (res.ok) {
|
|
503
|
+
return res.json();
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
throw new Error('Failed to fetch match data');
|
|
507
|
+
}
|
|
508
|
+
},
|
|
419
509
|
invalidateRoute: opts => {
|
|
420
510
|
var _router$state$pending5, _router$state$pending6;
|
|
421
511
|
|
|
@@ -460,7 +550,7 @@ function createRouter(userOptions) {
|
|
|
460
550
|
to: next.pathname
|
|
461
551
|
}));
|
|
462
552
|
},
|
|
463
|
-
navigate: async
|
|
553
|
+
navigate: async _ref7 => {
|
|
464
554
|
let {
|
|
465
555
|
from,
|
|
466
556
|
to = '.',
|
|
@@ -468,7 +558,7 @@ function createRouter(userOptions) {
|
|
|
468
558
|
hash,
|
|
469
559
|
replace,
|
|
470
560
|
params
|
|
471
|
-
} =
|
|
561
|
+
} = _ref7;
|
|
472
562
|
// If this link simply reloads the current route,
|
|
473
563
|
// make sure it has a new key so it will trigger a data refresh
|
|
474
564
|
// If this `to` is a valid external URL, return
|
|
@@ -492,8 +582,8 @@ function createRouter(userOptions) {
|
|
|
492
582
|
params
|
|
493
583
|
});
|
|
494
584
|
},
|
|
495
|
-
buildLink:
|
|
496
|
-
var _preload,
|
|
585
|
+
buildLink: _ref8 => {
|
|
586
|
+
var _preload, _ref9;
|
|
497
587
|
|
|
498
588
|
let {
|
|
499
589
|
from,
|
|
@@ -509,7 +599,7 @@ function createRouter(userOptions) {
|
|
|
509
599
|
preloadGcMaxAge: userPreloadGcMaxAge,
|
|
510
600
|
preloadDelay: userPreloadDelay,
|
|
511
601
|
disabled
|
|
512
|
-
} =
|
|
602
|
+
} = _ref8;
|
|
513
603
|
|
|
514
604
|
// If this link simply reloads the current route,
|
|
515
605
|
// make sure it has a new key so it will trigger a data refresh
|
|
@@ -533,7 +623,7 @@ function createRouter(userOptions) {
|
|
|
533
623
|
};
|
|
534
624
|
const next = router.buildNext(nextOpts);
|
|
535
625
|
preload = (_preload = preload) != null ? _preload : router.options.defaultPreload;
|
|
536
|
-
const preloadDelay = (
|
|
626
|
+
const preloadDelay = (_ref9 = userPreloadDelay != null ? userPreloadDelay : router.options.defaultPreloadDelay) != null ? _ref9 : 0; // Compare path/hash for matches
|
|
537
627
|
|
|
538
628
|
const pathIsEqual = router.state.location.pathname === next.pathname;
|
|
539
629
|
const currentPathSplit = router.state.location.pathname.split('/');
|
|
@@ -634,11 +724,7 @@ function createRouter(userOptions) {
|
|
|
634
724
|
const recurseRoutes = (routeConfigs, parent) => {
|
|
635
725
|
return routeConfigs.map(routeConfig => {
|
|
636
726
|
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
|
-
|
|
727
|
+
const route$1 = route.createRoute(routeConfig, routeOptions, parent, router);
|
|
642
728
|
const existingRoute = router.routesById[route$1.routeId];
|
|
643
729
|
|
|
644
730
|
if (existingRoute) {
|
|
@@ -748,9 +834,9 @@ function createRouter(userOptions) {
|
|
|
748
834
|
pathname: next.pathname,
|
|
749
835
|
hash: next.hash,
|
|
750
836
|
search: next.searchStr
|
|
751
|
-
}, {
|
|
837
|
+
}, _rollupPluginBabelHelpers["extends"]({
|
|
752
838
|
id
|
|
753
|
-
});
|
|
839
|
+
}, next.state));
|
|
754
840
|
} else {
|
|
755
841
|
history.push({
|
|
756
842
|
pathname: next.pathname,
|
|
@@ -773,8 +859,6 @@ function createRouter(userOptions) {
|
|
|
773
859
|
}
|
|
774
860
|
}
|
|
775
861
|
};
|
|
776
|
-
router.location = router.__.parseLocation(history.location);
|
|
777
|
-
router.state.location = router.location;
|
|
778
862
|
router.update(userOptions); // Allow frameworks to hook into the router creation
|
|
779
863
|
|
|
780
864
|
router.options.createRouter == null ? void 0 : router.options.createRouter(router);
|
|
@@ -785,5 +869,15 @@ function isCtrlEvent(e) {
|
|
|
785
869
|
return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);
|
|
786
870
|
}
|
|
787
871
|
|
|
872
|
+
function cascadeLoaderData(matches) {
|
|
873
|
+
matches.forEach((match, index) => {
|
|
874
|
+
const parent = matches[index - 1];
|
|
875
|
+
|
|
876
|
+
if (parent) {
|
|
877
|
+
match.loaderData = utils.replaceEqualDeep(match.loaderData, _rollupPluginBabelHelpers["extends"]({}, parent.loaderData, match.routeLoaderData));
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
|
|
788
882
|
exports.createRouter = createRouter;
|
|
789
883
|
//# sourceMappingURL=router.js.map
|