@tanstack/router-core 0.0.1-beta.45 → 0.0.1-beta.49
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/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/index.js +18 -20
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/interop.js +175 -0
- package/build/cjs/interop.js.map +1 -0
- package/build/cjs/path.js +4 -5
- package/build/cjs/path.js.map +1 -1
- package/build/cjs/route.js +16 -138
- package/build/cjs/route.js.map +1 -1
- package/build/cjs/routeConfig.js +1 -7
- package/build/cjs/routeConfig.js.map +1 -1
- package/build/cjs/routeMatch.js +194 -199
- package/build/cjs/routeMatch.js.map +1 -1
- package/build/cjs/router.js +726 -703
- package/build/cjs/router.js.map +1 -1
- package/build/cjs/store.js +54 -0
- package/build/cjs/store.js.map +1 -0
- package/build/esm/index.js +1305 -1114
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +229 -192
- package/build/types/index.d.ts +172 -109
- package/build/umd/index.development.js +1381 -2331
- 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 +3 -3
- package/src/actions.ts +157 -0
- package/src/history.ts +199 -0
- package/src/index.ts +4 -7
- package/src/interop.ts +169 -0
- package/src/link.ts +2 -2
- package/src/route.ts +34 -239
- package/src/routeConfig.ts +3 -34
- package/src/routeInfo.ts +6 -21
- package/src/routeMatch.ts +270 -285
- package/src/router.ts +967 -963
- package/src/store.ts +52 -0
- package/build/cjs/sharedClone.js +0 -122
- package/build/cjs/sharedClone.js.map +0 -1
- package/src/sharedClone.ts +0 -118
package/build/cjs/routeMatch.js
CHANGED
|
@@ -12,231 +12,226 @@
|
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
14
14
|
|
|
15
|
-
var
|
|
16
|
-
var
|
|
15
|
+
var store = require('./store.js');
|
|
16
|
+
var interop = require('./interop.js');
|
|
17
17
|
|
|
18
18
|
const componentTypes = ['component', 'errorComponent', 'pendingComponent'];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
+
matchId: opts.matchId,
|
|
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
|
+
})
|
|
30
41
|
});
|
|
42
|
+
if (!this.__hasLoaders()) {
|
|
43
|
+
this.store.setState(s => s.status = 'success');
|
|
44
|
+
}
|
|
31
45
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
...((_store$parentMatch = store.parentMatch) == null ? void 0 : _store$parentMatch.store.loaderData),
|
|
37
|
-
...s.routeLoaderData
|
|
46
|
+
#setLoaderData = loaderData => {
|
|
47
|
+
store.batch(() => {
|
|
48
|
+
this.store.setState(s => {
|
|
49
|
+
s.routeLoaderData = loaderData;
|
|
38
50
|
});
|
|
51
|
+
this.#updateLoaderData();
|
|
39
52
|
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
});
|
|
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;
|
|
111
60
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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;
|
|
115
66
|
}
|
|
116
|
-
|
|
117
|
-
|
|
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] = {
|
|
67
|
+
this.router.store.setState(s => {
|
|
68
|
+
s.matchCache[this.id] = {
|
|
141
69
|
gc: now + loaderOpts.gcMaxAge,
|
|
142
|
-
match:
|
|
70
|
+
match: this
|
|
143
71
|
};
|
|
144
|
-
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
145
74
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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 => {
|
|
155
85
|
const loadId = '' + Date.now() + Math.random();
|
|
156
|
-
latestId = loadId;
|
|
157
|
-
const checkLatest =
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return new Promise(() => {});
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
reactivity.batch(() => {
|
|
86
|
+
this.#latestId = loadId;
|
|
87
|
+
const checkLatest = () => loadId !== this.#latestId ? this.__loadPromise?.then(() => resolve()) : undefined;
|
|
88
|
+
let latestPromise;
|
|
89
|
+
store.batch(() => {
|
|
164
90
|
// If the match was in an error state, set it
|
|
165
91
|
// to a loading state again. Otherwise, keep it
|
|
166
92
|
// as loading or resolved
|
|
167
|
-
if (store.status === 'idle') {
|
|
168
|
-
|
|
93
|
+
if (this.store.state.status === 'idle') {
|
|
94
|
+
this.store.setState(s => s.status = 'loading');
|
|
169
95
|
}
|
|
170
96
|
|
|
171
97
|
// We started loading the route, so it's no longer invalid
|
|
172
|
-
|
|
98
|
+
this.store.setState(s => s.invalid = false);
|
|
173
99
|
});
|
|
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
100
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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;
|
|
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);
|
|
216
113
|
}
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
setStore(s => s.isFetching = false);
|
|
221
|
-
delete routeMatch.__.loadPromise;
|
|
222
|
-
resolve();
|
|
223
|
-
};
|
|
114
|
+
}));
|
|
115
|
+
})();
|
|
116
|
+
const dataPromise = Promise.resolve().then(async () => {
|
|
224
117
|
try {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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;
|
|
229
141
|
}
|
|
230
142
|
});
|
|
231
|
-
|
|
232
|
-
|
|
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;
|
|
233
232
|
}
|
|
234
233
|
};
|
|
235
|
-
if (!routeMatch.hasLoaders()) {
|
|
236
|
-
setStore(s => s.status = 'success');
|
|
237
|
-
}
|
|
238
|
-
return routeMatch;
|
|
239
234
|
}
|
|
240
235
|
|
|
241
|
-
exports.
|
|
236
|
+
exports.RouteMatch = RouteMatch;
|
|
242
237
|
//# sourceMappingURL=routeMatch.js.map
|
|
@@ -1 +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":";;;;;;;;;;;;;;;;;AAsEA,MAAMA,cAAc,GAAG,CACrB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,CACV,CAAA;AAEH,SAASC,gBAAgB,CAI9BC,MAA6B,EAC7BC,KAAuC,EACvCC,IAKC,EACsC;AACvC,EAAA,IAAIC,iBAAgC,CAAA;AACpC,EAAA,IAAIC,WAAmD,CAAA;EACvD,IAAIC,QAAQ,GAAG,EAAE,CAAA;AACjB,EAAA,IAAIC,OAAO,GAAG,MAAM,EAAE,CAAA;EAEtB,SAASC,aAAa,CAACC,UAAyC,EAAE;AAChEC,IAAAA,gBAAK,CAAC,MAAM;MACVC,QAAQ,CAAEC,CAAC,IAAK;QACdA,CAAC,CAACC,eAAe,GAAGC,uBAAW,CAACF,CAAC,CAACC,eAAe,EAAEJ,UAAU,CAAC,CAAA;AAChE,OAAC,CAAC,CAAA;AACFM,MAAAA,gBAAgB,EAAE,CAAA;AACpB,KAAC,CAAC,CAAA;AACJ,GAAA;AAEA,EAAA,SAASA,gBAAgB,GAAG;IAC1BJ,QAAQ,CAAEC,CAAC,IAAK;AAAA,MAAA,IAAA,kBAAA,CAAA;MACdA,CAAC,CAACH,UAAU,GAAGK,uBAAW,CAACF,CAAC,CAACH,UAAU,EAAE;AACvC,QAAA,IAAA,CAAA,kBAAA,GAAGO,KAAK,CAACC,WAAW,qBAAjB,kBAAmBD,CAAAA,KAAK,CAACP,UAAU,CAAA;AACtC,QAAA,GAAGG,CAAC,CAACC,eAAAA;AACP,OAAC,CAA6B,CAAA;AAChC,KAAC,CAAC,CAAA;AACJ,GAAA;AAEA,EAAA,MAAM,CAACG,KAAK,EAAEL,QAAQ,CAAC,GAAGO,sBAAW,CAEnC;IACAC,WAAW,EAAE,EAAE;IACfC,MAAM,EAAE,EAAS;AACjBC,IAAAA,MAAM,EAAE,MAAM;IACdR,eAAe,EAAE,EAAmC;IACpDJ,UAAU,EAAE,EAA8B;AAC1Ca,IAAAA,UAAU,EAAE,KAAK;AACjBC,IAAAA,OAAO,EAAE,KAAK;AACdC,IAAAA,SAAS,EAAEC,QAAQ;AACnB,IAAA,IAAIC,SAAS,GAAY;AACvB,MAAA,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,EAAE,CAAA;MACtB,OAAO,IAAI,CAACJ,OAAO,IAAI,IAAI,CAACC,SAAS,GAAGG,GAAG,CAAA;AAC7C,KAAA;AACF,GAAC,CAAC,CAAA;AAEF,EAAA,MAAME,UAAiD,GAAG;AACxD,IAAA,GAAG3B,KAAK;AACR,IAAA,GAAGC,IAAI;IACPa,KAAK;AACL;IACAf,MAAM;AACN6B,IAAAA,YAAY,EAAE,EAAE;AAChBC,IAAAA,EAAE,EAAE;MACFC,cAAc,EAAGf,WAAwB,IAAK;AAC5CP,QAAAA,gBAAK,CAAC,MAAM;UACVC,QAAQ,CAAEC,CAAC,IAAK;YACdA,CAAC,CAACK,WAAW,GAAGA,WAAW,CAAA;AAC7B,WAAC,CAAC,CAAA;AAEFF,UAAAA,gBAAgB,EAAE,CAAA;AACpB,SAAC,CAAC,CAAA;OACH;MACDkB,eAAe,EAAE,IAAIC,eAAe,EAAE;AACtCC,MAAAA,QAAQ,EAAE,MAAM;AAAA,QAAA,IAAA,mBAAA,CAAA;AACd;AACA,QAAA,MAAMC,YAAY,GAChB,CAAA,CAAA,mBAAA,GAAApB,KAAK,CAACC,WAAW,qBAAjB,mBAAmBD,CAAAA,KAAK,CAACI,MAAM,KAAInB,MAAM,CAACe,KAAK,CAACqB,eAAe,CAACjB,MAAM,CAAA;QAExE,IAAI;AACF,UAAA,MAAMkB,UAAU,GAAGtB,KAAK,CAACG,WAAW,CAAA;UAEpC,MAAMoB,SAAS,GACb,OAAOV,UAAU,CAACW,OAAO,CAACC,cAAc,KAAK,QAAQ,GACjDZ,UAAU,CAACW,OAAO,CAACC,cAAc,CAACC,KAAK,GACvCb,UAAU,CAACW,OAAO,CAACC,cAAc,CAAA;AAEvC,UAAA,IAAIE,UAAU,GAAG7B,uBAAW,CAC1BwB,UAAU,EACV,CAAAC,SAAS,IAATA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,SAAS,CAAGH,YAAY,CAAC,KAAI,EAAE,CAChC,CAAA;AAED1B,UAAAA,gBAAK,CAAC,MAAM;AACV;YACA,IAAI4B,UAAU,KAAKK,UAAU,EAAE;cAC7BhC,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACW,OAAO,GAAG,IAAK,CAAC,CAAA;AACrC,aAAA;;AAEA;YACAZ,QAAQ,CAAEC,CAAC,IAAK;cACdA,CAAC,CAACO,WAAW,GAAGwB,UAAU,CAAA;AAC1B/B,cAAAA,CAAC,CAACQ,MAAM,GAAGN,uBAAW,CAACsB,YAAY,EAAE;AACnC,gBAAA,GAAGA,YAAY;gBACf,GAAGO,UAAAA;AACL,eAAC,CAAC,CAAA;AACJ,aAAC,CAAC,CAAA;AACJ,WAAC,CAAC,CAAA;AAEF5C,UAAAA,cAAc,CAAC6C,GAAG,CAAC,MAAOC,IAAI,IAAK;AACjC,YAAA,MAAMC,SAAS,GAAGjB,UAAU,CAACW,OAAO,CAACK,IAAI,CAAC,CAAA;YAE1C,IAAI,OAAOhB,UAAU,CAACE,EAAE,CAACc,IAAI,CAAC,KAAK,UAAU,EAAE;AAC7ChB,cAAAA,UAAU,CAACE,EAAE,CAACc,IAAI,CAAC,GAAGC,SAAS,CAAA;AACjC,aAAA;AACF,WAAC,CAAC,CAAA;SACH,CAAC,OAAOC,GAAQ,EAAE;AACjBC,UAAAA,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC,CAAA;AAClB,UAAA,MAAME,KAAK,GAAG,IAAKC,KAAK,CAAS,6BAA6B,EAAE;AAC9DC,YAAAA,KAAK,EAAEJ,GAAAA;AACT,WAAC,CAAC,CAAA;UACFE,KAAK,CAACG,IAAI,GAAG,uBAAuB,CAAA;UAEpCzC,QAAQ,CAAEC,CAAC,IAAK;YACdA,CAAC,CAACS,MAAM,GAAG,OAAO,CAAA;YAClBT,CAAC,CAACqC,KAAK,GAAGA,KAAK,CAAA;AACjB,WAAC,CAAC,CAAA;;AAEF;AACA,UAAA,OAAA;AACF,SAAA;AACF,OAAA;KACD;AACDI,IAAAA,MAAM,EAAE,MAAM;AAAA,MAAA,IAAA,qBAAA,CAAA;MACZ,CAAAxB,qBAAAA,GAAAA,UAAU,CAACE,EAAE,CAACE,eAAe,KAA7B,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAA+BqB,KAAK,EAAE,CAAA;KACvC;AACDC,IAAAA,UAAU,EAAE,MAAM;MAChB5C,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACW,OAAO,GAAG,IAAK,CAAC,CAAA;KACpC;AACDiC,IAAAA,UAAU,EAAE,MAAM;AAChB,MAAA,OAAO,CAAC,EACNtD,KAAK,CAACsC,OAAO,CAACiB,MAAM,IACpB1D,cAAc,CAAC2D,IAAI,CAAEC,CAAC,IAAA;AAAA,QAAA,IAAA,gBAAA,CAAA;QAAA,OAAKzD,CAAAA,gBAAAA,GAAAA,KAAK,CAACsC,OAAO,CAACmB,CAAC,CAAC,KAAA,IAAA,GAAA,KAAA,CAAA,GAAhB,iBAAkBC,OAAO,CAAA;AAAA,OAAA,CAAC,CACtD,CAAA;KACF;IACDC,IAAI,EAAE,MAAOC,UAAU,IAAK;AAC1B,MAAA,MAAMnC,GAAG,GAAGC,IAAI,CAACD,GAAG,EAAE,CAAA;MACtB,MAAMoC,SAAS,GAAGD,UAAU,IAAVA,IAAAA,IAAAA,UAAU,CAAEF,OAAO,GACjCI,IAAI,CAACC,GAAG,CAACH,UAAU,IAAVA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,UAAU,CAAEI,MAAM,EAAEJ,UAAU,IAAVA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,UAAU,CAAEK,QAAQ,CAAC,GAClD,CAAC,CAAA;;AAEL;MACA,IAAIL,UAAU,YAAVA,UAAU,CAAEF,OAAO,IAAIG,SAAS,GAAG,CAAC,EAAE;AACxC;AACA,QAAA,IACE9D,MAAM,CAACe,KAAK,CAACoD,cAAc,CAACC,IAAI,CAC7BV,CAAC,IAAKA,CAAC,CAACW,OAAO,KAAKzC,UAAU,CAACyC,OAAO,CACxC,EACD;AACA,UAAA,OAAA;AACF,SAAA;QAEArE,MAAM,CAACe,KAAK,CAACuD,UAAU,CAAC1C,UAAU,CAACyC,OAAO,CAAC,GAAG;AAC5CE,UAAAA,EAAE,EAAE7C,GAAG,GAAGmC,UAAU,CAACK,QAAQ;AAC7BM,UAAAA,KAAK,EAAE5C,UAAAA;SACR,CAAA;AACH,OAAA;;AAEA;MACA,IACGb,KAAK,CAACK,MAAM,KAAK,SAAS,IAAIL,KAAK,CAACU,SAAS,IAC9CV,KAAK,CAACK,MAAM,KAAK,OAAO,IACxBL,KAAK,CAACK,MAAM,KAAK,MAAM,EACvB;AACA,QAAA,MAAM6C,MAAM,GAAGJ,UAAU,IAAA,IAAA,IAAVA,UAAU,CAAEF,OAAO,GAAGE,UAAU,IAAVA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,UAAU,CAAEI,MAAM,GAAGQ,SAAS,CAAA;QAEnE,MAAM7C,UAAU,CAAC8C,KAAK,CAAC;AAAET,UAAAA,MAAAA;AAAO,SAAC,CAAC,CAAA;AACpC,OAAA;KACD;IACDS,KAAK,EAAE,MAAOxE,IAAI,IAAK;AACrB,MAAA,MAAMyE,MAAM,GAAG,EAAE,GAAGhD,IAAI,CAACD,GAAG,EAAE,GAAGqC,IAAI,CAACa,MAAM,EAAE,CAAA;AAC9CvE,MAAAA,QAAQ,GAAGsE,MAAM,CAAA;MACjB,MAAME,WAAW,GAAG,YAAY;QAC9B,IAAIF,MAAM,KAAKtE,QAAQ,EAAE;AACvB;AACA,UAAA,OAAO,IAAIyE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AAC9B,SAAA;OACD,CAAA;AAEDrE,MAAAA,gBAAK,CAAC,MAAM;AACV;AACA;AACA;AACA,QAAA,IAAIM,KAAK,CAACK,MAAM,KAAK,MAAM,EAAE;UAC3BV,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACS,MAAM,GAAG,SAAU,CAAC,CAAA;AACzC,SAAA;;AAEA;QACAV,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACW,OAAO,GAAG,KAAM,CAAC,CAAA;AACtC,OAAC,CAAC,CAAA;MAEFM,UAAU,CAACE,EAAE,CAACiD,WAAW,GAAG,IAAID,OAAO,CAAC,MAAOE,CAAC,IAAK;AACnD;AACA;QACAtE,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACU,UAAU,GAAG,IAAK,CAAC,CAAA;AACtCf,QAAAA,OAAO,GAAG0E,CAAe,CAAA;QAEzB7E,iBAAiB,GAAG,CAAC,YAAY;AAC/B;AACA;;UAEA,MAAM2E,OAAO,CAACG,GAAG,CACfnF,cAAc,CAAC6C,GAAG,CAAC,MAAOC,IAAI,IAAK;AAAA,YAAA,IAAA,mBAAA,CAAA;AACjC,YAAA,MAAMC,SAAS,GAAGjB,UAAU,CAACW,OAAO,CAACK,IAAI,CAAC,CAAA;YAE1C,IAAIhB,CAAAA,mBAAAA,GAAAA,UAAU,CAACE,EAAE,CAACc,IAAI,CAAC,KAAA,IAAA,IAAnB,mBAAqBe,CAAAA,OAAO,EAAE;AAChC/B,cAAAA,UAAU,CAACE,EAAE,CAACc,IAAI,CAAC,GAAG,MAAM5C,MAAM,CAACuC,OAAO,CAAC2C,aAAa,CACtDrC,SAAS,CACV,CAAA;AACH,aAAA;AACF,WAAC,CAAC,CACH,CAAA;AACH,SAAC,GAAG,CAAA;QAEJzC,WAAW,GAAG0E,OAAO,CAACxE,OAAO,EAAE,CAAC6E,IAAI,CAAC,YAAY;UAC/C,IAAI;AACF,YAAA,IAAIvD,UAAU,CAACW,OAAO,CAACiB,MAAM,EAAE;cAC7B,MAAM4B,IAAI,GAAG,MAAMpF,MAAM,CAACqF,aAAa,CAACzD,UAAU,CAAC,CAAA;AACnD,cAAA,MAAMiD,WAAW,EAAE,CAAA;cAEnBtE,aAAa,CAAC6E,IAAI,CAAC,CAAA;AACrB,aAAA;YAEA1E,QAAQ,CAAEC,CAAC,IAAK;cACdA,CAAC,CAACqC,KAAK,GAAGyB,SAAS,CAAA;cACnB9D,CAAC,CAACS,MAAM,GAAG,SAAS,CAAA;AACpBT,cAAAA,CAAC,CAAC2E,SAAS,GAAG3D,IAAI,CAACD,GAAG,EAAE,CAAA;cACxBf,CAAC,CAACY,SAAS,GACTZ,CAAC,CAAC2E,SAAS,IACV,CAAApF,IAAI,IAAJA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAE+D,MAAM,KACXrC,UAAU,CAACW,OAAO,CAACgD,YAAY,IAC/BvF,MAAM,CAACuC,OAAO,CAACiD,mBAAmB,IAClC,CAAC,CAAC,CAAA;AACR,aAAC,CAAC,CAAA;YAEF,OAAOzE,KAAK,CAACH,eAAe,CAAA;WAC7B,CAAC,OAAOkC,GAAG,EAAE;AACZ,YAAA,MAAM+B,WAAW,EAAE,CAAA;AAEnB,YAAA,IAAIY,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzC5C,cAAAA,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC,CAAA;AACpB,aAAA;YAEApC,QAAQ,CAAEC,CAAC,IAAK;cACdA,CAAC,CAACqC,KAAK,GAAGF,GAAG,CAAA;cACbnC,CAAC,CAACS,MAAM,GAAG,OAAO,CAAA;AAClBT,cAAAA,CAAC,CAAC2E,SAAS,GAAG3D,IAAI,CAACD,GAAG,EAAE,CAAA;AAC1B,aAAC,CAAC,CAAA;AAEF,YAAA,MAAMoB,GAAG,CAAA;AACX,WAAA;AACF,SAAC,CAAC,CAAA;QAEF,MAAM8C,KAAK,GAAG,YAAY;AACxB,UAAA,MAAMf,WAAW,EAAE,CAAA;UACnBnE,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACU,UAAU,GAAG,KAAM,CAAC,CAAA;AACvC,UAAA,OAAOO,UAAU,CAACE,EAAE,CAACiD,WAAW,CAAA;AAChCzE,UAAAA,OAAO,EAAE,CAAA;SACV,CAAA;QAED,IAAI;AACF,UAAA,MAAMwE,OAAO,CAACG,GAAG,CAAC,CAAC9E,iBAAiB,EAAEC,WAAW,CAACyF,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;AACnED,UAAAA,KAAK,EAAE,CAAA;AACT,SAAC,CAAC,MAAM;AACNA,UAAAA,KAAK,EAAE,CAAA;AACT,SAAA;AACF,OAAC,CAAC,CAAA;AAEF,MAAA,MAAMhE,UAAU,CAACE,EAAE,CAACiD,WAAW,CAAA;AAC/B,MAAA,MAAMF,WAAW,EAAE,CAAA;AACrB,KAAA;GACD,CAAA;AAED,EAAA,IAAI,CAACjD,UAAU,CAAC2B,UAAU,EAAE,EAAE;IAC5B7C,QAAQ,CAAEC,CAAC,IAAMA,CAAC,CAACS,MAAM,GAAG,SAAU,CAAC,CAAA;AACzC,GAAA;AAEA,EAAA,OAAOQ,UAAU,CAAA;AACnB;;;;"}
|
|
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 matchId: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n ) {\n Object.assign(this, {\n route,\n router,\n matchId: opts.matchId,\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\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","matchId","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","id","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":"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"}
|