@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
1 lines • 8.86 kB
Source Map (JSON)
{"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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"}