UNPKG

@tanstack/react-router

Version:

Modern and scalable routing for React applications

128 lines (127 loc) 3.71 kB
import { jsx } from "react/jsx-runtime"; import * as React from "react"; import { useRouter } from "./useRouter.js"; function Asset({ tag, attrs, children, nonce }) { switch (tag) { case "title": return /* @__PURE__ */ jsx("title", { ...attrs, suppressHydrationWarning: true, children }); case "meta": return /* @__PURE__ */ jsx("meta", { ...attrs, suppressHydrationWarning: true }); case "link": return /* @__PURE__ */ jsx("link", { ...attrs, nonce, suppressHydrationWarning: true }); case "style": return /* @__PURE__ */ jsx( "style", { ...attrs, dangerouslySetInnerHTML: { __html: children }, nonce } ); case "script": return /* @__PURE__ */ jsx(Script, { attrs, nonce, children }); default: return null; } } function Script({ attrs, children, nonce }) { const router = useRouter(); React.useEffect(() => { if (attrs?.src) { const normSrc = (() => { try { const base = document.baseURI || window.location.href; return new URL(attrs.src, base).href; } catch { return attrs.src; } })(); const existingScript = Array.from( document.querySelectorAll("script[src]") ).find((el) => el.src === normSrc); if (existingScript) { return; } const script = document.createElement("script"); for (const [key, value] of Object.entries(attrs)) { if (key !== "suppressHydrationWarning" && value !== void 0 && value !== false) { script.setAttribute( key, typeof value === "boolean" ? "" : String(value) ); } } document.head.appendChild(script); return () => { if (script.parentNode) { script.parentNode.removeChild(script); } }; } if (typeof children === "string") { const typeAttr = typeof attrs?.type === "string" ? attrs.type : "text/javascript"; const nonceAttr = typeof attrs?.nonce === "string" ? attrs.nonce : void 0; const existingScript = Array.from( document.querySelectorAll("script:not([src])") ).find((el) => { if (!(el instanceof HTMLScriptElement)) return false; const sType = el.getAttribute("type") ?? "text/javascript"; const sNonce = el.getAttribute("nonce") ?? void 0; return el.textContent === children && sType === typeAttr && sNonce === nonceAttr; }); if (existingScript) { return; } const script = document.createElement("script"); script.textContent = children; if (attrs) { for (const [key, value] of Object.entries(attrs)) { if (key !== "suppressHydrationWarning" && value !== void 0 && value !== false) { script.setAttribute( key, typeof value === "boolean" ? "" : String(value) ); } } } document.head.appendChild(script); return () => { if (script.parentNode) { script.parentNode.removeChild(script); } }; } return void 0; }, [attrs, children]); if (!router.isServer) { return null; } if (attrs?.src && typeof attrs.src === "string") { return /* @__PURE__ */ jsx("script", { ...attrs, suppressHydrationWarning: true, nonce }); } if (typeof children === "string") { return /* @__PURE__ */ jsx( "script", { ...attrs, dangerouslySetInnerHTML: { __html: children }, suppressHydrationWarning: true, nonce } ); } return null; } export { Asset }; //# sourceMappingURL=Asset.js.map