@tanstack/react-router 1.24.0 → 1.26.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.
package/src/link.tsx CHANGED
@@ -76,9 +76,11 @@ export type Last<T extends Array<any>> = T extends [...infer _, infer L]
76
76
  ? L
77
77
  : never
78
78
 
79
- export type RemoveTrailingSlashes<T> = T extends `${infer R}/`
80
- ? RemoveTrailingSlashes<R>
81
- : T
79
+ export type RemoveTrailingSlashes<T> = T extends '/'
80
+ ? T
81
+ : T extends `${infer R}/`
82
+ ? RemoveTrailingSlashes<R>
83
+ : T
82
84
 
83
85
  export type RemoveLeadingSlashes<T> = T extends `/${infer R}`
84
86
  ? RemoveLeadingSlashes<R>
@@ -409,7 +411,7 @@ export function useLinkProps<
409
411
  // null for LinkUtils
410
412
 
411
413
  const dest = {
412
- from: options.to ? matchPathname : undefined,
414
+ ...(options.to && { from: matchPathname }),
413
415
  ...options,
414
416
  }
415
417
 
@@ -548,6 +550,20 @@ export function useLinkProps<
548
550
  const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =
549
551
  isActive ? {} : functionalUpdate(inactiveProps, {})
550
552
 
553
+ const resolvedClassName = [
554
+ className,
555
+ resolvedActiveProps.className,
556
+ resolvedInactiveProps.className,
557
+ ]
558
+ .filter(Boolean)
559
+ .join(' ')
560
+
561
+ const resolvedStyle = {
562
+ ...style,
563
+ ...resolvedActiveProps.style,
564
+ ...resolvedInactiveProps.style,
565
+ }
566
+
551
567
  return {
552
568
  ...resolvedActiveProps,
553
569
  ...resolvedInactiveProps,
@@ -563,26 +579,13 @@ export function useLinkProps<
563
579
  onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),
564
580
  onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),
565
581
  target,
566
- style: {
567
- ...style,
568
- ...resolvedActiveProps.style,
569
- ...resolvedInactiveProps.style,
570
- },
571
- className:
572
- [
573
- className,
574
- resolvedActiveProps.className,
575
- resolvedInactiveProps.className,
576
- ]
577
- .filter(Boolean)
578
- .join(' ') || undefined,
579
- ...(disabled
580
- ? {
581
- role: 'link',
582
- 'aria-disabled': true,
583
- }
584
- : undefined),
585
- ['data-status']: isActive ? 'active' : undefined,
582
+ ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),
583
+ ...(resolvedClassName && { className: resolvedClassName }),
584
+ ...(disabled && {
585
+ role: 'link',
586
+ 'aria-disabled': true,
587
+ }),
588
+ ...(isActive && { 'data-status': 'active' }),
586
589
  }
587
590
  }
588
591
 
package/src/route.ts CHANGED
@@ -1256,12 +1256,14 @@ export function createRouteMask<
1256
1256
  */
1257
1257
  export type ErrorRouteProps = {
1258
1258
  error: unknown
1259
- info: { componentStack: string }
1259
+ info?: { componentStack: string }
1260
+ reset: () => void
1260
1261
  }
1261
1262
 
1262
1263
  export type ErrorComponentProps = {
1263
1264
  error: unknown
1264
- info: { componentStack: string }
1265
+ info?: { componentStack: string }
1266
+ reset: () => void
1265
1267
  }
1266
1268
  export type NotFoundRouteProps = {
1267
1269
  // TODO: Make sure this is `| null | undefined` (this is for global not-founds)
package/src/router.ts CHANGED
@@ -40,9 +40,9 @@ import type {
40
40
  AnyContext,
41
41
  AnyRoute,
42
42
  AnySearchSchema,
43
+ ErrorRouteComponent,
43
44
  LoaderFnContext,
44
45
  NotFoundRouteComponent,
45
- Route,
46
46
  RouteMask,
47
47
  } from './route'
48
48
  import type {
@@ -122,7 +122,7 @@ export interface RouterOptions<
122
122
  defaultPreload?: false | 'intent'
123
123
  defaultPreloadDelay?: number
124
124
  defaultComponent?: RouteComponent
125
- defaultErrorComponent?: RouteComponent
125
+ defaultErrorComponent?: ErrorRouteComponent
126
126
  defaultPendingComponent?: RouteComponent
127
127
  defaultPendingMs?: number
128
128
  defaultPendingMinMs?: number
@@ -1545,9 +1545,10 @@ export class Router<
1545
1545
  }
1546
1546
 
1547
1547
  invalidate = () => {
1548
- const invalidate = (d: any) => ({
1548
+ const invalidate = (d: RouteMatch<TRouteTree>) => ({
1549
1549
  ...d,
1550
1550
  invalid: true,
1551
+ ...(d.status === 'error' ? ({ status: 'pending' } as const) : {}),
1551
1552
  })
1552
1553
 
1553
1554
  this.__store.setState((s) => ({
@@ -1557,7 +1558,7 @@ export class Router<
1557
1558
  pendingMatches: s.pendingMatches?.map(invalidate),
1558
1559
  }))
1559
1560
 
1560
- this.load()
1561
+ return this.load()
1561
1562
  }
1562
1563
 
1563
1564
  load = async (): Promise<void> => {