@tanstack/router-core 0.0.1-beta.4 → 0.0.1-beta.41
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 → index.js} +25 -8
- package/build/cjs/{packages/router-core/src/index.js.map → index.js.map} +1 -1
- package/build/cjs/{packages/router-core/src/path.js → path.js} +19 -43
- package/build/cjs/path.js.map +1 -0
- package/build/cjs/{packages/router-core/src/qss.js → qss.js} +8 -13
- package/build/cjs/qss.js.map +1 -0
- package/build/cjs/route.js +155 -0
- package/build/cjs/route.js.map +1 -0
- package/build/cjs/{packages/router-core/src/routeConfig.js → routeConfig.js} +14 -13
- package/build/cjs/routeConfig.js.map +1 -0
- package/build/cjs/routeMatch.js +242 -0
- package/build/cjs/routeMatch.js.map +1 -0
- package/build/cjs/router.js +807 -0
- package/build/cjs/router.js.map +1 -0
- package/build/cjs/{packages/router-core/src/searchParams.js → searchParams.js} +10 -12
- package/build/cjs/searchParams.js.map +1 -0
- package/build/cjs/sharedClone.js +122 -0
- package/build/cjs/sharedClone.js.map +1 -0
- package/build/cjs/utils.js +47 -0
- package/build/cjs/utils.js.map +1 -0
- package/build/esm/index.js +890 -1739
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +59 -49
- package/build/stats-react.json +196 -178
- package/build/types/index.d.ts +287 -283
- package/build/umd/index.development.js +1233 -922
- 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 +4 -2
- package/src/frameworks.ts +2 -2
- package/src/index.ts +1 -1
- package/src/link.ts +86 -43
- package/src/path.ts +12 -8
- package/src/route.ts +170 -158
- package/src/routeConfig.ts +105 -77
- package/src/routeInfo.ts +26 -8
- package/src/routeMatch.ts +204 -217
- package/src/router.ts +680 -503
- package/src/sharedClone.ts +118 -0
- package/src/utils.ts +14 -72
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -33
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
- package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js +0 -33
- package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +0 -1
- package/build/cjs/node_modules/history/index.js +0 -815
- package/build/cjs/node_modules/history/index.js.map +0 -1
- package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -30
- package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
- package/build/cjs/packages/router-core/src/path.js.map +0 -1
- package/build/cjs/packages/router-core/src/qss.js.map +0 -1
- package/build/cjs/packages/router-core/src/route.js +0 -161
- package/build/cjs/packages/router-core/src/route.js.map +0 -1
- package/build/cjs/packages/router-core/src/routeConfig.js.map +0 -1
- package/build/cjs/packages/router-core/src/routeMatch.js +0 -266
- package/build/cjs/packages/router-core/src/routeMatch.js.map +0 -1
- package/build/cjs/packages/router-core/src/router.js +0 -789
- package/build/cjs/packages/router-core/src/router.js.map +0 -1
- package/build/cjs/packages/router-core/src/searchParams.js.map +0 -1
- package/build/cjs/packages/router-core/src/utils.js +0 -118
- package/build/cjs/packages/router-core/src/utils.js.map +0 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* router-core
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) TanStack
|
|
5
|
+
*
|
|
6
|
+
* This source code is licensed under the MIT license found in the
|
|
7
|
+
* LICENSE.md file in the root directory of this source tree.
|
|
8
|
+
*
|
|
9
|
+
* @license MIT
|
|
10
|
+
*/
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
14
|
+
|
|
15
|
+
var reactivity = require('@solidjs/reactivity');
|
|
16
|
+
var sharedClone = require('./sharedClone.js');
|
|
17
|
+
|
|
18
|
+
const componentTypes = ['component', 'errorComponent', 'pendingComponent'];
|
|
19
|
+
function createRouteMatch(router, route, opts) {
|
|
20
|
+
let componentsPromise;
|
|
21
|
+
let dataPromise;
|
|
22
|
+
let latestId = '';
|
|
23
|
+
let resolve = () => {};
|
|
24
|
+
function setLoaderData(loaderData) {
|
|
25
|
+
reactivity.batch(() => {
|
|
26
|
+
setStore(s => {
|
|
27
|
+
s.routeLoaderData = sharedClone.sharedClone(s.routeLoaderData, loaderData);
|
|
28
|
+
});
|
|
29
|
+
updateLoaderData();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function updateLoaderData() {
|
|
33
|
+
setStore(s => {
|
|
34
|
+
var _store$parentMatch;
|
|
35
|
+
s.loaderData = sharedClone.sharedClone(s.loaderData, {
|
|
36
|
+
...((_store$parentMatch = store.parentMatch) == null ? void 0 : _store$parentMatch.store.loaderData),
|
|
37
|
+
...s.routeLoaderData
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const [store, setStore] = reactivity.createStore({
|
|
42
|
+
routeSearch: {},
|
|
43
|
+
search: {},
|
|
44
|
+
status: 'idle',
|
|
45
|
+
routeLoaderData: {},
|
|
46
|
+
loaderData: {},
|
|
47
|
+
isFetching: false,
|
|
48
|
+
invalid: false,
|
|
49
|
+
invalidAt: Infinity,
|
|
50
|
+
get isInvalid() {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
return this.invalid || this.invalidAt < now;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const routeMatch = {
|
|
56
|
+
...route,
|
|
57
|
+
...opts,
|
|
58
|
+
store,
|
|
59
|
+
// setStore,
|
|
60
|
+
router,
|
|
61
|
+
childMatches: [],
|
|
62
|
+
__: {
|
|
63
|
+
setParentMatch: parentMatch => {
|
|
64
|
+
reactivity.batch(() => {
|
|
65
|
+
setStore(s => {
|
|
66
|
+
s.parentMatch = parentMatch;
|
|
67
|
+
});
|
|
68
|
+
updateLoaderData();
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
abortController: new AbortController(),
|
|
72
|
+
validate: () => {
|
|
73
|
+
var _store$parentMatch2;
|
|
74
|
+
// Validate the search params and stabilize them
|
|
75
|
+
const parentSearch = ((_store$parentMatch2 = store.parentMatch) == null ? void 0 : _store$parentMatch2.store.search) ?? router.store.currentLocation.search;
|
|
76
|
+
try {
|
|
77
|
+
const prevSearch = store.routeSearch;
|
|
78
|
+
const validator = typeof routeMatch.options.validateSearch === 'object' ? routeMatch.options.validateSearch.parse : routeMatch.options.validateSearch;
|
|
79
|
+
let nextSearch = sharedClone.sharedClone(prevSearch, (validator == null ? void 0 : validator(parentSearch)) ?? {});
|
|
80
|
+
reactivity.batch(() => {
|
|
81
|
+
// Invalidate route matches when search param stability changes
|
|
82
|
+
if (prevSearch !== nextSearch) {
|
|
83
|
+
setStore(s => s.invalid = true);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// TODO: Alright, do we need batch() here?
|
|
87
|
+
setStore(s => {
|
|
88
|
+
s.routeSearch = nextSearch;
|
|
89
|
+
s.search = sharedClone.sharedClone(parentSearch, {
|
|
90
|
+
...parentSearch,
|
|
91
|
+
...nextSearch
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
componentTypes.map(async type => {
|
|
96
|
+
const component = routeMatch.options[type];
|
|
97
|
+
if (typeof routeMatch.__[type] !== 'function') {
|
|
98
|
+
routeMatch.__[type] = component;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} catch (err) {
|
|
102
|
+
console.error(err);
|
|
103
|
+
const error = new Error('Invalid search params found', {
|
|
104
|
+
cause: err
|
|
105
|
+
});
|
|
106
|
+
error.code = 'INVALID_SEARCH_PARAMS';
|
|
107
|
+
setStore(s => {
|
|
108
|
+
s.status = 'error';
|
|
109
|
+
s.error = error;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Do not proceed with loading the route
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
cancel: () => {
|
|
118
|
+
var _routeMatch$__$abortC;
|
|
119
|
+
(_routeMatch$__$abortC = routeMatch.__.abortController) == null ? void 0 : _routeMatch$__$abortC.abort();
|
|
120
|
+
},
|
|
121
|
+
invalidate: () => {
|
|
122
|
+
setStore(s => s.invalid = true);
|
|
123
|
+
},
|
|
124
|
+
hasLoaders: () => {
|
|
125
|
+
return !!(route.options.loader || componentTypes.some(d => {
|
|
126
|
+
var _route$options$d;
|
|
127
|
+
return (_route$options$d = route.options[d]) == null ? void 0 : _route$options$d.preload;
|
|
128
|
+
}));
|
|
129
|
+
},
|
|
130
|
+
load: async loaderOpts => {
|
|
131
|
+
const now = Date.now();
|
|
132
|
+
const minMaxAge = loaderOpts != null && loaderOpts.preload ? Math.max(loaderOpts == null ? void 0 : loaderOpts.maxAge, loaderOpts == null ? void 0 : loaderOpts.gcMaxAge) : 0;
|
|
133
|
+
|
|
134
|
+
// If this is a preload, add it to the preload cache
|
|
135
|
+
if (loaderOpts != null && loaderOpts.preload && minMaxAge > 0) {
|
|
136
|
+
// If the match is currently active, don't preload it
|
|
137
|
+
if (router.store.currentMatches.find(d => d.matchId === routeMatch.matchId)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
router.store.matchCache[routeMatch.matchId] = {
|
|
141
|
+
gc: now + loaderOpts.gcMaxAge,
|
|
142
|
+
match: routeMatch
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// If the match is invalid, errored or idle, trigger it to load
|
|
147
|
+
if (store.status === 'success' && store.isInvalid || store.status === 'error' || store.status === 'idle') {
|
|
148
|
+
const maxAge = loaderOpts != null && loaderOpts.preload ? loaderOpts == null ? void 0 : loaderOpts.maxAge : undefined;
|
|
149
|
+
await routeMatch.fetch({
|
|
150
|
+
maxAge
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
fetch: async opts => {
|
|
155
|
+
const loadId = '' + Date.now() + Math.random();
|
|
156
|
+
latestId = loadId;
|
|
157
|
+
const checkLatest = async () => {
|
|
158
|
+
if (loadId !== latestId) {
|
|
159
|
+
// warning(true, 'Data loader is out of date!')
|
|
160
|
+
return new Promise(() => {});
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
reactivity.batch(() => {
|
|
164
|
+
// If the match was in an error state, set it
|
|
165
|
+
// to a loading state again. Otherwise, keep it
|
|
166
|
+
// as loading or resolved
|
|
167
|
+
if (store.status === 'idle') {
|
|
168
|
+
setStore(s => s.status = 'loading');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// We started loading the route, so it's no longer invalid
|
|
172
|
+
setStore(s => s.invalid = false);
|
|
173
|
+
});
|
|
174
|
+
routeMatch.__.loadPromise = new Promise(async r => {
|
|
175
|
+
// We are now fetching, even if it's in the background of a
|
|
176
|
+
// resolved state
|
|
177
|
+
setStore(s => s.isFetching = true);
|
|
178
|
+
resolve = r;
|
|
179
|
+
componentsPromise = (async () => {
|
|
180
|
+
// then run all component and data loaders in parallel
|
|
181
|
+
// For each component type, potentially load it asynchronously
|
|
182
|
+
|
|
183
|
+
await Promise.all(componentTypes.map(async type => {
|
|
184
|
+
var _routeMatch$__$type;
|
|
185
|
+
const component = routeMatch.options[type];
|
|
186
|
+
if ((_routeMatch$__$type = routeMatch.__[type]) != null && _routeMatch$__$type.preload) {
|
|
187
|
+
routeMatch.__[type] = await router.options.loadComponent(component);
|
|
188
|
+
}
|
|
189
|
+
}));
|
|
190
|
+
})();
|
|
191
|
+
dataPromise = Promise.resolve().then(async () => {
|
|
192
|
+
try {
|
|
193
|
+
if (routeMatch.options.loader) {
|
|
194
|
+
const data = await router.loadMatchData(routeMatch);
|
|
195
|
+
await checkLatest();
|
|
196
|
+
setLoaderData(data);
|
|
197
|
+
}
|
|
198
|
+
setStore(s => {
|
|
199
|
+
s.error = undefined;
|
|
200
|
+
s.status = 'success';
|
|
201
|
+
s.updatedAt = Date.now();
|
|
202
|
+
s.invalidAt = s.updatedAt + ((opts == null ? void 0 : opts.maxAge) ?? routeMatch.options.loaderMaxAge ?? router.options.defaultLoaderMaxAge ?? 0);
|
|
203
|
+
});
|
|
204
|
+
return store.routeLoaderData;
|
|
205
|
+
} catch (err) {
|
|
206
|
+
await checkLatest();
|
|
207
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
208
|
+
console.error(err);
|
|
209
|
+
}
|
|
210
|
+
setStore(s => {
|
|
211
|
+
s.error = err;
|
|
212
|
+
s.status = 'error';
|
|
213
|
+
s.updatedAt = Date.now();
|
|
214
|
+
});
|
|
215
|
+
throw err;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
const after = async () => {
|
|
219
|
+
await checkLatest();
|
|
220
|
+
setStore(s => s.isFetching = false);
|
|
221
|
+
delete routeMatch.__.loadPromise;
|
|
222
|
+
resolve();
|
|
223
|
+
};
|
|
224
|
+
try {
|
|
225
|
+
await Promise.all([componentsPromise, dataPromise.catch(() => {})]);
|
|
226
|
+
after();
|
|
227
|
+
} catch {
|
|
228
|
+
after();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
await routeMatch.__.loadPromise;
|
|
232
|
+
await checkLatest();
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
if (!routeMatch.hasLoaders()) {
|
|
236
|
+
setStore(s => s.status = 'success');
|
|
237
|
+
}
|
|
238
|
+
return routeMatch;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
exports.createRouteMatch = createRouteMatch;
|
|
242
|
+
//# sourceMappingURL=routeMatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeMatch.js","sources":["../../src/routeMatch.ts"],"sourcesContent":["import { boolean } from 'zod'\nimport { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { Router } from './router'\nimport { batch, createStore } from '@solidjs/reactivity'\nimport { Expand } from './utils'\nimport { sharedClone } from './sharedClone'\n\nexport interface RouteMatchStore<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n parentMatch?: RouteMatch\n routeSearch: TRouteInfo['searchSchema']\n search: Expand<\n TAllRouteInfo['fullSearchSchema'] & TRouteInfo['fullSearchSchema']\n >\n status: 'idle' | 'loading' | 'success' | 'error'\n updatedAt?: number\n error?: unknown\n invalid: boolean\n isInvalid: boolean\n loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n invalidAt: number\n}\n\nexport interface RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> extends Route<TAllRouteInfo, TRouteInfo> {\n store: RouteMatchStore<TAllRouteInfo, TRouteInfo>\n // setStore: WritableStore<RouteMatchStore<TAllRouteInfo, TRouteInfo>>\n matchId: string\n pathname: string\n params: TRouteInfo['allParams']\n childMatches: RouteMatch[]\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 setParentMatch: (parentMatch?: RouteMatch) => void\n component?: GetFrameworkGeneric<'Component'>\n errorComponent?: GetFrameworkGeneric<'ErrorComponent'>\n pendingComponent?: GetFrameworkGeneric<'Component'>\n loadPromise?: Promise<void>\n onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n abortController: AbortController\n validate: () => void\n }\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, 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 let componentsPromise: Promise<void>\n let dataPromise: Promise<TRouteInfo['routeLoaderData']>\n let latestId = ''\n let resolve = () => {}\n\n function setLoaderData(loaderData: TRouteInfo['routeLoaderData']) {\n batch(() => {\n setStore((s) => {\n s.routeLoaderData = sharedClone(s.routeLoaderData, loaderData)\n })\n updateLoaderData()\n })\n }\n\n function updateLoaderData() {\n setStore((s) => {\n s.loaderData = sharedClone(s.loaderData, {\n ...store.parentMatch?.store.loaderData,\n ...s.routeLoaderData,\n }) as TRouteInfo['loaderData']\n })\n }\n\n const [store, setStore] = createStore<\n RouteMatchStore<TAllRouteInfo, TRouteInfo>\n >({\n routeSearch: {},\n search: {} as any,\n status: 'idle',\n routeLoaderData: {} as TRouteInfo['routeLoaderData'],\n loaderData: {} as TRouteInfo['loaderData'],\n isFetching: false,\n invalid: false,\n invalidAt: Infinity,\n get isInvalid(): boolean {\n const now = Date.now()\n return this.invalid || this.invalidAt < now\n },\n })\n\n const routeMatch: RouteMatch<TAllRouteInfo, TRouteInfo> = {\n ...route,\n ...opts,\n store,\n // setStore,\n router,\n childMatches: [],\n __: {\n setParentMatch: (parentMatch?: RouteMatch) => {\n batch(() => {\n setStore((s) => {\n s.parentMatch = parentMatch\n })\n\n updateLoaderData()\n })\n },\n abortController: new AbortController(),\n validate: () => {\n // Validate the search params and stabilize them\n const parentSearch =\n store.parentMatch?.store.search ?? router.store.currentLocation.search\n\n try {\n const prevSearch = store.routeSearch\n\n const validator =\n typeof routeMatch.options.validateSearch === 'object'\n ? routeMatch.options.validateSearch.parse\n : routeMatch.options.validateSearch\n\n let nextSearch = sharedClone(\n prevSearch,\n validator?.(parentSearch) ?? {},\n )\n\n batch(() => {\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n setStore((s) => (s.invalid = true))\n }\n\n // TODO: Alright, do we need batch() here?\n setStore((s) => {\n s.routeSearch = nextSearch\n s.search = sharedClone(parentSearch, {\n ...parentSearch,\n ...nextSearch,\n })\n })\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\n setStore((s) => {\n s.status = 'error'\n s.error = error\n })\n\n // Do not proceed with loading the route\n return\n }\n },\n },\n cancel: () => {\n routeMatch.__.abortController?.abort()\n },\n invalidate: () => {\n setStore((s) => (s.invalid = 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.store.currentMatches.find(\n (d) => d.matchId === routeMatch.matchId,\n )\n ) {\n return\n }\n\n router.store.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 (store.status === 'success' && store.isInvalid) ||\n store.status === 'error' ||\n store.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 latestId = loadId\n const checkLatest = async () => {\n if (loadId !== latestId) {\n // warning(true, 'Data loader is out of date!')\n return new Promise(() => {})\n }\n }\n\n batch(() => {\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 (store.status === 'idle') {\n setStore((s) => (s.status = 'loading'))\n }\n\n // We started loading the route, so it's no longer invalid\n setStore((s) => (s.invalid = false))\n })\n\n routeMatch.__.loadPromise = new Promise(async (r) => {\n // We are now fetching, even if it's in the background of a\n // resolved state\n setStore((s) => (s.isFetching = true))\n resolve = r as () => void\n\n 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 dataPromise = Promise.resolve().then(async () => {\n try {\n if (routeMatch.options.loader) {\n const data = await router.loadMatchData(routeMatch)\n await checkLatest()\n\n setLoaderData(data)\n }\n\n setStore((s) => {\n s.error = undefined\n s.status = 'success'\n s.updatedAt = Date.now()\n s.invalidAt =\n s.updatedAt +\n (opts?.maxAge ??\n routeMatch.options.loaderMaxAge ??\n router.options.defaultLoaderMaxAge ??\n 0)\n })\n\n return store.routeLoaderData\n } catch (err) {\n await checkLatest()\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n\n setStore((s) => {\n s.error = err\n s.status = 'error'\n s.updatedAt = Date.now()\n })\n\n throw err\n }\n })\n\n const after = async () => {\n await checkLatest()\n setStore((s) => (s.isFetching = false))\n delete routeMatch.__.loadPromise\n resolve()\n }\n\n try {\n await Promise.all([componentsPromise, dataPromise.catch(() => {})])\n after()\n } catch {\n after()\n }\n })\n\n await routeMatch.__.loadPromise\n await checkLatest()\n },\n }\n\n if (!routeMatch.hasLoaders()) {\n setStore((s) => (s.status = 'success'))\n }\n\n return routeMatch\n}\n"],"names":["componentTypes","createRouteMatch","router","route","opts","componentsPromise","dataPromise","latestId","resolve","setLoaderData","loaderData","batch","setStore","s","routeLoaderData","sharedClone","updateLoaderData","store","parentMatch","createStore","routeSearch","search","status","isFetching","invalid","invalidAt","Infinity","isInvalid","now","Date","routeMatch","childMatches","__","setParentMatch","abortController","AbortController","validate","parentSearch","currentLocation","prevSearch","validator","options","validateSearch","parse","nextSearch","map","type","component","err","console","error","Error","cause","code","cancel","abort","invalidate","hasLoaders","loader","some","d","preload","load","loaderOpts","minMaxAge","Math","max","maxAge","gcMaxAge","currentMatches","find","matchId","matchCache","gc","match","undefined","fetch","loadId","random","checkLatest","Promise","loadPromise","r","all","loadComponent","then","data","loadMatchData","updatedAt","loaderMaxAge","defaultLoaderMaxAge","process","env","NODE_ENV","after","catch"],"mappings":"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"}
|