@tanstack/react-router
Version:
Modern and scalable routing for React applications
128 lines (127 loc) • 3.71 kB
JavaScript
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