UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 8.94 kB
{"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":";;;;;;;AAOA,IAAMU,4BAA4B;AAElC,SAAgBC,MAAMC,OAA6C;CACjE,MAAM,EAAEE,KAAKC,OAAOC,aAAaJ;CAEjC,QAAQE,KAAR;EACE,KAAK,SACH,QAAA,GAAA,aAAA,iBAAQX,cAAAA,QAAAA,GAAAA,aAAAA,YAAUY,OAAK,EAAGC,SAAQ,CAAA,CAAA;EACpC,KAAK,QACH,QAAA,GAAA,aAAA,iBAAQf,cAAAA,MAASc,KAAK;EACxB,KAAK,QACH,QAAA,GAAA,aAAA,iBAAQf,cAAAA,MAASe,KAAK;EACxB,KAAK;GACH,IACEH,MAAMO,cACLC,QAAQC,IAAIC,2BAA2B,UACrCF,QAAQC,IAAIC,2BAA2BC,KAAAA,KAAajB,+BAAAA,WAEvD,QAAA,GAAA,aAAA,iBAAQkB,gBAAc;IAAQT;IAAQC;GAAQ,CAAA;GAGhD,QAAA,GAAA,aAAA,iBAAQd,cAAAA,QAAAA,GAAAA,aAAAA,YAAUa,OAAK,EAAGC,SAAQ,CAAA,CAAA;EACpC,KAAK,UACH,QAAA,GAAA,aAAA,iBAAQS,QAAM;GAAQV;GAAQC;EAAQ,CAAA;EACxC,SACE,OAAO;CACX;AACF;AAEA,SAASQ,eAAe,EACtBT,OACAC,YAIC;CAED,MAAMY,OADyBZ,aAAaO,KAAAA,IAExC,OAAOM,aAAa,cAClB,KACCA,SAASC,cACR,SAASpB,0BAAyB,EACpC,GAAGsB,eAAe,KACnBhB,YAAY;CAEjB,QAAA,GAAA,aAAA,iBACGd,cAAAA,QAAAA,GAAAA,aAAAA,YAAUa,OAAW,GAAGL,4BAA4B,GAAG,GAAC,EAAAM,UACtDY,KAAI,CAAA,CAAA;AAGX;AAOA,SAASH,OAAO,EACdV,OACAC,YAIqB;CACrB,MAAMoB,SAAS7B,kBAAAA,UAAU;CACzB,MAAM8B,aACJ,OAAOtB,OAAOuB,SAAS,YACvBvB,MAAMuB,SAAS,MACfvB,MAAMuB,SAAS,qBACfvB,MAAMuB,SAAS;CAEjBjC,CAAAA,GAAAA,SAAAA,eAAc;EACZ,IAAIgC,YAAY;EAEhB,IAAItB,OAAOoB,KAAK;GACd,MAAMI,iBAAiB;IACrB,IAAI;KACF,MAAMC,OAAOX,SAASY,WAAWC,OAAOC,SAASC;KACjD,OAAO,IAAIC,IAAI9B,MAAMoB,KAAKK,IAAI,EAAEI;IAClC,QAAQ;KACN,OAAO7B,MAAMoB;IACf;GACF,GAAG;GAKH,IAJuBY,MAAMC,KAC3BnB,SAASoB,iBAAiB,aAAa,CACzC,EAAEC,MAAMC,OAAQA,GAAyBhB,QAAQI,OAE7CO,GACF;GAGF,MAAMO,SAASxB,SAASyB,cAAc,QAAQ;GAE9C,KAAK,MAAM,CAACpB,KAAKqB,UAAUC,OAAOC,QAAQ1C,KAAK,GAC7C,IAAIwC,UAAUhC,KAAAA,KAAagC,UAAU,OACnCF,OAAOK,aACLxB,KACA,OAAOqB,UAAU,YAAY,KAAKI,OAAOJ,KAAK,CAChD;GAIJ1B,SAAS+B,KAAKC,YAAYR,MAAM;GAEhCjD,CAAAA,GAAAA,SAAAA,iBAAgB;IACd,IAAIiD,OAAOS,YACTT,OAAOS,WAAWC,YAAYV,MAAM;GAExC,CAAC;EACH;EAEA,IAAI,OAAOrC,aAAa,UAAU;GAChC,MAAMgD,WACJ,OAAOjD,OAAOuB,SAAS,WAAWvB,MAAMuB,OAAO;GACjD,MAAM2B,YACJ,OAAOlD,OAAOmD,UAAU,WAAWnD,MAAMmD,QAAQ3C,KAAAA;GAcnD,IAbuBwB,MAAMC,KAC3BnB,SAASoB,iBAAiB,mBAAmB,CAC/C,EAAEC,MAAMC,OAAO;IACb,IAAI,EAAEA,cAAcC,oBAAoB,OAAO;IAC/C,MAAMe,QAAQhB,GAAGiB,aAAa,MAAM,KAAK;IACzC,MAAMC,SAASlB,GAAGiB,aAAa,OAAO,KAAK7C,KAAAA;IAC3C,OACE4B,GAAGnB,gBAAgBhB,YACnBmD,UAAUH,YACVK,WAAWJ;GAEf,CAEInB,GACF;GAGF,MAAMO,SAASxB,SAASyB,cAAc,QAAQ;GAC9CD,OAAOrB,cAAchB;GAErB,IAAID;SACG,MAAM,CAACmB,KAAKqB,UAAUC,OAAOC,QAAQ1C,KAAK,GAC7C,IAAIwC,UAAUhC,KAAAA,KAAagC,UAAU,OACnCF,OAAOK,aACLxB,KACA,OAAOqB,UAAU,YAAY,KAAKI,OAAOJ,KAAK,CAChD;GAAA;GAKN1B,SAAS+B,KAAKC,YAAYR,MAAM;GAEhCjD,CAAAA,GAAAA,SAAAA,iBAAgB;IACd,IAAIiD,OAAOS,YACTT,OAAOS,WAAWC,YAAYV,MAAM;GAExC,CAAC;EACH;CACF,CAAC;CAED,IAAI,EAAE/C,+BAAAA,YAAY8B,OAAO9B,WAAW;EAClC,IAAI+B,cAAc,OAAOrB,aAAa,UACpC,cAAA;GAAA,IAAAsD,OAAAC,OAAA;GAAAC,CAAAA,GAAAA,aAAAA,QAAAF,OAAAA,GAAAA,aAAAA,YAAmBvD,OAAK,EAAA,aAAaC,SAAQ,CAAA,GAAA,OAAA,KAAA;GAAA,OAAAsD;EAAA,GAAA;EAI/C,OAAO;CACT;CAEA,IAAIvD,OAAOoB,OAAO,OAAOpB,MAAMoB,QAAQ,UACrC,cAAA;EAAA,IAAAsC,QAAAF,OAAA;EAAAC,CAAAA,GAAAA,aAAAA,QAAAC,OAAmB1D,OAAK,OAAA,KAAA;EAAA,OAAA0D;CAAA,GAAA;CAG1B,IAAI,OAAOzD,aAAa,UACtB,cAAA;EAAA,IAAA0D,QAAAH,OAAA;EAAAC,CAAAA,GAAAA,aAAAA,QAAAE,QAAAA,GAAAA,aAAAA,YAAmB3D,OAAK,EAAA,aAAaC,SAAQ,CAAA,GAAA,OAAA,KAAA;EAAA,OAAA0D;CAAA,GAAA;CAG/C,OAAO;AACT"}