@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.
Files changed (44) hide show
  1. package/build/cjs/actions.js +94 -0
  2. package/build/cjs/actions.js.map +1 -0
  3. package/build/cjs/history.js +163 -0
  4. package/build/cjs/history.js.map +1 -0
  5. package/build/cjs/index.js +18 -20
  6. package/build/cjs/index.js.map +1 -1
  7. package/build/cjs/interop.js +175 -0
  8. package/build/cjs/interop.js.map +1 -0
  9. package/build/cjs/path.js +4 -5
  10. package/build/cjs/path.js.map +1 -1
  11. package/build/cjs/route.js +16 -138
  12. package/build/cjs/route.js.map +1 -1
  13. package/build/cjs/routeConfig.js +1 -7
  14. package/build/cjs/routeConfig.js.map +1 -1
  15. package/build/cjs/routeMatch.js +194 -199
  16. package/build/cjs/routeMatch.js.map +1 -1
  17. package/build/cjs/router.js +726 -703
  18. package/build/cjs/router.js.map +1 -1
  19. package/build/cjs/store.js +54 -0
  20. package/build/cjs/store.js.map +1 -0
  21. package/build/esm/index.js +1305 -1114
  22. package/build/esm/index.js.map +1 -1
  23. package/build/stats-html.html +1 -1
  24. package/build/stats-react.json +229 -192
  25. package/build/types/index.d.ts +172 -109
  26. package/build/umd/index.development.js +1381 -2331
  27. package/build/umd/index.development.js.map +1 -1
  28. package/build/umd/index.production.js +1 -1
  29. package/build/umd/index.production.js.map +1 -1
  30. package/package.json +3 -3
  31. package/src/actions.ts +157 -0
  32. package/src/history.ts +199 -0
  33. package/src/index.ts +4 -7
  34. package/src/interop.ts +169 -0
  35. package/src/link.ts +2 -2
  36. package/src/route.ts +34 -239
  37. package/src/routeConfig.ts +3 -34
  38. package/src/routeInfo.ts +6 -21
  39. package/src/routeMatch.ts +270 -285
  40. package/src/router.ts +967 -963
  41. package/src/store.ts +52 -0
  42. package/build/cjs/sharedClone.js +0 -122
  43. package/build/cjs/sharedClone.js.map +0 -1
  44. package/src/sharedClone.ts +0 -118
@@ -12,231 +12,226 @@
12
12
 
13
13
  Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
- var reactivity = require('@solidjs/reactivity');
16
- var sharedClone = require('./sharedClone.js');
15
+ var store = require('./store.js');
16
+ var interop = require('./interop.js');
17
17
 
18
18
  const componentTypes = ['component', 'errorComponent', 'pendingComponent'];
19
- function createRouteMatch(router, route, opts) {
20
- let componentsPromise;
21
- let dataPromise;
22
- let latestId = '';
23
- let resolve = () => {};
24
- function setLoaderData(loaderData) {
25
- reactivity.batch(() => {
26
- setStore(s => {
27
- s.routeLoaderData = sharedClone.sharedClone(s.routeLoaderData, loaderData);
28
- });
29
- updateLoaderData();
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
- 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
46
+ #setLoaderData = loaderData => {
47
+ store.batch(() => {
48
+ this.store.setState(s => {
49
+ s.routeLoaderData = loaderData;
38
50
  });
51
+ this.#updateLoaderData();
39
52
  });
40
- }
41
- const [store, setStore] = reactivity.createStore({
42
- routeSearch: {},
43
- search: {},
44
- status: 'idle',
45
- routeLoaderData: {},
46
- loaderData: {},
47
- isFetching: false,
48
- invalid: false,
49
- invalidAt: Infinity,
50
- get isInvalid() {
51
- const now = Date.now();
52
- return this.invalid || this.invalidAt < now;
53
- }
54
- });
55
- const routeMatch = {
56
- ...route,
57
- ...opts,
58
- store,
59
- // setStore,
60
- router,
61
- childMatches: [],
62
- __: {
63
- setParentMatch: parentMatch => {
64
- reactivity.batch(() => {
65
- setStore(s => {
66
- s.parentMatch = parentMatch;
67
- });
68
- updateLoaderData();
69
- });
70
- },
71
- abortController: new AbortController(),
72
- validate: () => {
73
- var _store$parentMatch2;
74
- // Validate the search params and stabilize them
75
- const parentSearch = ((_store$parentMatch2 = store.parentMatch) == null ? void 0 : _store$parentMatch2.store.search) ?? router.store.currentLocation.search;
76
- try {
77
- const prevSearch = store.routeSearch;
78
- const validator = typeof routeMatch.options.validateSearch === 'object' ? routeMatch.options.validateSearch.parse : routeMatch.options.validateSearch;
79
- let nextSearch = sharedClone.sharedClone(prevSearch, (validator == null ? void 0 : validator(parentSearch)) ?? {});
80
- reactivity.batch(() => {
81
- // Invalidate route matches when search param stability changes
82
- if (prevSearch !== nextSearch) {
83
- setStore(s => s.invalid = true);
84
- }
85
-
86
- // TODO: Alright, do we need batch() here?
87
- setStore(s => {
88
- s.routeSearch = nextSearch;
89
- s.search = sharedClone.sharedClone(parentSearch, {
90
- ...parentSearch,
91
- ...nextSearch
92
- });
93
- });
94
- });
95
- componentTypes.map(async type => {
96
- const component = routeMatch.options[type];
97
- if (typeof routeMatch.__[type] !== 'function') {
98
- routeMatch.__[type] = component;
99
- }
100
- });
101
- } catch (err) {
102
- console.error(err);
103
- const error = new Error('Invalid search params found', {
104
- cause: err
105
- });
106
- error.code = 'INVALID_SEARCH_PARAMS';
107
- setStore(s => {
108
- s.status = 'error';
109
- s.error = error;
110
- });
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
- // Do not proceed with loading the route
113
- return;
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
- cancel: () => {
118
- var _routeMatch$__$abortC;
119
- (_routeMatch$__$abortC = routeMatch.__.abortController) == null ? void 0 : _routeMatch$__$abortC.abort();
120
- },
121
- invalidate: () => {
122
- setStore(s => s.invalid = true);
123
- },
124
- hasLoaders: () => {
125
- return !!(route.options.loader || componentTypes.some(d => {
126
- var _route$options$d;
127
- return (_route$options$d = route.options[d]) == null ? void 0 : _route$options$d.preload;
128
- }));
129
- },
130
- load: async loaderOpts => {
131
- const now = Date.now();
132
- const minMaxAge = loaderOpts != null && loaderOpts.preload ? Math.max(loaderOpts == null ? void 0 : loaderOpts.maxAge, loaderOpts == null ? void 0 : loaderOpts.gcMaxAge) : 0;
133
-
134
- // If this is a preload, add it to the preload cache
135
- if (loaderOpts != null && loaderOpts.preload && minMaxAge > 0) {
136
- // If the match is currently active, don't preload it
137
- if (router.store.currentMatches.find(d => d.matchId === routeMatch.matchId)) {
138
- return;
139
- }
140
- router.store.matchCache[routeMatch.matchId] = {
67
+ this.router.store.setState(s => {
68
+ s.matchCache[this.id] = {
141
69
  gc: now + loaderOpts.gcMaxAge,
142
- match: routeMatch
70
+ match: this
143
71
  };
144
- }
72
+ });
73
+ }
145
74
 
146
- // If the match is invalid, errored or idle, trigger it to load
147
- if (store.status === 'success' && store.isInvalid || store.status === 'error' || store.status === 'idle') {
148
- const maxAge = loaderOpts != null && loaderOpts.preload ? loaderOpts == null ? void 0 : loaderOpts.maxAge : undefined;
149
- await routeMatch.fetch({
150
- maxAge
151
- });
152
- }
153
- },
154
- fetch: async opts => {
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 = async () => {
158
- if (loadId !== latestId) {
159
- // warning(true, 'Data loader is out of date!')
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
- setStore(s => s.status = 'loading');
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
- setStore(s => s.invalid = false);
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
- await Promise.all(componentTypes.map(async type => {
184
- var _routeMatch$__$type;
185
- const component = routeMatch.options[type];
186
- if ((_routeMatch$__$type = routeMatch.__[type]) != null && _routeMatch$__$type.preload) {
187
- routeMatch.__[type] = await router.options.loadComponent(component);
188
- }
189
- }));
190
- })();
191
- dataPromise = Promise.resolve().then(async () => {
192
- try {
193
- if (routeMatch.options.loader) {
194
- const data = await router.loadMatchData(routeMatch);
195
- await checkLatest();
196
- setLoaderData(data);
197
- }
198
- setStore(s => {
199
- s.error = undefined;
200
- s.status = 'success';
201
- s.updatedAt = Date.now();
202
- s.invalidAt = s.updatedAt + ((opts == null ? void 0 : opts.maxAge) ?? routeMatch.options.loaderMaxAge ?? router.options.defaultLoaderMaxAge ?? 0);
203
- });
204
- return store.routeLoaderData;
205
- } catch (err) {
206
- await checkLatest();
207
- if (process.env.NODE_ENV !== 'production') {
208
- console.error(err);
209
- }
210
- setStore(s => {
211
- s.error = err;
212
- s.status = 'error';
213
- s.updatedAt = Date.now();
214
- });
215
- throw err;
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
- const after = async () => {
219
- await checkLatest();
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
- await Promise.all([componentsPromise, dataPromise.catch(() => {})]);
226
- after();
227
- } catch {
228
- after();
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
- await routeMatch.__.loadPromise;
232
- await checkLatest();
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.createRouteMatch = createRouteMatch;
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":"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"}
1
+ {"version":3,"file":"routeMatch.js","sources":["../../src/routeMatch.ts"],"sourcesContent":["import { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { 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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"}