@tanstack/router-core 0.0.1-beta.35 → 0.0.1-beta.39
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/index.js +2 -1
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/path.js +5 -7
- package/build/cjs/path.js.map +1 -1
- package/build/cjs/route.js +112 -96
- package/build/cjs/route.js.map +1 -1
- package/build/cjs/routeConfig.js +2 -2
- package/build/cjs/routeConfig.js.map +1 -1
- package/build/cjs/routeMatch.js +107 -65
- package/build/cjs/routeMatch.js.map +1 -1
- package/build/cjs/router.js +352 -372
- package/build/cjs/router.js.map +1 -1
- package/build/cjs/searchParams.js +4 -3
- package/build/cjs/searchParams.js.map +1 -1
- package/build/cjs/sharedClone.js +122 -0
- package/build/cjs/sharedClone.js.map +1 -0
- package/build/cjs/utils.js +1 -59
- package/build/cjs/utils.js.map +1 -1
- package/build/esm/index.js +686 -614
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +183 -158
- package/build/types/index.d.ts +61 -78
- package/build/umd/index.development.js +1032 -617
- 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/index.ts +1 -0
- package/src/link.ts +20 -12
- package/src/route.ts +160 -140
- package/src/routeConfig.ts +7 -2
- package/src/routeMatch.ts +146 -99
- package/src/router.ts +462 -523
- package/src/sharedClone.ts +118 -0
- package/src/utils.ts +0 -65
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -31
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
package/build/cjs/routeMatch.js
CHANGED
|
@@ -12,51 +12,86 @@
|
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
14
14
|
|
|
15
|
-
var
|
|
16
|
-
var
|
|
15
|
+
var reactivity = require('@solidjs/reactivity');
|
|
16
|
+
var sharedClone = require('./sharedClone.js');
|
|
17
17
|
|
|
18
18
|
const componentTypes = ['component', 'errorComponent', 'pendingComponent'];
|
|
19
19
|
function createRouteMatch(router, route, opts) {
|
|
20
|
-
|
|
21
|
-
|
|
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({
|
|
22
42
|
routeSearch: {},
|
|
23
43
|
search: {},
|
|
24
|
-
childMatches: [],
|
|
25
44
|
status: 'idle',
|
|
26
45
|
routeLoaderData: {},
|
|
27
46
|
loaderData: {},
|
|
28
47
|
isFetching: false,
|
|
29
|
-
|
|
48
|
+
invalid: false,
|
|
30
49
|
invalidAt: Infinity,
|
|
31
|
-
|
|
32
|
-
getIsInvalid: () => {
|
|
50
|
+
get isInvalid() {
|
|
33
51
|
const now = Date.now();
|
|
34
|
-
return
|
|
35
|
-
}
|
|
52
|
+
return this.invalid || this.invalidAt < now;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const routeMatch = {
|
|
56
|
+
...route,
|
|
57
|
+
...opts,
|
|
58
|
+
store,
|
|
59
|
+
// setStore,
|
|
60
|
+
router,
|
|
61
|
+
childMatches: [],
|
|
36
62
|
__: {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
63
|
+
setParentMatch: parentMatch => {
|
|
64
|
+
reactivity.batch(() => {
|
|
65
|
+
setStore(s => {
|
|
66
|
+
s.parentMatch = parentMatch;
|
|
67
|
+
});
|
|
68
|
+
updateLoaderData();
|
|
69
|
+
});
|
|
43
70
|
},
|
|
71
|
+
abortController: new AbortController(),
|
|
44
72
|
validate: () => {
|
|
45
|
-
var
|
|
73
|
+
var _store$parentMatch2;
|
|
46
74
|
// Validate the search params and stabilize them
|
|
47
|
-
const parentSearch = (
|
|
75
|
+
const parentSearch = ((_store$parentMatch2 = store.parentMatch) == null ? void 0 : _store$parentMatch2.store.search) ?? router.store.currentLocation.search;
|
|
48
76
|
try {
|
|
49
|
-
|
|
50
|
-
const prevSearch = routeMatch.routeSearch;
|
|
77
|
+
const prevSearch = store.routeSearch;
|
|
51
78
|
const validator = typeof routeMatch.options.validateSearch === 'object' ? routeMatch.options.validateSearch.parse : routeMatch.options.validateSearch;
|
|
52
|
-
let nextSearch =
|
|
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
|
+
}
|
|
53
85
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
+
});
|
|
60
95
|
componentTypes.map(async type => {
|
|
61
96
|
const component = routeMatch.options[type];
|
|
62
97
|
if (typeof routeMatch.__[type] !== 'function') {
|
|
@@ -69,8 +104,11 @@ function createRouteMatch(router, route, opts) {
|
|
|
69
104
|
cause: err
|
|
70
105
|
});
|
|
71
106
|
error.code = 'INVALID_SEARCH_PARAMS';
|
|
72
|
-
|
|
73
|
-
|
|
107
|
+
setStore(s => {
|
|
108
|
+
s.status = 'error';
|
|
109
|
+
s.error = error;
|
|
110
|
+
});
|
|
111
|
+
|
|
74
112
|
// Do not proceed with loading the route
|
|
75
113
|
return;
|
|
76
114
|
}
|
|
@@ -81,7 +119,7 @@ function createRouteMatch(router, route, opts) {
|
|
|
81
119
|
(_routeMatch$__$abortC = routeMatch.__.abortController) == null ? void 0 : _routeMatch$__$abortC.abort();
|
|
82
120
|
},
|
|
83
121
|
invalidate: () => {
|
|
84
|
-
|
|
122
|
+
setStore(s => s.invalid = true);
|
|
85
123
|
},
|
|
86
124
|
hasLoaders: () => {
|
|
87
125
|
return !!(route.options.loader || componentTypes.some(d => {
|
|
@@ -96,17 +134,17 @@ function createRouteMatch(router, route, opts) {
|
|
|
96
134
|
// If this is a preload, add it to the preload cache
|
|
97
135
|
if (loaderOpts != null && loaderOpts.preload && minMaxAge > 0) {
|
|
98
136
|
// If the match is currently active, don't preload it
|
|
99
|
-
if (router.
|
|
137
|
+
if (router.store.currentMatches.find(d => d.matchId === routeMatch.matchId)) {
|
|
100
138
|
return;
|
|
101
139
|
}
|
|
102
|
-
router.matchCache[routeMatch.matchId] = {
|
|
140
|
+
router.store.matchCache[routeMatch.matchId] = {
|
|
103
141
|
gc: now + loaderOpts.gcMaxAge,
|
|
104
142
|
match: routeMatch
|
|
105
143
|
};
|
|
106
144
|
}
|
|
107
145
|
|
|
108
146
|
// If the match is invalid, errored or idle, trigger it to load
|
|
109
|
-
if (
|
|
147
|
+
if (store.status === 'success' && store.isInvalid || store.status === 'error' || store.status === 'idle') {
|
|
110
148
|
const maxAge = loaderOpts != null && loaderOpts.preload ? loaderOpts == null ? void 0 : loaderOpts.maxAge : undefined;
|
|
111
149
|
await routeMatch.fetch({
|
|
112
150
|
maxAge
|
|
@@ -115,29 +153,30 @@ function createRouteMatch(router, route, opts) {
|
|
|
115
153
|
},
|
|
116
154
|
fetch: async opts => {
|
|
117
155
|
const loadId = '' + Date.now() + Math.random();
|
|
118
|
-
|
|
156
|
+
latestId = loadId;
|
|
119
157
|
const checkLatest = async () => {
|
|
120
|
-
if (loadId !==
|
|
158
|
+
if (loadId !== latestId) {
|
|
121
159
|
// warning(true, 'Data loader is out of date!')
|
|
122
160
|
return new Promise(() => {});
|
|
123
161
|
}
|
|
124
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
|
+
}
|
|
125
170
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
routeMatch.status = 'loading';
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// We started loading the route, so it's no longer invalid
|
|
134
|
-
routeMatch.isInvalid = false;
|
|
135
|
-
routeMatch.__.loadPromise = new Promise(async resolve => {
|
|
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 => {
|
|
136
175
|
// We are now fetching, even if it's in the background of a
|
|
137
176
|
// resolved state
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
177
|
+
setStore(s => s.isFetching = true);
|
|
178
|
+
resolve = r;
|
|
179
|
+
componentsPromise = (async () => {
|
|
141
180
|
// then run all component and data loaders in parallel
|
|
142
181
|
// For each component type, potentially load it asynchronously
|
|
143
182
|
|
|
@@ -149,49 +188,52 @@ function createRouteMatch(router, route, opts) {
|
|
|
149
188
|
}
|
|
150
189
|
}));
|
|
151
190
|
})();
|
|
152
|
-
|
|
191
|
+
dataPromise = Promise.resolve().then(async () => {
|
|
153
192
|
try {
|
|
154
|
-
var _ref, _ref2, _opts$maxAge;
|
|
155
193
|
if (routeMatch.options.loader) {
|
|
156
194
|
const data = await router.loadMatchData(routeMatch);
|
|
157
195
|
await checkLatest();
|
|
158
|
-
|
|
196
|
+
setLoaderData(data);
|
|
159
197
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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;
|
|
165
205
|
} catch (err) {
|
|
166
206
|
await checkLatest();
|
|
167
207
|
if (process.env.NODE_ENV !== 'production') {
|
|
168
208
|
console.error(err);
|
|
169
209
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
210
|
+
setStore(s => {
|
|
211
|
+
s.error = err;
|
|
212
|
+
s.status = 'error';
|
|
213
|
+
s.updatedAt = Date.now();
|
|
214
|
+
});
|
|
173
215
|
throw err;
|
|
174
216
|
}
|
|
175
217
|
});
|
|
176
218
|
const after = async () => {
|
|
177
219
|
await checkLatest();
|
|
178
|
-
|
|
220
|
+
setStore(s => s.isFetching = false);
|
|
179
221
|
delete routeMatch.__.loadPromise;
|
|
180
|
-
|
|
222
|
+
resolve();
|
|
181
223
|
};
|
|
182
224
|
try {
|
|
183
|
-
await Promise.all([
|
|
225
|
+
await Promise.all([componentsPromise, dataPromise.catch(() => {})]);
|
|
184
226
|
after();
|
|
185
|
-
} catch
|
|
227
|
+
} catch {
|
|
186
228
|
after();
|
|
187
229
|
}
|
|
188
230
|
});
|
|
189
231
|
await routeMatch.__.loadPromise;
|
|
190
232
|
await checkLatest();
|
|
191
233
|
}
|
|
192
|
-
}
|
|
234
|
+
};
|
|
193
235
|
if (!routeMatch.hasLoaders()) {
|
|
194
|
-
|
|
236
|
+
setStore(s => s.status = 'success');
|
|
195
237
|
}
|
|
196
238
|
return routeMatch;
|
|
197
239
|
}
|
|
@@ -1 +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 { Router } from './router'\nimport { Expand, 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: Expand<\n TAllRouteInfo['fullSearchSchema'] & TRouteInfo['fullSearchSchema']\n >\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'>\n errorComponent?: GetFrameworkGeneric<'ErrorComponent'>\n pendingComponent?: GetFrameworkGeneric<'Component'>\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, 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: {} as any,\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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"}
|
|
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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"}
|