@tanstack/router-core 1.154.13 → 1.154.14
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/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/location.d.cts +0 -27
- package/dist/cjs/router.cjs +69 -205
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +5 -37
- package/dist/cjs/scroll-restoration.cjs +2 -2
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/location.d.ts +0 -27
- package/dist/esm/router.d.ts +5 -37
- package/dist/esm/router.js +69 -205
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/scroll-restoration.js +2 -2
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -5
- package/src/location.ts +0 -35
- package/src/router.ts +83 -330
- package/src/scroll-restoration.ts +2 -2
package/dist/esm/router.js
CHANGED
|
@@ -47,6 +47,7 @@ class RouterCore {
|
|
|
47
47
|
this.tempLocationKey = `${Math.round(
|
|
48
48
|
Math.random() * 1e7
|
|
49
49
|
)}`;
|
|
50
|
+
this.resetNextScroll = true;
|
|
50
51
|
this.shouldViewTransition = void 0;
|
|
51
52
|
this.isViewTransitionTypesSupported = void 0;
|
|
52
53
|
this.subscribers = /* @__PURE__ */ new Set();
|
|
@@ -248,9 +249,9 @@ class RouterCore {
|
|
|
248
249
|
search: locationSearchOrOpts
|
|
249
250
|
},
|
|
250
251
|
opts
|
|
251
|
-
)
|
|
252
|
+
);
|
|
252
253
|
}
|
|
253
|
-
return this.matchRoutesInternal(pathnameOrNext, locationSearchOrOpts)
|
|
254
|
+
return this.matchRoutesInternal(pathnameOrNext, locationSearchOrOpts);
|
|
254
255
|
};
|
|
255
256
|
this.getMatchedRoutes = (pathname) => {
|
|
256
257
|
return getMatchedRoutes({
|
|
@@ -316,14 +317,12 @@ class RouterCore {
|
|
|
316
317
|
}).interpolatedPath;
|
|
317
318
|
const destMatchResult = this.getMatchedRoutes(interpolatedNextTo);
|
|
318
319
|
let destRoutes = destMatchResult.matchedRoutes;
|
|
319
|
-
const rawParams = destMatchResult.routeParams;
|
|
320
320
|
const isGlobalNotFound = destMatchResult.foundRoute ? destMatchResult.foundRoute.path !== "/" && destMatchResult.routeParams["**"] : trimPathRight(interpolatedNextTo);
|
|
321
|
-
let globalNotFoundRouteId;
|
|
322
321
|
if (isGlobalNotFound) {
|
|
323
322
|
if (this.options.notFoundRoute) {
|
|
324
323
|
destRoutes = [...destRoutes, this.options.notFoundRoute];
|
|
325
324
|
} else {
|
|
326
|
-
|
|
325
|
+
findGlobalNotFoundRouteId(
|
|
327
326
|
this.options.notFoundMode,
|
|
328
327
|
destRoutes
|
|
329
328
|
);
|
|
@@ -379,31 +378,19 @@ class RouterCore {
|
|
|
379
378
|
const hashStr = hash ? `#${hash}` : "";
|
|
380
379
|
let nextState = dest.state === true ? currentLocation.state : dest.state ? functionalUpdate(dest.state, currentLocation.state) : {};
|
|
381
380
|
nextState = replaceEqualDeep(currentLocation.state, nextState);
|
|
382
|
-
const snapshotParams = {
|
|
383
|
-
...rawParams,
|
|
384
|
-
...nextParams
|
|
385
|
-
};
|
|
386
|
-
const matchSnapshot = buildMatchSnapshotFromRoutes({
|
|
387
|
-
routes: destRoutes,
|
|
388
|
-
params: snapshotParams,
|
|
389
|
-
searchStr,
|
|
390
|
-
globalNotFoundRouteId
|
|
391
|
-
});
|
|
392
381
|
const fullPath = `${nextPathname}${searchStr}${hashStr}`;
|
|
393
382
|
const url = new URL(fullPath, this.origin);
|
|
394
383
|
const rewrittenUrl = executeRewriteOutput(this.rewrite, url);
|
|
395
|
-
const encodedHref = url.href.replace(url.origin, "");
|
|
396
384
|
return {
|
|
397
385
|
publicHref: rewrittenUrl.pathname + rewrittenUrl.search + rewrittenUrl.hash,
|
|
398
|
-
href:
|
|
386
|
+
href: fullPath,
|
|
399
387
|
url: rewrittenUrl,
|
|
400
388
|
pathname: nextPathname,
|
|
401
389
|
search: nextSearch,
|
|
402
390
|
searchStr,
|
|
403
391
|
state: nextState,
|
|
404
392
|
hash: hash ?? "",
|
|
405
|
-
unmaskOnReload: dest.unmaskOnReload
|
|
406
|
-
_matchSnapshot: matchSnapshot
|
|
393
|
+
unmaskOnReload: dest.unmaskOnReload
|
|
407
394
|
};
|
|
408
395
|
};
|
|
409
396
|
const buildWithMatches = (dest = {}, maskedDest) => {
|
|
@@ -475,73 +462,53 @@ class RouterCore {
|
|
|
475
462
|
});
|
|
476
463
|
if (isSameUrl && isSameState()) {
|
|
477
464
|
this.load();
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
465
|
+
} else {
|
|
466
|
+
let {
|
|
467
|
+
// eslint-disable-next-line prefer-const
|
|
468
|
+
maskedLocation,
|
|
469
|
+
// eslint-disable-next-line prefer-const
|
|
470
|
+
hashScrollIntoView,
|
|
471
|
+
// don't pass url into history since it is a URL instance that cannot be serialized
|
|
472
|
+
// eslint-disable-next-line prefer-const
|
|
473
|
+
url: _url,
|
|
474
|
+
...nextHistory
|
|
475
|
+
} = next;
|
|
476
|
+
if (maskedLocation) {
|
|
477
|
+
nextHistory = {
|
|
478
|
+
...maskedLocation,
|
|
479
|
+
state: {
|
|
480
|
+
...maskedLocation.state,
|
|
481
|
+
__tempKey: void 0,
|
|
482
|
+
__tempLocation: {
|
|
483
|
+
...nextHistory,
|
|
484
|
+
search: nextHistory.searchStr,
|
|
485
|
+
state: {
|
|
486
|
+
...nextHistory.state,
|
|
487
|
+
__tempKey: void 0,
|
|
488
|
+
__tempLocation: void 0,
|
|
489
|
+
__TSR_key: void 0,
|
|
490
|
+
key: void 0
|
|
491
|
+
// TODO: Remove in v2 - use __TSR_key instead
|
|
492
|
+
}
|
|
506
493
|
}
|
|
507
494
|
}
|
|
495
|
+
};
|
|
496
|
+
if (nextHistory.unmaskOnReload ?? this.options.unmaskOnReload ?? false) {
|
|
497
|
+
nextHistory.state.__tempKey = this.tempLocationKey;
|
|
508
498
|
}
|
|
509
|
-
};
|
|
510
|
-
if (nextHistory.unmaskOnReload ?? this.options.unmaskOnReload ?? false) {
|
|
511
|
-
nextHistory.state.__tempKey = this.tempLocationKey;
|
|
512
499
|
}
|
|
500
|
+
nextHistory.state.__hashScrollIntoViewOptions = hashScrollIntoView ?? this.options.defaultHashScrollIntoView ?? true;
|
|
501
|
+
this.shouldViewTransition = viewTransition;
|
|
502
|
+
this.history[next.replace ? "replace" : "push"](
|
|
503
|
+
nextHistory.publicHref,
|
|
504
|
+
nextHistory.state,
|
|
505
|
+
{ ignoreBlocker }
|
|
506
|
+
);
|
|
513
507
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
nextHistory.state.__TSR_sessionId = this.sessionId;
|
|
518
|
-
nextHistory.state.__TSR_matches = next._matchSnapshot ?? buildMatchSnapshot({
|
|
519
|
-
matchResult: this.getMatchedRoutes(next.pathname),
|
|
520
|
-
pathname: next.pathname,
|
|
521
|
-
searchStr: next.searchStr,
|
|
522
|
-
notFoundRoute: this.options.notFoundRoute,
|
|
523
|
-
notFoundMode: this.options.notFoundMode
|
|
524
|
-
});
|
|
525
|
-
const precomputedLocation = {
|
|
526
|
-
...next,
|
|
527
|
-
publicHref: nextHistory.publicHref,
|
|
528
|
-
state: nextHistory.state,
|
|
529
|
-
maskedLocation
|
|
530
|
-
};
|
|
531
|
-
const result = await this.history[next.replace ? "replace" : "push"](
|
|
532
|
-
nextHistory.publicHref,
|
|
533
|
-
nextHistory.state,
|
|
534
|
-
{ ignoreBlocker, skipTransitionerLoad: true }
|
|
535
|
-
);
|
|
536
|
-
if (result.type === "BLOCKED") {
|
|
537
|
-
this.commitLocationPromise?.resolve();
|
|
538
|
-
return this.commitLocationPromise;
|
|
539
|
-
}
|
|
540
|
-
if (this.history.location.href !== nextHistory.publicHref) {
|
|
541
|
-
return this.commitLocationPromise;
|
|
508
|
+
this.resetNextScroll = next.resetScroll ?? true;
|
|
509
|
+
if (!this.history.subscribers.size) {
|
|
510
|
+
this.load();
|
|
542
511
|
}
|
|
543
|
-
this.latestLocation = precomputedLocation;
|
|
544
|
-
this.load({ _skipUpdateLatestLocation: true });
|
|
545
512
|
return this.commitLocationPromise;
|
|
546
513
|
};
|
|
547
514
|
this.buildAndCommitLocation = ({
|
|
@@ -648,11 +615,9 @@ class RouterCore {
|
|
|
648
615
|
_isNavigate: true
|
|
649
616
|
});
|
|
650
617
|
};
|
|
651
|
-
this.beforeLoad = (
|
|
618
|
+
this.beforeLoad = () => {
|
|
652
619
|
this.cancelMatches();
|
|
653
|
-
|
|
654
|
-
this.updateLatestLocation();
|
|
655
|
-
}
|
|
620
|
+
this.updateLatestLocation();
|
|
656
621
|
if (this.isServer) {
|
|
657
622
|
const nextLocation = this.buildLocation({
|
|
658
623
|
to: this.latestLocation.pathname,
|
|
@@ -667,8 +632,7 @@ class RouterCore {
|
|
|
667
632
|
throw redirect({ href });
|
|
668
633
|
}
|
|
669
634
|
}
|
|
670
|
-
const
|
|
671
|
-
const pendingMatches = this.matchRoutes(this.latestLocation, { snapshot });
|
|
635
|
+
const pendingMatches = this.matchRoutes(this.latestLocation);
|
|
672
636
|
this.__store.setState((s) => ({
|
|
673
637
|
...s,
|
|
674
638
|
status: "pending",
|
|
@@ -689,9 +653,7 @@ class RouterCore {
|
|
|
689
653
|
loadPromise = new Promise((resolve) => {
|
|
690
654
|
this.startTransition(async () => {
|
|
691
655
|
try {
|
|
692
|
-
this.beforeLoad(
|
|
693
|
-
_skipUpdateLatestLocation: opts?._skipUpdateLatestLocation
|
|
694
|
-
});
|
|
656
|
+
this.beforeLoad();
|
|
695
657
|
const next = this.latestLocation;
|
|
696
658
|
const prevLocation = this.state.resolvedLocation;
|
|
697
659
|
if (!this.state.redirect) {
|
|
@@ -1048,7 +1010,6 @@ class RouterCore {
|
|
|
1048
1010
|
(d) => d.status === "notFound" || d.globalNotFound
|
|
1049
1011
|
);
|
|
1050
1012
|
};
|
|
1051
|
-
this.sessionId = typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1052
1013
|
this.update({
|
|
1053
1014
|
defaultPreloadDelay: 50,
|
|
1054
1015
|
defaultPendingMs: 1e3,
|
|
@@ -1077,57 +1038,33 @@ class RouterCore {
|
|
|
1077
1038
|
return this.routesById;
|
|
1078
1039
|
}
|
|
1079
1040
|
matchRoutesInternal(next, opts) {
|
|
1080
|
-
const
|
|
1081
|
-
const
|
|
1082
|
-
let matchedRoutes;
|
|
1083
|
-
let
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
const { foundRoute, routeParams: rp } = matchedRoutesResult;
|
|
1096
|
-
routeParams = rp;
|
|
1097
|
-
rawParams = { ...rp };
|
|
1098
|
-
matchedRoutes = matchedRoutesResult.matchedRoutes;
|
|
1099
|
-
parsedParams = matchedRoutesResult.parsedParams;
|
|
1100
|
-
let isGlobalNotFound = false;
|
|
1101
|
-
if (
|
|
1102
|
-
// If we found a route, and it's not an index route and we have left over path
|
|
1103
|
-
foundRoute ? foundRoute.path !== "/" && routeParams["**"] : (
|
|
1104
|
-
// Or if we didn't find a route and we have left over path
|
|
1105
|
-
trimPathRight(next.pathname)
|
|
1106
|
-
)
|
|
1107
|
-
) {
|
|
1108
|
-
if (this.options.notFoundRoute) {
|
|
1109
|
-
matchedRoutes = [...matchedRoutes, this.options.notFoundRoute];
|
|
1110
|
-
} else {
|
|
1111
|
-
isGlobalNotFound = true;
|
|
1112
|
-
}
|
|
1041
|
+
const matchedRoutesResult = this.getMatchedRoutes(next.pathname);
|
|
1042
|
+
const { foundRoute, routeParams, parsedParams } = matchedRoutesResult;
|
|
1043
|
+
let { matchedRoutes } = matchedRoutesResult;
|
|
1044
|
+
let isGlobalNotFound = false;
|
|
1045
|
+
if (
|
|
1046
|
+
// If we found a route, and it's not an index route and we have left over path
|
|
1047
|
+
foundRoute ? foundRoute.path !== "/" && routeParams["**"] : (
|
|
1048
|
+
// Or if we didn't find a route and we have left over path
|
|
1049
|
+
trimPathRight(next.pathname)
|
|
1050
|
+
)
|
|
1051
|
+
) {
|
|
1052
|
+
if (this.options.notFoundRoute) {
|
|
1053
|
+
matchedRoutes = [...matchedRoutes, this.options.notFoundRoute];
|
|
1054
|
+
} else {
|
|
1055
|
+
isGlobalNotFound = true;
|
|
1113
1056
|
}
|
|
1114
|
-
globalNotFoundRouteId = isGlobalNotFound ? findGlobalNotFoundRouteId(this.options.notFoundMode, matchedRoutes) : void 0;
|
|
1115
1057
|
}
|
|
1058
|
+
const globalNotFoundRouteId = isGlobalNotFound ? findGlobalNotFoundRouteId(this.options.notFoundMode, matchedRoutes) : void 0;
|
|
1116
1059
|
const matches = [];
|
|
1117
1060
|
const getParentContext = (parentMatch) => {
|
|
1118
1061
|
const parentMatchId = parentMatch?.id;
|
|
1119
1062
|
const parentContext = !parentMatchId ? this.options.context ?? void 0 : parentMatch.context ?? this.options.context ?? void 0;
|
|
1120
1063
|
return parentContext;
|
|
1121
1064
|
};
|
|
1122
|
-
const canUseCachedSearch = snapshotValid && snapshot.searchStr === next.searchStr && snapshot.validatedSearches?.length === matchedRoutes.length;
|
|
1123
|
-
const validatedSearchesToCache = [];
|
|
1124
1065
|
matchedRoutes.forEach((route, index) => {
|
|
1125
1066
|
const parentMatch = matches[index - 1];
|
|
1126
1067
|
const [preMatchSearch, strictMatchSearch, searchError] = (() => {
|
|
1127
|
-
if (canUseCachedSearch) {
|
|
1128
|
-
const cached = snapshot.validatedSearches[index];
|
|
1129
|
-
return [cached.search, cached.strictSearch, void 0];
|
|
1130
|
-
}
|
|
1131
1068
|
const parentSearch = parentMatch?.search ?? next.search;
|
|
1132
1069
|
const parentStrictSearch = parentMatch?._strictSearch ?? void 0;
|
|
1133
1070
|
try {
|
|
@@ -1153,12 +1090,6 @@ class RouterCore {
|
|
|
1153
1090
|
return [parentSearch, {}, searchParamError];
|
|
1154
1091
|
}
|
|
1155
1092
|
})();
|
|
1156
|
-
if (!canUseCachedSearch) {
|
|
1157
|
-
validatedSearchesToCache.push({
|
|
1158
|
-
search: preMatchSearch,
|
|
1159
|
-
strictSearch: strictMatchSearch
|
|
1160
|
-
});
|
|
1161
|
-
}
|
|
1162
1093
|
const loaderDeps = route.options.loaderDeps?.({
|
|
1163
1094
|
search: preMatchSearch
|
|
1164
1095
|
}) ?? "";
|
|
@@ -1272,13 +1203,6 @@ class RouterCore {
|
|
|
1272
1203
|
};
|
|
1273
1204
|
matches.push(match);
|
|
1274
1205
|
});
|
|
1275
|
-
if (!canUseCachedSearch && validatedSearchesToCache.length > 0) {
|
|
1276
|
-
const existingSnapshot = next.state?.__TSR_matches;
|
|
1277
|
-
if (existingSnapshot) {
|
|
1278
|
-
existingSnapshot.searchStr = next.searchStr;
|
|
1279
|
-
existingSnapshot.validatedSearches = validatedSearchesToCache;
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
1206
|
matches.forEach((match, index) => {
|
|
1283
1207
|
const route = this.looseRoutesById[match.routeId];
|
|
1284
1208
|
const existingMatch = this.getMatch(match.id);
|
|
@@ -1307,7 +1231,7 @@ class RouterCore {
|
|
|
1307
1231
|
};
|
|
1308
1232
|
}
|
|
1309
1233
|
});
|
|
1310
|
-
return
|
|
1234
|
+
return matches;
|
|
1311
1235
|
}
|
|
1312
1236
|
}
|
|
1313
1237
|
class SearchParamError extends Error {
|
|
@@ -1366,7 +1290,7 @@ function getMatchedRoutes({
|
|
|
1366
1290
|
const routeParams = {};
|
|
1367
1291
|
const trimmedPath = trimPathRight(pathname);
|
|
1368
1292
|
let foundRoute = void 0;
|
|
1369
|
-
let parsedParams =
|
|
1293
|
+
let parsedParams = void 0;
|
|
1370
1294
|
const match = findRouteMatch(trimmedPath, processedTree, true);
|
|
1371
1295
|
if (match) {
|
|
1372
1296
|
foundRoute = match.route;
|
|
@@ -1376,64 +1300,6 @@ function getMatchedRoutes({
|
|
|
1376
1300
|
const matchedRoutes = match?.branch || [routesById[rootRouteId]];
|
|
1377
1301
|
return { matchedRoutes, routeParams, foundRoute, parsedParams };
|
|
1378
1302
|
}
|
|
1379
|
-
function buildMatchSnapshot({
|
|
1380
|
-
matchResult,
|
|
1381
|
-
pathname,
|
|
1382
|
-
searchStr,
|
|
1383
|
-
notFoundRoute,
|
|
1384
|
-
notFoundMode
|
|
1385
|
-
}) {
|
|
1386
|
-
const snapshot = {
|
|
1387
|
-
routeIds: matchResult.matchedRoutes.map((r) => r.id),
|
|
1388
|
-
params: matchResult.routeParams,
|
|
1389
|
-
parsedParams: matchResult.parsedParams,
|
|
1390
|
-
searchStr
|
|
1391
|
-
};
|
|
1392
|
-
const isGlobalNotFound = matchResult.foundRoute ? matchResult.foundRoute.path !== "/" && matchResult.routeParams["**"] : trimPathRight(pathname);
|
|
1393
|
-
if (isGlobalNotFound) {
|
|
1394
|
-
if (notFoundRoute) {
|
|
1395
|
-
snapshot.globalNotFoundRouteId = notFoundRoute.id;
|
|
1396
|
-
} else {
|
|
1397
|
-
if (notFoundMode !== "root") {
|
|
1398
|
-
for (let i = matchResult.matchedRoutes.length - 1; i >= 0; i--) {
|
|
1399
|
-
const route = matchResult.matchedRoutes[i];
|
|
1400
|
-
if (route.children) {
|
|
1401
|
-
snapshot.globalNotFoundRouteId = route.id;
|
|
1402
|
-
break;
|
|
1403
|
-
}
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
if (!snapshot.globalNotFoundRouteId) {
|
|
1407
|
-
snapshot.globalNotFoundRouteId = rootRouteId;
|
|
1408
|
-
}
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
return snapshot;
|
|
1412
|
-
}
|
|
1413
|
-
function buildMatchSnapshotFromRoutes({
|
|
1414
|
-
routes,
|
|
1415
|
-
params,
|
|
1416
|
-
searchStr,
|
|
1417
|
-
globalNotFoundRouteId
|
|
1418
|
-
}) {
|
|
1419
|
-
const stringParams = {};
|
|
1420
|
-
for (const key in params) {
|
|
1421
|
-
const value = params[key];
|
|
1422
|
-
if (value != null) {
|
|
1423
|
-
stringParams[key] = String(value);
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
|
-
const snapshot = {
|
|
1427
|
-
routeIds: routes.map((r) => r.id),
|
|
1428
|
-
params: stringParams,
|
|
1429
|
-
parsedParams: params,
|
|
1430
|
-
searchStr
|
|
1431
|
-
};
|
|
1432
|
-
if (globalNotFoundRouteId) {
|
|
1433
|
-
snapshot.globalNotFoundRouteId = globalNotFoundRouteId;
|
|
1434
|
-
}
|
|
1435
|
-
return snapshot;
|
|
1436
|
-
}
|
|
1437
1303
|
function applySearchMiddleware({
|
|
1438
1304
|
search,
|
|
1439
1305
|
dest,
|
|
@@ -1533,8 +1399,6 @@ export {
|
|
|
1533
1399
|
PathParamError,
|
|
1534
1400
|
RouterCore,
|
|
1535
1401
|
SearchParamError,
|
|
1536
|
-
buildMatchSnapshot,
|
|
1537
|
-
buildMatchSnapshotFromRoutes,
|
|
1538
1402
|
defaultSerializeError,
|
|
1539
1403
|
getInitialRouterState,
|
|
1540
1404
|
getLocationChangeInfo,
|