@tanstack/solid-router 1.131.27 → 1.131.29

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 (39) hide show
  1. package/dist/cjs/Matches.cjs +22 -18
  2. package/dist/cjs/Matches.cjs.map +1 -1
  3. package/dist/cjs/RouterProvider.cjs +9 -9
  4. package/dist/cjs/RouterProvider.cjs.map +1 -1
  5. package/dist/cjs/link.cjs +13 -9
  6. package/dist/cjs/link.cjs.map +1 -1
  7. package/dist/cjs/useActiveLocation.cjs +40 -0
  8. package/dist/cjs/useActiveLocation.cjs.map +1 -0
  9. package/dist/cjs/useActiveLocation.d.cts +8 -0
  10. package/dist/cjs/useNavigate.cjs +9 -10
  11. package/dist/cjs/useNavigate.cjs.map +1 -1
  12. package/dist/esm/Matches.js +16 -12
  13. package/dist/esm/Matches.js.map +1 -1
  14. package/dist/esm/RouterProvider.js +9 -9
  15. package/dist/esm/RouterProvider.js.map +1 -1
  16. package/dist/esm/link.js +13 -9
  17. package/dist/esm/link.js.map +1 -1
  18. package/dist/esm/useActiveLocation.d.ts +8 -0
  19. package/dist/esm/useActiveLocation.js +40 -0
  20. package/dist/esm/useActiveLocation.js.map +1 -0
  21. package/dist/esm/useNavigate.js +9 -10
  22. package/dist/esm/useNavigate.js.map +1 -1
  23. package/dist/source/Matches.jsx +11 -7
  24. package/dist/source/Matches.jsx.map +1 -1
  25. package/dist/source/RouterProvider.jsx +7 -7
  26. package/dist/source/RouterProvider.jsx.map +1 -1
  27. package/dist/source/link.jsx +10 -11
  28. package/dist/source/link.jsx.map +1 -1
  29. package/dist/source/useActiveLocation.d.ts +8 -0
  30. package/dist/source/useActiveLocation.js +33 -0
  31. package/dist/source/useActiveLocation.js.map +1 -0
  32. package/dist/source/useNavigate.jsx +7 -10
  33. package/dist/source/useNavigate.jsx.map +1 -1
  34. package/package.json +2 -2
  35. package/src/Matches.tsx +18 -16
  36. package/src/RouterProvider.tsx +9 -10
  37. package/src/link.tsx +11 -11
  38. package/src/useActiveLocation.ts +61 -0
  39. package/src/useNavigate.tsx +10 -11
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const Solid = require("solid-js/web");
4
- const Solid$1 = require("solid-js");
3
+ const Solid$1 = require("solid-js/web");
4
+ const Solid = require("solid-js");
5
5
  const warning = require("tiny-warning");
6
6
  const CatchBoundary = require("./CatchBoundary.cjs");
7
7
  const useRouterState = require("./useRouterState.cjs");
@@ -26,20 +26,23 @@ function _interopNamespaceDefault(e) {
26
26
  n.default = e;
27
27
  return Object.freeze(n);
28
28
  }
29
- const Solid__namespace = /* @__PURE__ */ _interopNamespaceDefault(Solid$1);
29
+ const Solid__namespace = /* @__PURE__ */ _interopNamespaceDefault(Solid);
30
30
  function Matches() {
31
31
  const router = useRouter.useRouter();
32
- const pendingElement = router.options.defaultPendingComponent ? Solid.createComponent(router.options.defaultPendingComponent, {}) : null;
33
32
  const ResolvedSuspense = router.isServer || typeof document !== "undefined" && router.ssr ? SafeFragment.SafeFragment : Solid__namespace.Suspense;
34
- const inner = Solid.createComponent(ResolvedSuspense, {
35
- fallback: pendingElement,
33
+ const OptionalWrapper = router.options.InnerWrap || SafeFragment.SafeFragment;
34
+ return Solid$1.createComponent(OptionalWrapper, {
36
35
  get children() {
37
- return [Solid.memo(() => Solid.memo(() => !!!router.isServer)() && Solid.createComponent(Transitioner.Transitioner, {})), Solid.createComponent(MatchesInner, {})];
36
+ return Solid$1.createComponent(ResolvedSuspense, {
37
+ get fallback() {
38
+ return Solid$1.memo(() => !!router.options.defaultPendingComponent)() ? Solid$1.createComponent(router.options.defaultPendingComponent, {}) : null;
39
+ },
40
+ get children() {
41
+ return [Solid$1.memo(() => Solid$1.memo(() => !!!router.isServer)() && Solid$1.createComponent(Transitioner.Transitioner, {})), Solid$1.createComponent(MatchesInner, {})];
42
+ }
43
+ });
38
44
  }
39
45
  });
40
- return router.options.InnerWrap ? Solid.createComponent(router.options.InnerWrap, {
41
- children: inner
42
- }) : inner;
43
46
  }
44
47
  function MatchesInner() {
45
48
  const router = useRouter.useRouter();
@@ -52,15 +55,16 @@ function MatchesInner() {
52
55
  const resetKey = useRouterState.useRouterState({
53
56
  select: (s) => s.loadedAt
54
57
  });
55
- const matchComponent = () => matchId() ? Solid.createComponent(Match.Match, {
56
- get matchId() {
57
- return matchId();
58
- }
59
- }) : null;
60
- return Solid.createComponent(matchContext.matchContext.Provider, {
58
+ const matchComponent = () => {
59
+ const id = matchId();
60
+ return id ? Solid$1.createComponent(Match.Match, {
61
+ matchId: id
62
+ }) : null;
63
+ };
64
+ return Solid$1.createComponent(matchContext.matchContext.Provider, {
61
65
  value: matchId,
62
66
  get children() {
63
- return Solid.memo(() => !!router.options.disableGlobalCatchBoundary)() ? matchComponent() : Solid.createComponent(CatchBoundary.CatchBoundary, {
67
+ return Solid$1.memo(() => !!router.options.disableGlobalCatchBoundary)() ? matchComponent() : Solid$1.createComponent(CatchBoundary.CatchBoundary, {
64
68
  getResetKey: () => resetKey(),
65
69
  errorComponent: CatchBoundary.ErrorComponent,
66
70
  onCatch: (error) => {
@@ -103,7 +107,7 @@ function MatchRoute(props) {
103
107
  const status = useRouterState.useRouterState({
104
108
  select: (s) => s.status
105
109
  });
106
- return Solid.createComponent(Solid__namespace.Show, {
110
+ return Solid$1.createComponent(Solid__namespace.Show, {
107
111
  get when() {
108
112
  return status();
109
113
  },
@@ -1 +1 @@
1
- {"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n styles?: Array<Solid.JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n {!router.isServer && <Transitioner />}\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n const matchComponent = () =>\n matchId() ? <Match matchId={matchId()!} /> : null\n\n return (\n <matchContext.Provider value={matchId}>\n {router.options.disableGlobalCatchBoundary ? (\n matchComponent()\n ) : (\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchComponent()}\n </CatchBoundary>\n )}\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","ssr","SafeFragment","Solid","Suspense","inner","fallback","children","_$memo","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchComponent","Match","matchContext","Provider","value","disableGlobalCatchBoundary","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
1
+ {"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n styles?: Array<Solid.JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Suspense\n\n const OptionalWrapper = router.options.InnerWrap || SafeFragment\n\n return (\n <OptionalWrapper>\n <ResolvedSuspense\n fallback={\n router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n }\n >\n {!router.isServer && <Transitioner />}\n <MatchesInner />\n </ResolvedSuspense>\n </OptionalWrapper>\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n const matchComponent = () => {\n const id = matchId()\n return id ? <Match matchId={id} /> : null\n }\n\n return (\n <matchContext.Provider value={matchId}>\n {router.options.disableGlobalCatchBoundary ? (\n matchComponent()\n ) : (\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchComponent()}\n </CatchBoundary>\n )}\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","ResolvedSuspense","isServer","document","ssr","SafeFragment","Solid","Suspense","OptionalWrapper","options","InnerWrap","_$createComponent","children","fallback","_$memo","defaultPendingComponent","Transitioner","MatchesInner","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchComponent","Match","matchContext","Provider","value","disableGlobalCatchBoundary","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Solid = require("solid-js/web");
4
4
  const Matches = require("./Matches.cjs");
5
5
  const routerContext = require("./routerContext.cjs");
6
+ const SafeFragment = require("./SafeFragment.cjs");
6
7
  function RouterContextProvider({
7
8
  router,
8
9
  children,
@@ -17,18 +18,17 @@ function RouterContextProvider({
17
18
  }
18
19
  });
19
20
  const routerContext$1 = routerContext.getRouterContext();
20
- const provider = Solid.createComponent(routerContext$1.Provider, {
21
- value: router,
21
+ const OptionalWrapper = router.options.Wrap || SafeFragment.SafeFragment;
22
+ return Solid.createComponent(OptionalWrapper, {
22
23
  get children() {
23
- return children();
24
+ return Solid.createComponent(routerContext$1.Provider, {
25
+ value: router,
26
+ get children() {
27
+ return children();
28
+ }
29
+ });
24
30
  }
25
31
  });
26
- if (router.options.Wrap) {
27
- return Solid.createComponent(router.options.Wrap, {
28
- children: provider
29
- });
30
- }
31
- return provider;
32
32
  }
33
33
  function RouterProvider({
34
34
  router,
@@ -1 +1 @@
1
- {"version":3,"file":"RouterProvider.cjs","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import { Matches } from './Matches'\nimport { getRouterContext } from './routerContext'\nimport type * as Solid from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterOptions,\n} from '@tanstack/router-core'\n\nexport function RouterContextProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({\n router,\n children,\n ...rest\n}: RouterProps<TRouter, TDehydrated> & {\n children: () => Solid.JSX.Element\n}) {\n // Allow the router to update options on the router instance\n router.update({\n ...router.options,\n ...rest,\n context: {\n ...router.options.context,\n ...rest.context,\n },\n } as any)\n\n const routerContext = getRouterContext()\n\n const provider = (\n <routerContext.Provider value={router as AnyRouter}>\n {children()}\n </routerContext.Provider>\n )\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{provider}</router.options.Wrap>\n }\n\n return provider\n}\n\nexport function RouterProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouter, TDehydrated>) {\n return (\n <RouterContextProvider router={router} {...rest}>\n {() => <Matches />}\n </RouterContextProvider>\n )\n}\n\nexport type RouterProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n false,\n TRouter['history'],\n TDehydrated\n >,\n 'context'\n> & {\n router: TRouter\n context?: Partial<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n false,\n TRouter['history'],\n TDehydrated\n >['context']\n >\n}\n"],"names":["RouterContextProvider","router","children","rest","update","options","context","routerContext","getRouterContext","provider","_$createComponent","Provider","value","Wrap","RouterProvider","_$mergeProps","Matches"],"mappings":";;;;;AASO,SAASA,sBAGd;AAAA,EACAC;AAAAA,EACAC;AAAAA,EACA,GAAGC;AAGL,GAAG;AAEDF,SAAOG,OAAO;AAAA,IACZ,GAAGH,OAAOI;AAAAA,IACV,GAAGF;AAAAA,IACHG,SAAS;AAAA,MACP,GAAGL,OAAOI,QAAQC;AAAAA,MAClB,GAAGH,KAAKG;AAAAA,IAAAA;AAAAA,EACV,CACM;AAER,QAAMC,kBAAgBC,cAAAA,iBAAiB;AAEjCC,QAAAA,WAAQC,MAAAA,gBACXH,gBAAcI,UAAQ;AAAA,IAACC,OAAOX;AAAAA,IAAmB,IAAAC,WAAA;AAAA,aAC/CA,SAAS;AAAA,IAAA;AAAA,EAAC,CAEd;AAEGD,MAAAA,OAAOI,QAAQQ,MAAM;AACvBH,WAAAA,sBAAQT,OAAOI,QAAQQ,MAAI;AAAA,MAAAX,UAAEO;AAAAA,IAAAA,CAAQ;AAAA,EAAA;AAGhCA,SAAAA;AACT;AAEO,SAASK,eAGd;AAAA,EAAEb;AAAAA,EAAQ,GAAGE;AAAwC,GAAG;AACxDO,SAAAA,MAAAA,gBACGV,uBAAqBe,iBAAA;AAAA,IAACd;AAAAA,KAAoBE,MAAI;AAAA,IAAAD,UAC5CA,MAAAQ,sBAAOM,QAAAA,SAAO,CAAA,CAAA;AAAA,EAAA,CAAG,CAAA;AAGxB;;;"}
1
+ {"version":3,"file":"RouterProvider.cjs","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import { Matches } from './Matches'\nimport { getRouterContext } from './routerContext'\nimport { SafeFragment } from './SafeFragment'\nimport type * as Solid from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterOptions,\n} from '@tanstack/router-core'\n\nexport function RouterContextProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({\n router,\n children,\n ...rest\n}: RouterProps<TRouter, TDehydrated> & {\n children: () => Solid.JSX.Element\n}) {\n // Allow the router to update options on the router instance\n router.update({\n ...router.options,\n ...rest,\n context: {\n ...router.options.context,\n ...rest.context,\n },\n } as any)\n\n const routerContext = getRouterContext()\n\n const OptionalWrapper = router.options.Wrap || SafeFragment\n\n return (\n <OptionalWrapper>\n <routerContext.Provider value={router as AnyRouter}>\n {children()}\n </routerContext.Provider>\n </OptionalWrapper>\n )\n}\n\nexport function RouterProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouter, TDehydrated>) {\n return (\n <RouterContextProvider router={router} {...rest}>\n {() => <Matches />}\n </RouterContextProvider>\n )\n}\n\nexport type RouterProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n false,\n TRouter['history'],\n TDehydrated\n >,\n 'context'\n> & {\n router: TRouter\n context?: Partial<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n false,\n TRouter['history'],\n TDehydrated\n >['context']\n >\n}\n"],"names":["RouterContextProvider","router","children","rest","update","options","context","routerContext","getRouterContext","OptionalWrapper","Wrap","SafeFragment","_$createComponent","Provider","value","RouterProvider","_$mergeProps","Matches"],"mappings":";;;;;;AAUO,SAASA,sBAGd;AAAA,EACAC;AAAAA,EACAC;AAAAA,EACA,GAAGC;AAGL,GAAG;AAEDF,SAAOG,OAAO;AAAA,IACZ,GAAGH,OAAOI;AAAAA,IACV,GAAGF;AAAAA,IACHG,SAAS;AAAA,MACP,GAAGL,OAAOI,QAAQC;AAAAA,MAClB,GAAGH,KAAKG;AAAAA,IAAAA;AAAAA,EACV,CACM;AAER,QAAMC,kBAAgBC,cAAAA,iBAAiB;AAEjCC,QAAAA,kBAAkBR,OAAOI,QAAQK,QAAQC,aAAAA;AAE/C,SAAAC,MAAAA,gBACGH,iBAAe;AAAA,IAAA,IAAAP,WAAA;AAAAU,aAAAA,MAAAA,gBACbL,gBAAcM,UAAQ;AAAA,QAACC,OAAOb;AAAAA,QAAmB,IAAAC,WAAA;AAAA,iBAC/CA,SAAS;AAAA,QAAA;AAAA,MAAC,CAAA;AAAA,IAAA;AAAA,EAAA,CAAA;AAInB;AAEO,SAASa,eAGd;AAAA,EAAEd;AAAAA,EAAQ,GAAGE;AAAwC,GAAG;AACxDS,SAAAA,MAAAA,gBACGZ,uBAAqBgB,iBAAA;AAAA,IAACf;AAAAA,KAAoBE,MAAI;AAAA,IAAAD,UAC5CA,MAAAU,sBAAOK,QAAAA,SAAO,CAAA,CAAA;AAAA,EAAA,CAAG,CAAA;AAGxB;;;"}
package/dist/cjs/link.cjs CHANGED
@@ -7,7 +7,7 @@ const routerCore = require("@tanstack/router-core");
7
7
  const useRouterState = require("./useRouterState.cjs");
8
8
  const useRouter = require("./useRouter.cjs");
9
9
  const utils = require("./utils.cjs");
10
- const useMatch = require("./useMatch.cjs");
10
+ const useActiveLocation = require("./useActiveLocation.cjs");
11
11
  function _interopNamespaceDefault(e) {
12
12
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
13
13
  if (e) {
@@ -47,16 +47,20 @@ function useLinkProps(options) {
47
47
  const currentSearch = useRouterState.useRouterState({
48
48
  select: (s) => s.location.searchStr
49
49
  });
50
- const from = useMatch.useMatch({
51
- strict: false,
52
- select: (match) => options.from ?? match.fullPath
53
- });
54
- const _options = () => ({
55
- ...options,
56
- from: from()
57
- });
50
+ const {
51
+ getFromPath,
52
+ activeLocation
53
+ } = useActiveLocation.useActiveLocation();
54
+ const from = getFromPath(options.from);
55
+ const _options = () => {
56
+ return {
57
+ ...options,
58
+ from: from()
59
+ };
60
+ };
58
61
  const next = Solid__namespace.createMemo(() => {
59
62
  currentSearch();
63
+ activeLocation();
60
64
  return router.buildLocation(_options());
61
65
  });
62
66
  const preload = Solid__namespace.createMemo(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"link.cjs","sources":["../../src/link.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\n\nimport { mergeRefs } from '@solid-primitives/refs'\n\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Solid.ComponentProps<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)\n let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: () => ({ class: 'active' }),\n inactiveProps: () => ({}),\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n ],\n )\n\n // const {\n // // custom props\n // activeProps = () => ({ class: 'active' }),\n // inactiveProps = () => ({}),\n // activeOptions,\n // to,\n // preload: userPreload,\n // preloadDelay: userPreloadDelay,\n // hashScrollIntoView,\n // replace,\n // startTransition,\n // resetScroll,\n // viewTransition,\n // // element props\n // children,\n // target,\n // disabled,\n // style,\n // class,\n // onClick,\n // onFocus,\n // onMouseEnter,\n // onMouseLeave,\n // onTouchStart,\n // ignoreBlocker,\n // ...rest\n // } = options\n\n const [_, propsSafeToSpread] = Solid.splitProps(rest, [\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'unsafeRelative',\n ])\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: Solid.Accessor<'internal' | 'external'> = () => {\n try {\n new URL(`${local.to}`)\n return 'external'\n } catch {}\n return 'internal'\n }\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n // when `from` is not supplied, use the route of the current match as the `from` location\n // so relative routing works as expected\n const from = useMatch({\n strict: false,\n select: (match) => options.from ?? match.fullPath,\n })\n\n const _options = () => ({\n ...options,\n from: from(),\n })\n\n const next = Solid.createMemo(() => {\n currentSearch()\n return router.buildLocation(_options() as any)\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument) {\n return false\n }\n return local.preload ?? router.options.defaultPreload\n })\n const preloadDelay = () =>\n local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (local.activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next().pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n ).split('/')\n const nextPathSplit = removeTrailingSlash(\n next()?.pathname,\n router.basepath,\n )?.split('/')\n\n const pathIsFuzzyEqual = nextPathSplit?.every(\n (d, i) => d === currentPathSplit[i],\n )\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (local.activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next().search, {\n partial: !local.activeOptions?.exact,\n ignoreUndefined: !local.activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (local.activeOptions?.includeHash) {\n return s.location.hash === next().hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options() as any).catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const [ref, setRef] = Solid.createSignal<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: !!local.disabled || !(preload() === 'viewport') },\n )\n\n Solid.createEffect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!local.disabled && preload() === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n if (type() === 'external') {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref,\n get type() {\n return type()\n },\n get href() {\n return local.to\n },\n },\n Solid.splitProps(local, [\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOut',\n 'onMouseOver',\n 'onTouchStart',\n ])[0],\n ) as any\n }\n\n // The click handler\n const handleClick = (e: MouseEvent) => {\n if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!local.target || local.target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n setIsTransitioning(true)\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ..._options(),\n replace: local.replace,\n resetScroll: local.resetScroll,\n hashScrollIntoView: local.hashScrollIntoView,\n startTransition: local.startTransition,\n viewTransition: local.viewTransition,\n ignoreBlocker: local.ignoreBlocker,\n })\n }\n }\n\n // The click handler\n const handleFocus = (_: MouseEvent) => {\n if (local.disabled) return\n if (preload()) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (preload()) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay())\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n /** Call a JSX.EventHandlerUnion with the event. */\n function callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n ) {\n if (handler) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n }\n\n return event.defaultPrevented\n }\n\n function composeEventHandlers<T>(\n handlers: Array<Solid.JSX.EventHandlerUnion<T, any> | undefined>,\n ) {\n return (event: any) => {\n for (const handler of handlers) {\n callHandler(event, handler)\n }\n }\n }\n\n // Get the active props\n const resolvedActiveProps: () => Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n } = () =>\n isActive() ? (functionalUpdate(local.activeProps as any, {}) ?? {}) : {}\n\n // Get the inactive props\n const resolvedInactiveProps: () => Omit<\n Solid.ComponentProps<'a'>,\n 'style'\n > & { style?: Solid.JSX.CSSProperties } = () =>\n isActive() ? {} : functionalUpdate(local.inactiveProps, {})\n\n const resolvedClassName = () =>\n [local.class, resolvedActiveProps().class, resolvedInactiveProps().class]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = () => ({\n ...local.style,\n ...resolvedActiveProps().style,\n ...resolvedInactiveProps().style,\n })\n\n const href = Solid.createMemo(() => {\n const nextLocation = next()\n const maskedLocation = nextLocation?.maskedLocation\n\n return _options().disabled\n ? undefined\n : maskedLocation\n ? router.history.createHref(maskedLocation.href)\n : router.history.createHref(nextLocation?.href)\n })\n\n return Solid.mergeProps(\n propsSafeToSpread,\n resolvedActiveProps,\n resolvedInactiveProps,\n () => {\n return {\n href: href(),\n ref: mergeRefs(setRef, _options().ref),\n onClick: composeEventHandlers([local.onClick, handleClick]),\n onFocus: composeEventHandlers([local.onFocus, handleFocus]),\n onMouseEnter: composeEventHandlers([local.onMouseEnter, handleEnter]),\n onMouseOver: composeEventHandlers([local.onMouseOver, handleEnter]),\n onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),\n onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),\n onTouchStart: composeEventHandlers([\n local.onTouchStart,\n handleTouchStart,\n ]),\n disabled: !!local.disabled,\n target: local.target,\n ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),\n ...(resolvedClassName() && { class: resolvedClassName() }),\n ...(local.disabled && {\n role: 'link',\n 'aria-disabled': true,\n }),\n ...(isActive() && { 'data-status': 'active', 'aria-current': 'page' }),\n ...(isTransitioning() && { 'data-transitioning': 'transitioning' }),\n }\n },\n ) as any\n}\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n Omit<Solid.ComponentProps<'a'>, 'style'> & { style?: Solid.JSX.CSSProperties }\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentSolidProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | Solid.JSX.Element\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => Solid.JSX.Element)\n}\n\ntype LinkComponentSolidProps<TComp> = TComp extends Solid.ValidComponent\n ? Omit<Solid.ComponentProps<TComp>, keyof CreateLinkProps>\n : never\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentSolidProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Solid.JSX.Element\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): Solid.JSX.Element\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,\n): LinkComponent<TComp> {\n return (props) => <Link {...props} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props) => {\n const [local, rest] = Solid.splitProps(\n props as typeof props & { _asChild: any },\n ['_asChild', 'children'],\n )\n\n const [_, linkProps] = Solid.splitProps(\n useLinkProps(rest as unknown as any),\n ['type'],\n )\n\n const children = Solid.createMemo(() => {\n const ch = local.children\n if (typeof ch === 'function') {\n return ch({\n get isActive() {\n return (linkProps as any)['data-status'] === 'active'\n },\n isTransitioning: false,\n })\n }\n\n return ch satisfies Solid.JSX.Element\n })\n\n return (\n <Dynamic component={local._asChild ? local._asChild : 'a'} {...linkProps}>\n {children()}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":["useLinkProps","options","router","useRouter","isTransitioning","setIsTransitioning","Solid","createSignal","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","class","inactiveProps","_","propsSafeToSpread","type","URL","to","currentSearch","useRouterState","select","s","location","searchStr","from","useMatch","strict","match","fullPath","_options","next","createMemo","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","console","warn","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","ref","setRef","useIntersectionObserver","rootMargin","disabled","createEffect","href","handleClick","e","isCtrlEvent","defaultPrevented","target","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","callHandler","event","handler","composeEventHandlers","handlers","resolvedActiveProps","functionalUpdate","resolvedInactiveProps","resolvedClassName","filter","Boolean","join","resolvedStyle","style","nextLocation","maskedLocation","undefined","history","createHref","mergeRefs","onClick","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","Object","keys","length","role","createLink","Comp","props","_$createComponent","Link","_$mergeProps","_asChild","linkProps","children","ch","Dynamic","component","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
1
+ {"version":3,"file":"link.cjs","sources":["../../src/link.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\n\nimport { mergeRefs } from '@solid-primitives/refs'\n\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useActiveLocation } from './useActiveLocation'\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Solid.ComponentProps<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)\n let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: () => ({ class: 'active' }),\n inactiveProps: () => ({}),\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n ],\n )\n\n // const {\n // // custom props\n // activeProps = () => ({ class: 'active' }),\n // inactiveProps = () => ({}),\n // activeOptions,\n // to,\n // preload: userPreload,\n // preloadDelay: userPreloadDelay,\n // hashScrollIntoView,\n // replace,\n // startTransition,\n // resetScroll,\n // viewTransition,\n // // element props\n // children,\n // target,\n // disabled,\n // style,\n // class,\n // onClick,\n // onFocus,\n // onMouseEnter,\n // onMouseLeave,\n // onTouchStart,\n // ignoreBlocker,\n // ...rest\n // } = options\n\n const [_, propsSafeToSpread] = Solid.splitProps(rest, [\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'unsafeRelative',\n ])\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: Solid.Accessor<'internal' | 'external'> = () => {\n try {\n new URL(`${local.to}`)\n return 'external'\n } catch {}\n return 'internal'\n }\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n const { getFromPath, activeLocation } = useActiveLocation()\n\n const from = getFromPath(options.from)\n\n const _options = () => {\n return {\n ...options,\n from: from(),\n }\n }\n\n const next = Solid.createMemo(() => {\n currentSearch()\n activeLocation()\n return router.buildLocation(_options() as any)\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument) {\n return false\n }\n return local.preload ?? router.options.defaultPreload\n })\n const preloadDelay = () =>\n local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (local.activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next().pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n ).split('/')\n const nextPathSplit = removeTrailingSlash(\n next()?.pathname,\n router.basepath,\n )?.split('/')\n\n const pathIsFuzzyEqual = nextPathSplit?.every(\n (d, i) => d === currentPathSplit[i],\n )\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (local.activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next().search, {\n partial: !local.activeOptions?.exact,\n ignoreUndefined: !local.activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (local.activeOptions?.includeHash) {\n return s.location.hash === next().hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options() as any).catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const [ref, setRef] = Solid.createSignal<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: !!local.disabled || !(preload() === 'viewport') },\n )\n\n Solid.createEffect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!local.disabled && preload() === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n if (type() === 'external') {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref,\n get type() {\n return type()\n },\n get href() {\n return local.to\n },\n },\n Solid.splitProps(local, [\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOut',\n 'onMouseOver',\n 'onTouchStart',\n ])[0],\n ) as any\n }\n\n // The click handler\n const handleClick = (e: MouseEvent) => {\n if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!local.target || local.target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n setIsTransitioning(true)\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ..._options(),\n replace: local.replace,\n resetScroll: local.resetScroll,\n hashScrollIntoView: local.hashScrollIntoView,\n startTransition: local.startTransition,\n viewTransition: local.viewTransition,\n ignoreBlocker: local.ignoreBlocker,\n })\n }\n }\n\n // The click handler\n const handleFocus = (_: MouseEvent) => {\n if (local.disabled) return\n if (preload()) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (preload()) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay())\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n /** Call a JSX.EventHandlerUnion with the event. */\n function callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n ) {\n if (handler) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n }\n\n return event.defaultPrevented\n }\n\n function composeEventHandlers<T>(\n handlers: Array<Solid.JSX.EventHandlerUnion<T, any> | undefined>,\n ) {\n return (event: any) => {\n for (const handler of handlers) {\n callHandler(event, handler)\n }\n }\n }\n\n // Get the active props\n const resolvedActiveProps: () => Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n } = () =>\n isActive() ? (functionalUpdate(local.activeProps as any, {}) ?? {}) : {}\n\n // Get the inactive props\n const resolvedInactiveProps: () => Omit<\n Solid.ComponentProps<'a'>,\n 'style'\n > & { style?: Solid.JSX.CSSProperties } = () =>\n isActive() ? {} : functionalUpdate(local.inactiveProps, {})\n\n const resolvedClassName = () =>\n [local.class, resolvedActiveProps().class, resolvedInactiveProps().class]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = () => ({\n ...local.style,\n ...resolvedActiveProps().style,\n ...resolvedInactiveProps().style,\n })\n\n const href = Solid.createMemo(() => {\n const nextLocation = next()\n const maskedLocation = nextLocation?.maskedLocation\n\n return _options().disabled\n ? undefined\n : maskedLocation\n ? router.history.createHref(maskedLocation.href)\n : router.history.createHref(nextLocation?.href)\n })\n\n return Solid.mergeProps(\n propsSafeToSpread,\n resolvedActiveProps,\n resolvedInactiveProps,\n () => {\n return {\n href: href(),\n ref: mergeRefs(setRef, _options().ref),\n onClick: composeEventHandlers([local.onClick, handleClick]),\n onFocus: composeEventHandlers([local.onFocus, handleFocus]),\n onMouseEnter: composeEventHandlers([local.onMouseEnter, handleEnter]),\n onMouseOver: composeEventHandlers([local.onMouseOver, handleEnter]),\n onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),\n onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),\n onTouchStart: composeEventHandlers([\n local.onTouchStart,\n handleTouchStart,\n ]),\n disabled: !!local.disabled,\n target: local.target,\n ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),\n ...(resolvedClassName() && { class: resolvedClassName() }),\n ...(local.disabled && {\n role: 'link',\n 'aria-disabled': true,\n }),\n ...(isActive() && { 'data-status': 'active', 'aria-current': 'page' }),\n ...(isTransitioning() && { 'data-transitioning': 'transitioning' }),\n }\n },\n ) as any\n}\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n Omit<Solid.ComponentProps<'a'>, 'style'> & { style?: Solid.JSX.CSSProperties }\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentSolidProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | Solid.JSX.Element\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => Solid.JSX.Element)\n}\n\ntype LinkComponentSolidProps<TComp> = TComp extends Solid.ValidComponent\n ? Omit<Solid.ComponentProps<TComp>, keyof CreateLinkProps>\n : never\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentSolidProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Solid.JSX.Element\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): Solid.JSX.Element\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,\n): LinkComponent<TComp> {\n return (props) => <Link {...props} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props) => {\n const [local, rest] = Solid.splitProps(\n props as typeof props & { _asChild: any },\n ['_asChild', 'children'],\n )\n\n const [_, linkProps] = Solid.splitProps(\n useLinkProps(rest as unknown as any),\n ['type'],\n )\n\n const children = Solid.createMemo(() => {\n const ch = local.children\n if (typeof ch === 'function') {\n return ch({\n get isActive() {\n return (linkProps as any)['data-status'] === 'active'\n },\n isTransitioning: false,\n })\n }\n\n return ch satisfies Solid.JSX.Element\n })\n\n return (\n <Dynamic component={local._asChild ? local._asChild : 'a'} {...linkProps}>\n {children()}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":["useLinkProps","options","router","useRouter","isTransitioning","setIsTransitioning","Solid","createSignal","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","class","inactiveProps","_","propsSafeToSpread","type","URL","to","currentSearch","useRouterState","select","s","location","searchStr","getFromPath","activeLocation","useActiveLocation","from","_options","next","createMemo","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","console","warn","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","ref","setRef","useIntersectionObserver","rootMargin","disabled","createEffect","href","handleClick","e","isCtrlEvent","defaultPrevented","target","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","callHandler","event","handler","composeEventHandlers","handlers","resolvedActiveProps","functionalUpdate","resolvedInactiveProps","resolvedClassName","filter","Boolean","join","resolvedStyle","style","nextLocation","maskedLocation","undefined","history","createHref","mergeRefs","onClick","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","Object","keys","length","role","createLink","Comp","props","_$createComponent","Link","_$mergeProps","_asChild","linkProps","children","ch","Dynamic","component","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const routerCore = require("@tanstack/router-core");
4
+ const Solid = require("solid-js");
5
+ const useMatch = require("./useMatch.cjs");
6
+ const useRouter = require("./useRouter.cjs");
7
+ const useRouterState = require("./useRouterState.cjs");
8
+ function useActiveLocation(location) {
9
+ const router = useRouter.useRouter();
10
+ const [activeLocation, setActiveLocation] = Solid.createSignal(
11
+ location ?? useRouterState.useRouterState({ select: (s) => s.location })()
12
+ );
13
+ const [customActiveLocation, setCustomActiveLocation] = Solid.createSignal(location);
14
+ Solid.createEffect(() => {
15
+ setActiveLocation(
16
+ customActiveLocation() ?? useRouterState.useRouterState({ select: (s) => s.location })()
17
+ );
18
+ });
19
+ const matchIndex = useMatch.useMatch({
20
+ strict: false,
21
+ select: (match) => match.index
22
+ });
23
+ const getFromPath = (from) => Solid.createMemo(() => {
24
+ const activeLocationMatches = router.matchRoutes(
25
+ customActiveLocation() ?? activeLocation(),
26
+ {
27
+ _buildLocation: false
28
+ }
29
+ );
30
+ const activeLocationMatch = routerCore.last(activeLocationMatches);
31
+ return from ?? (activeLocationMatch == null ? void 0 : activeLocationMatch.fullPath) ?? router.state.matches[matchIndex()].fullPath;
32
+ });
33
+ return {
34
+ activeLocation,
35
+ getFromPath,
36
+ setActiveLocation: setCustomActiveLocation
37
+ };
38
+ }
39
+ exports.useActiveLocation = useActiveLocation;
40
+ //# sourceMappingURL=useActiveLocation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActiveLocation.cjs","sources":["../../src/useActiveLocation.ts"],"sourcesContent":["import { last } from '@tanstack/router-core'\nimport { createEffect, createMemo, createSignal } from 'solid-js'\nimport { useMatch } from './useMatch'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport type { Accessor } from 'solid-js'\nimport type { ParsedLocation } from '@tanstack/router-core'\n\nexport type UseLocationResult = {\n activeLocation: Accessor<ParsedLocation>\n getFromPath: (from?: string) => Accessor<string>\n setActiveLocation: (location?: ParsedLocation) => void\n}\n\nexport function useActiveLocation(\n location?: ParsedLocation,\n): UseLocationResult {\n const router = useRouter()\n // we are not using a variable here for router state location since we need to only calculate that if the location is not passed in. It can result in unnecessary history actions if we do that.\n const [activeLocation, setActiveLocation] = createSignal<ParsedLocation>(\n location ?? useRouterState({ select: (s) => s.location })(),\n )\n const [customActiveLocation, setCustomActiveLocation] = createSignal<\n ParsedLocation | undefined\n >(location)\n\n createEffect(() => {\n setActiveLocation(\n customActiveLocation() ?? useRouterState({ select: (s) => s.location })(),\n )\n })\n\n const matchIndex = useMatch({\n strict: false,\n select: (match) => match.index,\n })\n\n const getFromPath = (from?: string) =>\n createMemo(() => {\n const activeLocationMatches = router.matchRoutes(\n customActiveLocation() ?? activeLocation(),\n {\n _buildLocation: false,\n },\n )\n\n const activeLocationMatch = last(activeLocationMatches)\n\n return (\n from ??\n activeLocationMatch?.fullPath ??\n router.state.matches[matchIndex()]!.fullPath\n )\n })\n\n return {\n activeLocation,\n getFromPath,\n setActiveLocation: setCustomActiveLocation,\n }\n}\n"],"names":["useRouter","createSignal","useRouterState","createEffect","useMatch","createMemo","last"],"mappings":";;;;;;;AAcO,SAAS,kBACd,UACmB;AACnB,QAAM,SAASA,UAAAA,UAAU;AAEnB,QAAA,CAAC,gBAAgB,iBAAiB,IAAIC,MAAA;AAAA,IAC1C,YAAYC,8BAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE;AAAA,EAC5D;AACA,QAAM,CAAC,sBAAsB,uBAAuB,IAAID,MAAAA,aAEtD,QAAQ;AAEVE,QAAAA,aAAa,MAAM;AACjB;AAAA,MACE,qBAAA,KAA0BD,eAAAA,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE;AAAA,IAC1E;AAAA,EAAA,CACD;AAED,QAAM,aAAaE,SAAAA,SAAS;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ,CAAC,UAAU,MAAM;AAAA,EAAA,CAC1B;AAED,QAAM,cAAc,CAAC,SACnBC,MAAAA,WAAW,MAAM;AACf,UAAM,wBAAwB,OAAO;AAAA,MACnC,qBAAA,KAA0B,eAAe;AAAA,MACzC;AAAA,QACE,gBAAgB;AAAA,MAAA;AAAA,IAEpB;AAEM,UAAA,sBAAsBC,gBAAK,qBAAqB;AAGpD,WAAA,SACA,2DAAqB,aACrB,OAAO,MAAM,QAAQ,WAAY,CAAA,EAAG;AAAA,EAAA,CAEvC;AAEI,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB;AACF;;"}
@@ -0,0 +1,8 @@
1
+ import { Accessor } from 'solid-js';
2
+ import { ParsedLocation } from '@tanstack/router-core';
3
+ export type UseLocationResult = {
4
+ activeLocation: Accessor<ParsedLocation>;
5
+ getFromPath: (from?: string) => Accessor<string>;
6
+ setActiveLocation: (location?: ParsedLocation) => void;
7
+ };
8
+ export declare function useActiveLocation(location?: ParsedLocation): UseLocationResult;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Solid = require("solid-js");
4
4
  const useRouter = require("./useRouter.cjs");
5
- const useMatch = require("./useMatch.cjs");
5
+ const useActiveLocation = require("./useActiveLocation.cjs");
6
6
  function _interopNamespaceDefault(e) {
7
7
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
8
8
  if (e) {
@@ -21,18 +21,17 @@ function _interopNamespaceDefault(e) {
21
21
  }
22
22
  const Solid__namespace = /* @__PURE__ */ _interopNamespaceDefault(Solid);
23
23
  function useNavigate(_defaultOpts) {
24
+ const router = useRouter.useRouter();
24
25
  const {
25
- navigate,
26
- state
27
- } = useRouter.useRouter();
28
- const matchIndex = useMatch.useMatch({
29
- strict: false,
30
- select: (match) => match.index
31
- });
26
+ getFromPath,
27
+ setActiveLocation
28
+ } = useActiveLocation.useActiveLocation(router.latestLocation);
32
29
  return (options) => {
33
- return navigate({
30
+ setActiveLocation(router.latestLocation);
31
+ const from = getFromPath(options.from ?? (_defaultOpts == null ? void 0 : _defaultOpts.from));
32
+ return router.navigate({
34
33
  ...options,
35
- from: options.from ?? (_defaultOpts == null ? void 0 : _defaultOpts.from) ?? state.matches[matchIndex()].fullPath
34
+ from: from()
36
35
  });
37
36
  };
38
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useNavigate.cjs","sources":["../../src/useNavigate.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\nimport { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n FromPathOption,\n NavigateOptions,\n RegisteredRouter,\n UseNavigateResult,\n} from '@tanstack/router-core'\n\nexport function useNavigate<\n TRouter extends AnyRouter = RegisteredRouter,\n TDefaultFrom extends string = string,\n>(_defaultOpts?: {\n from?: FromPathOption<TRouter, TDefaultFrom>\n}): UseNavigateResult<TDefaultFrom> {\n const { navigate, state } = useRouter()\n\n const matchIndex = useMatch({\n strict: false,\n select: (match) => match.index,\n })\n\n return ((options: NavigateOptions) => {\n return navigate({\n ...options,\n from:\n options.from ??\n _defaultOpts?.from ??\n state.matches[matchIndex()]!.fullPath,\n })\n }) as UseNavigateResult<TDefaultFrom>\n}\n\nexport function Navigate<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {\n const { navigate } = useRouter()\n\n Solid.onMount(() => {\n navigate({\n ...props,\n })\n })\n\n return null\n}\n"],"names":["useNavigate","_defaultOpts","navigate","state","useRouter","matchIndex","useMatch","strict","select","match","index","options","from","matches","fullPath","Navigate","props","Solid","onMount"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWO,SAASA,YAGdC,cAEkC;AAC5B,QAAA;AAAA,IAAEC;AAAAA,IAAUC;AAAAA,MAAUC,oBAAU;AAEtC,QAAMC,aAAaC,SAAAA,SAAS;AAAA,IAC1BC,QAAQ;AAAA,IACRC,QAASC,WAAUA,MAAMC;AAAAA,EAAAA,CAC1B;AAED,SAAQ,CAACC,YAA6B;AACpC,WAAOT,SAAS;AAAA,MACd,GAAGS;AAAAA,MACHC,MACED,QAAQC,SACRX,6CAAcW,SACdT,MAAMU,QAAQR,WAAW,CAAC,EAAGS;AAAAA,IAAAA,CAChC;AAAA,EACH;AACF;AAEO,SAASC,SAMdC,OAAuE;AACjE,QAAA;AAAA,IAAEd;AAAAA,MAAaE,oBAAU;AAE/Ba,mBAAMC,QAAQ,MAAM;AACT,aAAA;AAAA,MACP,GAAGF;AAAAA,IAAAA,CACJ;AAAA,EAAA,CACF;AAEM,SAAA;AACT;;;"}
1
+ {"version":3,"file":"useNavigate.cjs","sources":["../../src/useNavigate.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\nimport { useActiveLocation } from './useActiveLocation'\nimport type {\n AnyRouter,\n FromPathOption,\n NavigateOptions,\n RegisteredRouter,\n UseNavigateResult,\n} from '@tanstack/router-core'\n\nexport function useNavigate<\n TRouter extends AnyRouter = RegisteredRouter,\n TDefaultFrom extends string = string,\n>(_defaultOpts?: {\n from?: FromPathOption<TRouter, TDefaultFrom>\n}): UseNavigateResult<TDefaultFrom> {\n const router = useRouter()\n\n const { getFromPath, setActiveLocation } = useActiveLocation(\n router.latestLocation,\n )\n\n return ((options: NavigateOptions) => {\n setActiveLocation(router.latestLocation)\n const from = getFromPath(options.from ?? _defaultOpts?.from)\n\n return router.navigate({\n ...options,\n from: from(),\n })\n }) as UseNavigateResult<TDefaultFrom>\n}\n\nexport function Navigate<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {\n const { navigate } = useRouter()\n\n Solid.onMount(() => {\n navigate({\n ...props,\n })\n })\n\n return null\n}\n"],"names":["useNavigate","_defaultOpts","router","useRouter","getFromPath","setActiveLocation","useActiveLocation","latestLocation","options","from","navigate","Navigate","props","Solid","onMount"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWO,SAASA,YAGdC,cAEkC;AAClC,QAAMC,SAASC,UAAAA,UAAU;AAEnB,QAAA;AAAA,IAAEC;AAAAA,IAAaC;AAAAA,EAAAA,IAAsBC,kBACzCJ,kBAAAA,OAAOK,cACT;AAEA,SAAQ,CAACC,YAA6B;AACpCH,sBAAkBH,OAAOK,cAAc;AACvC,UAAME,OAAOL,YAAYI,QAAQC,SAAQR,6CAAcQ,KAAI;AAE3D,WAAOP,OAAOQ,SAAS;AAAA,MACrB,GAAGF;AAAAA,MACHC,MAAMA,KAAK;AAAA,IAAA,CACZ;AAAA,EACH;AACF;AAEO,SAASE,SAMdC,OAAuE;AACjE,QAAA;AAAA,IAAEF;AAAAA,MAAaP,oBAAU;AAE/BU,mBAAMC,QAAQ,MAAM;AACT,aAAA;AAAA,MACP,GAAGF;AAAAA,IAAAA,CACJ;AAAA,EAAA,CACF;AAEM,SAAA;AACT;;;"}
@@ -10,17 +10,20 @@ import { Match } from "./Match.js";
10
10
  import { SafeFragment } from "./SafeFragment.js";
11
11
  function Matches() {
12
12
  const router = useRouter();
13
- const pendingElement = router.options.defaultPendingComponent ? createComponent(router.options.defaultPendingComponent, {}) : null;
14
13
  const ResolvedSuspense = router.isServer || typeof document !== "undefined" && router.ssr ? SafeFragment : Solid.Suspense;
15
- const inner = createComponent(ResolvedSuspense, {
16
- fallback: pendingElement,
14
+ const OptionalWrapper = router.options.InnerWrap || SafeFragment;
15
+ return createComponent(OptionalWrapper, {
17
16
  get children() {
18
- return [memo(() => memo(() => !!!router.isServer)() && createComponent(Transitioner, {})), createComponent(MatchesInner, {})];
17
+ return createComponent(ResolvedSuspense, {
18
+ get fallback() {
19
+ return memo(() => !!router.options.defaultPendingComponent)() ? createComponent(router.options.defaultPendingComponent, {}) : null;
20
+ },
21
+ get children() {
22
+ return [memo(() => memo(() => !!!router.isServer)() && createComponent(Transitioner, {})), createComponent(MatchesInner, {})];
23
+ }
24
+ });
19
25
  }
20
26
  });
21
- return router.options.InnerWrap ? createComponent(router.options.InnerWrap, {
22
- children: inner
23
- }) : inner;
24
27
  }
25
28
  function MatchesInner() {
26
29
  const router = useRouter();
@@ -33,11 +36,12 @@ function MatchesInner() {
33
36
  const resetKey = useRouterState({
34
37
  select: (s) => s.loadedAt
35
38
  });
36
- const matchComponent = () => matchId() ? createComponent(Match, {
37
- get matchId() {
38
- return matchId();
39
- }
40
- }) : null;
39
+ const matchComponent = () => {
40
+ const id = matchId();
41
+ return id ? createComponent(Match, {
42
+ matchId: id
43
+ }) : null;
44
+ };
41
45
  return createComponent(matchContext.Provider, {
42
46
  value: matchId,
43
47
  get children() {
@@ -1 +1 @@
1
- {"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n styles?: Array<Solid.JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n {!router.isServer && <Transitioner />}\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n const matchComponent = () =>\n matchId() ? <Match matchId={matchId()!} /> : null\n\n return (\n <matchContext.Provider value={matchId}>\n {router.options.disableGlobalCatchBoundary ? (\n matchComponent()\n ) : (\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchComponent()}\n </CatchBoundary>\n )}\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","ssr","SafeFragment","Solid","Suspense","inner","fallback","children","_$memo","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchComponent","Match","matchContext","Provider","value","disableGlobalCatchBoundary","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
1
+ {"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n styles?: Array<Solid.JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Suspense\n\n const OptionalWrapper = router.options.InnerWrap || SafeFragment\n\n return (\n <OptionalWrapper>\n <ResolvedSuspense\n fallback={\n router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n }\n >\n {!router.isServer && <Transitioner />}\n <MatchesInner />\n </ResolvedSuspense>\n </OptionalWrapper>\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n const matchComponent = () => {\n const id = matchId()\n return id ? <Match matchId={id} /> : null\n }\n\n return (\n <matchContext.Provider value={matchId}>\n {router.options.disableGlobalCatchBoundary ? (\n matchComponent()\n ) : (\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchComponent()}\n </CatchBoundary>\n )}\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","ResolvedSuspense","isServer","document","ssr","SafeFragment","Solid","Suspense","OptionalWrapper","options","InnerWrap","_$createComponent","children","fallback","_$memo","defaultPendingComponent","Transitioner","MatchesInner","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchComponent","Match","matchContext","Provider","value","disableGlobalCatchBoundary","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}