@tanstack/router-core 1.171.14 → 1.171.16-pre.0

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 (139) hide show
  1. package/dist/cjs/Matches.cjs.map +1 -1
  2. package/dist/cjs/Matches.d.cts +3 -12
  3. package/dist/cjs/await-signal.cjs +21 -0
  4. package/dist/cjs/await-signal.cjs.map +1 -0
  5. package/dist/cjs/await-signal.d.cts +1 -0
  6. package/dist/cjs/index.cjs +3 -1
  7. package/dist/cjs/index.d.cts +3 -2
  8. package/dist/cjs/isServer/client.cjs +2 -0
  9. package/dist/cjs/isServer/client.cjs.map +1 -1
  10. package/dist/cjs/isServer/client.d.cts +1 -0
  11. package/dist/cjs/isServer/development.cjs +2 -0
  12. package/dist/cjs/isServer/development.cjs.map +1 -1
  13. package/dist/cjs/isServer/development.d.cts +1 -0
  14. package/dist/cjs/isServer/server.cjs +2 -0
  15. package/dist/cjs/isServer/server.cjs.map +1 -1
  16. package/dist/cjs/isServer/server.d.cts +1 -0
  17. package/dist/cjs/load-client.cjs +1470 -0
  18. package/dist/cjs/load-client.cjs.map +1 -0
  19. package/dist/cjs/load-client.d.cts +147 -0
  20. package/dist/cjs/load-server.cjs +565 -0
  21. package/dist/cjs/load-server.cjs.map +1 -0
  22. package/dist/cjs/load-server.d.cts +16 -0
  23. package/dist/cjs/redirect.cjs.map +1 -1
  24. package/dist/cjs/redirect.d.cts +0 -1
  25. package/dist/cjs/route.cjs.map +1 -1
  26. package/dist/cjs/router.cjs +187 -445
  27. package/dist/cjs/router.cjs.map +1 -1
  28. package/dist/cjs/router.d.cts +62 -52
  29. package/dist/cjs/scroll-restoration.cjs +27 -34
  30. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  31. package/dist/cjs/ssr/client.cjs +2 -2
  32. package/dist/cjs/ssr/createRequestHandler.cjs +60 -9
  33. package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -1
  34. package/dist/cjs/ssr/createRequestHandler.d.cts +1 -0
  35. package/dist/cjs/ssr/handlerCallback.cjs +49 -4
  36. package/dist/cjs/ssr/handlerCallback.cjs.map +1 -1
  37. package/dist/cjs/ssr/handlerCallback.d.cts +3 -0
  38. package/dist/cjs/ssr/server.cjs +4 -0
  39. package/dist/cjs/ssr/server.d.cts +2 -2
  40. package/dist/cjs/ssr/ssr-client.d.cts +1 -10
  41. package/dist/cjs/ssr/ssr-match-id.cjs +2 -2
  42. package/dist/cjs/ssr/ssr-match-id.cjs.map +1 -1
  43. package/dist/cjs/ssr/ssr-server.cjs +6 -6
  44. package/dist/cjs/ssr/ssr-server.cjs.map +1 -1
  45. package/dist/cjs/ssr/transformStreamWithRouter.cjs +27 -1
  46. package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -1
  47. package/dist/cjs/ssr/transformStreamWithRouter.d.cts +2 -0
  48. package/dist/cjs/ssr/types.d.cts +0 -1
  49. package/dist/cjs/stores.cjs +30 -104
  50. package/dist/cjs/stores.cjs.map +1 -1
  51. package/dist/cjs/stores.d.cts +7 -32
  52. package/dist/cjs/utils.cjs +0 -4
  53. package/dist/cjs/utils.cjs.map +1 -1
  54. package/dist/esm/Matches.d.ts +3 -12
  55. package/dist/esm/Matches.js.map +1 -1
  56. package/dist/esm/await-signal.d.ts +1 -0
  57. package/dist/esm/await-signal.js +21 -0
  58. package/dist/esm/await-signal.js.map +1 -0
  59. package/dist/esm/index.d.ts +3 -2
  60. package/dist/esm/index.js +3 -2
  61. package/dist/esm/isServer/client.d.ts +1 -0
  62. package/dist/esm/isServer/client.js +2 -1
  63. package/dist/esm/isServer/client.js.map +1 -1
  64. package/dist/esm/isServer/development.d.ts +1 -0
  65. package/dist/esm/isServer/development.js +2 -1
  66. package/dist/esm/isServer/development.js.map +1 -1
  67. package/dist/esm/isServer/server.d.ts +1 -0
  68. package/dist/esm/isServer/server.js +2 -1
  69. package/dist/esm/isServer/server.js.map +1 -1
  70. package/dist/esm/load-client.d.ts +147 -0
  71. package/dist/esm/load-client.js +1462 -0
  72. package/dist/esm/load-client.js.map +1 -0
  73. package/dist/esm/load-server.d.ts +16 -0
  74. package/dist/esm/load-server.js +565 -0
  75. package/dist/esm/load-server.js.map +1 -0
  76. package/dist/esm/redirect.d.ts +0 -1
  77. package/dist/esm/redirect.js.map +1 -1
  78. package/dist/esm/route.js.map +1 -1
  79. package/dist/esm/router.d.ts +62 -52
  80. package/dist/esm/router.js +188 -446
  81. package/dist/esm/router.js.map +1 -1
  82. package/dist/esm/scroll-restoration.js +27 -34
  83. package/dist/esm/scroll-restoration.js.map +1 -1
  84. package/dist/esm/ssr/client.js +1 -1
  85. package/dist/esm/ssr/createRequestHandler.d.ts +1 -0
  86. package/dist/esm/ssr/createRequestHandler.js +61 -11
  87. package/dist/esm/ssr/createRequestHandler.js.map +1 -1
  88. package/dist/esm/ssr/handlerCallback.d.ts +3 -0
  89. package/dist/esm/ssr/handlerCallback.js +47 -5
  90. package/dist/esm/ssr/handlerCallback.js.map +1 -1
  91. package/dist/esm/ssr/server.d.ts +2 -2
  92. package/dist/esm/ssr/server.js +3 -3
  93. package/dist/esm/ssr/ssr-client.d.ts +1 -10
  94. package/dist/esm/ssr/ssr-match-id.js +2 -2
  95. package/dist/esm/ssr/ssr-match-id.js.map +1 -1
  96. package/dist/esm/ssr/ssr-server.js +6 -6
  97. package/dist/esm/ssr/ssr-server.js.map +1 -1
  98. package/dist/esm/ssr/transformStreamWithRouter.d.ts +2 -0
  99. package/dist/esm/ssr/transformStreamWithRouter.js +27 -1
  100. package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -1
  101. package/dist/esm/ssr/types.d.ts +0 -1
  102. package/dist/esm/stores.d.ts +7 -32
  103. package/dist/esm/stores.js +30 -104
  104. package/dist/esm/stores.js.map +1 -1
  105. package/dist/esm/utils.js +1 -4
  106. package/dist/esm/utils.js.map +1 -1
  107. package/package.json +3 -3
  108. package/src/Matches.ts +6 -21
  109. package/src/await-signal.ts +27 -0
  110. package/src/index.ts +1 -3
  111. package/src/isServer/client.ts +1 -0
  112. package/src/isServer/development.ts +1 -0
  113. package/src/isServer/server.ts +1 -0
  114. package/src/load-client.ts +2701 -0
  115. package/src/load-server.ts +849 -0
  116. package/src/redirect.ts +0 -1
  117. package/src/route.ts +2 -11
  118. package/src/router.ts +380 -774
  119. package/src/scroll-restoration.ts +40 -56
  120. package/src/ssr/createRequestHandler.ts +109 -16
  121. package/src/ssr/handlerCallback.ts +76 -10
  122. package/src/ssr/server.ts +4 -1
  123. package/src/ssr/ssr-client.ts +1 -310
  124. package/src/ssr/ssr-match-id.ts +11 -2
  125. package/src/ssr/ssr-server.ts +9 -8
  126. package/src/ssr/transformStreamWithRouter.ts +37 -1
  127. package/src/ssr/types.ts +0 -1
  128. package/src/stores.ts +46 -208
  129. package/dist/cjs/load-matches.cjs +0 -658
  130. package/dist/cjs/load-matches.cjs.map +0 -1
  131. package/dist/cjs/load-matches.d.cts +0 -18
  132. package/dist/cjs/ssr/ssr-client.cjs +0 -183
  133. package/dist/cjs/ssr/ssr-client.cjs.map +0 -1
  134. package/dist/esm/load-matches.d.ts +0 -18
  135. package/dist/esm/load-matches.js +0 -656
  136. package/dist/esm/load-matches.js.map +0 -1
  137. package/dist/esm/ssr/ssr-client.js +0 -183
  138. package/dist/esm/ssr/ssr-client.js.map +0 -1
  139. package/src/load-matches.ts +0 -1278
@@ -1,658 +0,0 @@
1
- const require_utils = require("./utils.cjs");
2
- const require_invariant = require("./invariant.cjs");
3
- const require_not_found = require("./not-found.cjs");
4
- const require_root = require("./root.cjs");
5
- const require_redirect = require("./redirect.cjs");
6
- let _tanstack_router_core_isServer = require("@tanstack/router-core/isServer");
7
- //#region src/load-matches.ts
8
- const triggerOnReady = (inner) => {
9
- if (!inner.rendered) {
10
- inner.rendered = true;
11
- return inner.onReady?.();
12
- }
13
- };
14
- const hasForcePendingActiveMatch = (router) => {
15
- return router.stores.matchesId.get().some((matchId) => {
16
- return router.stores.matchStores.get(matchId)?.get()._forcePending;
17
- });
18
- };
19
- const resolvePreload = (inner, matchId) => {
20
- return !!(inner.preload && !inner.router.stores.matchStores.has(matchId));
21
- };
22
- /**
23
- * Builds the accumulated context from router options and all matches up to (and optionally including) the given index.
24
- * Merges __routeContext and __beforeLoadContext from each match.
25
- */
26
- const buildMatchContext = (inner, index, includeCurrentMatch = true) => {
27
- const context = { ...inner.router.options.context ?? {} };
28
- const end = includeCurrentMatch ? index : index - 1;
29
- for (let i = 0; i <= end; i++) {
30
- const innerMatch = inner.matches[i];
31
- if (!innerMatch) continue;
32
- const m = inner.router.getMatch(innerMatch.id);
33
- if (!m) continue;
34
- Object.assign(context, m.__routeContext, m.__beforeLoadContext);
35
- }
36
- return context;
37
- };
38
- const getNotFoundBoundaryIndex = (inner, err) => {
39
- if (!inner.matches.length) return;
40
- const requestedRouteId = err.routeId;
41
- const matchedRootIndex = inner.matches.findIndex((m) => m.routeId === inner.router.routeTree.id);
42
- const rootIndex = matchedRootIndex >= 0 ? matchedRootIndex : 0;
43
- let startIndex = requestedRouteId ? inner.matches.findIndex((match) => match.routeId === requestedRouteId) : inner.firstBadMatchIndex ?? inner.matches.length - 1;
44
- if (startIndex < 0) startIndex = rootIndex;
45
- for (let i = startIndex; i >= 0; i--) {
46
- const match = inner.matches[i];
47
- if (inner.router.looseRoutesById[match.routeId].options.notFoundComponent) return i;
48
- }
49
- return requestedRouteId ? startIndex : rootIndex;
50
- };
51
- const handleRedirectAndNotFound = (inner, match, err) => {
52
- if (!require_redirect.isRedirect(err) && !require_not_found.isNotFound(err)) return;
53
- if (require_redirect.isRedirect(err) && err.redirectHandled && !err.options.reloadDocument) throw err;
54
- if (match) {
55
- match._nonReactive.beforeLoadPromise?.resolve();
56
- match._nonReactive.loaderPromise?.resolve();
57
- match._nonReactive.beforeLoadPromise = void 0;
58
- match._nonReactive.loaderPromise = void 0;
59
- match._nonReactive.error = err;
60
- inner.updateMatch(match.id, (prev) => ({
61
- ...prev,
62
- status: require_redirect.isRedirect(err) ? "redirected" : require_not_found.isNotFound(err) ? "notFound" : prev.status === "pending" ? "success" : prev.status,
63
- context: buildMatchContext(inner, match.index),
64
- isFetching: false,
65
- error: err
66
- }));
67
- if (require_not_found.isNotFound(err) && !err.routeId) err.routeId = match.routeId;
68
- match._nonReactive.loadPromise?.resolve();
69
- }
70
- if (require_redirect.isRedirect(err)) {
71
- inner.rendered = true;
72
- err.options._fromLocation = inner.location;
73
- err.redirectHandled = true;
74
- err = inner.router.resolveRedirect(err);
75
- }
76
- throw err;
77
- };
78
- const shouldSkipLoader = (inner, matchId) => {
79
- const match = inner.router.getMatch(matchId);
80
- if (!match) return true;
81
- if (!(_tanstack_router_core_isServer.isServer ?? inner.router.isServer) && match._nonReactive.dehydrated) return true;
82
- if ((_tanstack_router_core_isServer.isServer ?? inner.router.isServer) && match.ssr === false) return true;
83
- return false;
84
- };
85
- const syncMatchContext = (inner, matchId, index) => {
86
- const nextContext = buildMatchContext(inner, index);
87
- inner.updateMatch(matchId, (prev) => {
88
- return {
89
- ...prev,
90
- context: nextContext
91
- };
92
- });
93
- };
94
- const handleSerialError = (inner, index, err) => {
95
- const { id: matchId, routeId } = inner.matches[index];
96
- const route = inner.router.looseRoutesById[routeId];
97
- if (err instanceof Promise) throw err;
98
- inner.firstBadMatchIndex ??= index;
99
- handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), err);
100
- try {
101
- route.options.onError?.(err);
102
- } catch (errorHandlerErr) {
103
- err = errorHandlerErr;
104
- handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), err);
105
- }
106
- inner.updateMatch(matchId, (prev) => {
107
- prev._nonReactive.beforeLoadPromise?.resolve();
108
- prev._nonReactive.beforeLoadPromise = void 0;
109
- prev._nonReactive.loadPromise?.resolve();
110
- return {
111
- ...prev,
112
- error: err,
113
- status: "error",
114
- isFetching: false,
115
- updatedAt: Date.now(),
116
- abortController: new AbortController()
117
- };
118
- });
119
- if (!inner.preload && !require_redirect.isRedirect(err) && !require_not_found.isNotFound(err)) inner.serialError ??= err;
120
- };
121
- const isBeforeLoadSsr = (inner, matchId, index, route) => {
122
- const existingMatch = inner.router.getMatch(matchId);
123
- const parentMatchId = inner.matches[index - 1]?.id;
124
- const parentMatch = parentMatchId ? inner.router.getMatch(parentMatchId) : void 0;
125
- if (inner.router.isShell()) {
126
- existingMatch.ssr = route.id === require_root.rootRouteId;
127
- return;
128
- }
129
- if (parentMatch?.ssr === false) {
130
- existingMatch.ssr = false;
131
- return;
132
- }
133
- const parentOverride = (tempSsr) => {
134
- if (tempSsr === true && parentMatch?.ssr === "data-only") return "data-only";
135
- return tempSsr;
136
- };
137
- const defaultSsr = inner.router.options.defaultSsr ?? true;
138
- if (route.options.ssr === void 0) {
139
- existingMatch.ssr = parentOverride(defaultSsr);
140
- return;
141
- }
142
- if (typeof route.options.ssr !== "function") {
143
- existingMatch.ssr = parentOverride(route.options.ssr);
144
- return;
145
- }
146
- const { search, params } = existingMatch;
147
- const ssrFnContext = {
148
- search: makeMaybe(search, existingMatch.searchError),
149
- params: makeMaybe(params, existingMatch.paramsError),
150
- location: inner.location,
151
- matches: inner.matches.map((match) => ({
152
- index: match.index,
153
- pathname: match.pathname,
154
- fullPath: match.fullPath,
155
- staticData: match.staticData,
156
- id: match.id,
157
- routeId: match.routeId,
158
- search: makeMaybe(match.search, match.searchError),
159
- params: makeMaybe(match.params, match.paramsError),
160
- ssr: match.ssr
161
- }))
162
- };
163
- const tempSsr = route.options.ssr(ssrFnContext);
164
- if (require_utils.isPromise(tempSsr)) return tempSsr.then((ssr) => {
165
- existingMatch.ssr = parentOverride(ssr ?? defaultSsr);
166
- });
167
- existingMatch.ssr = parentOverride(tempSsr ?? defaultSsr);
168
- };
169
- const setupPendingTimeout = (inner, matchId, route, match) => {
170
- if (match._nonReactive.pendingTimeout !== void 0) return;
171
- const pendingMs = route.options.pendingMs ?? inner.router.options.defaultPendingMs;
172
- if (!!(inner.onReady && !(_tanstack_router_core_isServer.isServer ?? inner.router.isServer) && !resolvePreload(inner, matchId) && (route.options.loader || route.options.beforeLoad || routeNeedsPreload(route)) && typeof pendingMs === "number" && pendingMs !== Infinity && (route.options.pendingComponent ?? inner.router.options?.defaultPendingComponent))) {
173
- const pendingTimeout = setTimeout(() => {
174
- triggerOnReady(inner);
175
- }, pendingMs);
176
- match._nonReactive.pendingTimeout = pendingTimeout;
177
- }
178
- };
179
- const preBeforeLoadSetup = (inner, matchId, route) => {
180
- const existingMatch = inner.router.getMatch(matchId);
181
- if (!existingMatch._nonReactive.beforeLoadPromise && !existingMatch._nonReactive.loaderPromise) return;
182
- setupPendingTimeout(inner, matchId, route, existingMatch);
183
- const then = () => {
184
- const match = inner.router.getMatch(matchId);
185
- if (match.preload && (match.status === "redirected" || match.status === "notFound")) handleRedirectAndNotFound(inner, match, match.error);
186
- };
187
- return existingMatch._nonReactive.beforeLoadPromise ? existingMatch._nonReactive.beforeLoadPromise.then(then) : then();
188
- };
189
- const executeBeforeLoad = (inner, matchId, index, route) => {
190
- const match = inner.router.getMatch(matchId);
191
- let prevLoadPromise = match._nonReactive.loadPromise;
192
- match._nonReactive.loadPromise = require_utils.createControlledPromise(() => {
193
- prevLoadPromise?.resolve();
194
- prevLoadPromise = void 0;
195
- });
196
- const { paramsError, searchError } = match;
197
- if (paramsError) handleSerialError(inner, index, paramsError);
198
- if (searchError) handleSerialError(inner, index, searchError);
199
- setupPendingTimeout(inner, matchId, route, match);
200
- const abortController = new AbortController();
201
- let isPending = false;
202
- const pending = () => {
203
- if (isPending) return;
204
- isPending = true;
205
- inner.updateMatch(matchId, (prev) => ({
206
- ...prev,
207
- isFetching: "beforeLoad",
208
- fetchCount: prev.fetchCount + 1,
209
- abortController
210
- }));
211
- };
212
- const resolve = () => {
213
- match._nonReactive.beforeLoadPromise?.resolve();
214
- match._nonReactive.beforeLoadPromise = void 0;
215
- inner.updateMatch(matchId, (prev) => ({
216
- ...prev,
217
- isFetching: false
218
- }));
219
- };
220
- if (!route.options.beforeLoad) {
221
- inner.router.batch(() => {
222
- pending();
223
- resolve();
224
- });
225
- return;
226
- }
227
- match._nonReactive.beforeLoadPromise = require_utils.createControlledPromise();
228
- const context = {
229
- ...buildMatchContext(inner, index, false),
230
- ...match.__routeContext
231
- };
232
- const { search, params, cause } = match;
233
- const preload = resolvePreload(inner, matchId);
234
- const beforeLoadFnContext = {
235
- search,
236
- abortController,
237
- params,
238
- preload,
239
- context,
240
- location: inner.location,
241
- navigate: (opts) => inner.router.navigate({
242
- ...opts,
243
- _fromLocation: inner.location
244
- }),
245
- buildLocation: inner.router.buildLocation,
246
- cause: preload ? "preload" : cause,
247
- matches: inner.matches,
248
- routeId: route.id,
249
- ...inner.router.options.additionalContext
250
- };
251
- const updateContext = (beforeLoadContext) => {
252
- if (beforeLoadContext === void 0) {
253
- inner.router.batch(() => {
254
- pending();
255
- resolve();
256
- });
257
- return;
258
- }
259
- if (require_redirect.isRedirect(beforeLoadContext) || require_not_found.isNotFound(beforeLoadContext)) {
260
- pending();
261
- handleSerialError(inner, index, beforeLoadContext);
262
- }
263
- inner.router.batch(() => {
264
- pending();
265
- inner.updateMatch(matchId, (prev) => ({
266
- ...prev,
267
- __beforeLoadContext: beforeLoadContext
268
- }));
269
- resolve();
270
- });
271
- };
272
- let beforeLoadContext;
273
- try {
274
- beforeLoadContext = route.options.beforeLoad(beforeLoadFnContext);
275
- if (require_utils.isPromise(beforeLoadContext)) {
276
- pending();
277
- return beforeLoadContext.catch((err) => {
278
- handleSerialError(inner, index, err);
279
- }).then(updateContext);
280
- }
281
- } catch (err) {
282
- pending();
283
- handleSerialError(inner, index, err);
284
- }
285
- updateContext(beforeLoadContext);
286
- };
287
- const handleBeforeLoad = (inner, index) => {
288
- const { id: matchId, routeId } = inner.matches[index];
289
- const route = inner.router.looseRoutesById[routeId];
290
- const serverSsr = () => {
291
- if (_tanstack_router_core_isServer.isServer ?? inner.router.isServer) {
292
- const maybePromise = isBeforeLoadSsr(inner, matchId, index, route);
293
- if (require_utils.isPromise(maybePromise)) return maybePromise.then(queueExecution);
294
- }
295
- return queueExecution();
296
- };
297
- const execute = () => executeBeforeLoad(inner, matchId, index, route);
298
- const queueExecution = () => {
299
- if (shouldSkipLoader(inner, matchId)) return;
300
- const result = preBeforeLoadSetup(inner, matchId, route);
301
- return require_utils.isPromise(result) ? result.then(execute) : execute();
302
- };
303
- return serverSsr();
304
- };
305
- const executeHead = (inner, matchId, route) => {
306
- const match = inner.router.getMatch(matchId);
307
- if (!match) return;
308
- if (!route.options.head && !route.options.scripts && !route.options.headers) return;
309
- const assetContext = {
310
- ssr: inner.router.options.ssr,
311
- matches: inner.matches,
312
- match,
313
- params: match.params,
314
- loaderData: match.loaderData
315
- };
316
- return Promise.all([
317
- route.options.head?.(assetContext),
318
- route.options.scripts?.(assetContext),
319
- route.options.headers?.(assetContext)
320
- ]).then(([headFnContent, scripts, headers]) => {
321
- return {
322
- meta: headFnContent?.meta,
323
- links: headFnContent?.links,
324
- headScripts: headFnContent?.scripts,
325
- headers,
326
- scripts,
327
- styles: headFnContent?.styles
328
- };
329
- });
330
- };
331
- const getLoaderContext = (inner, matchPromises, matchId, index, route) => {
332
- const parentMatchPromise = matchPromises[index - 1];
333
- const { params, loaderDeps, abortController, cause } = inner.router.getMatch(matchId);
334
- const context = buildMatchContext(inner, index);
335
- const preload = resolvePreload(inner, matchId);
336
- return {
337
- params,
338
- deps: loaderDeps,
339
- preload: !!preload,
340
- parentMatchPromise,
341
- abortController,
342
- context,
343
- location: inner.location,
344
- navigate: (opts) => inner.router.navigate({
345
- ...opts,
346
- _fromLocation: inner.location
347
- }),
348
- cause: preload ? "preload" : cause,
349
- route,
350
- ...inner.router.options.additionalContext
351
- };
352
- };
353
- const runLoader = async (inner, matchPromises, matchId, index, route) => {
354
- try {
355
- const match = inner.router.getMatch(matchId);
356
- try {
357
- if (!(_tanstack_router_core_isServer.isServer ?? inner.router.isServer) || match.ssr === true) loadRouteChunk(route);
358
- const routeLoader = route.options.loader;
359
- const loader = typeof routeLoader === "function" ? routeLoader : routeLoader?.handler;
360
- const loaderResult = loader?.(getLoaderContext(inner, matchPromises, matchId, index, route));
361
- const loaderResultIsPromise = !!loader && require_utils.isPromise(loaderResult);
362
- if (!!(loaderResultIsPromise || route._lazyPromise || route._componentsPromise || route.options.head || route.options.scripts || route.options.headers || match._nonReactive.minPendingPromise)) inner.updateMatch(matchId, (prev) => ({
363
- ...prev,
364
- isFetching: "loader"
365
- }));
366
- if (loader) {
367
- const loaderData = loaderResultIsPromise ? await loaderResult : loaderResult;
368
- handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), loaderData);
369
- if (loaderData !== void 0) inner.updateMatch(matchId, (prev) => ({
370
- ...prev,
371
- loaderData
372
- }));
373
- }
374
- if (route._lazyPromise) await route._lazyPromise;
375
- const pendingPromise = match._nonReactive.minPendingPromise;
376
- if (pendingPromise) await pendingPromise;
377
- if (route._componentsPromise) await route._componentsPromise;
378
- inner.updateMatch(matchId, (prev) => ({
379
- ...prev,
380
- error: void 0,
381
- context: buildMatchContext(inner, index),
382
- status: "success",
383
- isFetching: false,
384
- updatedAt: Date.now()
385
- }));
386
- } catch (e) {
387
- let error = e;
388
- if (error?.name === "AbortError") {
389
- if (match.abortController.signal.aborted) {
390
- match._nonReactive.loaderPromise?.resolve();
391
- match._nonReactive.loaderPromise = void 0;
392
- return;
393
- }
394
- inner.updateMatch(matchId, (prev) => ({
395
- ...prev,
396
- status: prev.status === "pending" ? "success" : prev.status,
397
- isFetching: false,
398
- context: buildMatchContext(inner, index)
399
- }));
400
- return;
401
- }
402
- const pendingPromise = match._nonReactive.minPendingPromise;
403
- if (pendingPromise) await pendingPromise;
404
- if (require_not_found.isNotFound(e)) await route.options.notFoundComponent?.preload?.();
405
- handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), e);
406
- try {
407
- route.options.onError?.(e);
408
- } catch (onErrorError) {
409
- error = onErrorError;
410
- handleRedirectAndNotFound(inner, inner.router.getMatch(matchId), onErrorError);
411
- }
412
- if (!require_redirect.isRedirect(error) && !require_not_found.isNotFound(error)) await loadRouteChunk(route, ["errorComponent"]);
413
- inner.updateMatch(matchId, (prev) => ({
414
- ...prev,
415
- error,
416
- context: buildMatchContext(inner, index),
417
- status: "error",
418
- isFetching: false
419
- }));
420
- }
421
- } catch (err) {
422
- const match = inner.router.getMatch(matchId);
423
- if (match) match._nonReactive.loaderPromise = void 0;
424
- handleRedirectAndNotFound(inner, match, err);
425
- }
426
- };
427
- const loadRouteMatch = async (inner, matchPromises, index) => {
428
- async function handleLoader(preload, prevMatch, previousRouteMatchId, match, route) {
429
- const age = Date.now() - prevMatch.updatedAt;
430
- const staleAge = preload ? route.options.preloadStaleTime ?? inner.router.options.defaultPreloadStaleTime ?? 3e4 : route.options.staleTime ?? inner.router.options.defaultStaleTime ?? 0;
431
- const shouldReloadOption = route.options.shouldReload;
432
- const shouldReload = typeof shouldReloadOption === "function" ? shouldReloadOption(getLoaderContext(inner, matchPromises, matchId, index, route)) : shouldReloadOption;
433
- const { status, invalid } = match;
434
- const staleMatchShouldReload = age >= staleAge && (!!inner.forceStaleReload || match.cause === "enter" || previousRouteMatchId !== void 0 && previousRouteMatchId !== match.id);
435
- loaderShouldRunAsync = status === "success" && (invalid || (shouldReload ?? staleMatchShouldReload));
436
- if (preload && route.options.preload === false) {} else if (loaderShouldRunAsync && !inner.sync && shouldReloadInBackground) {
437
- loaderIsRunningAsync = true;
438
- (async () => {
439
- try {
440
- await runLoader(inner, matchPromises, matchId, index, route);
441
- const match = inner.router.getMatch(matchId);
442
- match._nonReactive.loaderPromise?.resolve();
443
- match._nonReactive.loadPromise?.resolve();
444
- match._nonReactive.loaderPromise = void 0;
445
- match._nonReactive.loadPromise = void 0;
446
- } catch (err) {
447
- if (require_redirect.isRedirect(err)) await inner.router.navigate(err.options);
448
- }
449
- })();
450
- } else if (status !== "success" || loaderShouldRunAsync) await runLoader(inner, matchPromises, matchId, index, route);
451
- else syncMatchContext(inner, matchId, index);
452
- }
453
- const { id: matchId, routeId } = inner.matches[index];
454
- let loaderShouldRunAsync = false;
455
- let loaderIsRunningAsync = false;
456
- const route = inner.router.looseRoutesById[routeId];
457
- const routeLoader = route.options.loader;
458
- const shouldReloadInBackground = ((typeof routeLoader === "function" ? void 0 : routeLoader?.staleReloadMode) ?? inner.router.options.defaultStaleReloadMode) !== "blocking";
459
- if (shouldSkipLoader(inner, matchId)) {
460
- if (!inner.router.getMatch(matchId)) return inner.matches[index];
461
- syncMatchContext(inner, matchId, index);
462
- if (_tanstack_router_core_isServer.isServer ?? inner.router.isServer) return inner.router.getMatch(matchId);
463
- } else {
464
- const prevMatch = inner.router.getMatch(matchId);
465
- const activeIdAtIndex = inner.router.stores.matchesId.get()[index];
466
- const previousRouteMatchId = (activeIdAtIndex && inner.router.stores.matchStores.get(activeIdAtIndex) || null)?.routeId === routeId ? activeIdAtIndex : inner.router.stores.matches.get().find((d) => d.routeId === routeId)?.id;
467
- const preload = resolvePreload(inner, matchId);
468
- if (prevMatch._nonReactive.loaderPromise) {
469
- if (prevMatch.status === "success" && !inner.sync && !prevMatch.preload && shouldReloadInBackground) return prevMatch;
470
- await prevMatch._nonReactive.loaderPromise;
471
- const match = inner.router.getMatch(matchId);
472
- const error = match._nonReactive.error || match.error;
473
- if (error) handleRedirectAndNotFound(inner, match, error);
474
- if (match.status === "pending") await handleLoader(preload, prevMatch, previousRouteMatchId, match, route);
475
- } else {
476
- const nextPreload = preload && !inner.router.stores.matchStores.has(matchId);
477
- const match = inner.router.getMatch(matchId);
478
- match._nonReactive.loaderPromise = require_utils.createControlledPromise();
479
- if (nextPreload !== match.preload) inner.updateMatch(matchId, (prev) => ({
480
- ...prev,
481
- preload: nextPreload
482
- }));
483
- await handleLoader(preload, prevMatch, previousRouteMatchId, match, route);
484
- }
485
- }
486
- const match = inner.router.getMatch(matchId);
487
- if (!loaderIsRunningAsync) {
488
- match._nonReactive.loaderPromise?.resolve();
489
- match._nonReactive.loadPromise?.resolve();
490
- match._nonReactive.loadPromise = void 0;
491
- }
492
- clearTimeout(match._nonReactive.pendingTimeout);
493
- match._nonReactive.pendingTimeout = void 0;
494
- if (!loaderIsRunningAsync) match._nonReactive.loaderPromise = void 0;
495
- match._nonReactive.dehydrated = void 0;
496
- const nextIsFetching = loaderIsRunningAsync ? match.isFetching : false;
497
- if (nextIsFetching !== match.isFetching || match.invalid !== false) {
498
- inner.updateMatch(matchId, (prev) => ({
499
- ...prev,
500
- isFetching: nextIsFetching,
501
- invalid: false
502
- }));
503
- return inner.router.getMatch(matchId);
504
- } else return match;
505
- };
506
- async function loadMatches(arg) {
507
- const inner = arg;
508
- const matchPromises = [];
509
- if (!(_tanstack_router_core_isServer.isServer ?? inner.router.isServer) && hasForcePendingActiveMatch(inner.router)) triggerOnReady(inner);
510
- let beforeLoadNotFound;
511
- for (let i = 0; i < inner.matches.length; i++) {
512
- try {
513
- const beforeLoad = handleBeforeLoad(inner, i);
514
- if (require_utils.isPromise(beforeLoad)) await beforeLoad;
515
- } catch (err) {
516
- if (require_redirect.isRedirect(err)) throw err;
517
- if (require_not_found.isNotFound(err)) beforeLoadNotFound = err;
518
- else if (!inner.preload) throw err;
519
- break;
520
- }
521
- if (inner.serialError || inner.firstBadMatchIndex != null) break;
522
- }
523
- const baseMaxIndexExclusive = inner.firstBadMatchIndex ?? inner.matches.length;
524
- const boundaryIndex = beforeLoadNotFound && !inner.preload ? getNotFoundBoundaryIndex(inner, beforeLoadNotFound) : void 0;
525
- const maxIndexExclusive = beforeLoadNotFound && inner.preload ? 0 : boundaryIndex !== void 0 ? Math.min(boundaryIndex + 1, baseMaxIndexExclusive) : baseMaxIndexExclusive;
526
- let firstNotFound;
527
- let firstUnhandledRejection;
528
- for (let i = 0; i < maxIndexExclusive; i++) matchPromises.push(loadRouteMatch(inner, matchPromises, i));
529
- try {
530
- await Promise.all(matchPromises);
531
- } catch {
532
- const settled = await Promise.allSettled(matchPromises);
533
- for (const result of settled) {
534
- if (result.status !== "rejected") continue;
535
- const reason = result.reason;
536
- if (require_redirect.isRedirect(reason)) throw reason;
537
- if (require_not_found.isNotFound(reason)) firstNotFound ??= reason;
538
- else firstUnhandledRejection ??= reason;
539
- }
540
- if (firstUnhandledRejection !== void 0) throw firstUnhandledRejection;
541
- }
542
- const notFoundToThrow = firstNotFound ?? (beforeLoadNotFound && !inner.preload ? beforeLoadNotFound : void 0);
543
- let headMaxIndex = inner.firstBadMatchIndex !== void 0 ? inner.firstBadMatchIndex : inner.matches.length - 1;
544
- if (!notFoundToThrow && beforeLoadNotFound && inner.preload) return inner.matches;
545
- if (notFoundToThrow) {
546
- const renderedBoundaryIndex = getNotFoundBoundaryIndex(inner, notFoundToThrow);
547
- if (renderedBoundaryIndex === void 0) {
548
- if (process.env.NODE_ENV !== "production") throw new Error("Invariant failed: Could not find match for notFound boundary");
549
- require_invariant.invariant();
550
- }
551
- const boundaryMatch = inner.matches[renderedBoundaryIndex];
552
- const boundaryRoute = inner.router.looseRoutesById[boundaryMatch.routeId];
553
- const defaultNotFoundComponent = inner.router.options?.defaultNotFoundComponent;
554
- if (!boundaryRoute.options.notFoundComponent && defaultNotFoundComponent) boundaryRoute.options.notFoundComponent = defaultNotFoundComponent;
555
- notFoundToThrow.routeId = boundaryMatch.routeId;
556
- const boundaryIsRoot = boundaryMatch.routeId === inner.router.routeTree.id;
557
- inner.updateMatch(boundaryMatch.id, (prev) => ({
558
- ...prev,
559
- ...boundaryIsRoot ? {
560
- status: "success",
561
- globalNotFound: true,
562
- error: void 0
563
- } : {
564
- status: "notFound",
565
- error: notFoundToThrow
566
- },
567
- isFetching: false
568
- }));
569
- headMaxIndex = renderedBoundaryIndex;
570
- await loadRouteChunk(boundaryRoute, ["notFoundComponent"]);
571
- } else if (!inner.preload) {
572
- const rootMatch = inner.matches[0];
573
- if (!rootMatch.globalNotFound) {
574
- if (inner.router.getMatch(rootMatch.id)?.globalNotFound) inner.updateMatch(rootMatch.id, (prev) => ({
575
- ...prev,
576
- globalNotFound: false,
577
- error: void 0
578
- }));
579
- }
580
- }
581
- if (inner.serialError && inner.firstBadMatchIndex !== void 0) {
582
- const errorRoute = inner.router.looseRoutesById[inner.matches[inner.firstBadMatchIndex].routeId];
583
- await loadRouteChunk(errorRoute, ["errorComponent"]);
584
- }
585
- for (let i = 0; i <= headMaxIndex; i++) {
586
- const { id: matchId, routeId } = inner.matches[i];
587
- const route = inner.router.looseRoutesById[routeId];
588
- try {
589
- const headResult = executeHead(inner, matchId, route);
590
- if (headResult) {
591
- const head = await headResult;
592
- inner.updateMatch(matchId, (prev) => ({
593
- ...prev,
594
- ...head
595
- }));
596
- }
597
- } catch (err) {
598
- console.error(`Error executing head for route ${routeId}:`, err);
599
- }
600
- }
601
- const readyPromise = triggerOnReady(inner);
602
- if (require_utils.isPromise(readyPromise)) await readyPromise;
603
- if (notFoundToThrow) throw notFoundToThrow;
604
- if (inner.serialError && !inner.preload && !inner.onReady) throw inner.serialError;
605
- return inner.matches;
606
- }
607
- function preloadRouteComponents(route, componentTypesToLoad) {
608
- const preloads = componentTypesToLoad.map((type) => route.options[type]?.preload?.()).filter(Boolean);
609
- if (preloads.length === 0) return void 0;
610
- return Promise.all(preloads);
611
- }
612
- function loadRouteChunk(route, componentTypesToLoad = componentTypes) {
613
- if (!route._lazyLoaded && route._lazyPromise === void 0) if (route.lazyFn) route._lazyPromise = route.lazyFn().then((lazyRoute) => {
614
- const { id: _id, ...options } = lazyRoute.options;
615
- Object.assign(route.options, options);
616
- route._lazyLoaded = true;
617
- route._lazyPromise = void 0;
618
- });
619
- else route._lazyLoaded = true;
620
- const runAfterLazy = () => route._componentsLoaded ? void 0 : componentTypesToLoad === componentTypes ? (() => {
621
- if (route._componentsPromise === void 0) {
622
- const componentsPromise = preloadRouteComponents(route, componentTypes);
623
- if (componentsPromise) route._componentsPromise = componentsPromise.then(() => {
624
- route._componentsLoaded = true;
625
- route._componentsPromise = void 0;
626
- });
627
- else route._componentsLoaded = true;
628
- }
629
- return route._componentsPromise;
630
- })() : preloadRouteComponents(route, componentTypesToLoad);
631
- return route._lazyPromise ? route._lazyPromise.then(runAfterLazy) : runAfterLazy();
632
- }
633
- function makeMaybe(value, error) {
634
- if (error) return {
635
- status: "error",
636
- error
637
- };
638
- return {
639
- status: "success",
640
- value
641
- };
642
- }
643
- function routeNeedsPreload(route) {
644
- for (const componentType of componentTypes) if (route.options[componentType]?.preload) return true;
645
- return false;
646
- }
647
- const componentTypes = [
648
- "component",
649
- "errorComponent",
650
- "pendingComponent",
651
- "notFoundComponent"
652
- ];
653
- //#endregion
654
- exports.loadMatches = loadMatches;
655
- exports.loadRouteChunk = loadRouteChunk;
656
- exports.routeNeedsPreload = routeNeedsPreload;
657
-
658
- //# sourceMappingURL=load-matches.cjs.map