@tanstack/solid-router 2.0.0-alpha.5 → 2.0.0-alpha.7

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 (219) hide show
  1. package/dist/cjs/Asset.cjs +2 -2
  2. package/dist/cjs/Asset.cjs.map +1 -1
  3. package/dist/cjs/HeadContent.cjs +11 -1
  4. package/dist/cjs/HeadContent.cjs.map +1 -1
  5. package/dist/cjs/HeadContent.dev.cjs +11 -1
  6. package/dist/cjs/HeadContent.dev.cjs.map +1 -1
  7. package/dist/cjs/Match.cjs +265 -248
  8. package/dist/cjs/Match.cjs.map +1 -1
  9. package/dist/cjs/Match.d.cts +1 -3
  10. package/dist/cjs/Matches.cjs +35 -34
  11. package/dist/cjs/Matches.cjs.map +1 -1
  12. package/dist/cjs/RouterProvider.cjs +12 -8
  13. package/dist/cjs/RouterProvider.cjs.map +1 -1
  14. package/dist/cjs/RouterProvider.d.cts +1 -1
  15. package/dist/cjs/Scripts.cjs +23 -12
  16. package/dist/cjs/Scripts.cjs.map +1 -1
  17. package/dist/cjs/Scripts.d.cts +2 -1
  18. package/dist/cjs/Transitioner.cjs +57 -36
  19. package/dist/cjs/Transitioner.cjs.map +1 -1
  20. package/dist/cjs/headContentUtils.cjs +26 -23
  21. package/dist/cjs/headContentUtils.cjs.map +1 -1
  22. package/dist/cjs/headContentUtils.d.cts +2 -1
  23. package/dist/cjs/index.cjs +1 -1
  24. package/dist/cjs/index.dev.cjs +1 -1
  25. package/dist/cjs/link.cjs +143 -101
  26. package/dist/cjs/link.cjs.map +1 -1
  27. package/dist/cjs/matchContext.cjs +7 -5
  28. package/dist/cjs/matchContext.cjs.map +1 -1
  29. package/dist/cjs/matchContext.d.cts +8 -2
  30. package/dist/cjs/not-found.cjs +8 -4
  31. package/dist/cjs/not-found.cjs.map +1 -1
  32. package/dist/cjs/not-found.d.cts +1 -1
  33. package/dist/cjs/router.cjs +2 -1
  34. package/dist/cjs/router.cjs.map +1 -1
  35. package/dist/cjs/routerStores.cjs +75 -0
  36. package/dist/cjs/routerStores.cjs.map +1 -0
  37. package/dist/cjs/routerStores.d.cts +10 -0
  38. package/dist/cjs/ssr/RouterClient.cjs +1 -1
  39. package/dist/cjs/ssr/RouterClient.cjs.map +1 -1
  40. package/dist/cjs/ssr/renderRouterToStream.cjs +1 -1
  41. package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -1
  42. package/dist/cjs/ssr/renderRouterToString.cjs +1 -1
  43. package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -1
  44. package/dist/cjs/useBlocker.cjs +12 -3
  45. package/dist/cjs/useBlocker.cjs.map +1 -1
  46. package/dist/cjs/useCanGoBack.cjs +6 -2
  47. package/dist/cjs/useCanGoBack.cjs.map +1 -1
  48. package/dist/cjs/useCanGoBack.d.cts +2 -1
  49. package/dist/cjs/useLoaderDeps.cjs +2 -3
  50. package/dist/cjs/useLoaderDeps.cjs.map +1 -1
  51. package/dist/cjs/useLocation.cjs +13 -2
  52. package/dist/cjs/useLocation.cjs.map +1 -1
  53. package/dist/cjs/useMatch.cjs +27 -15
  54. package/dist/cjs/useMatch.cjs.map +1 -1
  55. package/dist/cjs/useParams.cjs +1 -1
  56. package/dist/cjs/useParams.cjs.map +1 -1
  57. package/dist/cjs/useRouterState.cjs +12 -30
  58. package/dist/cjs/useRouterState.cjs.map +1 -1
  59. package/dist/cjs/useSearch.cjs +2 -1
  60. package/dist/cjs/useSearch.cjs.map +1 -1
  61. package/dist/cjs/utils.cjs +3 -17
  62. package/dist/cjs/utils.cjs.map +1 -1
  63. package/dist/cjs/utils.d.cts +0 -5
  64. package/dist/esm/Asset.js +6 -6
  65. package/dist/esm/Asset.js.map +1 -1
  66. package/dist/esm/HeadContent.dev.js +12 -2
  67. package/dist/esm/HeadContent.dev.js.map +1 -1
  68. package/dist/esm/HeadContent.js +12 -2
  69. package/dist/esm/HeadContent.js.map +1 -1
  70. package/dist/esm/Match.d.ts +1 -3
  71. package/dist/esm/Match.js +267 -250
  72. package/dist/esm/Match.js.map +1 -1
  73. package/dist/esm/Matches.js +40 -39
  74. package/dist/esm/Matches.js.map +1 -1
  75. package/dist/esm/RouterProvider.d.ts +1 -1
  76. package/dist/esm/RouterProvider.js +10 -7
  77. package/dist/esm/RouterProvider.js.map +1 -1
  78. package/dist/esm/ScriptOnce.js +2 -2
  79. package/dist/esm/ScriptOnce.js.map +1 -1
  80. package/dist/esm/Scripts.d.ts +2 -1
  81. package/dist/esm/Scripts.js +21 -11
  82. package/dist/esm/Scripts.js.map +1 -1
  83. package/dist/esm/Transitioner.js +58 -37
  84. package/dist/esm/Transitioner.js.map +1 -1
  85. package/dist/esm/headContentUtils.d.ts +2 -1
  86. package/dist/esm/headContentUtils.js +26 -23
  87. package/dist/esm/headContentUtils.js.map +1 -1
  88. package/dist/esm/index.dev.js +1 -1
  89. package/dist/esm/index.js +1 -1
  90. package/dist/esm/link.js +146 -104
  91. package/dist/esm/link.js.map +1 -1
  92. package/dist/esm/matchContext.d.ts +8 -2
  93. package/dist/esm/matchContext.js +7 -4
  94. package/dist/esm/matchContext.js.map +1 -1
  95. package/dist/esm/not-found.d.ts +1 -1
  96. package/dist/esm/not-found.js +6 -3
  97. package/dist/esm/not-found.js.map +1 -1
  98. package/dist/esm/router.js +2 -1
  99. package/dist/esm/router.js.map +1 -1
  100. package/dist/esm/routerStores.d.ts +10 -0
  101. package/dist/esm/routerStores.js +73 -0
  102. package/dist/esm/routerStores.js.map +1 -0
  103. package/dist/esm/scroll-restoration.js +2 -2
  104. package/dist/esm/scroll-restoration.js.map +1 -1
  105. package/dist/esm/ssr/RouterClient.js +1 -1
  106. package/dist/esm/ssr/RouterClient.js.map +1 -1
  107. package/dist/esm/ssr/renderRouterToStream.js +1 -1
  108. package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
  109. package/dist/esm/ssr/renderRouterToString.js +1 -1
  110. package/dist/esm/ssr/renderRouterToString.js.map +1 -1
  111. package/dist/esm/useBlocker.js +12 -3
  112. package/dist/esm/useBlocker.js.map +1 -1
  113. package/dist/esm/useCanGoBack.d.ts +2 -1
  114. package/dist/esm/useCanGoBack.js +4 -2
  115. package/dist/esm/useCanGoBack.js.map +1 -1
  116. package/dist/esm/useLoaderDeps.js +2 -3
  117. package/dist/esm/useLoaderDeps.js.map +1 -1
  118. package/dist/esm/useLocation.js +11 -2
  119. package/dist/esm/useLocation.js.map +1 -1
  120. package/dist/esm/useMatch.js +28 -16
  121. package/dist/esm/useMatch.js.map +1 -1
  122. package/dist/esm/useParams.js +1 -1
  123. package/dist/esm/useParams.js.map +1 -1
  124. package/dist/esm/useRouterState.js +11 -30
  125. package/dist/esm/useRouterState.js.map +1 -1
  126. package/dist/esm/useSearch.js +2 -1
  127. package/dist/esm/useSearch.js.map +1 -1
  128. package/dist/esm/utils.d.ts +0 -5
  129. package/dist/esm/utils.js +4 -17
  130. package/dist/esm/utils.js.map +1 -1
  131. package/dist/source/Asset.jsx +3 -3
  132. package/dist/source/Asset.jsx.map +1 -1
  133. package/dist/source/HeadContent.dev.jsx +5 -1
  134. package/dist/source/HeadContent.dev.jsx.map +1 -1
  135. package/dist/source/HeadContent.jsx +5 -1
  136. package/dist/source/HeadContent.jsx.map +1 -1
  137. package/dist/source/Match.d.ts +1 -3
  138. package/dist/source/Match.jsx +260 -264
  139. package/dist/source/Match.jsx.map +1 -1
  140. package/dist/source/Matches.jsx +46 -46
  141. package/dist/source/Matches.jsx.map +1 -1
  142. package/dist/source/RouterProvider.d.ts +1 -1
  143. package/dist/source/RouterProvider.jsx +13 -9
  144. package/dist/source/RouterProvider.jsx.map +1 -1
  145. package/dist/source/Scripts.d.ts +2 -1
  146. package/dist/source/Scripts.jsx +46 -47
  147. package/dist/source/Scripts.jsx.map +1 -1
  148. package/dist/source/Transitioner.jsx +80 -44
  149. package/dist/source/Transitioner.jsx.map +1 -1
  150. package/dist/source/headContentUtils.d.ts +2 -1
  151. package/dist/source/headContentUtils.jsx +79 -80
  152. package/dist/source/headContentUtils.jsx.map +1 -1
  153. package/dist/source/link.jsx +145 -112
  154. package/dist/source/link.jsx.map +1 -1
  155. package/dist/source/matchContext.d.ts +8 -2
  156. package/dist/source/matchContext.jsx +7 -3
  157. package/dist/source/matchContext.jsx.map +1 -1
  158. package/dist/source/not-found.d.ts +1 -1
  159. package/dist/source/not-found.jsx +6 -5
  160. package/dist/source/not-found.jsx.map +1 -1
  161. package/dist/source/router.js +2 -1
  162. package/dist/source/router.js.map +1 -1
  163. package/dist/source/routerStores.d.ts +10 -0
  164. package/dist/source/routerStores.js +82 -0
  165. package/dist/source/routerStores.js.map +1 -0
  166. package/dist/source/ssr/RouterClient.jsx +1 -1
  167. package/dist/source/ssr/RouterClient.jsx.map +1 -1
  168. package/dist/source/ssr/renderRouterToStream.jsx +1 -1
  169. package/dist/source/ssr/renderRouterToStream.jsx.map +1 -1
  170. package/dist/source/ssr/renderRouterToString.jsx +1 -1
  171. package/dist/source/ssr/renderRouterToString.jsx.map +1 -1
  172. package/dist/source/useBlocker.jsx +19 -8
  173. package/dist/source/useBlocker.jsx.map +1 -1
  174. package/dist/source/useCanGoBack.d.ts +2 -1
  175. package/dist/source/useCanGoBack.js +4 -2
  176. package/dist/source/useCanGoBack.js.map +1 -1
  177. package/dist/source/useLoaderDeps.jsx +2 -3
  178. package/dist/source/useLoaderDeps.jsx.map +1 -1
  179. package/dist/source/useLocation.jsx +13 -3
  180. package/dist/source/useLocation.jsx.map +1 -1
  181. package/dist/source/useMatch.jsx +33 -23
  182. package/dist/source/useMatch.jsx.map +1 -1
  183. package/dist/source/useParams.jsx +1 -1
  184. package/dist/source/useParams.jsx.map +1 -1
  185. package/dist/source/useRouterState.jsx +14 -55
  186. package/dist/source/useRouterState.jsx.map +1 -1
  187. package/dist/source/useSearch.jsx +2 -1
  188. package/dist/source/useSearch.jsx.map +1 -1
  189. package/dist/source/utils.d.ts +0 -5
  190. package/dist/source/utils.js +2 -15
  191. package/dist/source/utils.js.map +1 -1
  192. package/package.json +7 -7
  193. package/skills/solid-router/SKILL.md +2 -0
  194. package/src/Asset.tsx +3 -3
  195. package/src/HeadContent.dev.tsx +10 -1
  196. package/src/HeadContent.tsx +10 -1
  197. package/src/Match.tsx +395 -349
  198. package/src/Matches.tsx +55 -54
  199. package/src/RouterProvider.tsx +13 -10
  200. package/src/Scripts.tsx +55 -54
  201. package/src/Transitioner.tsx +103 -60
  202. package/src/headContentUtils.tsx +104 -96
  203. package/src/link.tsx +188 -146
  204. package/src/matchContext.tsx +16 -7
  205. package/src/not-found.tsx +6 -6
  206. package/src/router.ts +2 -1
  207. package/src/routerStores.ts +119 -0
  208. package/src/ssr/RouterClient.tsx +1 -1
  209. package/src/ssr/renderRouterToStream.tsx +1 -1
  210. package/src/ssr/renderRouterToString.tsx +1 -1
  211. package/src/useBlocker.tsx +80 -63
  212. package/src/useCanGoBack.ts +6 -2
  213. package/src/useLoaderDeps.tsx +2 -3
  214. package/src/useLocation.tsx +18 -5
  215. package/src/useMatch.tsx +37 -38
  216. package/src/useParams.tsx +2 -3
  217. package/src/useRouterState.tsx +21 -67
  218. package/src/useSearch.tsx +2 -1
  219. package/src/utils.ts +2 -24
@@ -118,9 +118,9 @@ function Script(props) {
118
118
  }
119
119
  document.head.appendChild(script);
120
120
  }
121
- (0, solid_js.onCleanup)(() => {
121
+ return () => {
122
122
  if (script?.parentNode) script.parentNode.removeChild(script);
123
- });
123
+ };
124
124
  });
125
125
  return null;
126
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.cjs","names":["isServer","createEffect","onCleanup","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","Title","_el$","_tmpl$","_$spread","_el$2","_tmpl$2","_el$3","_tmpl$3","_$mergeProps","_el$4","Script","props","Record","router","_el$5","_tmpl$4","_$insert","titleText","document","title","_el$6","dataScript","type","src","_el$7","_tmpl$5","_el$8","_el$9","const","script","HTMLScriptElement","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","createElement","key","value","Object","entries","undefined","setAttribute","String","head","appendChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","parentNode","removeChild"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { isServer } from '@tanstack/router-core/isServer'\nimport { createEffect, onCleanup } from 'solid-js'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nexport function Asset({\n tag,\n attrs,\n children,\n}: RouterManagedTag): JSX.Element | null {\n switch (tag) {\n case 'title':\n return <Title attrs={attrs} children={children} />\n case 'meta':\n return <meta {...attrs} />\n case 'link':\n return <link {...attrs} />\n case 'style':\n if (typeof children === 'string') {\n return <style {...attrs} innerHTML={children} />\n }\n return <style {...attrs} />\n case 'script':\n return <Script attrs={attrs} children={children} />\n default:\n return null\n }\n}\n\nfunction Title(props: {\n attrs?: Record<string, any>\n children?: unknown\n}): JSX.Element | null {\n const router = useRouter()\n const attrs = props.attrs\n const children = props.children\n\n // Server: render <title> normally\n if (isServer ?? router.isServer) {\n return <title {...attrs}>{children as string}</title>\n }\n\n // Client: imperatively set document.title so it updates during\n // client-side navigation (JSX <title> in <head> doesn't reliably\n // update the browser's document.title).\n createEffect(\n () => children,\n (titleText) => {\n document.title = typeof titleText === 'string' ? titleText : ''\n },\n )\n\n // Still render the <title> element in the DOM for consistency,\n // but the imperative assignment above is what actually drives the update.\n return <title {...attrs}>{children as string}</title>\n}\n\nfunction Script(props: {\n attrs?: Record<string, any>\n children?: unknown\n}): JSX.Element | null {\n const router = useRouter()\n const attrs = props.attrs\n const children = props.children\n\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n // --- Server rendering ---\n if (isServer ?? router.isServer) {\n if (attrs?.src) {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n }\n\n // --- Client rendering ---\n\n // Data scripts (e.g. application/ld+json) are rendered in the tree;\n // they don't need to execute.\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // For executable scripts, use imperative DOM injection so the browser\n // actually executes them during client-side navigation.\n createEffect(\n () => ({ attrs, children, dataScript }) as const,\n ({ attrs, children, dataScript }) => {\n if (dataScript) return\n\n let script: HTMLScriptElement | undefined\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n } else if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n }\n\n onCleanup(() => {\n if (script?.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n },\n )\n\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Asset.cjs","names":["isServer","createEffect","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","Title","_el$","_tmpl$","_$spread","_el$2","_tmpl$2","_el$3","_tmpl$3","_$mergeProps","_el$4","Script","props","Record","router","_el$5","_tmpl$4","_$insert","titleText","document","title","_el$6","dataScript","type","src","_el$7","_tmpl$5","_el$8","_el$9","const","script","HTMLScriptElement","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","createElement","key","value","Object","entries","undefined","setAttribute","String","head","appendChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","parentNode","removeChild"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { isServer } from '@tanstack/router-core/isServer'\nimport { createEffect } from 'solid-js'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nexport function Asset({\n tag,\n attrs,\n children,\n}: RouterManagedTag): JSX.Element | null {\n switch (tag) {\n case 'title':\n return <Title attrs={attrs} children={children} />\n case 'meta':\n return <meta {...attrs} />\n case 'link':\n return <link {...attrs} />\n case 'style':\n if (typeof children === 'string') {\n return <style {...attrs} innerHTML={children} />\n }\n return <style {...attrs} />\n case 'script':\n return <Script attrs={attrs} children={children} />\n default:\n return null\n }\n}\n\nfunction Title(props: {\n attrs?: Record<string, any>\n children?: unknown\n}): JSX.Element | null {\n const router = useRouter()\n const attrs = props.attrs\n const children = props.children\n\n // Server: render <title> normally\n if (isServer ?? router.isServer) {\n return <title {...attrs}>{children as string}</title>\n }\n\n // Client: imperatively set document.title so it updates during\n // client-side navigation (JSX <title> in <head> doesn't reliably\n // update the browser's document.title).\n createEffect(\n () => children,\n (titleText) => {\n document.title = typeof titleText === 'string' ? titleText : ''\n },\n )\n\n // Still render the <title> element in the DOM for consistency,\n // but the imperative assignment above is what actually drives the update.\n return <title {...attrs}>{children as string}</title>\n}\n\nfunction Script(props: {\n attrs?: Record<string, any>\n children?: unknown\n}): JSX.Element | null {\n const router = useRouter()\n const attrs = props.attrs\n const children = props.children\n\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n // --- Server rendering ---\n if (isServer ?? router.isServer) {\n if (attrs?.src) {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n }\n\n // --- Client rendering ---\n\n // Data scripts (e.g. application/ld+json) are rendered in the tree;\n // they don't need to execute.\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // For executable scripts, use imperative DOM injection so the browser\n // actually executes them during client-side navigation.\n createEffect(\n () => ({ attrs, children, dataScript }) as const,\n ({ attrs, children, dataScript }) => {\n if (dataScript) return\n\n let script: HTMLScriptElement | undefined\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n } else if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n }\n\n return () => {\n if (script?.parentNode) {\n script.parentNode.removeChild(script)\n }\n }\n },\n )\n\n return null\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  require("./_virtual/_rolldown/runtime.cjs");
2
+ const require_useRouter = require("./useRouter.cjs");
2
3
  const require_Asset = require("./Asset.cjs");
3
4
  const require_headContentUtils = require("./headContentUtils.cjs");
4
5
  let _solidjs_web = require("@solidjs/web");
@@ -12,7 +13,8 @@ let solid_js = require("solid-js");
12
13
  */
13
14
  function HeadContent() {
14
15
  const tags = require_headContentUtils.useTags();
15
- return (0, _solidjs_web.createComponent)(solid_js.For, {
16
+ const router = require_useRouter.useRouter();
17
+ const content = () => (0, _solidjs_web.createComponent)(solid_js.For, {
16
18
  get each() {
17
19
  return tags();
18
20
  },
@@ -31,6 +33,14 @@ function HeadContent() {
31
33
  });
32
34
  }
33
35
  });
36
+ return _solidjs_web.isServer ?? router.isServer ? content() : (0, _solidjs_web.createComponent)(_solidjs_web.Portal, {
37
+ get mount() {
38
+ return document.head;
39
+ },
40
+ get children() {
41
+ return content();
42
+ }
43
+ });
34
44
  }
35
45
  //#endregion
36
46
  exports.HeadContent = HeadContent;
@@ -1 +1 @@
1
- {"version":3,"file":"HeadContent.cjs","names":["For","Asset","useTags","HeadContent","tags","_$createComponent","each","children","tag","t","attrs"],"sources":["../../src/HeadContent.tsx"],"sourcesContent":["import { For } from 'solid-js'\nimport { Asset } from './Asset'\nimport { useTags } from './headContentUtils'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * When using full document hydration (hydrating from `<html>`), this component should be rendered in the `<body>`\n * to ensure it's part of the reactive tree and updates correctly during client-side navigation.\n * The component uses portals internally to render content into the `<head>` element.\n */\nexport function HeadContent() {\n const tags = useTags()\n\n return (\n <For each={tags()}>\n {(tag) => {\n const t = tag() as any\n return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />\n }}\n </For>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAUA,SAAgBG,cAAc;CAC5B,MAAMC,OAAOF,yBAAAA,SAAS;AAEtB,SAAA,GAAA,aAAA,iBACGF,SAAAA,KAAG;EAAA,IAACM,OAAI;AAAA,UAAEF,MAAM;;EAAAG,WACbC,QAAQ;GACR,MAAMC,IAAID,KAAK;AACf,WAAA,GAAA,aAAA,iBAAQP,cAAAA,OAAK;IAAA,IAACO,MAAG;AAAA,YAAEC,EAAED;;IAAG,IAAEE,QAAK;AAAA,YAAED,EAAEC;;IAAK,IAAEH,WAAQ;AAAA,YAAEE,EAAEF;;IAAQ,CAAA;;EAC/D,CAAA"}
1
+ {"version":3,"file":"HeadContent.cjs","names":["For","Portal","isServer","Asset","useRouter","useTags","HeadContent","tags","router","content","_$createComponent","each","children","tag","t","attrs","mount","document","head"],"sources":["../../src/HeadContent.tsx"],"sourcesContent":["import { For } from 'solid-js'\nimport { Portal, isServer } from '@solidjs/web'\nimport { Asset } from './Asset'\nimport { useRouter } from './useRouter'\nimport { useTags } from './headContentUtils'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * When using full document hydration (hydrating from `<html>`), this component should be rendered in the `<body>`\n * to ensure it's part of the reactive tree and updates correctly during client-side navigation.\n * The component uses portals internally to render content into the `<head>` element.\n */\nexport function HeadContent() {\n const tags = useTags()\n const router = useRouter()\n\n const content = () => (\n <For each={tags()}>\n {(tag) => {\n const t = tag() as any\n return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />\n }}\n </For>\n )\n\n return (isServer ?? router.isServer) ? (\n content()\n ) : (\n <Portal mount={document.head}>{content()}</Portal>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAgBM,cAAc;CAC5B,MAAMC,OAAOF,yBAAAA,SAAS;CACtB,MAAMG,SAASJ,kBAAAA,WAAW;CAE1B,MAAMK,iBAAAA,GAAAA,aAAAA,iBACHT,SAAAA,KAAG;EAAA,IAACW,OAAI;AAAA,UAAEJ,MAAM;;EAAAK,WACbC,QAAQ;GACR,MAAMC,IAAID,KAAK;AACf,WAAA,GAAA,aAAA,iBAAQV,cAAAA,OAAK;IAAA,IAACU,MAAG;AAAA,YAAEC,EAAED;;IAAG,IAAEE,QAAK;AAAA,YAAED,EAAEC;;IAAK,IAAEH,WAAQ;AAAA,YAAEE,EAAEF;;IAAQ,CAAA;;EAC/D,CAEJ;AAED,QAAQV,aAAAA,YAAYM,OAAON,WACzBO,SAAS,IAAA,GAAA,aAAA,iBAERR,aAAAA,QAAM;EAAA,IAACe,QAAK;AAAA,UAAEC,SAASC;;EAAI,IAAAN,WAAA;AAAA,UAAGH,SAAS;;EAAA,CACzC"}
@@ -1,5 +1,6 @@
1
1
  require("./_virtual/_rolldown/runtime.cjs");
2
2
  const require_ClientOnly = require("./ClientOnly.cjs");
3
+ const require_useRouter = require("./useRouter.cjs");
3
4
  const require_Asset = require("./Asset.cjs");
4
5
  const require_headContentUtils = require("./headContentUtils.cjs");
5
6
  let _solidjs_web = require("@solidjs/web");
@@ -18,6 +19,7 @@ var DEV_STYLES_ATTR = "data-tanstack-router-dev-styles";
18
19
  function HeadContent() {
19
20
  const tags = require_headContentUtils.useTags();
20
21
  const hydrated = require_ClientOnly.useHydrated();
22
+ const router = require_useRouter.useRouter();
21
23
  (0, solid_js.createEffect)(() => [hydrated()], ([hydrated]) => {
22
24
  if (hydrated) document.querySelectorAll(`link[${DEV_STYLES_ATTR}]`).forEach((el) => el.remove());
23
25
  });
@@ -25,7 +27,7 @@ function HeadContent() {
25
27
  if (hydrated()) return tags().filter((tag) => !tag.attrs?.[DEV_STYLES_ATTR]);
26
28
  return tags();
27
29
  });
28
- return (0, _solidjs_web.createComponent)(solid_js.For, {
30
+ const content = () => (0, _solidjs_web.createComponent)(solid_js.For, {
29
31
  get each() {
30
32
  return filteredTags();
31
33
  },
@@ -44,6 +46,14 @@ function HeadContent() {
44
46
  });
45
47
  }
46
48
  });
49
+ return _solidjs_web.isServer ?? router.isServer ? content() : (0, _solidjs_web.createComponent)(_solidjs_web.Portal, {
50
+ get mount() {
51
+ return document.head;
52
+ },
53
+ get children() {
54
+ return content();
55
+ }
56
+ });
47
57
  }
48
58
  //#endregion
49
59
  exports.HeadContent = HeadContent;
@@ -1 +1 @@
1
- {"version":3,"file":"HeadContent.dev.cjs","names":["For","createEffect","createMemo","Asset","useHydrated","useTags","DEV_STYLES_ATTR","HeadContent","tags","hydrated","const","document","querySelectorAll","forEach","el","remove","filteredTags","filter","tag","attrs","_$createComponent","each","children","t"],"sources":["../../src/HeadContent.dev.tsx"],"sourcesContent":["import { For, createEffect, createMemo } from 'solid-js'\nimport { Asset } from './Asset'\nimport { useHydrated } from './ClientOnly'\nimport { useTags } from './headContentUtils'\n\nconst DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * When using full document hydration (hydrating from `<html>`), this component should be rendered in the `<body>`\n * to ensure it's part of the reactive tree and updates correctly during client-side navigation.\n * The component uses portals internally to render content into the `<head>` element.\n *\n * Development version: filters out dev styles link after hydration and\n * includes a fallback cleanup effect for hydration mismatch cases.\n */\nexport function HeadContent() {\n const tags = useTags()\n const hydrated = useHydrated()\n\n // Fallback cleanup for hydration mismatch cases\n // Runs when hydration completes to remove any orphaned dev styles links from DOM\n createEffect(\n () => [hydrated()] as const,\n ([hydrated]) => {\n if (hydrated) {\n document\n .querySelectorAll(`link[${DEV_STYLES_ATTR}]`)\n .forEach((el) => el.remove())\n }\n },\n )\n\n // Filter out dev styles after hydration\n const filteredTags = createMemo(() => {\n if (hydrated()) {\n return tags().filter((tag) => !tag.attrs?.[DEV_STYLES_ATTR])\n }\n return tags()\n })\n\n return (\n <For each={filteredTags()}>\n {(tag) => {\n const t = tag() as any\n return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />\n }}\n </For>\n )\n}\n"],"mappings":";;;;;;;AAKA,IAAMM,kBAAkB;;;;;;;;;;AAWxB,SAAgBC,cAAc;CAC5B,MAAMC,OAAOH,yBAAAA,SAAS;CACtB,MAAMI,WAAWL,mBAAAA,aAAa;AAI9BH,EAAAA,GAAAA,SAAAA,oBACQ,CAACQ,UAAU,CAAC,GACjB,CAACA,cAAc;AACd,MAAIA,SACFE,UACGC,iBAAiB,QAAQN,gBAAe,GAAI,CAC5CO,SAASC,OAAOA,GAAGC,QAAQ,CAAC;GAGpC;CAGD,MAAMC,gBAAAA,GAAAA,SAAAA,kBAAgC;AACpC,MAAIP,UAAU,CACZ,QAAOD,MAAM,CAACS,QAAQC,QAAQ,CAACA,IAAIC,QAAQb,iBAAiB;AAE9D,SAAOE,MAAM;GACb;AAEF,SAAA,GAAA,aAAA,iBACGR,SAAAA,KAAG;EAAA,IAACqB,OAAI;AAAA,UAAEL,cAAc;;EAAAM,WACrBJ,QAAQ;GACR,MAAMK,IAAIL,KAAK;AACf,WAAA,GAAA,aAAA,iBAAQf,cAAAA,OAAK;IAAA,IAACe,MAAG;AAAA,YAAEK,EAAEL;;IAAG,IAAEC,QAAK;AAAA,YAAEI,EAAEJ;;IAAK,IAAEG,WAAQ;AAAA,YAAEC,EAAED;;IAAQ,CAAA;;EAC/D,CAAA"}
1
+ {"version":3,"file":"HeadContent.dev.cjs","names":["For","createEffect","createMemo","Portal","isServer","Asset","useHydrated","useRouter","useTags","DEV_STYLES_ATTR","HeadContent","tags","hydrated","router","const","document","querySelectorAll","forEach","el","remove","filteredTags","filter","tag","attrs","content","_$createComponent","each","children","t","mount","head"],"sources":["../../src/HeadContent.dev.tsx"],"sourcesContent":["import { For, createEffect, createMemo } from 'solid-js'\nimport { Portal, isServer } from '@solidjs/web'\nimport { Asset } from './Asset'\nimport { useHydrated } from './ClientOnly'\nimport { useRouter } from './useRouter'\nimport { useTags } from './headContentUtils'\n\nconst DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * When using full document hydration (hydrating from `<html>`), this component should be rendered in the `<body>`\n * to ensure it's part of the reactive tree and updates correctly during client-side navigation.\n * The component uses portals internally to render content into the `<head>` element.\n *\n * Development version: filters out dev styles link after hydration and\n * includes a fallback cleanup effect for hydration mismatch cases.\n */\nexport function HeadContent() {\n const tags = useTags()\n const hydrated = useHydrated()\n const router = useRouter()\n\n // Fallback cleanup for hydration mismatch cases\n // Runs when hydration completes to remove any orphaned dev styles links from DOM\n createEffect(\n () => [hydrated()] as const,\n ([hydrated]) => {\n if (hydrated) {\n document\n .querySelectorAll(`link[${DEV_STYLES_ATTR}]`)\n .forEach((el) => el.remove())\n }\n },\n )\n\n // Filter out dev styles after hydration\n const filteredTags = createMemo(() => {\n if (hydrated()) {\n return tags().filter((tag) => !tag.attrs?.[DEV_STYLES_ATTR])\n }\n return tags()\n })\n\n const content = () => (\n <For each={filteredTags()}>\n {(tag) => {\n const t = tag() as any\n return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />\n }}\n </For>\n )\n\n return (isServer ?? router.isServer) ? (\n content()\n ) : (\n <Portal mount={document.head}>{content()}</Portal>\n )\n}\n"],"mappings":";;;;;;;;AAOA,IAAMS,kBAAkB;;;;;;;;;;AAWxB,SAAgBC,cAAc;CAC5B,MAAMC,OAAOH,yBAAAA,SAAS;CACtB,MAAMI,WAAWN,mBAAAA,aAAa;CAC9B,MAAMO,SAASN,kBAAAA,WAAW;AAI1BN,EAAAA,GAAAA,SAAAA,oBACQ,CAACW,UAAU,CAAC,GACjB,CAACA,cAAc;AACd,MAAIA,SACFG,UACGC,iBAAiB,QAAQP,gBAAe,GAAI,CAC5CQ,SAASC,OAAOA,GAAGC,QAAQ,CAAC;GAGpC;CAGD,MAAMC,gBAAAA,GAAAA,SAAAA,kBAAgC;AACpC,MAAIR,UAAU,CACZ,QAAOD,MAAM,CAACU,QAAQC,QAAQ,CAACA,IAAIC,QAAQd,iBAAiB;AAE9D,SAAOE,MAAM;GACb;CAEF,MAAMa,iBAAAA,GAAAA,aAAAA,iBACHxB,SAAAA,KAAG;EAAA,IAAC0B,OAAI;AAAA,UAAEN,cAAc;;EAAAO,WACrBL,QAAQ;GACR,MAAMM,IAAIN,KAAK;AACf,WAAA,GAAA,aAAA,iBAAQjB,cAAAA,OAAK;IAAA,IAACiB,MAAG;AAAA,YAAEM,EAAEN;;IAAG,IAAEC,QAAK;AAAA,YAAEK,EAAEL;;IAAK,IAAEI,WAAQ;AAAA,YAAEC,EAAED;;IAAQ,CAAA;;EAC/D,CAEJ;AAED,QAAQvB,aAAAA,YAAYS,OAAOT,WACzBoB,SAAS,IAAA,GAAA,aAAA,iBAERrB,aAAAA,QAAM;EAAA,IAAC0B,QAAK;AAAA,UAAEd,SAASe;;EAAI,IAAAH,WAAA;AAAA,UAAGH,SAAS;;EAAA,CACzC"}