@tanstack/solid-router 1.168.20 → 1.168.21

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.
@@ -6,12 +6,19 @@ let _tanstack_router_core_isServer = require("@tanstack/router-core/isServer");
6
6
  let _solidjs_meta = require("@solidjs/meta");
7
7
  //#region src/Asset.tsx
8
8
  var _tmpl$ = /* @__PURE__ */ (0, solid_js_web.template)(`<script>`);
9
- function Asset({ tag, attrs, children }) {
9
+ var INLINE_CSS_HYDRATION_ATTR = "data-tsr-inline-css";
10
+ function Asset(asset) {
11
+ const { tag, attrs, children } = asset;
10
12
  switch (tag) {
11
13
  case "title": return (0, solid_js_web.createComponent)(_solidjs_meta.Title, (0, solid_js_web.mergeProps)(attrs, { children }));
12
14
  case "meta": return (0, solid_js_web.createComponent)(_solidjs_meta.Meta, attrs);
13
15
  case "link": return (0, solid_js_web.createComponent)(_solidjs_meta.Link, attrs);
14
- case "style": return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { children }));
16
+ case "style":
17
+ if (asset.inlineCss && (process.env.TSS_INLINE_CSS_ENABLED === "true" || process.env.TSS_INLINE_CSS_ENABLED === void 0 && _tanstack_router_core_isServer.isServer)) return (0, solid_js_web.createComponent)(InlineCssStyle, {
18
+ attrs,
19
+ children
20
+ });
21
+ return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { children }));
15
22
  case "script": return (0, solid_js_web.createComponent)(Script, {
16
23
  attrs,
17
24
  children
@@ -19,6 +26,10 @@ function Asset({ tag, attrs, children }) {
19
26
  default: return null;
20
27
  }
21
28
  }
29
+ function InlineCssStyle({ attrs, children }) {
30
+ const html = children === void 0 ? typeof document === "undefined" ? "" : document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? "" : children ?? "";
31
+ return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { [INLINE_CSS_HYDRATION_ATTR]: "" }, { children: html }));
32
+ }
22
33
  function Script({ attrs, children }) {
23
34
  const router = require_useRouter.useRouter();
24
35
  const dataScript = typeof attrs?.type === "string" && attrs.type !== "" && attrs.type !== "text/javascript" && attrs.type !== "module";
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.cjs","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","_$mergeProps","Script","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","document","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","undefined","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\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}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\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 const 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\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n 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 const 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 onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Asset.cjs","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","INLINE_CSS_HYDRATION_ATTR","Asset","asset","Element","tag","attrs","children","_$createComponent","_$mergeProps","inlineCss","process","env","TSS_INLINE_CSS_ENABLED","undefined","InlineCssStyle","Script","Record","isInlineCssPlaceholder","html","document","querySelector","HTMLStyleElement","textContent","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nconst INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'\n\nexport function Asset(asset: RouterManagedTag): JSX.Element | null {\n const { tag, attrs, children } = asset\n\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n if (\n asset.inlineCss &&\n (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||\n (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))\n ) {\n return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>\n }\n\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\nfunction InlineCssStyle({\n attrs,\n children,\n}: {\n attrs?: Record<string, any>\n children?: RouterManagedTag['children']\n}) {\n const isInlineCssPlaceholder = children === undefined\n const html = isInlineCssPlaceholder\n ? typeof document === 'undefined'\n ? ''\n : (document.querySelector<HTMLStyleElement>(\n `style[${INLINE_CSS_HYDRATION_ATTR}]`,\n )?.textContent ?? '')\n : (children ?? '')\n\n return (\n <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>\n {html}\n </Style>\n )\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\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 const 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\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n 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 const 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 onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { RouterManagedTag } from '@tanstack/router-core';
2
2
  import { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
@@ -71,14 +71,29 @@ var useTags = (assetCrossOrigin) => {
71
71
  }
72
72
  }));
73
73
  const manifest = router.ssr?.manifest;
74
- const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
75
- tag: "link",
76
- attrs: {
77
- ...asset.attrs,
78
- crossOrigin: (0, _tanstack_router_core.getAssetCrossOrigin)(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
79
- nonce
74
+ const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).flatMap((asset) => {
75
+ if (asset.tag === "link") {
76
+ if ((0, _tanstack_router_core.isInlinableStylesheet)(manifest, asset)) return [];
77
+ return [{
78
+ tag: "link",
79
+ attrs: {
80
+ ...asset.attrs,
81
+ crossOrigin: (0, _tanstack_router_core.getAssetCrossOrigin)(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
82
+ nonce
83
+ }
84
+ }];
80
85
  }
81
- }));
86
+ if (asset.tag === "style") return [{
87
+ tag: "style",
88
+ attrs: {
89
+ ...asset.attrs,
90
+ nonce
91
+ },
92
+ children: asset.children,
93
+ ...asset.inlineCss ? { inlineCss: true } : {}
94
+ }];
95
+ return [];
96
+ });
82
97
  return [...constructed, ...assets];
83
98
  });
84
99
  const preloadLinks = solid_js.createMemo(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.cjs","names":["Solid","escapeHtml","getAssetCrossOrigin","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","crossOrigin","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n replaceEqualDeep,\n resolveManifestAssetLink,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\n/**\n * Build the list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .filter((asset) => asset.tag === 'link')\n .map(\n (asset) =>\n ({\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.cjs","names":["Solid","escapeHtml","getAssetCrossOrigin","isInlinableStylesheet","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","flatMap","asset","crossOrigin","inlineCss","const","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n isInlinableStylesheet,\n replaceEqualDeep,\n resolveManifestAssetLink,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\n/**\n * Build the list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .flatMap((asset): Array<RouterManagedTag> => {\n if (asset.tag === 'link') {\n if (isInlinableStylesheet(manifest, asset)) {\n return []\n }\n\n return [\n {\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n },\n ]\n }\n\n if (asset.tag === 'style') {\n return [\n {\n tag: 'style',\n attrs: {\n ...asset.attrs,\n nonce,\n },\n children: asset.children,\n ...(asset.inlineCss ? { inlineCss: true as const } : {}),\n },\n ]\n }\n\n return []\n })\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { RouterManagedTag } from '@tanstack/router-core';
2
2
  import { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
package/dist/esm/Asset.js CHANGED
@@ -5,12 +5,19 @@ import { isServer } from "@tanstack/router-core/isServer";
5
5
  import { Link, Meta, Style, Title } from "@solidjs/meta";
6
6
  //#region src/Asset.tsx
7
7
  var _tmpl$ = /* @__PURE__ */ template(`<script>`);
8
- function Asset({ tag, attrs, children }) {
8
+ var INLINE_CSS_HYDRATION_ATTR = "data-tsr-inline-css";
9
+ function Asset(asset) {
10
+ const { tag, attrs, children } = asset;
9
11
  switch (tag) {
10
12
  case "title": return createComponent(Title, mergeProps(attrs, { children }));
11
13
  case "meta": return createComponent(Meta, attrs);
12
14
  case "link": return createComponent(Link, attrs);
13
- case "style": return createComponent(Style, mergeProps(attrs, { children }));
15
+ case "style":
16
+ if (asset.inlineCss && (process.env.TSS_INLINE_CSS_ENABLED === "true" || process.env.TSS_INLINE_CSS_ENABLED === void 0 && isServer)) return createComponent(InlineCssStyle, {
17
+ attrs,
18
+ children
19
+ });
20
+ return createComponent(Style, mergeProps(attrs, { children }));
14
21
  case "script": return createComponent(Script, {
15
22
  attrs,
16
23
  children
@@ -18,6 +25,10 @@ function Asset({ tag, attrs, children }) {
18
25
  default: return null;
19
26
  }
20
27
  }
28
+ function InlineCssStyle({ attrs, children }) {
29
+ const html = children === void 0 ? typeof document === "undefined" ? "" : document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? "" : children ?? "";
30
+ return createComponent(Style, mergeProps(attrs, { [INLINE_CSS_HYDRATION_ATTR]: "" }, { children: html }));
31
+ }
21
32
  function Script({ attrs, children }) {
22
33
  const router = useRouter();
23
34
  const dataScript = typeof attrs?.type === "string" && attrs.type !== "" && attrs.type !== "text/javascript" && attrs.type !== "module";
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.js","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","_$mergeProps","Script","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","document","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","undefined","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\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}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\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 const 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\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n 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 const 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 onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Asset.js","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","INLINE_CSS_HYDRATION_ATTR","Asset","asset","Element","tag","attrs","children","_$createComponent","_$mergeProps","inlineCss","process","env","TSS_INLINE_CSS_ENABLED","undefined","InlineCssStyle","Script","Record","isInlineCssPlaceholder","html","document","querySelector","HTMLStyleElement","textContent","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nconst INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'\n\nexport function Asset(asset: RouterManagedTag): JSX.Element | null {\n const { tag, attrs, children } = asset\n\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n if (\n asset.inlineCss &&\n (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||\n (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))\n ) {\n return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>\n }\n\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\nfunction InlineCssStyle({\n attrs,\n children,\n}: {\n attrs?: Record<string, any>\n children?: RouterManagedTag['children']\n}) {\n const isInlineCssPlaceholder = children === undefined\n const html = isInlineCssPlaceholder\n ? typeof document === 'undefined'\n ? ''\n : (document.querySelector<HTMLStyleElement>(\n `style[${INLINE_CSS_HYDRATION_ATTR}]`,\n )?.textContent ?? '')\n : (children ?? '')\n\n return (\n <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>\n {html}\n </Style>\n )\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\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 const 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\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n 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 const 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 onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { useRouter } from "./useRouter.js";
2
- import { escapeHtml, getAssetCrossOrigin, replaceEqualDeep, resolveManifestAssetLink } from "@tanstack/router-core";
2
+ import { escapeHtml, getAssetCrossOrigin, isInlinableStylesheet, replaceEqualDeep, resolveManifestAssetLink } from "@tanstack/router-core";
3
3
  import * as Solid from "solid-js";
4
4
  //#region src/headContentUtils.tsx
5
5
  /**
@@ -69,14 +69,29 @@ var useTags = (assetCrossOrigin) => {
69
69
  }
70
70
  }));
71
71
  const manifest = router.ssr?.manifest;
72
- const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
73
- tag: "link",
74
- attrs: {
75
- ...asset.attrs,
76
- crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
77
- nonce
72
+ const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).flatMap((asset) => {
73
+ if (asset.tag === "link") {
74
+ if (isInlinableStylesheet(manifest, asset)) return [];
75
+ return [{
76
+ tag: "link",
77
+ attrs: {
78
+ ...asset.attrs,
79
+ crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
80
+ nonce
81
+ }
82
+ }];
78
83
  }
79
- }));
84
+ if (asset.tag === "style") return [{
85
+ tag: "style",
86
+ attrs: {
87
+ ...asset.attrs,
88
+ nonce
89
+ },
90
+ children: asset.children,
91
+ ...asset.inlineCss ? { inlineCss: true } : {}
92
+ }];
93
+ return [];
94
+ });
80
95
  return [...constructed, ...assets];
81
96
  });
82
97
  const preloadLinks = Solid.createMemo(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.js","names":["Solid","escapeHtml","getAssetCrossOrigin","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","crossOrigin","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n replaceEqualDeep,\n resolveManifestAssetLink,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\n/**\n * Build the list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .filter((asset) => asset.tag === 'link')\n .map(\n (asset) =>\n ({\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.js","names":["Solid","escapeHtml","getAssetCrossOrigin","isInlinableStylesheet","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","flatMap","asset","crossOrigin","inlineCss","const","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n isInlinableStylesheet,\n replaceEqualDeep,\n resolveManifestAssetLink,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\n/**\n * Build the list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .flatMap((asset): Array<RouterManagedTag> => {\n if (asset.tag === 'link') {\n if (isInlinableStylesheet(manifest, asset)) {\n return []\n }\n\n return [\n {\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n },\n ]\n }\n\n if (asset.tag === 'style') {\n return [\n {\n tag: 'style',\n attrs: {\n ...asset.attrs,\n nonce,\n },\n children: asset.children,\n ...(asset.inlineCss ? { inlineCss: true as const } : {}),\n },\n ]\n }\n\n return []\n })\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { RouterManagedTag } from '@tanstack/router-core';
2
2
  import type { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
@@ -2,7 +2,9 @@ import { Link, Meta, Style, Title } from '@solidjs/meta';
2
2
  import { onCleanup, onMount } from 'solid-js';
3
3
  import { isServer } from '@tanstack/router-core/isServer';
4
4
  import { useRouter } from './useRouter';
5
- export function Asset({ tag, attrs, children, }) {
5
+ const INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css';
6
+ export function Asset(asset) {
7
+ const { tag, attrs, children } = asset;
6
8
  switch (tag) {
7
9
  case 'title':
8
10
  return <Title {...attrs}>{children}</Title>;
@@ -11,6 +13,11 @@ export function Asset({ tag, attrs, children, }) {
11
13
  case 'link':
12
14
  return <Link {...attrs}/>;
13
15
  case 'style':
16
+ if (asset.inlineCss &&
17
+ (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||
18
+ (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))) {
19
+ return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>;
20
+ }
14
21
  return <Style {...attrs}>{children}</Style>;
15
22
  case 'script':
16
23
  return <Script attrs={attrs}>{children}</Script>;
@@ -18,6 +25,17 @@ export function Asset({ tag, attrs, children, }) {
18
25
  return null;
19
26
  }
20
27
  }
28
+ function InlineCssStyle({ attrs, children, }) {
29
+ const isInlineCssPlaceholder = children === undefined;
30
+ const html = isInlineCssPlaceholder
31
+ ? typeof document === 'undefined'
32
+ ? ''
33
+ : (document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? '')
34
+ : (children ?? '');
35
+ return (<Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>
36
+ {html}
37
+ </Style>);
38
+ }
21
39
  function Script({ attrs, children, }) {
22
40
  const router = useRouter();
23
41
  const dataScript = typeof attrs?.type === 'string' &&
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as Solid from 'solid-js';
2
- import { escapeHtml, getAssetCrossOrigin, replaceEqualDeep, resolveManifestAssetLink, } from '@tanstack/router-core';
2
+ import { escapeHtml, getAssetCrossOrigin, isInlinableStylesheet, replaceEqualDeep, resolveManifestAssetLink, } from '@tanstack/router-core';
3
3
  import { useRouter } from './useRouter';
4
4
  /**
5
5
  * Build the list of head/link/meta/script tags to render for active matches.
@@ -101,16 +101,38 @@ export const useTags = (assetCrossOrigin) => {
101
101
  .map((match) => manifest?.routes[match.routeId]?.assets ?? [])
102
102
  .filter(Boolean)
103
103
  .flat(1)
104
- .filter((asset) => asset.tag === 'link')
105
- .map((asset) => ({
106
- tag: 'link',
107
- attrs: {
108
- ...asset.attrs,
109
- crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
110
- asset.attrs?.crossOrigin,
111
- nonce,
112
- },
113
- }));
104
+ .flatMap((asset) => {
105
+ if (asset.tag === 'link') {
106
+ if (isInlinableStylesheet(manifest, asset)) {
107
+ return [];
108
+ }
109
+ return [
110
+ {
111
+ tag: 'link',
112
+ attrs: {
113
+ ...asset.attrs,
114
+ crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
115
+ asset.attrs?.crossOrigin,
116
+ nonce,
117
+ },
118
+ },
119
+ ];
120
+ }
121
+ if (asset.tag === 'style') {
122
+ return [
123
+ {
124
+ tag: 'style',
125
+ attrs: {
126
+ ...asset.attrs,
127
+ nonce,
128
+ },
129
+ children: asset.children,
130
+ ...(asset.inlineCss ? { inlineCss: true } : {}),
131
+ },
132
+ ];
133
+ }
134
+ return [];
135
+ });
114
136
  return [...constructed, ...assets];
115
137
  });
116
138
  const preloadLinks = Solid.createMemo(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-router",
3
- "version": "1.168.20",
3
+ "version": "1.168.21",
4
4
  "description": "Modern and scalable routing for Solid applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -92,7 +92,7 @@
92
92
  "@solidjs/meta": "^0.29.4",
93
93
  "isbot": "^5.1.22",
94
94
  "@tanstack/history": "1.161.6",
95
- "@tanstack/router-core": "1.168.15"
95
+ "@tanstack/router-core": "1.168.16"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@solidjs/testing-library": "^0.8.10",
package/src/Asset.tsx CHANGED
@@ -5,11 +5,11 @@ import { useRouter } from './useRouter'
5
5
  import type { RouterManagedTag } from '@tanstack/router-core'
6
6
  import type { JSX } from 'solid-js'
7
7
 
8
- export function Asset({
9
- tag,
10
- attrs,
11
- children,
12
- }: RouterManagedTag): JSX.Element | null {
8
+ const INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'
9
+
10
+ export function Asset(asset: RouterManagedTag): JSX.Element | null {
11
+ const { tag, attrs, children } = asset
12
+
13
13
  switch (tag) {
14
14
  case 'title':
15
15
  return <Title {...attrs}>{children}</Title>
@@ -18,6 +18,14 @@ export function Asset({
18
18
  case 'link':
19
19
  return <Link {...attrs} />
20
20
  case 'style':
21
+ if (
22
+ asset.inlineCss &&
23
+ (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||
24
+ (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))
25
+ ) {
26
+ return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>
27
+ }
28
+
21
29
  return <Style {...attrs}>{children}</Style>
22
30
  case 'script':
23
31
  return <Script attrs={attrs}>{children}</Script>
@@ -26,6 +34,29 @@ export function Asset({
26
34
  }
27
35
  }
28
36
 
37
+ function InlineCssStyle({
38
+ attrs,
39
+ children,
40
+ }: {
41
+ attrs?: Record<string, any>
42
+ children?: RouterManagedTag['children']
43
+ }) {
44
+ const isInlineCssPlaceholder = children === undefined
45
+ const html = isInlineCssPlaceholder
46
+ ? typeof document === 'undefined'
47
+ ? ''
48
+ : (document.querySelector<HTMLStyleElement>(
49
+ `style[${INLINE_CSS_HYDRATION_ATTR}]`,
50
+ )?.textContent ?? '')
51
+ : (children ?? '')
52
+
53
+ return (
54
+ <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>
55
+ {html}
56
+ </Style>
57
+ )
58
+ }
59
+
29
60
  interface ScriptAttrs {
30
61
  [key: string]: string | boolean | undefined
31
62
  src?: string
@@ -2,6 +2,7 @@ import * as Solid from 'solid-js'
2
2
  import {
3
3
  escapeHtml,
4
4
  getAssetCrossOrigin,
5
+ isInlinableStylesheet,
5
6
  replaceEqualDeep,
6
7
  resolveManifestAssetLink,
7
8
  } from '@tanstack/router-core'
@@ -117,20 +118,42 @@ export const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {
117
118
  .map((match) => manifest?.routes[match.routeId]?.assets ?? [])
118
119
  .filter(Boolean)
119
120
  .flat(1)
120
- .filter((asset) => asset.tag === 'link')
121
- .map(
122
- (asset) =>
123
- ({
124
- tag: 'link',
125
- attrs: {
126
- ...asset.attrs,
127
- crossOrigin:
128
- getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
129
- asset.attrs?.crossOrigin,
130
- nonce,
121
+ .flatMap((asset): Array<RouterManagedTag> => {
122
+ if (asset.tag === 'link') {
123
+ if (isInlinableStylesheet(manifest, asset)) {
124
+ return []
125
+ }
126
+
127
+ return [
128
+ {
129
+ tag: 'link',
130
+ attrs: {
131
+ ...asset.attrs,
132
+ crossOrigin:
133
+ getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
134
+ asset.attrs?.crossOrigin,
135
+ nonce,
136
+ },
131
137
  },
132
- }) satisfies RouterManagedTag,
133
- )
138
+ ]
139
+ }
140
+
141
+ if (asset.tag === 'style') {
142
+ return [
143
+ {
144
+ tag: 'style',
145
+ attrs: {
146
+ ...asset.attrs,
147
+ nonce,
148
+ },
149
+ children: asset.children,
150
+ ...(asset.inlineCss ? { inlineCss: true as const } : {}),
151
+ },
152
+ ]
153
+ }
154
+
155
+ return []
156
+ })
134
157
 
135
158
  return [...constructed, ...assets]
136
159
  })