{"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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"}