@tanstack/solid-router 1.167.5 → 1.168.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/cjs/Match.cjs +244 -223
  2. package/dist/cjs/Match.cjs.map +1 -1
  3. package/dist/cjs/Match.d.cts +1 -3
  4. package/dist/cjs/Matches.cjs +32 -31
  5. package/dist/cjs/Matches.cjs.map +1 -1
  6. package/dist/cjs/Scripts.cjs +10 -8
  7. package/dist/cjs/Scripts.cjs.map +1 -1
  8. package/dist/cjs/Scripts.d.cts +2 -1
  9. package/dist/cjs/Transitioner.cjs +26 -26
  10. package/dist/cjs/Transitioner.cjs.map +1 -1
  11. package/dist/cjs/headContentUtils.cjs +15 -15
  12. package/dist/cjs/headContentUtils.cjs.map +1 -1
  13. package/dist/cjs/index.cjs +1 -1
  14. package/dist/cjs/index.dev.cjs +1 -1
  15. package/dist/cjs/link.cjs +119 -84
  16. package/dist/cjs/link.cjs.map +1 -1
  17. package/dist/cjs/matchContext.cjs +7 -5
  18. package/dist/cjs/matchContext.cjs.map +1 -1
  19. package/dist/cjs/matchContext.d.cts +8 -2
  20. package/dist/cjs/not-found.cjs +8 -4
  21. package/dist/cjs/not-found.cjs.map +1 -1
  22. package/dist/cjs/not-found.d.cts +1 -1
  23. package/dist/cjs/router.cjs +2 -1
  24. package/dist/cjs/router.cjs.map +1 -1
  25. package/dist/cjs/routerStores.cjs +67 -0
  26. package/dist/cjs/routerStores.cjs.map +1 -0
  27. package/dist/cjs/routerStores.d.cts +10 -0
  28. package/dist/cjs/ssr/RouterClient.cjs +1 -1
  29. package/dist/cjs/ssr/RouterClient.cjs.map +1 -1
  30. package/dist/cjs/ssr/renderRouterToStream.cjs +1 -1
  31. package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -1
  32. package/dist/cjs/ssr/renderRouterToString.cjs +2 -2
  33. package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -1
  34. package/dist/cjs/ssr/renderRouterToString.d.cts +1 -1
  35. package/dist/cjs/useCanGoBack.cjs +6 -2
  36. package/dist/cjs/useCanGoBack.cjs.map +1 -1
  37. package/dist/cjs/useCanGoBack.d.cts +2 -1
  38. package/dist/cjs/useLoaderDeps.cjs +2 -3
  39. package/dist/cjs/useLoaderDeps.cjs.map +1 -1
  40. package/dist/cjs/useLocation.cjs +13 -2
  41. package/dist/cjs/useLocation.cjs.map +1 -1
  42. package/dist/cjs/useMatch.cjs +17 -15
  43. package/dist/cjs/useMatch.cjs.map +1 -1
  44. package/dist/cjs/useParams.cjs +1 -1
  45. package/dist/cjs/useParams.cjs.map +1 -1
  46. package/dist/cjs/useRouterState.cjs +12 -19
  47. package/dist/cjs/useRouterState.cjs.map +1 -1
  48. package/dist/cjs/useSearch.cjs +2 -1
  49. package/dist/cjs/useSearch.cjs.map +1 -1
  50. package/dist/cjs/utils.cjs +0 -14
  51. package/dist/cjs/utils.cjs.map +1 -1
  52. package/dist/cjs/utils.d.cts +0 -4
  53. package/dist/esm/Match.d.ts +1 -3
  54. package/dist/esm/Match.js +245 -224
  55. package/dist/esm/Match.js.map +1 -1
  56. package/dist/esm/Matches.js +34 -33
  57. package/dist/esm/Matches.js.map +1 -1
  58. package/dist/esm/Scripts.d.ts +2 -1
  59. package/dist/esm/Scripts.js +8 -7
  60. package/dist/esm/Scripts.js.map +1 -1
  61. package/dist/esm/Transitioner.js +26 -26
  62. package/dist/esm/Transitioner.js.map +1 -1
  63. package/dist/esm/headContentUtils.js +15 -15
  64. package/dist/esm/headContentUtils.js.map +1 -1
  65. package/dist/esm/index.dev.js +1 -1
  66. package/dist/esm/index.js +1 -1
  67. package/dist/esm/link.js +120 -85
  68. package/dist/esm/link.js.map +1 -1
  69. package/dist/esm/matchContext.d.ts +8 -2
  70. package/dist/esm/matchContext.js +7 -4
  71. package/dist/esm/matchContext.js.map +1 -1
  72. package/dist/esm/not-found.d.ts +1 -1
  73. package/dist/esm/not-found.js +6 -3
  74. package/dist/esm/not-found.js.map +1 -1
  75. package/dist/esm/router.js +2 -1
  76. package/dist/esm/router.js.map +1 -1
  77. package/dist/esm/routerStores.d.ts +10 -0
  78. package/dist/esm/routerStores.js +65 -0
  79. package/dist/esm/routerStores.js.map +1 -0
  80. package/dist/esm/ssr/RouterClient.js +1 -1
  81. package/dist/esm/ssr/RouterClient.js.map +1 -1
  82. package/dist/esm/ssr/renderRouterToStream.js +1 -1
  83. package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
  84. package/dist/esm/ssr/renderRouterToString.d.ts +1 -1
  85. package/dist/esm/ssr/renderRouterToString.js +2 -2
  86. package/dist/esm/ssr/renderRouterToString.js.map +1 -1
  87. package/dist/esm/useCanGoBack.d.ts +2 -1
  88. package/dist/esm/useCanGoBack.js +4 -2
  89. package/dist/esm/useCanGoBack.js.map +1 -1
  90. package/dist/esm/useLoaderDeps.js +2 -3
  91. package/dist/esm/useLoaderDeps.js.map +1 -1
  92. package/dist/esm/useLocation.js +11 -2
  93. package/dist/esm/useLocation.js.map +1 -1
  94. package/dist/esm/useMatch.js +18 -16
  95. package/dist/esm/useMatch.js.map +1 -1
  96. package/dist/esm/useParams.js +1 -1
  97. package/dist/esm/useParams.js.map +1 -1
  98. package/dist/esm/useRouterState.js +10 -18
  99. package/dist/esm/useRouterState.js.map +1 -1
  100. package/dist/esm/useSearch.js +2 -1
  101. package/dist/esm/useSearch.js.map +1 -1
  102. package/dist/esm/utils.d.ts +0 -4
  103. package/dist/esm/utils.js +1 -14
  104. package/dist/esm/utils.js.map +1 -1
  105. package/dist/source/Match.d.ts +1 -3
  106. package/dist/source/Match.jsx +246 -237
  107. package/dist/source/Match.jsx.map +1 -1
  108. package/dist/source/Matches.jsx +42 -44
  109. package/dist/source/Matches.jsx.map +1 -1
  110. package/dist/source/Scripts.d.ts +2 -1
  111. package/dist/source/Scripts.jsx +31 -36
  112. package/dist/source/Scripts.jsx.map +1 -1
  113. package/dist/source/Transitioner.jsx +26 -31
  114. package/dist/source/Transitioner.jsx.map +1 -1
  115. package/dist/source/headContentUtils.jsx +64 -72
  116. package/dist/source/headContentUtils.jsx.map +1 -1
  117. package/dist/source/link.jsx +136 -107
  118. package/dist/source/link.jsx.map +1 -1
  119. package/dist/source/matchContext.d.ts +8 -2
  120. package/dist/source/matchContext.jsx +7 -3
  121. package/dist/source/matchContext.jsx.map +1 -1
  122. package/dist/source/not-found.d.ts +1 -1
  123. package/dist/source/not-found.jsx +6 -5
  124. package/dist/source/not-found.jsx.map +1 -1
  125. package/dist/source/router.js +2 -1
  126. package/dist/source/router.js.map +1 -1
  127. package/dist/source/routerStores.d.ts +10 -0
  128. package/dist/source/routerStores.js +71 -0
  129. package/dist/source/routerStores.js.map +1 -0
  130. package/dist/source/ssr/RouterClient.jsx +1 -1
  131. package/dist/source/ssr/RouterClient.jsx.map +1 -1
  132. package/dist/source/ssr/renderRouterToStream.jsx +1 -1
  133. package/dist/source/ssr/renderRouterToStream.jsx.map +1 -1
  134. package/dist/source/ssr/renderRouterToString.d.ts +1 -1
  135. package/dist/source/ssr/renderRouterToString.jsx +2 -2
  136. package/dist/source/ssr/renderRouterToString.jsx.map +1 -1
  137. package/dist/source/useCanGoBack.d.ts +2 -1
  138. package/dist/source/useCanGoBack.js +4 -2
  139. package/dist/source/useCanGoBack.js.map +1 -1
  140. package/dist/source/useLoaderDeps.jsx +2 -3
  141. package/dist/source/useLoaderDeps.jsx.map +1 -1
  142. package/dist/source/useLocation.jsx +13 -3
  143. package/dist/source/useLocation.jsx.map +1 -1
  144. package/dist/source/useMatch.jsx +30 -27
  145. package/dist/source/useMatch.jsx.map +1 -1
  146. package/dist/source/useParams.jsx +1 -1
  147. package/dist/source/useParams.jsx.map +1 -1
  148. package/dist/source/useRouterState.jsx +12 -33
  149. package/dist/source/useRouterState.jsx.map +1 -1
  150. package/dist/source/useSearch.jsx +2 -1
  151. package/dist/source/useSearch.jsx.map +1 -1
  152. package/dist/source/utils.d.ts +0 -4
  153. package/dist/source/utils.js +0 -13
  154. package/dist/source/utils.js.map +1 -1
  155. package/package.json +2 -3
  156. package/skills/solid-router/SKILL.md +2 -0
  157. package/src/Match.tsx +351 -304
  158. package/src/Matches.tsx +49 -52
  159. package/src/Scripts.tsx +40 -41
  160. package/src/Transitioner.tsx +67 -66
  161. package/src/headContentUtils.tsx +89 -91
  162. package/src/link.tsx +179 -141
  163. package/src/matchContext.tsx +16 -7
  164. package/src/not-found.tsx +6 -6
  165. package/src/router.ts +2 -1
  166. package/src/routerStores.ts +107 -0
  167. package/src/ssr/RouterClient.tsx +1 -1
  168. package/src/ssr/renderRouterToStream.tsx +1 -1
  169. package/src/ssr/renderRouterToString.tsx +2 -2
  170. package/src/useCanGoBack.ts +6 -2
  171. package/src/useLoaderDeps.tsx +2 -3
  172. package/src/useLocation.tsx +18 -5
  173. package/src/useMatch.tsx +36 -43
  174. package/src/useParams.tsx +2 -3
  175. package/src/useRouterState.tsx +17 -41
  176. package/src/useSearch.tsx +2 -1
  177. package/src/utils.ts +0 -20
@@ -1,4 +1,5 @@
1
1
  import { createFileRoute, createLazyFileRoute } from "./fileRoute.js";
2
+ import { getStoreFactory } from "./routerStores.js";
2
3
  import { RouterCore } from "@tanstack/router-core";
3
4
  //#region src/router.ts
4
5
  var createRouter = (options) => {
@@ -6,7 +7,7 @@ var createRouter = (options) => {
6
7
  };
7
8
  var Router = class extends RouterCore {
8
9
  constructor(options) {
9
- super(options);
10
+ super(options, getStoreFactory);
10
11
  }
11
12
  };
12
13
  if (typeof globalThis !== "undefined") {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","names":[],"sources":["../../src/router.ts"],"sourcesContent":["import { RouterCore } from '@tanstack/router-core'\nimport { createFileRoute, createLazyFileRoute } from './fileRoute'\nimport type { RouterHistory } from '@tanstack/history'\nimport type {\n AnyRoute,\n CreateRouterFn,\n RouterConstructorOptions,\n TrailingSlashOption,\n} from '@tanstack/router-core'\nimport type {\n ErrorRouteComponent,\n NotFoundRouteComponent,\n RouteComponent,\n} from './route'\nimport type { JSX } from 'solid-js'\n\ndeclare module '@tanstack/router-core' {\n export interface RouterOptionsExtensions {\n /**\n * The default `component` a route should use if no component is provided.\n *\n * @default Outlet\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultcomponent-property)\n */\n defaultComponent?: RouteComponent\n /**\n * The default `errorComponent` a route should use if no error component is provided.\n *\n * @default ErrorComponent\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaulterrorcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-errors-with-routeoptionserrorcomponent)\n */\n defaultErrorComponent?: ErrorRouteComponent\n /**\n * The default `pendingComponent` a route should use if no pending component is provided.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultpendingcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#showing-a-pending-component)\n */\n defaultPendingComponent?: RouteComponent\n /**\n * The default `notFoundComponent` a route should use if no notFound component is provided.\n *\n * @default NotFound\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultnotfoundcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/not-found-errors#default-router-wide-not-found-handling)\n */\n defaultNotFoundComponent?: NotFoundRouteComponent\n /**\n * A component that will be used to wrap the entire router.\n *\n * This is useful for providing a context to the entire router.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#wrap-property)\n */\n Wrap?: (props: { children: any }) => JSX.Element\n /**\n * A component that will be used to wrap the inner contents of the router.\n *\n * This is useful for providing a context to the inner contents of the router where you also need access to the router context and hooks.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#innerwrap-property)\n */\n InnerWrap?: (props: { children: any }) => JSX.Element\n\n /**\n * The default `onCatch` handler for errors caught by the Router ErrorBoundary\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultoncatch-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#handling-errors-with-routeoptionsoncatch)\n */\n defaultOnCatch?: (error: Error) => void\n }\n}\n\nexport const createRouter: CreateRouterFn = (options) => {\n return new Router(options)\n}\n\nexport class Router<\n in out TRouteTree extends AnyRoute,\n in out TTrailingSlashOption extends TrailingSlashOption = 'never',\n in out TDefaultStructuralSharingOption extends boolean = false,\n in out TRouterHistory extends RouterHistory = RouterHistory,\n in out TDehydrated extends Record<string, any> = Record<string, any>,\n> extends RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n> {\n constructor(\n options: RouterConstructorOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n ) {\n super(options)\n }\n}\n\nif (typeof globalThis !== 'undefined') {\n ;(globalThis as any).createFileRoute = createFileRoute\n ;(globalThis as any).createLazyFileRoute = createLazyFileRoute\n} else if (typeof window !== 'undefined') {\n ;(window as any).createFileRoute = createFileRoute\n ;(window as any).createLazyFileRoute = createLazyFileRoute\n}\n"],"mappings":";;;AA2EA,IAAa,gBAAgC,YAAY;AACvD,QAAO,IAAI,OAAO,QAAQ;;AAG5B,IAAa,SAAb,cAMU,WAMR;CACA,YACE,SAOA;AACA,QAAM,QAAQ;;;AAIlB,IAAI,OAAO,eAAe,aAAa;AACnC,YAAmB,kBAAkB;AACrC,YAAmB,sBAAsB;WAClC,OAAO,WAAW,aAAa;AACtC,QAAe,kBAAkB;AACjC,QAAe,sBAAsB"}
1
+ {"version":3,"file":"router.js","names":[],"sources":["../../src/router.ts"],"sourcesContent":["import { RouterCore } from '@tanstack/router-core'\nimport { createFileRoute, createLazyFileRoute } from './fileRoute'\nimport { getStoreFactory } from './routerStores'\nimport type { RouterHistory } from '@tanstack/history'\nimport type {\n AnyRoute,\n CreateRouterFn,\n RouterConstructorOptions,\n TrailingSlashOption,\n} from '@tanstack/router-core'\nimport type {\n ErrorRouteComponent,\n NotFoundRouteComponent,\n RouteComponent,\n} from './route'\nimport type { JSX } from 'solid-js'\n\ndeclare module '@tanstack/router-core' {\n export interface RouterOptionsExtensions {\n /**\n * The default `component` a route should use if no component is provided.\n *\n * @default Outlet\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultcomponent-property)\n */\n defaultComponent?: RouteComponent\n /**\n * The default `errorComponent` a route should use if no error component is provided.\n *\n * @default ErrorComponent\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaulterrorcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-errors-with-routeoptionserrorcomponent)\n */\n defaultErrorComponent?: ErrorRouteComponent\n /**\n * The default `pendingComponent` a route should use if no pending component is provided.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultpendingcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#showing-a-pending-component)\n */\n defaultPendingComponent?: RouteComponent\n /**\n * The default `notFoundComponent` a route should use if no notFound component is provided.\n *\n * @default NotFound\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultnotfoundcomponent-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/not-found-errors#default-router-wide-not-found-handling)\n */\n defaultNotFoundComponent?: NotFoundRouteComponent\n /**\n * A component that will be used to wrap the entire router.\n *\n * This is useful for providing a context to the entire router.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#wrap-property)\n */\n Wrap?: (props: { children: any }) => JSX.Element\n /**\n * A component that will be used to wrap the inner contents of the router.\n *\n * This is useful for providing a context to the inner contents of the router where you also need access to the router context and hooks.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#innerwrap-property)\n */\n InnerWrap?: (props: { children: any }) => JSX.Element\n\n /**\n * The default `onCatch` handler for errors caught by the Router ErrorBoundary\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultoncatch-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#handling-errors-with-routeoptionsoncatch)\n */\n defaultOnCatch?: (error: Error) => void\n }\n}\n\nexport const createRouter: CreateRouterFn = (options) => {\n return new Router(options)\n}\n\nexport class Router<\n in out TRouteTree extends AnyRoute,\n in out TTrailingSlashOption extends TrailingSlashOption = 'never',\n in out TDefaultStructuralSharingOption extends boolean = false,\n in out TRouterHistory extends RouterHistory = RouterHistory,\n in out TDehydrated extends Record<string, any> = Record<string, any>,\n> extends RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n> {\n constructor(\n options: RouterConstructorOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n ) {\n super(options, getStoreFactory)\n }\n}\n\nif (typeof globalThis !== 'undefined') {\n ;(globalThis as any).createFileRoute = createFileRoute\n ;(globalThis as any).createLazyFileRoute = createLazyFileRoute\n} else if (typeof window !== 'undefined') {\n ;(window as any).createFileRoute = createFileRoute\n ;(window as any).createLazyFileRoute = createLazyFileRoute\n}\n"],"mappings":";;;;AA4EA,IAAa,gBAAgC,YAAY;AACvD,QAAO,IAAI,OAAO,QAAQ;;AAG5B,IAAa,SAAb,cAMU,WAMR;CACA,YACE,SAOA;AACA,QAAM,SAAS,gBAAgB;;;AAInC,IAAI,OAAO,eAAe,aAAa;AACnC,YAAmB,kBAAkB;AACrC,YAAmB,sBAAsB;WAClC,OAAO,WAAW,aAAa;AACtC,QAAe,kBAAkB;AACjC,QAAe,sBAAsB"}
@@ -0,0 +1,10 @@
1
+ import { AnyRoute, GetStoreConfig, RouterReadableStore } from '@tanstack/router-core';
2
+ declare module '@tanstack/router-core' {
3
+ interface RouterStores<in out TRouteTree extends AnyRoute> {
4
+ /** Maps each active routeId to the matchId of its child in the match tree. */
5
+ childMatchIdByRouteId: RouterReadableStore<Record<string, string>>;
6
+ /** Maps each pending routeId to true for quick lookup. */
7
+ pendingRouteIds: RouterReadableStore<Record<string, boolean>>;
8
+ }
9
+ }
10
+ export declare const getStoreFactory: GetStoreConfig;
@@ -0,0 +1,65 @@
1
+ import { createNonReactiveMutableStore, createNonReactiveReadonlyStore } from "@tanstack/router-core";
2
+ import * as Solid from "solid-js";
3
+ import { isServer } from "@tanstack/router-core/isServer";
4
+ //#region src/routerStores.ts
5
+ function initRouterStores(stores, createReadonlyStore) {
6
+ stores.childMatchIdByRouteId = createReadonlyStore(() => {
7
+ const ids = stores.matchesId.state;
8
+ const obj = {};
9
+ for (let i = 0; i < ids.length - 1; i++) {
10
+ const parentStore = stores.activeMatchStoresById.get(ids[i]);
11
+ if (parentStore?.routeId) obj[parentStore.routeId] = ids[i + 1];
12
+ }
13
+ return obj;
14
+ });
15
+ stores.pendingRouteIds = createReadonlyStore(() => {
16
+ const ids = stores.pendingMatchesId.state;
17
+ const obj = {};
18
+ for (const id of ids) {
19
+ const store = stores.pendingMatchStoresById.get(id);
20
+ if (store?.routeId) obj[store.routeId] = true;
21
+ }
22
+ return obj;
23
+ });
24
+ }
25
+ function createSolidMutableStore(initialValue) {
26
+ const [signal, setSignal] = Solid.createSignal(initialValue);
27
+ return {
28
+ get state() {
29
+ return signal();
30
+ },
31
+ setState: setSignal
32
+ };
33
+ }
34
+ var finalizationRegistry = null;
35
+ if (typeof globalThis !== "undefined" && "FinalizationRegistry" in globalThis) finalizationRegistry = new FinalizationRegistry((cb) => cb());
36
+ function createSolidReadonlyStore(read) {
37
+ let dispose;
38
+ const memo = Solid.createRoot((d) => {
39
+ dispose = d;
40
+ return Solid.createMemo(read);
41
+ });
42
+ const store = { get state() {
43
+ return memo();
44
+ } };
45
+ finalizationRegistry?.register(store, dispose);
46
+ return store;
47
+ }
48
+ var getStoreFactory = (opts) => {
49
+ if (isServer ?? opts.isServer) return {
50
+ createMutableStore: createNonReactiveMutableStore,
51
+ createReadonlyStore: createNonReactiveReadonlyStore,
52
+ batch: (fn) => fn(),
53
+ init: (stores) => initRouterStores(stores, createNonReactiveReadonlyStore)
54
+ };
55
+ return {
56
+ createMutableStore: createSolidMutableStore,
57
+ createReadonlyStore: createSolidReadonlyStore,
58
+ batch: Solid.batch,
59
+ init: (stores) => initRouterStores(stores, createSolidReadonlyStore)
60
+ };
61
+ };
62
+ //#endregion
63
+ export { getStoreFactory };
64
+
65
+ //# sourceMappingURL=routerStores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routerStores.js","names":[],"sources":["../../src/routerStores.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n createNonReactiveMutableStore,\n createNonReactiveReadonlyStore,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n AnyRoute,\n GetStoreConfig,\n RouterReadableStore,\n RouterStores,\n RouterWritableStore,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouterStores<in out TRouteTree extends AnyRoute> {\n /** Maps each active routeId to the matchId of its child in the match tree. */\n childMatchIdByRouteId: RouterReadableStore<Record<string, string>>\n /** Maps each pending routeId to true for quick lookup. */\n pendingRouteIds: RouterReadableStore<Record<string, boolean>>\n }\n}\n\nfunction initRouterStores(\n stores: RouterStores<AnyRoute>,\n createReadonlyStore: <TValue>(\n read: () => TValue,\n ) => RouterReadableStore<TValue>,\n) {\n stores.childMatchIdByRouteId = createReadonlyStore(() => {\n const ids = stores.matchesId.state\n const obj: Record<string, string> = {}\n for (let i = 0; i < ids.length - 1; i++) {\n const parentStore = stores.activeMatchStoresById.get(ids[i]!)\n if (parentStore?.routeId) {\n obj[parentStore.routeId] = ids[i + 1]!\n }\n }\n return obj\n })\n\n stores.pendingRouteIds = createReadonlyStore(() => {\n const ids = stores.pendingMatchesId.state\n const obj: Record<string, boolean> = {}\n for (const id of ids) {\n const store = stores.pendingMatchStoresById.get(id)\n if (store?.routeId) {\n obj[store.routeId] = true\n }\n }\n return obj\n })\n}\n\nfunction createSolidMutableStore<TValue>(\n initialValue: TValue,\n): RouterWritableStore<TValue> {\n const [signal, setSignal] = Solid.createSignal(initialValue)\n\n return {\n get state() {\n return signal()\n },\n setState: setSignal,\n }\n}\n\nlet finalizationRegistry: FinalizationRegistry<() => void> | null = null\nif (typeof globalThis !== 'undefined' && 'FinalizationRegistry' in globalThis) {\n finalizationRegistry = new FinalizationRegistry((cb) => cb())\n}\n\nfunction createSolidReadonlyStore<TValue>(\n read: () => TValue,\n): RouterReadableStore<TValue> {\n let dispose!: () => void\n const memo = Solid.createRoot((d) => {\n dispose = d\n return Solid.createMemo(read)\n })\n const store = {\n get state() {\n return memo()\n },\n }\n finalizationRegistry?.register(store, dispose)\n return store\n}\n\nexport const getStoreFactory: GetStoreConfig = (opts) => {\n if (isServer ?? opts.isServer) {\n return {\n createMutableStore: createNonReactiveMutableStore,\n createReadonlyStore: createNonReactiveReadonlyStore,\n batch: (fn) => fn(),\n init: (stores) =>\n initRouterStores(stores, createNonReactiveReadonlyStore),\n }\n }\n\n return {\n createMutableStore: createSolidMutableStore,\n createReadonlyStore: createSolidReadonlyStore,\n batch: Solid.batch,\n init: (stores) => initRouterStores(stores, createSolidReadonlyStore),\n }\n}\n"],"mappings":";;;;AAuBA,SAAS,iBACP,QACA,qBAGA;AACA,QAAO,wBAAwB,0BAA0B;EACvD,MAAM,MAAM,OAAO,UAAU;EAC7B,MAAM,MAA8B,EAAE;AACtC,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;GACvC,MAAM,cAAc,OAAO,sBAAsB,IAAI,IAAI,GAAI;AAC7D,OAAI,aAAa,QACf,KAAI,YAAY,WAAW,IAAI,IAAI;;AAGvC,SAAO;GACP;AAEF,QAAO,kBAAkB,0BAA0B;EACjD,MAAM,MAAM,OAAO,iBAAiB;EACpC,MAAM,MAA+B,EAAE;AACvC,OAAK,MAAM,MAAM,KAAK;GACpB,MAAM,QAAQ,OAAO,uBAAuB,IAAI,GAAG;AACnD,OAAI,OAAO,QACT,KAAI,MAAM,WAAW;;AAGzB,SAAO;GACP;;AAGJ,SAAS,wBACP,cAC6B;CAC7B,MAAM,CAAC,QAAQ,aAAa,MAAM,aAAa,aAAa;AAE5D,QAAO;EACL,IAAI,QAAQ;AACV,UAAO,QAAQ;;EAEjB,UAAU;EACX;;AAGH,IAAI,uBAAgE;AACpE,IAAI,OAAO,eAAe,eAAe,0BAA0B,WACjE,wBAAuB,IAAI,sBAAsB,OAAO,IAAI,CAAC;AAG/D,SAAS,yBACP,MAC6B;CAC7B,IAAI;CACJ,MAAM,OAAO,MAAM,YAAY,MAAM;AACnC,YAAU;AACV,SAAO,MAAM,WAAW,KAAK;GAC7B;CACF,MAAM,QAAQ,EACZ,IAAI,QAAQ;AACV,SAAO,MAAM;IAEhB;AACD,uBAAsB,SAAS,OAAO,QAAQ;AAC9C,QAAO;;AAGT,IAAa,mBAAmC,SAAS;AACvD,KAAI,YAAY,KAAK,SACnB,QAAO;EACL,oBAAoB;EACpB,qBAAqB;EACrB,QAAQ,OAAO,IAAI;EACnB,OAAO,WACL,iBAAiB,QAAQ,+BAA+B;EAC3D;AAGH,QAAO;EACL,oBAAoB;EACpB,qBAAqB;EACrB,OAAO,MAAM;EACb,OAAO,WAAW,iBAAiB,QAAQ,yBAAyB;EACrE"}
@@ -7,7 +7,7 @@ import { hydrate } from "@tanstack/router-core/ssr/client";
7
7
  var hydrationPromise;
8
8
  var Dummy = (props) => memo(() => props.children);
9
9
  function RouterClient(props) {
10
- if (!hydrationPromise) if (!props.router.state.matches.length) hydrationPromise = hydrate(props.router);
10
+ if (!hydrationPromise) if (!props.router.stores.matchesId.state.length) hydrationPromise = hydrate(props.router);
11
11
  else hydrationPromise = Promise.resolve();
12
12
  return createComponent(Await, {
13
13
  promise: hydrationPromise,
@@ -1 +1 @@
1
- {"version":3,"file":"RouterClient.js","names":["hydrate","Await","HeadContent","RouterProvider","AnyRouter","JSXElement","hydrationPromise","Promise","Array","Dummy","props","children","_$memo","RouterClient","router","state","matches","length","resolve","_$createComponent","promise","InnerWrap"],"sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\nimport { Await } from '../awaited'\nimport { HeadContent } from '../HeadContent'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nconst Dummy = (props: { children?: JSXElement }) => <>{props.children}</>\n\nexport function RouterClient(props: { router: AnyRouter }) {\n if (!hydrationPromise) {\n if (!props.router.state.matches.length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n return (\n <Await\n promise={hydrationPromise}\n children={() => (\n <Dummy>\n <Dummy>\n <RouterProvider\n router={props.router}\n InnerWrap={(props) => (\n <Dummy>\n <Dummy>\n <HeadContent />\n {props.children}\n </Dummy>\n <Dummy />\n </Dummy>\n )}\n />\n </Dummy>\n </Dummy>\n )}\n />\n )\n}\n"],"mappings":";;;;;;AAOA,IAAIM;AAEJ,IAAMG,SAASC,UAAgCE,WAAQF,MAAMC,SAAY;AAEzE,SAAgBE,aAAaH,OAA8B;AACzD,KAAI,CAACJ,iBACH,KAAI,CAACI,MAAMI,OAAOC,MAAMC,QAAQC,OAC9BX,oBAAmBN,QAAQU,MAAMI,OAAO;KAExCR,oBAAmBC,QAAQW,SAAS;AAGxC,QAAAC,gBACGlB,OAAK;EACJmB,SAASd;EACTK,gBAAUQ,gBACPV,OAAK,EAAA,IAAAE,WAAA;AAAA,UAAAQ,gBACHV,OAAK,EAAA,IAAAE,WAAA;AAAA,WAAAQ,gBACHhB,gBAAc;KAAA,IACbW,SAAM;AAAA,aAAEJ,MAAMI;;KACdO,YAAYX,UAAKS,gBACdV,OAAK,EAAA,IAAAE,WAAA;AAAA,aAAA,CAAAQ,gBACHV,OAAK,EAAA,IAAAE,WAAA;AAAA,cAAA,CAAAQ,gBACHjB,aAAW,EAAA,CAAA,EAAAU,WACXF,MAAMC,SAAQ,CAAA;SAAA,CAAA,EAAAQ,gBAEhBV,OAAK,EAAA,CAAA,CAAA;QAAA,CAAA;KAET,CAAA;MAAA,CAAA;KAAA,CAAA;EAIR,CAAA"}
1
+ {"version":3,"file":"RouterClient.js","names":["hydrate","Await","HeadContent","RouterProvider","AnyRouter","JSXElement","hydrationPromise","Promise","Array","Dummy","props","children","_$memo","RouterClient","router","stores","matchesId","state","length","resolve","_$createComponent","promise","InnerWrap"],"sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\nimport { Await } from '../awaited'\nimport { HeadContent } from '../HeadContent'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nconst Dummy = (props: { children?: JSXElement }) => <>{props.children}</>\n\nexport function RouterClient(props: { router: AnyRouter }) {\n if (!hydrationPromise) {\n if (!props.router.stores.matchesId.state.length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n return (\n <Await\n promise={hydrationPromise}\n children={() => (\n <Dummy>\n <Dummy>\n <RouterProvider\n router={props.router}\n InnerWrap={(props) => (\n <Dummy>\n <Dummy>\n <HeadContent />\n {props.children}\n </Dummy>\n <Dummy />\n </Dummy>\n )}\n />\n </Dummy>\n </Dummy>\n )}\n />\n )\n}\n"],"mappings":";;;;;;AAOA,IAAIM;AAEJ,IAAMG,SAASC,UAAgCE,WAAQF,MAAMC,SAAY;AAEzE,SAAgBE,aAAaH,OAA8B;AACzD,KAAI,CAACJ,iBACH,KAAI,CAACI,MAAMI,OAAOC,OAAOC,UAAUC,MAAMC,OACvCZ,oBAAmBN,QAAQU,MAAMI,OAAO;KAExCR,oBAAmBC,QAAQY,SAAS;AAGxC,QAAAC,gBACGnB,OAAK;EACJoB,SAASf;EACTK,gBAAUS,gBACPX,OAAK,EAAA,IAAAE,WAAA;AAAA,UAAAS,gBACHX,OAAK,EAAA,IAAAE,WAAA;AAAA,WAAAS,gBACHjB,gBAAc;KAAA,IACbW,SAAM;AAAA,aAAEJ,MAAMI;;KACdQ,YAAYZ,UAAKU,gBACdX,OAAK,EAAA,IAAAE,WAAA;AAAA,aAAA,CAAAS,gBACHX,OAAK,EAAA,IAAAE,WAAA;AAAA,cAAA,CAAAS,gBACHlB,aAAW,EAAA,CAAA,EAAAU,WACXF,MAAMC,SAAQ,CAAA;SAAA,CAAA,EAAAS,gBAEhBX,OAAK,EAAA,CAAA,CAAA;QAAA,CAAA;KAET,CAAA;MAAA,CAAA;KAAA,CAAA;EAIR,CAAA"}
@@ -18,7 +18,7 @@ var renderRouterToStream = async ({ request, router, responseHeaders, children }
18
18
  stream.pipeTo(writable);
19
19
  const responseStream = transformReadableStreamWithRouter(router, readable);
20
20
  return new Response(responseStream, {
21
- status: router.state.statusCode,
21
+ status: router.stores.statusCode.state,
22
22
  headers: responseHeaders
23
23
  });
24
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"renderRouterToStream.js","names":["Solid","isbot","transformReadableStreamWithRouter","makeSsrSerovalPlugin","JSXElement","ReadableStream","AnyRouter","renderRouterToStream","request","router","responseHeaders","children","Request","Headers","writable","readable","TransformStream","docType","ssr","serializationAdapters","options","serovalPlugins","map","adapter","plugin","didRun","stream","renderToStream","_$memo","nonce","plugins","headers","get","pipeTo","responseStream","Response","status","state","statusCode"],"sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { isbot } from 'isbot'\nimport { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\nimport type { ReadableStream } from 'node:stream/web'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n children,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n const { writable, readable } = new TransformStream()\n\n const docType = Solid.ssr('<!DOCTYPE html>')\n\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n const stream = Solid.renderToStream(\n () => (\n <>\n {docType}\n {children()}\n </>\n ),\n {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any,\n )\n\n if (isbot(request.headers.get('User-Agent'))) {\n await stream\n }\n stream.pipeTo(writable)\n\n const responseStream = transformReadableStreamWithRouter(\n router,\n readable as unknown as ReadableStream,\n )\n return new Response(responseStream as any, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n}\n"],"mappings":";;;;;;AAQA,IAAaO,uBAAuB,OAAO,EACzCC,SACAC,QACAC,iBACAC,eAMI;CACJ,MAAM,EAAEG,UAAUC,aAAa,IAAIC,iBAAiB;CAEpD,MAAMC,UAAUjB,MAAMkB,IAAI,kBAAkB;CAK5C,MAAMG,kBAFHZ,OAAOW,SAAiBD,yBACxBV,OAAOW,QAAQF,KAAaC,wBACeG,KAAKC,YAAiB;AAElE,SADepB,qBAAqBoB,SAAS,EAAEE,QAAQ,OAAO,CAAC;GAE/D;CAEF,MAAMC,SAAS1B,MAAM2B,qBACnB,CAEKV,SAAOW,KACPjB,SAAQ,CAEZ,EACD;EACEkB,OAAOpB,OAAOW,QAAQF,KAAKW;EAC3BC,SAAST;EACV,CACF;AAED,KAAIpB,MAAMO,QAAQuB,QAAQC,IAAI,aAAa,CAAC,CAC1C,OAAMN;AAERA,QAAOO,OAAOnB,SAAS;CAEvB,MAAMoB,iBAAiBhC,kCACrBO,QACAM,SACD;AACD,QAAO,IAAIoB,SAASD,gBAAuB;EACzCE,QAAQ3B,OAAO4B,MAAMC;EACrBP,SAASrB;EACV,CAAC"}
1
+ {"version":3,"file":"renderRouterToStream.js","names":["Solid","isbot","transformReadableStreamWithRouter","makeSsrSerovalPlugin","JSXElement","ReadableStream","AnyRouter","renderRouterToStream","request","router","responseHeaders","children","Request","Headers","writable","readable","TransformStream","docType","ssr","serializationAdapters","options","serovalPlugins","map","adapter","plugin","didRun","stream","renderToStream","_$memo","nonce","plugins","headers","get","pipeTo","responseStream","Response","status","stores","statusCode","state"],"sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { isbot } from 'isbot'\nimport { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\nimport type { ReadableStream } from 'node:stream/web'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n children,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n const { writable, readable } = new TransformStream()\n\n const docType = Solid.ssr('<!DOCTYPE html>')\n\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n const stream = Solid.renderToStream(\n () => (\n <>\n {docType}\n {children()}\n </>\n ),\n {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any,\n )\n\n if (isbot(request.headers.get('User-Agent'))) {\n await stream\n }\n stream.pipeTo(writable)\n\n const responseStream = transformReadableStreamWithRouter(\n router,\n readable as unknown as ReadableStream,\n )\n return new Response(responseStream as any, {\n status: router.stores.statusCode.state,\n headers: responseHeaders,\n })\n}\n"],"mappings":";;;;;;AAQA,IAAaO,uBAAuB,OAAO,EACzCC,SACAC,QACAC,iBACAC,eAMI;CACJ,MAAM,EAAEG,UAAUC,aAAa,IAAIC,iBAAiB;CAEpD,MAAMC,UAAUjB,MAAMkB,IAAI,kBAAkB;CAK5C,MAAMG,kBAFHZ,OAAOW,SAAiBD,yBACxBV,OAAOW,QAAQF,KAAaC,wBACeG,KAAKC,YAAiB;AAElE,SADepB,qBAAqBoB,SAAS,EAAEE,QAAQ,OAAO,CAAC;GAE/D;CAEF,MAAMC,SAAS1B,MAAM2B,qBACnB,CAEKV,SAAOW,KACPjB,SAAQ,CAEZ,EACD;EACEkB,OAAOpB,OAAOW,QAAQF,KAAKW;EAC3BC,SAAST;EACV,CACF;AAED,KAAIpB,MAAMO,QAAQuB,QAAQC,IAAI,aAAa,CAAC,CAC1C,OAAMN;AAERA,QAAOO,OAAOnB,SAAS;CAEvB,MAAMoB,iBAAiBhC,kCACrBO,QACAM,SACD;AACD,QAAO,IAAIoB,SAASD,gBAAuB;EACzCE,QAAQ3B,OAAO4B,OAAOC,WAAWC;EACjCR,SAASrB;EACV,CAAC"}
@@ -4,4 +4,4 @@ export declare const renderRouterToString: ({ router, responseHeaders, children,
4
4
  router: AnyRouter;
5
5
  responseHeaders: Headers;
6
6
  children: () => JSXElement;
7
- }) => Promise<Response>;
7
+ }) => Response;
@@ -1,7 +1,7 @@
1
1
  import { makeSsrSerovalPlugin } from "@tanstack/router-core";
2
2
  import * as Solid from "solid-js/web";
3
3
  //#region src/ssr/renderRouterToString.tsx
4
- var renderRouterToString = async ({ router, responseHeaders, children }) => {
4
+ var renderRouterToString = ({ router, responseHeaders, children }) => {
5
5
  try {
6
6
  const serovalPlugins = (router.options?.serializationAdapters || router.options.ssr?.serializationAdapters)?.map((adapter) => {
7
7
  return makeSsrSerovalPlugin(adapter, { didRun: false });
@@ -14,7 +14,7 @@ var renderRouterToString = async ({ router, responseHeaders, children }) => {
14
14
  const injectedHtml = router.serverSsr.takeBufferedHtml();
15
15
  if (injectedHtml) html = html.replace(`</body>`, () => `${injectedHtml}</body>`);
16
16
  return new Response(`<!DOCTYPE html>${html}`, {
17
- status: router.state.statusCode,
17
+ status: router.stores.statusCode.state,
18
18
  headers: responseHeaders
19
19
  });
20
20
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"renderRouterToString.js","names":["Solid","makeSsrSerovalPlugin","AnyRouter","JSXElement","renderRouterToString","router","responseHeaders","children","Headers","serializationAdapters","options","ssr","serovalPlugins","map","adapter","plugin","didRun","html","renderToString","nonce","plugins","serverSsr","setRenderFinished","injectedHtml","takeBufferedHtml","replace","Response","status","state","statusCode","headers","error","console","cleanup"],"sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nexport const renderRouterToString = async ({\n router,\n responseHeaders,\n children,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n try {\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n let html = Solid.renderToString(children, {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"mappings":";;;AAKA,IAAaI,uBAAuB,OAAO,EACzCC,QACAC,iBACAC,eAKI;AACJ,KAAI;EAIF,MAAMK,kBAFHP,OAAOK,SAAiBD,yBACxBJ,OAAOK,QAAQC,KAAaF,wBACeI,KAAKC,YAAiB;AAElE,UADeb,qBAAqBa,SAAS,EAAEE,QAAQ,OAAO,CAAC;IAE/D;EAEF,IAAIC,OAAOjB,MAAMkB,eAAeX,UAAU;GACxCY,OAAOd,OAAOK,QAAQC,KAAKQ;GAC3BC,SAASR;GACV,CAAQ;AACTP,SAAOgB,UAAWC,mBAAmB;EAErC,MAAMC,eAAelB,OAAOgB,UAAWG,kBAAkB;AACzD,MAAID,aACFN,QAAOA,KAAKQ,QAAQ,iBAAiB,GAAGF,aAAY,SAAU;AAEhE,SAAO,IAAIG,SAAS,kBAAkBT,QAAQ;GAC5CU,QAAQtB,OAAOuB,MAAMC;GACrBC,SAASxB;GACV,CAAC;UACKyB,OAAO;AACdC,UAAQD,MAAM,2BAA2BA,MAAM;AAC/C,SAAO,IAAIL,SAAS,yBAAyB;GAC3CC,QAAQ;GACRG,SAASxB;GACV,CAAC;WACM;AACRD,SAAOgB,WAAWY,SAAS"}
1
+ {"version":3,"file":"renderRouterToString.js","names":["Solid","makeSsrSerovalPlugin","AnyRouter","JSXElement","renderRouterToString","router","responseHeaders","children","Headers","serializationAdapters","options","ssr","serovalPlugins","map","adapter","plugin","didRun","html","renderToString","nonce","plugins","serverSsr","setRenderFinished","injectedHtml","takeBufferedHtml","replace","Response","status","stores","statusCode","state","headers","error","console","cleanup"],"sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nexport const renderRouterToString = ({\n router,\n responseHeaders,\n children,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n try {\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n let html = Solid.renderToString(children, {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.stores.statusCode.state,\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"mappings":";;;AAKA,IAAaI,wBAAwB,EACnCC,QACAC,iBACAC,eAKI;AACJ,KAAI;EAIF,MAAMK,kBAFHP,OAAOK,SAAiBD,yBACxBJ,OAAOK,QAAQC,KAAaF,wBACeI,KAAKC,YAAiB;AAElE,UADeb,qBAAqBa,SAAS,EAAEE,QAAQ,OAAO,CAAC;IAE/D;EAEF,IAAIC,OAAOjB,MAAMkB,eAAeX,UAAU;GACxCY,OAAOd,OAAOK,QAAQC,KAAKQ;GAC3BC,SAASR;GACV,CAAQ;AACTP,SAAOgB,UAAWC,mBAAmB;EAErC,MAAMC,eAAelB,OAAOgB,UAAWG,kBAAkB;AACzD,MAAID,aACFN,QAAOA,KAAKQ,QAAQ,iBAAiB,GAAGF,aAAY,SAAU;AAEhE,SAAO,IAAIG,SAAS,kBAAkBT,QAAQ;GAC5CU,QAAQtB,OAAOuB,OAAOC,WAAWC;GACjCC,SAASzB;GACV,CAAC;UACK0B,OAAO;AACdC,UAAQD,MAAM,2BAA2BA,MAAM;AAC/C,SAAO,IAAIN,SAAS,yBAAyB;GAC3CC,QAAQ;GACRI,SAASzB;GACV,CAAC;WACM;AACRD,SAAOgB,WAAWa,SAAS"}
@@ -1 +1,2 @@
1
- export declare function useCanGoBack(): import('solid-js').Accessor<boolean>;
1
+ import * as Solid from 'solid-js';
2
+ export declare function useCanGoBack(): Solid.Accessor<boolean>;
@@ -1,7 +1,9 @@
1
- import { useRouterState } from "./useRouterState.js";
1
+ import { useRouter } from "./useRouter.js";
2
+ import * as Solid from "solid-js";
2
3
  //#region src/useCanGoBack.ts
3
4
  function useCanGoBack() {
4
- return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 });
5
+ const router = useRouter();
6
+ return Solid.createMemo(() => router.stores.location.state.state.__TSR_index !== 0);
5
7
  }
6
8
  //#endregion
7
9
  export { useCanGoBack };
@@ -1 +1 @@
1
- {"version":3,"file":"useCanGoBack.js","names":[],"sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import { useRouterState } from './useRouterState'\n\nexport function useCanGoBack() {\n return useRouterState({ select: (s) => s.location.state.__TSR_index !== 0 })\n}\n"],"mappings":";;AAEA,SAAgB,eAAe;AAC7B,QAAO,eAAe,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,gBAAgB,GAAG,CAAC"}
1
+ {"version":3,"file":"useCanGoBack.js","names":[],"sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\n\nexport function useCanGoBack() {\n const router = useRouter()\n return Solid.createMemo(\n () => router.stores.location.state.state.__TSR_index !== 0,\n )\n}\n"],"mappings":";;;AAGA,SAAgB,eAAe;CAC7B,MAAM,SAAS,WAAW;AAC1B,QAAO,MAAM,iBACL,OAAO,OAAO,SAAS,MAAM,MAAM,gBAAgB,EAC1D"}
@@ -1,11 +1,10 @@
1
1
  import { useMatch } from "./useMatch.js";
2
2
  //#region src/useLoaderDeps.tsx
3
3
  function useLoaderDeps(opts) {
4
- const { select, ...rest } = opts;
5
4
  return useMatch({
6
- ...rest,
5
+ ...opts,
7
6
  select: (s) => {
8
- return select ? select(s.loaderDeps) : s.loaderDeps;
7
+ return opts.select ? opts.select(s.loaderDeps) : s.loaderDeps;
9
8
  }
10
9
  });
11
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useLoaderDeps.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseLoaderDeps","StrictOrFrom","UseLoaderDepsResult","UseLoaderDepsBaseOptions","select","deps","TRouter","TFrom","TSelected","UseLoaderDepsOptions","UseLoaderDepsRoute","opts","TId","useLoaderDeps","rest","s","loaderDeps"],"sources":["../../src/useLoaderDeps.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseLoaderDeps,\n StrictOrFrom,\n UseLoaderDepsResult,\n} from '@tanstack/router-core'\n\nexport interface UseLoaderDepsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TSelected,\n> {\n select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected\n}\n\nexport type UseLoaderDepsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom> &\n UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>\n\nexport type UseLoaderDepsRoute<out TId> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,\n) => Accessor<UseLoaderDepsResult<TRouter, TId, TSelected>>\n\nexport function useLoaderDeps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TSelected = unknown,\n>(\n opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>,\n): Accessor<UseLoaderDepsResult<TRouter, TFrom, TSelected>> {\n const { select, ...rest } = opts\n return useMatch({\n ...rest,\n select: (s) => {\n return select ? select(s.loaderDeps) : s.loaderDeps\n },\n }) as Accessor<UseLoaderDepsResult<TRouter, TFrom, TSelected>>\n}\n"],"mappings":";;AAgCA,SAAgBiB,cAKdF,MAC0D;CAC1D,MAAM,EAAEP,QAAQ,GAAGU,SAASH;AAC5B,QAAOf,SAAS;EACd,GAAGkB;EACHV,SAASW,MAAM;AACb,UAAOX,SAASA,OAAOW,EAAEC,WAAW,GAAGD,EAAEC;;EAE5C,CAAC"}
1
+ {"version":3,"file":"useLoaderDeps.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseLoaderDeps","StrictOrFrom","UseLoaderDepsResult","UseLoaderDepsBaseOptions","select","deps","TRouter","TFrom","TSelected","UseLoaderDepsOptions","UseLoaderDepsRoute","opts","TId","useLoaderDeps","s","loaderDeps"],"sources":["../../src/useLoaderDeps.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseLoaderDeps,\n StrictOrFrom,\n UseLoaderDepsResult,\n} from '@tanstack/router-core'\n\nexport interface UseLoaderDepsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TSelected,\n> {\n select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected\n}\n\nexport type UseLoaderDepsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom> &\n UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>\n\nexport type UseLoaderDepsRoute<out TId> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,\n) => Accessor<UseLoaderDepsResult<TRouter, TId, TSelected>>\n\nexport function useLoaderDeps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TSelected = unknown,\n>(\n opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>,\n): Accessor<UseLoaderDepsResult<TRouter, TFrom, TSelected>> {\n return useMatch({\n ...opts,\n select: (s) => {\n return opts.select ? opts.select(s.loaderDeps) : s.loaderDeps\n },\n }) as Accessor<UseLoaderDepsResult<TRouter, TFrom, TSelected>>\n}\n"],"mappings":";;AAgCA,SAAgBiB,cAKdF,MAC0D;AAC1D,QAAOf,SAAS;EACd,GAAGe;EACHP,SAASU,MAAM;AACb,UAAOH,KAAKP,SAASO,KAAKP,OAAOU,EAAEC,WAAW,GAAGD,EAAEC;;EAEtD,CAAC"}
@@ -1,7 +1,16 @@
1
- import { useRouterState } from "./useRouterState.js";
1
+ import { useRouter } from "./useRouter.js";
2
+ import { replaceEqualDeep } from "@tanstack/router-core";
3
+ import * as Solid from "solid-js";
2
4
  //#region src/useLocation.tsx
3
5
  function useLocation(opts) {
4
- return useRouterState({ select: (state) => opts?.select ? opts.select(state.location) : state.location });
6
+ const router = useRouter();
7
+ if (!opts?.select) return (() => router.stores.location.state);
8
+ const select = opts.select;
9
+ return Solid.createMemo((prev) => {
10
+ const res = select(router.stores.location.state);
11
+ if (prev === void 0) return res;
12
+ return replaceEqualDeep(prev, res);
13
+ });
5
14
  }
6
15
  //#endregion
7
16
  export { useLocation };
@@ -1 +1 @@
1
- {"version":3,"file":"useLocation.js","names":["useRouterState","AnyRouter","RegisteredRouter","RouterState","Accessor","UseLocationBaseOptions","select","state","TRouter","TSelected","UseLocationResult","useLocation","opts","location"],"sources":["../../src/useLocation.tsx"],"sourcesContent":["import { useRouterState } from './useRouterState'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport interface UseLocationBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (state: RouterState<TRouter['routeTree']>['location']) => TSelected\n}\n\nexport type UseLocationResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected\n ? RouterState<TRouter['routeTree']>['location']\n : TSelected\n\nexport function useLocation<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLocationBaseOptions<TRouter, TSelected>,\n): Accessor<UseLocationResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: any) =>\n opts?.select ? opts.select(state.location) : state.location,\n } as any) as Accessor<UseLocationResult<TRouter, TSelected>>\n}\n"],"mappings":";;AAmBA,SAAgBW,YAIdC,MACiD;AACjD,QAAOZ,eAAe,EACpBM,SAASC,UACPK,MAAMN,SAASM,KAAKN,OAAOC,MAAMM,SAAS,GAAGN,MAAMM,UACtD,CAAQ"}
1
+ {"version":3,"file":"useLocation.js","names":["Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseLocationBaseOptions","select","state","TRouter","TSelected","UseLocationResult","useLocation","opts","router","stores","location","createMemo","prev","res","undefined"],"sources":["../../src/useLocation.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport interface UseLocationBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (state: RouterState<TRouter['routeTree']>['location']) => TSelected\n}\n\nexport type UseLocationResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected\n ? RouterState<TRouter['routeTree']>['location']\n : TSelected\n\nexport function useLocation<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLocationBaseOptions<TRouter, TSelected>,\n): Accessor<UseLocationResult<TRouter, TSelected>> {\n const router = useRouter<TRouter>()\n\n if (!opts?.select) {\n return (() => router.stores.location.state) as Accessor<\n UseLocationResult<TRouter, TSelected>\n >\n }\n\n const select = opts.select\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const res = select(router.stores.location.state)\n if (prev === undefined) return res\n return replaceEqualDeep(prev, res)\n }) as Accessor<UseLocationResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;AAqBA,SAAgBa,YAIdC,MACiD;CACjD,MAAMC,SAASb,WAAoB;AAEnC,KAAI,CAACY,MAAMN,OACT,eAAcO,OAAOC,OAAOC,SAASR;CAKvC,MAAMD,SAASM,KAAKN;AAEpB,QAAOR,MAAMkB,YAAYC,SAAgC;EACvD,MAAMC,MAAMZ,OAAOO,OAAOC,OAAOC,SAASR,MAAM;AAChD,MAAIU,SAASE,KAAAA,EAAW,QAAOD;AAC/B,SAAOnB,iBAAiBkB,MAAMC,IAAI;GAClC"}
@@ -1,25 +1,27 @@
1
- import { useRouterState } from "./useRouterState.js";
2
- import { dummyMatchContext, matchContext } from "./matchContext.js";
1
+ import { useRouter } from "./useRouter.js";
2
+ import { nearestMatchContext } from "./matchContext.js";
3
+ import { replaceEqualDeep } from "@tanstack/router-core";
3
4
  import * as Solid from "solid-js";
4
5
  import invariant from "tiny-invariant";
5
6
  //#region src/useMatch.tsx
6
7
  function useMatch(opts) {
7
- const nearestMatchId = Solid.useContext(opts.from ? dummyMatchContext : matchContext);
8
- const matchState = useRouterState({ select: (state) => {
9
- const match = state.matches.find((d) => opts.from ? opts.from === d.routeId : d.id === nearestMatchId());
10
- if (match === void 0) return {
11
- match: void 0,
12
- shouldThrowError: !state.pendingMatches?.find((d) => opts.from ? opts.from === d.routeId : d.id === nearestMatchId()) && !state.isTransitioning && (opts.shouldThrow ?? true)
13
- };
14
- return {
15
- match: opts.select ? opts.select(match) : match,
16
- shouldThrowError: false
17
- };
18
- } });
8
+ const router = useRouter();
9
+ const nearestMatch = opts.from ? void 0 : Solid.useContext(nearestMatchContext);
10
+ const match = () => {
11
+ if (opts.from) return router.stores.getMatchStoreByRouteId(opts.from).state;
12
+ return nearestMatch?.match();
13
+ };
19
14
  Solid.createEffect(() => {
20
- if (matchState().shouldThrowError) invariant(false, `Could not find ${opts.from ? `an active match from "${opts.from}"` : "a nearest match!"}`);
15
+ if (match() !== void 0) return;
16
+ invariant(!(!(opts.from ? Boolean(router.stores.pendingRouteIds.state[opts.from]) : nearestMatch?.hasPending() ?? false) && !router.stores.isTransitioning.state && (opts.shouldThrow ?? true)), `Could not find ${opts.from ? `an active match from "${opts.from}"` : "a nearest match!"}`);
17
+ });
18
+ return Solid.createMemo((prev) => {
19
+ const selectedMatch = match();
20
+ if (selectedMatch === void 0) return void 0;
21
+ const res = opts.select ? opts.select(selectedMatch) : selectedMatch;
22
+ if (prev === void 0) return res;
23
+ return replaceEqualDeep(prev, res);
21
24
  });
22
- return Solid.createMemo(() => matchState().match);
23
25
  }
24
26
  //#endregion
25
27
  export { useMatch };
@@ -1 +1 @@
1
- {"version":3,"file":"useMatch.js","names":["Solid","invariant","useRouterState","dummyMatchContext","matchContext","AnyRouter","MakeRouteMatch","MakeRouteMatchUnion","RegisteredRouter","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseMatchBaseOptions","select","match","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseMatchRoute","opts","Accessor","UseMatchResult","UseMatchOptions","useMatch","nearestMatchId","useContext","from","matchState","shouldThrowError","state","matches","find","d","routeId","id","undefined","pendingMatch","pendingMatches","isTransitioning","createEffect","createMemo"],"sources":["../../src/useMatch.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport { useRouterState } from './useRouterState'\nimport { dummyMatchContext, matchContext } from './matchContext'\nimport type {\n AnyRouter,\n MakeRouteMatch,\n MakeRouteMatchUnion,\n RegisteredRouter,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n} from '@tanstack/router-core'\n\nexport interface UseMatchBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (\n match: MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>,\n ) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseMatchRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchBaseOptions<TRouter, TFrom, true, true, TSelected>,\n) => Solid.Accessor<UseMatchResult<TRouter, TFrom, true, TSelected>>\n\nexport type UseMatchOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseMatchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseMatchResult<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TSelected,\n> = unknown extends TSelected\n ? TStrict extends true\n ? MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>\n : MakeRouteMatchUnion<TRouter>\n : TSelected\n\nexport function useMatch<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseMatchOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Solid.Accessor<\n ThrowOrOptional<UseMatchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n const nearestMatchId = Solid.useContext(\n opts.from ? dummyMatchContext : matchContext,\n )\n\n // Create a signal to track error state separately from the match\n const matchState: Solid.Accessor<{\n match: any\n shouldThrowError: boolean\n }> = useRouterState({\n select: (state: any) => {\n const match = state.matches.find((d: any) =>\n opts.from ? opts.from === d.routeId : d.id === nearestMatchId(),\n )\n\n if (match === undefined) {\n // During navigation transitions, check if the match exists in pendingMatches\n const pendingMatch = state.pendingMatches?.find((d: any) =>\n opts.from ? opts.from === d.routeId : d.id === nearestMatchId(),\n )\n\n // Determine if we should throw an error\n const shouldThrowError =\n !pendingMatch && !state.isTransitioning && (opts.shouldThrow ?? true)\n\n return { match: undefined, shouldThrowError }\n }\n\n return {\n match: opts.select ? opts.select(match) : match,\n shouldThrowError: false,\n }\n },\n } as any)\n\n // Use createEffect to throw errors outside the reactive selector context\n // This allows error boundaries to properly catch the errors\n Solid.createEffect(() => {\n const state = matchState()\n if (state.shouldThrowError) {\n invariant(\n false,\n `Could not find ${opts.from ? `an active match from \"${opts.from}\"` : 'a nearest match!'}`,\n )\n }\n })\n\n // Return an accessor that extracts just the match value\n return Solid.createMemo(() => matchState().match) as any\n}\n"],"mappings":";;;;;AAsDA,SAAgB0B,SAOdJ,MASA;CACA,MAAMK,iBAAiB3B,MAAM4B,WAC3BN,KAAKO,OAAO1B,oBAAoBC,aACjC;CAGD,MAAM0B,aAGD5B,eAAe,EAClBW,SAASmB,UAAe;EACtB,MAAMlB,QAAQkB,MAAMC,QAAQC,MAAMC,MAChCb,KAAKO,OAAOP,KAAKO,SAASM,EAAEC,UAAUD,EAAEE,OAAOV,gBACjD,CAAC;AAED,MAAIb,UAAUwB,KAAAA,EAUZ,QAAO;GAAExB,OAAOwB,KAAAA;GAAWP,kBAFzB,CANmBC,MAAMQ,gBAAgBN,MAAMC,MAC/Cb,KAAKO,OAAOP,KAAKO,SAASM,EAAEC,UAAUD,EAAEE,OAAOV,gBACjD,CAAC,IAIkB,CAACK,MAAMS,oBAAoBnB,KAAKH,eAAe;GAErB;AAG/C,SAAO;GACLL,OAAOQ,KAAKT,SAASS,KAAKT,OAAOC,MAAM,GAAGA;GAC1CiB,kBAAkB;GACnB;IAEJ,CAAQ;AAIT/B,OAAM0C,mBAAmB;AAEvB,MADcZ,YAAY,CAChBC,iBACR9B,WACE,OACA,kBAAkBqB,KAAKO,OAAO,yBAAyBP,KAAKO,KAAI,KAAM,qBACvE;GAEH;AAGF,QAAO7B,MAAM2C,iBAAiBb,YAAY,CAAChB,MAAM"}
1
+ {"version":3,"file":"useMatch.js","names":["Solid","invariant","replaceEqualDeep","nearestMatchContext","useRouter","AnyRouter","MakeRouteMatch","MakeRouteMatchUnion","RegisteredRouter","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseMatchBaseOptions","select","match","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseMatchRoute","opts","Accessor","UseMatchResult","UseMatchOptions","useMatch","router","nearestMatch","from","undefined","useContext","stores","getMatchStoreByRouteId","state","createEffect","hasPendingMatch","Boolean","pendingRouteIds","hasPending","isTransitioning","createMemo","prev","selectedMatch","res"],"sources":["../../src/useMatch.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { nearestMatchContext } from './matchContext'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n MakeRouteMatch,\n MakeRouteMatchUnion,\n RegisteredRouter,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n} from '@tanstack/router-core'\n\nexport interface UseMatchBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (\n match: MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>,\n ) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseMatchRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchBaseOptions<TRouter, TFrom, true, true, TSelected>,\n) => Solid.Accessor<UseMatchResult<TRouter, TFrom, true, TSelected>>\n\nexport type UseMatchOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseMatchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseMatchResult<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TSelected,\n> = unknown extends TSelected\n ? TStrict extends true\n ? MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>\n : MakeRouteMatchUnion<TRouter>\n : TSelected\n\nexport function useMatch<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseMatchOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Solid.Accessor<\n ThrowOrOptional<UseMatchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n const router = useRouter<TRouter>()\n const nearestMatch = opts.from\n ? undefined\n : Solid.useContext(nearestMatchContext)\n\n const match = () => {\n if (opts.from) {\n return router.stores.getMatchStoreByRouteId(opts.from).state\n }\n\n return nearestMatch?.match()\n }\n\n Solid.createEffect(() => {\n if (match() !== undefined) {\n return\n }\n\n const hasPendingMatch = opts.from\n ? Boolean(router.stores.pendingRouteIds.state[opts.from!])\n : (nearestMatch?.hasPending() ?? false)\n\n invariant(\n !(\n !hasPendingMatch &&\n !router.stores.isTransitioning.state &&\n (opts.shouldThrow ?? true)\n ),\n `Could not find ${opts.from ? `an active match from \"${opts.from}\"` : 'a nearest match!'}`,\n )\n })\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const selectedMatch = match()\n\n if (selectedMatch === undefined) return undefined\n const res = opts.select ? opts.select(selectedMatch as any) : selectedMatch\n if (prev === undefined) return res as TSelected\n return replaceEqualDeep(prev, res) as TSelected\n }) as any\n}\n"],"mappings":";;;;;;AAuDA,SAAgB0B,SAOdJ,MASA;CACA,MAAMK,SAASvB,WAAoB;CACnC,MAAMwB,eAAeN,KAAKO,OACtBC,KAAAA,IACA9B,MAAM+B,WAAW5B,oBAAoB;CAEzC,MAAMW,cAAc;AAClB,MAAIQ,KAAKO,KACP,QAAOF,OAAOK,OAAOC,uBAAuBX,KAAKO,KAAK,CAACK;AAGzD,SAAON,cAAcd,OAAO;;AAG9Bd,OAAMmC,mBAAmB;AACvB,MAAIrB,OAAO,KAAKgB,KAAAA,EACd;AAOF7B,YACE,EACE,EANoBqB,KAAKO,OACzBQ,QAAQV,OAAOK,OAAOM,gBAAgBJ,MAAMZ,KAAKO,MAAO,GACvDD,cAAcW,YAAY,IAAI,UAK/B,CAACZ,OAAOK,OAAOQ,gBAAgBN,UAC9BZ,KAAKH,eAAe,QAEvB,kBAAkBG,KAAKO,OAAO,yBAAyBP,KAAKO,KAAI,KAAM,qBACvE;GACD;AAEF,QAAO7B,MAAMyC,YAAYC,SAAgC;EACvD,MAAMC,gBAAgB7B,OAAO;AAE7B,MAAI6B,kBAAkBb,KAAAA,EAAW,QAAOA,KAAAA;EACxC,MAAMc,MAAMtB,KAAKT,SAASS,KAAKT,OAAO8B,cAAqB,GAAGA;AAC9D,MAAID,SAASZ,KAAAA,EAAW,QAAOc;AAC/B,SAAO1C,iBAAiBwC,MAAME,IAAI;GAClC"}
@@ -3,8 +3,8 @@ import { useMatch } from "./useMatch.js";
3
3
  function useParams(opts) {
4
4
  return useMatch({
5
5
  from: opts.from,
6
- shouldThrow: opts.shouldThrow,
7
6
  strict: opts.strict,
7
+ shouldThrow: opts.shouldThrow,
8
8
  select: (match) => {
9
9
  const params = opts.strict === false ? match.params : match._strictParams;
10
10
  return opts.select ? opts.select(params) : params;
@@ -1 +1 @@
1
- {"version":3,"file":"useParams.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseParams","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseParamsResult","UseParamsBaseOptions","select","params","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseParamsOptions","UseParamsRoute","opts","useParams","from","strict","match","_strictParams"],"sources":["../../src/useParams.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseParams,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n UseParamsResult,\n} from '@tanstack/router-core'\n\nexport interface UseParamsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (params: ResolveUseParams<TRouter, TFrom, TStrict>) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseParamsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseParamsBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseParamsRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseParamsBaseOptions<\n TRouter,\n TFrom,\n /* TStrict */ true,\n /* TThrow */ true,\n TSelected\n >,\n) => Accessor<UseParamsResult<TRouter, TFrom, true, TSelected>>\n\nexport function useParams<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseParamsOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Accessor<\n ThrowOrOptional<UseParamsResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n return useMatch({\n from: opts.from!,\n shouldThrow: opts.shouldThrow,\n strict: opts.strict,\n select: (match) => {\n const params = opts.strict === false ? match.params : match._strictParams\n\n return opts.select ? opts.select(params) : params\n },\n }) as Accessor<any>\n}\n"],"mappings":";;AA6CA,SAAgBqB,UAOdD,MASA;AACA,QAAOpB,SAAS;EACdsB,MAAMF,KAAKE;EACXN,aAAaI,KAAKJ;EAClBO,QAAQH,KAAKG;EACbb,SAASc,UAAU;GACjB,MAAMb,SAASS,KAAKG,WAAW,QAAQC,MAAMb,SAASa,MAAMC;AAE5D,UAAOL,KAAKV,SAASU,KAAKV,OAAOC,OAAO,GAAGA;;EAE9C,CAAC"}
1
+ {"version":3,"file":"useParams.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseParams","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseParamsResult","UseParamsBaseOptions","select","params","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseParamsOptions","UseParamsRoute","opts","useParams","from","strict","match","_strictParams"],"sources":["../../src/useParams.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseParams,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n UseParamsResult,\n} from '@tanstack/router-core'\n\nexport interface UseParamsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (params: ResolveUseParams<TRouter, TFrom, TStrict>) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseParamsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseParamsBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseParamsRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseParamsBaseOptions<\n TRouter,\n TFrom,\n /* TStrict */ true,\n /* TThrow */ true,\n TSelected\n >,\n) => Accessor<UseParamsResult<TRouter, TFrom, true, TSelected>>\n\nexport function useParams<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseParamsOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Accessor<\n ThrowOrOptional<UseParamsResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n return useMatch({\n from: opts.from!,\n strict: opts.strict,\n shouldThrow: opts.shouldThrow,\n select: (match: any) => {\n const params = opts.strict === false ? match.params : match._strictParams\n return opts.select ? opts.select(params) : params\n },\n }) as Accessor<any>\n}\n"],"mappings":";;AA6CA,SAAgBqB,UAOdD,MASA;AACA,QAAOpB,SAAS;EACdsB,MAAMF,KAAKE;EACXC,QAAQH,KAAKG;EACbP,aAAaI,KAAKJ;EAClBN,SAASc,UAAe;GACtB,MAAMb,SAASS,KAAKG,WAAW,QAAQC,MAAMb,SAASa,MAAMC;AAC5D,UAAOL,KAAKV,SAASU,KAAKV,OAAOC,OAAO,GAAGA;;EAE9C,CAAC"}
@@ -1,31 +1,23 @@
1
1
  import { useRouter } from "./useRouter.js";
2
+ import { replaceEqualDeep } from "@tanstack/router-core";
3
+ import * as Solid from "solid-js";
2
4
  import { isServer } from "@tanstack/router-core/isServer";
3
- import { useStore } from "@tanstack/solid-store";
4
5
  //#region src/useRouterState.tsx
5
- function deepEqual(a, b) {
6
- if (Object.is(a, b)) return true;
7
- if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) return false;
8
- const keysA = Object.keys(a);
9
- const keysB = Object.keys(b);
10
- if (keysA.length !== keysB.length) return false;
11
- for (const key of keysA) {
12
- if (!Object.prototype.hasOwnProperty.call(b, key)) return false;
13
- if (!deepEqual(a[key], b[key])) return false;
14
- }
15
- return true;
16
- }
17
6
  function useRouterState(opts) {
18
7
  const contextRouter = useRouter({ warn: opts?.router === void 0 });
19
8
  const router = opts?.router || contextRouter;
20
9
  if (isServer ?? router.isServer) {
21
- const state = router.state;
10
+ const state = router.stores.__store.state;
22
11
  const selected = opts?.select ? opts.select(state) : state;
23
12
  return (() => selected);
24
13
  }
25
- return useStore(router.__store, (state) => {
26
- if (opts?.select) return opts.select(state);
27
- return state;
28
- }, { equal: deepEqual });
14
+ if (!opts?.select) return (() => router.stores.__store.state);
15
+ const select = opts.select;
16
+ return Solid.createMemo((prev) => {
17
+ const res = select(router.stores.__store.state);
18
+ if (prev === void 0) return res;
19
+ return replaceEqualDeep(prev, res);
20
+ });
29
21
  }
30
22
  //#endregion
31
23
  export { useRouterState };
@@ -1 +1 @@
1
- {"version":3,"file":"useRouterState.js","names":["useStore","isServer","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","deepEqual","a","b","Object","is","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","UseRouterStateOptions","router","TRouter","select","state","TSelected","UseRouterStateResult","useRouterState","opts","contextRouter","warn","undefined","_isServer","selected","__store","equal"],"sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { useStore } from '@tanstack/solid-store'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\n// Deep equality check to match behavior of solid-store 0.7.0's reconcile()\nfunction deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.state as RouterState<TRouter['routeTree']>\n const selected = (\n opts?.select ? opts.select(state) : state\n ) as UseRouterStateResult<TRouter, TSelected>\n return (() => selected) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n return useStore(\n router.__store,\n (state) => {\n if (opts?.select) return opts.select(state)\n\n return state\n },\n {\n // Use deep equality to match behavior of solid-store 0.7.0 which used\n // reconcile(). This ensures updates work correctly when selectors\n // return new object references but with the same values.\n equal: deepEqual,\n },\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;AAWA,SAASO,UAAUC,GAAQC,GAAiB;AAC1C,KAAIC,OAAOC,GAAGH,GAAGC,EAAE,CAAE,QAAO;AAE5B,KACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,KAEN,QAAO;CAGT,MAAMG,QAAQF,OAAOG,KAAKL,EAAE;CAC5B,MAAMM,QAAQJ,OAAOG,KAAKJ,EAAE;AAE5B,KAAIG,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,MAAK,MAAMC,OAAOJ,OAAO;AACvB,MAAI,CAACF,OAAOO,UAAUC,eAAeC,KAAKV,GAAGO,IAAI,CAAE,QAAO;AAC1D,MAAI,CAACT,UAAUC,EAAEQ,MAAMP,EAAEO,KAAK,CAAE,QAAO;;AAGzC,QAAO;;AAaT,SAAgBW,eAIdC,MACoD;CACpD,MAAMC,gBAAgB3B,UAAmB,EACvC4B,MAAMF,MAAMP,WAAWU,KAAAA,GACxB,CAAC;CACF,MAAMV,SAASO,MAAMP,UAAUQ;AAM/B,KADkB5B,YAAYoB,OAAOpB,UACtB;EACb,MAAMuB,QAAQH,OAAOG;EACrB,MAAMS,WACJL,MAAML,SAASK,KAAKL,OAAOC,MAAM,GAAGA;AAEtC,gBAAcS;;AAKhB,QAAOjC,SACLqB,OAAOa,UACNV,UAAU;AACT,MAAII,MAAML,OAAQ,QAAOK,KAAKL,OAAOC,MAAM;AAE3C,SAAOA;IAET,EAIEW,OAAO5B,WAEX,CAAC"}
1
+ {"version":3,"file":"useRouterState.js","names":["isServer","Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseRouterStateOptions","router","TRouter","select","state","TSelected","UseRouterStateResult","useRouterState","opts","contextRouter","warn","undefined","_isServer","stores","__store","selected","createMemo","prev","res"],"sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { isServer } from '@tanstack/router-core/isServer'\nimport * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.stores.__store.state as RouterState<\n TRouter['routeTree']\n >\n const selected = (\n opts?.select ? opts.select(state) : state\n ) as UseRouterStateResult<TRouter, TSelected>\n return (() => selected) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n if (!opts?.select) {\n return (() => router.stores.__store.state) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n const select = opts.select\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const res = select(router.stores.__store.state)\n if (prev === undefined) return res\n return replaceEqualDeep(prev, res)\n }) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;;AAqBA,SAAgBe,eAIdC,MACoD;CACpD,MAAMC,gBAAgBd,UAAmB,EACvCe,MAAMF,MAAMP,WAAWU,KAAAA,GACxB,CAAC;CACF,MAAMV,SAASO,MAAMP,UAAUQ;AAM/B,KADkBjB,YAAYS,OAAOT,UACtB;EACb,MAAMY,QAAQH,OAAOY,OAAOC,QAAQV;EAGpC,MAAMW,WACJP,MAAML,SAASK,KAAKL,OAAOC,MAAM,GAAGA;AAEtC,gBAAcW;;AAKhB,KAAI,CAACP,MAAML,OACT,eAAcF,OAAOY,OAAOC,QAAQV;CAKtC,MAAMD,SAASK,KAAKL;AAEpB,QAAOV,MAAMuB,YAAYC,SAAgC;EACvD,MAAMC,MAAMf,OAAOF,OAAOY,OAAOC,QAAQV,MAAM;AAC/C,MAAIa,SAASN,KAAAA,EAAW,QAAOO;AAC/B,SAAOxB,iBAAiBuB,MAAMC,IAAI;GAClC"}
@@ -6,7 +6,8 @@ function useSearch(opts) {
6
6
  strict: opts.strict,
7
7
  shouldThrow: opts.shouldThrow,
8
8
  select: (match) => {
9
- return opts.select ? opts.select(match.search) : match.search;
9
+ const search = match.search;
10
+ return opts.select ? opts.select(search) : search;
10
11
  }
11
12
  });
12
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useSearch.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseSearch","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseSearchResult","UseSearchBaseOptions","select","state","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseSearchOptions","UseSearchRoute","opts","useSearch","from","strict","match","search"],"sources":["../../src/useSearch.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseSearch,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n UseSearchResult,\n} from '@tanstack/router-core'\n\nexport interface UseSearchBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (state: ResolveUseSearch<TRouter, TFrom, TStrict>) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseSearchOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseSearchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseSearchRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseSearchBaseOptions<\n TRouter,\n TFrom,\n /* TStrict */ true,\n /* TThrow */ true,\n TSelected\n >,\n) => Accessor<UseSearchResult<TRouter, TFrom, true, TSelected>>\n\nexport function useSearch<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseSearchOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Accessor<\n ThrowOrOptional<UseSearchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n return useMatch({\n from: opts.from!,\n strict: opts.strict,\n shouldThrow: opts.shouldThrow,\n select: (match: any) => {\n return opts.select ? opts.select(match.search) : match.search\n },\n }) as any\n}\n"],"mappings":";;AA6CA,SAAgBqB,UAOdD,MASA;AACA,QAAOpB,SAAS;EACdsB,MAAMF,KAAKE;EACXC,QAAQH,KAAKG;EACbP,aAAaI,KAAKJ;EAClBN,SAASc,UAAe;AACtB,UAAOJ,KAAKV,SAASU,KAAKV,OAAOc,MAAMC,OAAO,GAAGD,MAAMC;;EAE1D,CAAC"}
1
+ {"version":3,"file":"useSearch.js","names":["useMatch","Accessor","AnyRouter","RegisteredRouter","ResolveUseSearch","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseSearchResult","UseSearchBaseOptions","select","state","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseSearchOptions","UseSearchRoute","opts","useSearch","from","strict","match","search"],"sources":["../../src/useSearch.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { Accessor } from 'solid-js'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseSearch,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n UseSearchResult,\n} from '@tanstack/router-core'\n\nexport interface UseSearchBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (state: ResolveUseSearch<TRouter, TFrom, TStrict>) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseSearchOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseSearchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseSearchRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseSearchBaseOptions<\n TRouter,\n TFrom,\n /* TStrict */ true,\n /* TThrow */ true,\n TSelected\n >,\n) => Accessor<UseSearchResult<TRouter, TFrom, true, TSelected>>\n\nexport function useSearch<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseSearchOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Accessor<\n ThrowOrOptional<UseSearchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n return useMatch({\n from: opts.from!,\n strict: opts.strict,\n shouldThrow: opts.shouldThrow,\n select: (match: any) => {\n const search = match.search\n return opts.select ? opts.select(search) : search\n },\n }) as any\n}\n"],"mappings":";;AA6CA,SAAgBqB,UAOdD,MASA;AACA,QAAOpB,SAAS;EACdsB,MAAMF,KAAKE;EACXC,QAAQH,KAAKG;EACbP,aAAaI,KAAKJ;EAClBN,SAASc,UAAe;GACtB,MAAMC,SAASD,MAAMC;AACrB,UAAOL,KAAKV,SAASU,KAAKV,OAAOe,OAAO,GAAGA;;EAE9C,CAAC"}
@@ -1,8 +1,4 @@
1
1
  import * as Solid from 'solid-js';
2
- export declare const usePrevious: (fn: () => boolean) => Solid.Accessor<{
3
- current: boolean | null;
4
- previous: boolean | null;
5
- }>;
6
2
  /**
7
3
  * React hook to wrap `IntersectionObserver`.
8
4
  *
package/dist/esm/utils.js CHANGED
@@ -1,18 +1,5 @@
1
1
  import * as Solid from "solid-js";
2
2
  //#region src/utils.ts
3
- var usePrevious = (fn) => {
4
- return Solid.createMemo((prev = {
5
- current: null,
6
- previous: null
7
- }) => {
8
- const current = fn();
9
- if (prev.current !== current) {
10
- prev.previous = prev.current;
11
- prev.current = current;
12
- }
13
- return prev;
14
- });
15
- };
16
3
  /**
17
4
  * React hook to wrap `IntersectionObserver`.
18
5
  *
@@ -55,6 +42,6 @@ function useIntersectionObserver(ref, callback, intersectionObserverOptions = {}
55
42
  return () => observerRef;
56
43
  }
57
44
  //#endregion
58
- export { useIntersectionObserver, usePrevious };
45
+ export { useIntersectionObserver };
59
46
 
60
47
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import * as Solid from 'solid-js'\n\nexport const usePrevious = (fn: () => boolean) => {\n return Solid.createMemo(\n (\n prev: { current: boolean | null; previous: boolean | null } = {\n current: null,\n previous: null,\n },\n ) => {\n const current = fn()\n\n if (prev.current !== current) {\n prev.previous = prev.current\n prev.current = current\n }\n\n return prev\n },\n )\n}\n\n/**\n * React hook to wrap `IntersectionObserver`.\n *\n * This hook will create an `IntersectionObserver` and observe the ref passed to it.\n *\n * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`.\n *\n * @param ref - The ref to observe\n * @param intersectionObserverOptions - The options to pass to the IntersectionObserver\n * @param options - The options to pass to the hook\n * @param callback - The callback to call when the intersection changes\n * @returns The IntersectionObserver instance\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const ref = React.useRef<HTMLDivElement>(null)\n * useIntersectionObserver(\n * ref,\n * (entry) => { doSomething(entry) },\n * { rootMargin: '10px' },\n * { disabled: false }\n * )\n * return <div ref={ref} />\n * ```\n */\nexport function useIntersectionObserver<T extends Element>(\n ref: Solid.Accessor<T | null>,\n callback: (entry: IntersectionObserverEntry | undefined) => void,\n intersectionObserverOptions: IntersectionObserverInit = {},\n options: { disabled?: boolean } = {},\n): Solid.Accessor<IntersectionObserver | null> {\n const isIntersectionObserverAvailable =\n typeof IntersectionObserver === 'function'\n let observerRef: IntersectionObserver | null = null\n\n Solid.createEffect(() => {\n const r = ref()\n if (!r || !isIntersectionObserverAvailable || options.disabled) {\n return\n }\n\n observerRef = new IntersectionObserver(([entry]) => {\n callback(entry)\n }, intersectionObserverOptions)\n\n observerRef.observe(r)\n\n Solid.onCleanup(() => {\n observerRef?.disconnect()\n })\n })\n\n return () => observerRef\n}\n"],"mappings":";;AAEA,IAAa,eAAe,OAAsB;AAChD,QAAO,MAAM,YAET,OAA8D;EAC5D,SAAS;EACT,UAAU;EACX,KACE;EACH,MAAM,UAAU,IAAI;AAEpB,MAAI,KAAK,YAAY,SAAS;AAC5B,QAAK,WAAW,KAAK;AACrB,QAAK,UAAU;;AAGjB,SAAO;GAEV;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BH,SAAgB,wBACd,KACA,UACA,8BAAwD,EAAE,EAC1D,UAAkC,EAAE,EACS;CAC7C,MAAM,kCACJ,OAAO,yBAAyB;CAClC,IAAI,cAA2C;AAE/C,OAAM,mBAAmB;EACvB,MAAM,IAAI,KAAK;AACf,MAAI,CAAC,KAAK,CAAC,mCAAmC,QAAQ,SACpD;AAGF,gBAAc,IAAI,sBAAsB,CAAC,WAAW;AAClD,YAAS,MAAM;KACd,4BAA4B;AAE/B,cAAY,QAAQ,EAAE;AAEtB,QAAM,gBAAgB;AACpB,gBAAa,YAAY;IACzB;GACF;AAEF,cAAa"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import * as Solid from 'solid-js'\n\n/**\n * React hook to wrap `IntersectionObserver`.\n *\n * This hook will create an `IntersectionObserver` and observe the ref passed to it.\n *\n * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`.\n *\n * @param ref - The ref to observe\n * @param intersectionObserverOptions - The options to pass to the IntersectionObserver\n * @param options - The options to pass to the hook\n * @param callback - The callback to call when the intersection changes\n * @returns The IntersectionObserver instance\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const ref = React.useRef<HTMLDivElement>(null)\n * useIntersectionObserver(\n * ref,\n * (entry) => { doSomething(entry) },\n * { rootMargin: '10px' },\n * { disabled: false }\n * )\n * return <div ref={ref} />\n * ```\n */\nexport function useIntersectionObserver<T extends Element>(\n ref: Solid.Accessor<T | null>,\n callback: (entry: IntersectionObserverEntry | undefined) => void,\n intersectionObserverOptions: IntersectionObserverInit = {},\n options: { disabled?: boolean } = {},\n): Solid.Accessor<IntersectionObserver | null> {\n const isIntersectionObserverAvailable =\n typeof IntersectionObserver === 'function'\n let observerRef: IntersectionObserver | null = null\n\n Solid.createEffect(() => {\n const r = ref()\n if (!r || !isIntersectionObserverAvailable || options.disabled) {\n return\n }\n\n observerRef = new IntersectionObserver(([entry]) => {\n callback(entry)\n }, intersectionObserverOptions)\n\n observerRef.observe(r)\n\n Solid.onCleanup(() => {\n observerRef?.disconnect()\n })\n })\n\n return () => observerRef\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,wBACd,KACA,UACA,8BAAwD,EAAE,EAC1D,UAAkC,EAAE,EACS;CAC7C,MAAM,kCACJ,OAAO,yBAAyB;CAClC,IAAI,cAA2C;AAE/C,OAAM,mBAAmB;EACvB,MAAM,IAAI,KAAK;AACf,MAAI,CAAC,KAAK,CAAC,mCAAmC,QAAQ,SACpD;AAGF,gBAAc,IAAI,sBAAsB,CAAC,WAAW;AAClD,YAAS,MAAM;KACd,4BAA4B;AAE/B,cAAY,QAAQ,EAAE;AAEtB,QAAM,gBAAgB;AACpB,gBAAa,YAAY;IACzB;GACF;AAEF,cAAa"}
@@ -2,7 +2,5 @@ import * as Solid from 'solid-js';
2
2
  export declare const Match: (props: {
3
3
  matchId: string;
4
4
  }) => Solid.JSX.Element;
5
- export declare const MatchInner: (props: {
6
- matchId: string;
7
- }) => any;
5
+ export declare const MatchInner: () => any;
8
6
  export declare const Outlet: () => Solid.JSX.Element;