@tanstack/router-core 0.0.1-beta.5 → 0.0.1-beta.51
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/LICENSE +21 -0
- package/build/cjs/actions.js +94 -0
- package/build/cjs/actions.js.map +1 -0
- package/build/cjs/history.js +163 -0
- package/build/cjs/history.js.map +1 -0
- package/build/cjs/{packages/router-core/src/index.js → index.js} +26 -11
- package/build/cjs/{packages/router-core/src/index.js.map → index.js.map} +1 -1
- package/build/cjs/interop.js +175 -0
- package/build/cjs/interop.js.map +1 -0
- package/build/cjs/{packages/router-core/src/path.js → path.js} +23 -48
- 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 +33 -0
- package/build/cjs/route.js.map +1 -0
- package/build/cjs/{packages/router-core/src/routeConfig.js → routeConfig.js} +13 -18
- package/build/cjs/routeConfig.js.map +1 -0
- package/build/cjs/routeMatch.js +237 -0
- package/build/cjs/routeMatch.js.map +1 -0
- package/build/cjs/router.js +824 -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/store.js +54 -0
- package/build/cjs/store.js.map +1 -0
- package/build/cjs/utils.js +47 -0
- package/build/cjs/utils.js.map +1 -0
- package/build/esm/index.js +1386 -2058
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +59 -49
- package/build/stats-react.json +248 -193
- package/build/types/index.d.ts +385 -317
- package/build/umd/index.development.js +1489 -2142
- 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 +6 -4
- package/src/actions.ts +157 -0
- package/src/frameworks.ts +2 -2
- package/src/history.ts +199 -0
- package/src/index.ts +4 -7
- package/src/interop.ts +169 -0
- package/src/link.ts +87 -44
- package/src/path.ts +12 -8
- package/src/route.ts +36 -229
- package/src/routeConfig.ts +99 -102
- package/src/routeInfo.ts +28 -25
- package/src/routeMatch.ts +293 -322
- package/src/router.ts +1060 -884
- package/src/store.ts +52 -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 -797
- 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,237 @@
|
|
|
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 store = require('./store.js');
|
|
16
|
+
var interop = require('./interop.js');
|
|
17
|
+
|
|
18
|
+
const componentTypes = ['component', 'errorComponent', 'pendingComponent'];
|
|
19
|
+
class RouteMatch {
|
|
20
|
+
abortController = new AbortController();
|
|
21
|
+
#latestId = '';
|
|
22
|
+
#resolve = () => {};
|
|
23
|
+
onLoaderDataListeners = new Set();
|
|
24
|
+
constructor(router, route, opts) {
|
|
25
|
+
Object.assign(this, {
|
|
26
|
+
route,
|
|
27
|
+
router,
|
|
28
|
+
id: opts.id,
|
|
29
|
+
pathname: opts.pathname,
|
|
30
|
+
params: opts.params,
|
|
31
|
+
store: store.createStore({
|
|
32
|
+
routeSearch: {},
|
|
33
|
+
search: {},
|
|
34
|
+
status: 'idle',
|
|
35
|
+
routeLoaderData: {},
|
|
36
|
+
loaderData: {},
|
|
37
|
+
isFetching: false,
|
|
38
|
+
invalid: false,
|
|
39
|
+
invalidAt: Infinity
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
if (!this.__hasLoaders()) {
|
|
43
|
+
this.store.setState(s => s.status = 'success');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
#setLoaderData = loaderData => {
|
|
47
|
+
store.batch(() => {
|
|
48
|
+
this.store.setState(s => {
|
|
49
|
+
s.routeLoaderData = loaderData;
|
|
50
|
+
});
|
|
51
|
+
this.#updateLoaderData();
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
cancel = () => {
|
|
55
|
+
this.abortController?.abort();
|
|
56
|
+
};
|
|
57
|
+
load = async loaderOpts => {
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
const minMaxAge = loaderOpts?.preload ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge) : 0;
|
|
60
|
+
|
|
61
|
+
// If this is a preload, add it to the preload cache
|
|
62
|
+
if (loaderOpts?.preload && minMaxAge > 0) {
|
|
63
|
+
// If the match is currently active, don't preload it
|
|
64
|
+
if (this.router.store.state.currentMatches.find(d => d.id === this.id)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.router.store.setState(s => {
|
|
68
|
+
s.matchCache[this.id] = {
|
|
69
|
+
gc: now + loaderOpts.gcMaxAge,
|
|
70
|
+
match: this
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// If the match is invalid, errored or idle, trigger it to load
|
|
76
|
+
if (this.store.state.status === 'success' && this.getIsInvalid() || this.store.state.status === 'error' || this.store.state.status === 'idle') {
|
|
77
|
+
const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined;
|
|
78
|
+
await this.fetch({
|
|
79
|
+
maxAge
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
fetch = async opts => {
|
|
84
|
+
this.__loadPromise = new Promise(async resolve => {
|
|
85
|
+
const loadId = '' + Date.now() + Math.random();
|
|
86
|
+
this.#latestId = loadId;
|
|
87
|
+
const checkLatest = () => loadId !== this.#latestId ? this.__loadPromise?.then(() => resolve()) : undefined;
|
|
88
|
+
let latestPromise;
|
|
89
|
+
store.batch(() => {
|
|
90
|
+
// If the match was in an error state, set it
|
|
91
|
+
// to a loading state again. Otherwise, keep it
|
|
92
|
+
// as loading or resolved
|
|
93
|
+
if (this.store.state.status === 'idle') {
|
|
94
|
+
this.store.setState(s => s.status = 'loading');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// We started loading the route, so it's no longer invalid
|
|
98
|
+
this.store.setState(s => s.invalid = false);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// We are now fetching, even if it's in the background of a
|
|
102
|
+
// resolved state
|
|
103
|
+
this.store.setState(s => s.isFetching = true);
|
|
104
|
+
this.#resolve = resolve;
|
|
105
|
+
const componentsPromise = (async () => {
|
|
106
|
+
// then run all component and data loaders in parallel
|
|
107
|
+
// For each component type, potentially load it asynchronously
|
|
108
|
+
|
|
109
|
+
await Promise.all(componentTypes.map(async type => {
|
|
110
|
+
const component = this.route.options[type];
|
|
111
|
+
if (this[type]?.preload) {
|
|
112
|
+
this[type] = await this.router.options.loadComponent(component);
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
})();
|
|
116
|
+
const dataPromise = Promise.resolve().then(async () => {
|
|
117
|
+
try {
|
|
118
|
+
if (this.route.options.loader) {
|
|
119
|
+
const data = await this.router.loadMatchData(this);
|
|
120
|
+
if (latestPromise = checkLatest()) return latestPromise;
|
|
121
|
+
this.#setLoaderData(data);
|
|
122
|
+
}
|
|
123
|
+
this.store.setState(s => {
|
|
124
|
+
s.error = undefined;
|
|
125
|
+
s.status = 'success';
|
|
126
|
+
s.updatedAt = Date.now();
|
|
127
|
+
s.invalidAt = s.updatedAt + (opts?.maxAge ?? this.route.options.loaderMaxAge ?? this.router.options.defaultLoaderMaxAge ?? 0);
|
|
128
|
+
});
|
|
129
|
+
return this.store.state.routeLoaderData;
|
|
130
|
+
} catch (err) {
|
|
131
|
+
if (latestPromise = checkLatest()) return latestPromise;
|
|
132
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
133
|
+
console.error(err);
|
|
134
|
+
}
|
|
135
|
+
this.store.setState(s => {
|
|
136
|
+
s.error = err;
|
|
137
|
+
s.status = 'error';
|
|
138
|
+
s.updatedAt = Date.now();
|
|
139
|
+
});
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
const after = async () => {
|
|
144
|
+
if (latestPromise = checkLatest()) return latestPromise;
|
|
145
|
+
this.store.setState(s => s.isFetching = false);
|
|
146
|
+
this.#resolve();
|
|
147
|
+
delete this.__loadPromise;
|
|
148
|
+
};
|
|
149
|
+
try {
|
|
150
|
+
await Promise.all([componentsPromise, dataPromise.catch(() => {})]);
|
|
151
|
+
after();
|
|
152
|
+
} catch {
|
|
153
|
+
after();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return this.__loadPromise;
|
|
157
|
+
};
|
|
158
|
+
invalidate = async () => {
|
|
159
|
+
this.store.setState(s => s.invalid = true);
|
|
160
|
+
if (this.router.store.state.currentMatches.find(d => d.id === this.id)) {
|
|
161
|
+
await this.load();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
__hasLoaders = () => {
|
|
165
|
+
return !!(this.route.options.loader || componentTypes.some(d => this.route.options[d]?.preload));
|
|
166
|
+
};
|
|
167
|
+
getIsInvalid = () => {
|
|
168
|
+
const now = Date.now();
|
|
169
|
+
return this.store.state.invalid || this.store.state.invalidAt < now;
|
|
170
|
+
};
|
|
171
|
+
#updateLoaderData = () => {
|
|
172
|
+
this.store.setState(s => {
|
|
173
|
+
s.loaderData = interop.replaceEqualDeep(s.loaderData, {
|
|
174
|
+
...this.parentMatch?.store.state.loaderData,
|
|
175
|
+
...s.routeLoaderData
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
this.onLoaderDataListeners.forEach(listener => listener());
|
|
179
|
+
};
|
|
180
|
+
__setParentMatch = parentMatch => {
|
|
181
|
+
if (!this.parentMatch && parentMatch) {
|
|
182
|
+
this.parentMatch = parentMatch;
|
|
183
|
+
this.parentMatch.__onLoaderData(() => {
|
|
184
|
+
this.#updateLoaderData();
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
__onLoaderData = listener => {
|
|
189
|
+
this.onLoaderDataListeners.add(listener);
|
|
190
|
+
// return () => this.onLoaderDataListeners.delete(listener)
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
__validate = () => {
|
|
194
|
+
// Validate the search params and stabilize them
|
|
195
|
+
const parentSearch = this.parentMatch?.store.state.search ?? this.router.store.state.latestLocation.search;
|
|
196
|
+
try {
|
|
197
|
+
const prevSearch = this.store.state.routeSearch;
|
|
198
|
+
const validator = typeof this.route.options.validateSearch === 'object' ? this.route.options.validateSearch.parse : this.route.options.validateSearch;
|
|
199
|
+
let nextSearch = validator?.(parentSearch) ?? {};
|
|
200
|
+
store.batch(() => {
|
|
201
|
+
// Invalidate route matches when search param stability changes
|
|
202
|
+
if (prevSearch !== nextSearch) {
|
|
203
|
+
this.store.setState(s => s.invalid = true);
|
|
204
|
+
}
|
|
205
|
+
this.store.setState(s => {
|
|
206
|
+
s.routeSearch = nextSearch;
|
|
207
|
+
s.search = {
|
|
208
|
+
...parentSearch,
|
|
209
|
+
...nextSearch
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
componentTypes.map(async type => {
|
|
214
|
+
const component = this.route.options[type];
|
|
215
|
+
if (typeof this[type] !== 'function') {
|
|
216
|
+
this[type] = component;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
} catch (err) {
|
|
220
|
+
console.error(err);
|
|
221
|
+
const error = new Error('Invalid search params found', {
|
|
222
|
+
cause: err
|
|
223
|
+
});
|
|
224
|
+
error.code = 'INVALID_SEARCH_PARAMS';
|
|
225
|
+
this.store.setState(s => {
|
|
226
|
+
s.status = 'error';
|
|
227
|
+
s.error = error;
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Do not proceed with loading the route
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
exports.RouteMatch = RouteMatch;
|
|
237
|
+
//# sourceMappingURL=routeMatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { AnyRouter, Router } from './router'\nimport { batch, createStore, Store } from './store'\nimport { Expand } from './utils'\nimport { replaceEqualDeep } from './interop'\n\nexport interface RouteMatchStore<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\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 loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n invalidAt: number\n}\n\nconst componentTypes = [\n 'component',\n 'errorComponent',\n 'pendingComponent',\n] as const\n\nexport class RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n route!: Route<TAllRouteInfo, TRouteInfo>\n router!: Router<TAllRouteInfo['routeConfig'], TAllRouteInfo>\n store!: Store<RouteMatchStore<TAllRouteInfo, TRouteInfo>>\n id!: string\n pathname!: string\n params!: TRouteInfo['allParams']\n\n component: GetFrameworkGeneric<'Component'>\n errorComponent: GetFrameworkGeneric<'ErrorComponent'>\n pendingComponent: GetFrameworkGeneric<'Component'>\n abortController = new AbortController()\n #latestId = ''\n #resolve = () => {}\n onLoaderDataListeners = new Set<() => void>()\n parentMatch?: RouteMatch\n\n __loadPromise?: Promise<void>\n __onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n\n constructor(\n router: AnyRouter,\n route: Route<TAllRouteInfo, TRouteInfo>,\n opts: {\n id: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n ) {\n Object.assign(this, {\n route,\n router,\n id: opts.id,\n pathname: opts.pathname,\n params: opts.params,\n store: createStore<RouteMatchStore<TAllRouteInfo, TRouteInfo>>({\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 }),\n })\n\n if (!this.__hasLoaders()) {\n this.store.setState((s) => (s.status = 'success'))\n }\n }\n\n #setLoaderData = (loaderData: TRouteInfo['routeLoaderData']) => {\n batch(() => {\n this.store.setState((s) => {\n s.routeLoaderData = loaderData\n })\n this.#updateLoaderData()\n })\n }\n\n cancel = () => {\n this.abortController?.abort()\n }\n\n load = async (\n loaderOpts?:\n | { preload: true; maxAge: number; gcMaxAge: number }\n | { preload?: false; maxAge?: never; gcMaxAge?: never },\n ): Promise<void> => {\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 this.router.store.state.currentMatches.find((d) => d.id === this.id)\n ) {\n return\n }\n\n this.router.store.setState((s) => {\n s.matchCache[this.id] = {\n gc: now + loaderOpts.gcMaxAge,\n match: this as RouteMatch<any, any>,\n }\n })\n }\n\n // If the match is invalid, errored or idle, trigger it to load\n if (\n (this.store.state.status === 'success' && this.getIsInvalid()) ||\n this.store.state.status === 'error' ||\n this.store.state.status === 'idle'\n ) {\n const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined\n await this.fetch({ maxAge })\n }\n }\n\n fetch = async (opts?: {\n maxAge?: number\n }): Promise<TRouteInfo['routeLoaderData']> => {\n this.__loadPromise = new Promise(async (resolve) => {\n const loadId = '' + Date.now() + Math.random()\n this.#latestId = loadId\n\n const checkLatest = () =>\n loadId !== this.#latestId\n ? this.__loadPromise?.then(() => resolve())\n : undefined\n\n let latestPromise\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 (this.store.state.status === 'idle') {\n this.store.setState((s) => (s.status = 'loading'))\n }\n\n // We started loading the route, so it's no longer invalid\n this.store.setState((s) => (s.invalid = false))\n })\n\n // We are now fetching, even if it's in the background of a\n // resolved state\n this.store.setState((s) => (s.isFetching = true))\n this.#resolve = resolve as () => void\n\n const 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 = this.route.options[type]\n\n if (this[type]?.preload) {\n this[type] = await this.router.options.loadComponent!(component)\n }\n }),\n )\n })()\n\n const dataPromise = Promise.resolve().then(async () => {\n try {\n if (this.route.options.loader) {\n const data = await this.router.loadMatchData(this)\n if ((latestPromise = checkLatest())) return latestPromise\n this.#setLoaderData(data)\n }\n\n this.store.setState((s) => {\n s.error = undefined\n s.status = 'success'\n s.updatedAt = Date.now()\n s.invalidAt =\n s.updatedAt +\n (opts?.maxAge ??\n this.route.options.loaderMaxAge ??\n this.router.options.defaultLoaderMaxAge ??\n 0)\n })\n\n return this.store.state.routeLoaderData\n } catch (err) {\n if ((latestPromise = checkLatest())) return latestPromise\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n\n this.store.setState((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 if ((latestPromise = checkLatest())) return latestPromise\n this.store.setState((s) => (s.isFetching = false))\n this.#resolve()\n delete this.__loadPromise\n }\n\n try {\n await Promise.all([componentsPromise, dataPromise.catch(() => {})])\n after()\n } catch {\n after()\n }\n })\n\n return this.__loadPromise\n }\n invalidate = async () => {\n this.store.setState((s) => (s.invalid = true))\n if (this.router.store.state.currentMatches.find((d) => d.id === this.id)) {\n await this.load()\n }\n }\n __hasLoaders = () => {\n return !!(\n this.route.options.loader ||\n componentTypes.some((d) => this.route.options[d]?.preload)\n )\n }\n getIsInvalid = () => {\n const now = Date.now()\n return this.store.state.invalid || this.store.state.invalidAt < now\n }\n\n #updateLoaderData = () => {\n this.store.setState((s) => {\n s.loaderData = replaceEqualDeep(s.loaderData, {\n ...this.parentMatch?.store.state.loaderData,\n ...s.routeLoaderData,\n }) as TRouteInfo['loaderData']\n })\n this.onLoaderDataListeners.forEach((listener) => listener())\n }\n\n __setParentMatch = (parentMatch?: RouteMatch) => {\n if (!this.parentMatch && parentMatch) {\n this.parentMatch = parentMatch\n this.parentMatch.__onLoaderData(() => {\n this.#updateLoaderData()\n })\n }\n }\n\n __onLoaderData = (listener: () => void) => {\n this.onLoaderDataListeners.add(listener)\n // return () => this.onLoaderDataListeners.delete(listener)\n }\n\n __validate = () => {\n // Validate the search params and stabilize them\n const parentSearch =\n this.parentMatch?.store.state.search ??\n this.router.store.state.latestLocation.search\n\n try {\n const prevSearch = this.store.state.routeSearch\n\n const validator =\n typeof this.route.options.validateSearch === 'object'\n ? this.route.options.validateSearch.parse\n : this.route.options.validateSearch\n\n let nextSearch = validator?.(parentSearch) ?? {}\n\n batch(() => {\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n this.store.setState((s) => (s.invalid = true))\n }\n\n this.store.setState((s) => {\n s.routeSearch = nextSearch\n s.search = {\n ...parentSearch,\n ...nextSearch,\n } as any\n })\n })\n\n componentTypes.map(async (type) => {\n const component = this.route.options[type]\n\n if (typeof this[type] !== 'function') {\n this[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 this.store.setState((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"],"names":["componentTypes","RouteMatch","abortController","AbortController","onLoaderDataListeners","Set","constructor","router","route","opts","Object","assign","id","pathname","params","store","createStore","routeSearch","search","status","routeLoaderData","loaderData","isFetching","invalid","invalidAt","Infinity","__hasLoaders","setState","s","batch","cancel","abort","load","loaderOpts","now","Date","minMaxAge","preload","Math","max","maxAge","gcMaxAge","state","currentMatches","find","d","matchCache","gc","match","getIsInvalid","undefined","fetch","__loadPromise","Promise","resolve","loadId","random","checkLatest","then","latestPromise","componentsPromise","all","map","type","component","options","loadComponent","dataPromise","loader","data","loadMatchData","error","updatedAt","loaderMaxAge","defaultLoaderMaxAge","err","process","env","NODE_ENV","console","after","catch","invalidate","some","replaceEqualDeep","parentMatch","forEach","listener","__setParentMatch","__onLoaderData","add","__validate","parentSearch","latestLocation","prevSearch","validator","validateSearch","parse","nextSearch","Error","cause","code"],"mappings":";;;;;;;;;;;;;;;;;AA+BA,MAAMA,cAAc,GAAG,CACrB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,CACV,CAAA;AAEH,MAAMC,UAAU,CAGrB;EAWAC,eAAe,GAAG,IAAIC,eAAe,EAAE,CAAA;EACvC,SAAS,GAAG,EAAE,CAAA;AACd,EAAA,QAAQ,GAAG,MAAM,EAAE,CAAA;EACnBC,qBAAqB,GAAG,IAAIC,GAAG,EAAc,CAAA;AAW7CC,EAAAA,WAAW,CACTC,MAAiB,EACjBC,KAAuC,EACvCC,IAIC,EACD;AACAC,IAAAA,MAAM,CAACC,MAAM,CAAC,IAAI,EAAE;MAClBH,KAAK;MACLD,MAAM;MACNK,EAAE,EAAEH,IAAI,CAACG,EAAE;MACXC,QAAQ,EAAEJ,IAAI,CAACI,QAAQ;MACvBC,MAAM,EAAEL,IAAI,CAACK,MAAM;MACnBC,KAAK,EAAEC,iBAAW,CAA6C;QAC7DC,WAAW,EAAE,EAAE;QACfC,MAAM,EAAE,EAAS;AACjBC,QAAAA,MAAM,EAAE,MAAM;QACdC,eAAe,EAAE,EAAmC;QACpDC,UAAU,EAAE,EAA8B;AAC1CC,QAAAA,UAAU,EAAE,KAAK;AACjBC,QAAAA,OAAO,EAAE,KAAK;AACdC,QAAAA,SAAS,EAAEC,QAAAA;OACZ,CAAA;AACH,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE,EAAE;AACxB,MAAA,IAAI,CAACX,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACT,MAAM,GAAG,SAAU,CAAC,CAAA;AACpD,KAAA;AACF,GAAA;EAEA,cAAc,GAAIE,UAAyC,IAAK;AAC9DQ,IAAAA,WAAK,CAAC,MAAM;AACV,MAAA,IAAI,CAACd,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;QACzBA,CAAC,CAACR,eAAe,GAAGC,UAAU,CAAA;AAChC,OAAC,CAAC,CAAA;MACF,IAAI,CAAC,iBAAiB,EAAE,CAAA;AAC1B,KAAC,CAAC,CAAA;GACH,CAAA;AAEDS,EAAAA,MAAM,GAAG,MAAM;AACb,IAAA,IAAI,CAAC5B,eAAe,EAAE6B,KAAK,EAAE,CAAA;GAC9B,CAAA;EAEDC,IAAI,GAAG,MACLC,UAEyD,IACvC;AAClB,IAAA,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,EAAE,CAAA;AACtB,IAAA,MAAME,SAAS,GAAGH,UAAU,EAAEI,OAAO,GACjCC,IAAI,CAACC,GAAG,CAACN,UAAU,EAAEO,MAAM,EAAEP,UAAU,EAAEQ,QAAQ,CAAC,GAClD,CAAC,CAAA;;AAEL;AACA,IAAA,IAAIR,UAAU,EAAEI,OAAO,IAAID,SAAS,GAAG,CAAC,EAAE;AACxC;MACA,IACE,IAAI,CAAC7B,MAAM,CAACQ,KAAK,CAAC2B,KAAK,CAACC,cAAc,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACjC,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC,EACpE;AACA,QAAA,OAAA;AACF,OAAA;MAEA,IAAI,CAACL,MAAM,CAACQ,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;AAChCA,QAAAA,CAAC,CAACkB,UAAU,CAAC,IAAI,CAAClC,EAAE,CAAC,GAAG;AACtBmC,UAAAA,EAAE,EAAEb,GAAG,GAAGD,UAAU,CAACQ,QAAQ;AAC7BO,UAAAA,KAAK,EAAE,IAAA;SACR,CAAA;AACH,OAAC,CAAC,CAAA;AACJ,KAAA;;AAEA;AACA,IAAA,IACG,IAAI,CAACjC,KAAK,CAAC2B,KAAK,CAACvB,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC8B,YAAY,EAAE,IAC7D,IAAI,CAAClC,KAAK,CAAC2B,KAAK,CAACvB,MAAM,KAAK,OAAO,IACnC,IAAI,CAACJ,KAAK,CAAC2B,KAAK,CAACvB,MAAM,KAAK,MAAM,EAClC;MACA,MAAMqB,MAAM,GAAGP,UAAU,EAAEI,OAAO,GAAGJ,UAAU,EAAEO,MAAM,GAAGU,SAAS,CAAA;MACnE,MAAM,IAAI,CAACC,KAAK,CAAC;AAAEX,QAAAA,MAAAA;AAAO,OAAC,CAAC,CAAA;AAC9B,KAAA;GACD,CAAA;EAEDW,KAAK,GAAG,MAAO1C,IAEd,IAA6C;IAC5C,IAAI,CAAC2C,aAAa,GAAG,IAAIC,OAAO,CAAC,MAAOC,OAAO,IAAK;AAClD,MAAA,MAAMC,MAAM,GAAG,EAAE,GAAGpB,IAAI,CAACD,GAAG,EAAE,GAAGI,IAAI,CAACkB,MAAM,EAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,SAAS,GAAGD,MAAM,CAAA;MAEvB,MAAME,WAAW,GAAG,MAClBF,MAAM,KAAK,IAAI,CAAC,SAAS,GACrB,IAAI,CAACH,aAAa,EAAEM,IAAI,CAAC,MAAMJ,OAAO,EAAE,CAAC,GACzCJ,SAAS,CAAA;AAEf,MAAA,IAAIS,aAAa,CAAA;AAEjB9B,MAAAA,WAAK,CAAC,MAAM;AACV;AACA;AACA;QACA,IAAI,IAAI,CAACd,KAAK,CAAC2B,KAAK,CAACvB,MAAM,KAAK,MAAM,EAAE;AACtC,UAAA,IAAI,CAACJ,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACT,MAAM,GAAG,SAAU,CAAC,CAAA;AACpD,SAAA;;AAEA;AACA,QAAA,IAAI,CAACJ,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACL,OAAO,GAAG,KAAM,CAAC,CAAA;AACjD,OAAC,CAAC,CAAA;;AAEF;AACA;AACA,MAAA,IAAI,CAACR,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACN,UAAU,GAAG,IAAK,CAAC,CAAA;AACjD,MAAA,IAAI,CAAC,QAAQ,GAAGgC,OAAqB,CAAA;MAErC,MAAMM,iBAAiB,GAAG,CAAC,YAAY;AACrC;AACA;;QAEA,MAAMP,OAAO,CAACQ,GAAG,CACf7D,cAAc,CAAC8D,GAAG,CAAC,MAAOC,IAAI,IAAK;UACjC,MAAMC,SAAS,GAAG,IAAI,CAACxD,KAAK,CAACyD,OAAO,CAACF,IAAI,CAAC,CAAA;AAE1C,UAAA,IAAI,IAAI,CAACA,IAAI,CAAC,EAAE1B,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC0B,IAAI,CAAC,GAAG,MAAM,IAAI,CAACxD,MAAM,CAAC0D,OAAO,CAACC,aAAa,CAAEF,SAAS,CAAC,CAAA;AAClE,WAAA;AACF,SAAC,CAAC,CACH,CAAA;AACH,OAAC,GAAG,CAAA;MAEJ,MAAMG,WAAW,GAAGd,OAAO,CAACC,OAAO,EAAE,CAACI,IAAI,CAAC,YAAY;QACrD,IAAI;AACF,UAAA,IAAI,IAAI,CAAClD,KAAK,CAACyD,OAAO,CAACG,MAAM,EAAE;YAC7B,MAAMC,IAAI,GAAG,MAAM,IAAI,CAAC9D,MAAM,CAAC+D,aAAa,CAAC,IAAI,CAAC,CAAA;AAClD,YAAA,IAAKX,aAAa,GAAGF,WAAW,EAAE,EAAG,OAAOE,aAAa,CAAA;AACzD,YAAA,IAAI,CAAC,cAAc,CAACU,IAAI,CAAC,CAAA;AAC3B,WAAA;AAEA,UAAA,IAAI,CAACtD,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;YACzBA,CAAC,CAAC2C,KAAK,GAAGrB,SAAS,CAAA;YACnBtB,CAAC,CAACT,MAAM,GAAG,SAAS,CAAA;AACpBS,YAAAA,CAAC,CAAC4C,SAAS,GAAGrC,IAAI,CAACD,GAAG,EAAE,CAAA;AACxBN,YAAAA,CAAC,CAACJ,SAAS,GACTI,CAAC,CAAC4C,SAAS,IACV/D,IAAI,EAAE+B,MAAM,IACX,IAAI,CAAChC,KAAK,CAACyD,OAAO,CAACQ,YAAY,IAC/B,IAAI,CAAClE,MAAM,CAAC0D,OAAO,CAACS,mBAAmB,IACvC,CAAC,CAAC,CAAA;AACR,WAAC,CAAC,CAAA;AAEF,UAAA,OAAO,IAAI,CAAC3D,KAAK,CAAC2B,KAAK,CAACtB,eAAe,CAAA;SACxC,CAAC,OAAOuD,GAAG,EAAE;AACZ,UAAA,IAAKhB,aAAa,GAAGF,WAAW,EAAE,EAAG,OAAOE,aAAa,CAAA;AAEzD,UAAA,IAAIiB,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzCC,YAAAA,OAAO,CAACR,KAAK,CAACI,GAAG,CAAC,CAAA;AACpB,WAAA;AAEA,UAAA,IAAI,CAAC5D,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;YACzBA,CAAC,CAAC2C,KAAK,GAAGI,GAAG,CAAA;YACb/C,CAAC,CAACT,MAAM,GAAG,OAAO,CAAA;AAClBS,YAAAA,CAAC,CAAC4C,SAAS,GAAGrC,IAAI,CAACD,GAAG,EAAE,CAAA;AAC1B,WAAC,CAAC,CAAA;AAEF,UAAA,MAAMyC,GAAG,CAAA;AACX,SAAA;AACF,OAAC,CAAC,CAAA;MAEF,MAAMK,KAAK,GAAG,YAAY;AACxB,QAAA,IAAKrB,aAAa,GAAGF,WAAW,EAAE,EAAG,OAAOE,aAAa,CAAA;AACzD,QAAA,IAAI,CAAC5C,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACN,UAAU,GAAG,KAAM,CAAC,CAAA;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,OAAO,IAAI,CAAC8B,aAAa,CAAA;OAC1B,CAAA;MAED,IAAI;AACF,QAAA,MAAMC,OAAO,CAACQ,GAAG,CAAC,CAACD,iBAAiB,EAAEO,WAAW,CAACc,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;AACnED,QAAAA,KAAK,EAAE,CAAA;AACT,OAAC,CAAC,MAAM;AACNA,QAAAA,KAAK,EAAE,CAAA;AACT,OAAA;AACF,KAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC5B,aAAa,CAAA;GAC1B,CAAA;AACD8B,EAAAA,UAAU,GAAG,YAAY;AACvB,IAAA,IAAI,CAACnE,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACL,OAAO,GAAG,IAAK,CAAC,CAAA;IAC9C,IAAI,IAAI,CAAChB,MAAM,CAACQ,KAAK,CAAC2B,KAAK,CAACC,cAAc,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACjC,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC,EAAE;MACxE,MAAM,IAAI,CAACoB,IAAI,EAAE,CAAA;AACnB,KAAA;GACD,CAAA;AACDN,EAAAA,YAAY,GAAG,MAAM;IACnB,OAAO,CAAC,EACN,IAAI,CAAClB,KAAK,CAACyD,OAAO,CAACG,MAAM,IACzBpE,cAAc,CAACmF,IAAI,CAAEtC,CAAC,IAAK,IAAI,CAACrC,KAAK,CAACyD,OAAO,CAACpB,CAAC,CAAC,EAAER,OAAO,CAAC,CAC3D,CAAA;GACF,CAAA;AACDY,EAAAA,YAAY,GAAG,MAAM;AACnB,IAAA,MAAMf,GAAG,GAAGC,IAAI,CAACD,GAAG,EAAE,CAAA;AACtB,IAAA,OAAO,IAAI,CAACnB,KAAK,CAAC2B,KAAK,CAACnB,OAAO,IAAI,IAAI,CAACR,KAAK,CAAC2B,KAAK,CAAClB,SAAS,GAAGU,GAAG,CAAA;GACpE,CAAA;EAED,iBAAiB,GAAG,MAAM;AACxB,IAAA,IAAI,CAACnB,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;MACzBA,CAAC,CAACP,UAAU,GAAG+D,wBAAgB,CAACxD,CAAC,CAACP,UAAU,EAAE;QAC5C,GAAG,IAAI,CAACgE,WAAW,EAAEtE,KAAK,CAAC2B,KAAK,CAACrB,UAAU;AAC3C,QAAA,GAAGO,CAAC,CAACR,eAAAA;AACP,OAAC,CAA6B,CAAA;AAChC,KAAC,CAAC,CAAA;IACF,IAAI,CAAChB,qBAAqB,CAACkF,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,EAAE,CAAC,CAAA;GAC7D,CAAA;EAEDC,gBAAgB,GAAIH,WAAwB,IAAK;AAC/C,IAAA,IAAI,CAAC,IAAI,CAACA,WAAW,IAAIA,WAAW,EAAE;MACpC,IAAI,CAACA,WAAW,GAAGA,WAAW,CAAA;AAC9B,MAAA,IAAI,CAACA,WAAW,CAACI,cAAc,CAAC,MAAM;QACpC,IAAI,CAAC,iBAAiB,EAAE,CAAA;AAC1B,OAAC,CAAC,CAAA;AACJ,KAAA;GACD,CAAA;EAEDA,cAAc,GAAIF,QAAoB,IAAK;AACzC,IAAA,IAAI,CAACnF,qBAAqB,CAACsF,GAAG,CAACH,QAAQ,CAAC,CAAA;AACxC;GACD,CAAA;;AAEDI,EAAAA,UAAU,GAAG,MAAM;AACjB;IACA,MAAMC,YAAY,GAChB,IAAI,CAACP,WAAW,EAAEtE,KAAK,CAAC2B,KAAK,CAACxB,MAAM,IACpC,IAAI,CAACX,MAAM,CAACQ,KAAK,CAAC2B,KAAK,CAACmD,cAAc,CAAC3E,MAAM,CAAA;IAE/C,IAAI;MACF,MAAM4E,UAAU,GAAG,IAAI,CAAC/E,KAAK,CAAC2B,KAAK,CAACzB,WAAW,CAAA;AAE/C,MAAA,MAAM8E,SAAS,GACb,OAAO,IAAI,CAACvF,KAAK,CAACyD,OAAO,CAAC+B,cAAc,KAAK,QAAQ,GACjD,IAAI,CAACxF,KAAK,CAACyD,OAAO,CAAC+B,cAAc,CAACC,KAAK,GACvC,IAAI,CAACzF,KAAK,CAACyD,OAAO,CAAC+B,cAAc,CAAA;MAEvC,IAAIE,UAAU,GAAGH,SAAS,GAAGH,YAAY,CAAC,IAAI,EAAE,CAAA;AAEhD/D,MAAAA,WAAK,CAAC,MAAM;AACV;QACA,IAAIiE,UAAU,KAAKI,UAAU,EAAE;AAC7B,UAAA,IAAI,CAACnF,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACL,OAAO,GAAG,IAAK,CAAC,CAAA;AAChD,SAAA;AAEA,QAAA,IAAI,CAACR,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;UACzBA,CAAC,CAACX,WAAW,GAAGiF,UAAU,CAAA;UAC1BtE,CAAC,CAACV,MAAM,GAAG;AACT,YAAA,GAAG0E,YAAY;YACf,GAAGM,UAAAA;WACG,CAAA;AACV,SAAC,CAAC,CAAA;AACJ,OAAC,CAAC,CAAA;AAEFlG,MAAAA,cAAc,CAAC8D,GAAG,CAAC,MAAOC,IAAI,IAAK;QACjC,MAAMC,SAAS,GAAG,IAAI,CAACxD,KAAK,CAACyD,OAAO,CAACF,IAAI,CAAC,CAAA;AAE1C,QAAA,IAAI,OAAO,IAAI,CAACA,IAAI,CAAC,KAAK,UAAU,EAAE;AACpC,UAAA,IAAI,CAACA,IAAI,CAAC,GAAGC,SAAS,CAAA;AACxB,SAAA;AACF,OAAC,CAAC,CAAA;KACH,CAAC,OAAOW,GAAQ,EAAE;AACjBI,MAAAA,OAAO,CAACR,KAAK,CAACI,GAAG,CAAC,CAAA;AAClB,MAAA,MAAMJ,KAAK,GAAG,IAAK4B,KAAK,CAAS,6BAA6B,EAAE;AAC9DC,QAAAA,KAAK,EAAEzB,GAAAA;AACT,OAAC,CAAC,CAAA;MACFJ,KAAK,CAAC8B,IAAI,GAAG,uBAAuB,CAAA;AAEpC,MAAA,IAAI,CAACtF,KAAK,CAACY,QAAQ,CAAEC,CAAC,IAAK;QACzBA,CAAC,CAACT,MAAM,GAAG,OAAO,CAAA;QAClBS,CAAC,CAAC2C,KAAK,GAAGA,KAAK,CAAA;AACjB,OAAC,CAAC,CAAA;;AAEF;AACA,MAAA,OAAA;AACF,KAAA;GACD,CAAA;AACH;;;;"}
|