"use client"; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { defaultHead: null, default: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { defaultHead: function() { return defaultHead; }, default: function() { return _default; } }); const _interop_require_default = require("@swc/helpers/_/_interop_require_default"); const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); const _sideeffect = /*#__PURE__*/ _interop_require_default._(require("./side-effect")); const _ampcontextsharedruntime = require("./amp-context.shared-runtime"); const _headmanagercontextsharedruntime = require("./head-manager-context.shared-runtime"); const _ampmode = require("./amp-mode"); const _warnonce = require("./utils/warn-once"); function defaultHead(inAmpMode) { if (inAmpMode === void 0) inAmpMode = false; const head = [ /*#__PURE__*/ _react.default.createElement("meta", { charSet: "utf-8" }) ]; if (!inAmpMode) { head.push(/*#__PURE__*/ _react.default.createElement("meta", { name: "viewport", content: "width=device-width" })); } return head; } function onlyReactElement(list, child) { // React children can be "string" or "number" in this case we ignore them for backwards compat if (typeof child === "string" || typeof child === "number") { return list; } // Adds support for React.Fragment if (child.type === _react.default.Fragment) { return list.concat(// @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[] _react.default.Children.toArray(child.props.children).reduce(// @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[] (fragmentList, fragmentChild)=>{ if (typeof fragmentChild === "string" || typeof fragmentChild === "number") { return fragmentList; } return fragmentList.concat(fragmentChild); }, [])); } return list.concat(child); } const METATYPES = [ "name", "httpEquiv", "charSet", "itemProp" ]; /* returns a function for filtering head child elements which shouldn't be duplicated, like Also adds support for deduplicated `key` properties */ function unique() { const keys = new Set(); const tags = new Set(); const metaTypes = new Set(); const metaCategories = {}; return (h)=>{ let isUnique = true; let hasKey = false; if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) { hasKey = true; const key = h.key.slice(h.key.indexOf("$") + 1); if (keys.has(key)) { isUnique = false; } else { keys.add(key); } } // eslint-disable-next-line default-case switch(h.type){ case "title": case "base": if (tags.has(h.type)) { isUnique = false; } else { tags.add(h.type); } break; case "meta": for(let i = 0, len = METATYPES.length; i < len; i++){ const metatype = METATYPES[i]; if (!h.props.hasOwnProperty(metatype)) continue; if (metatype === "charSet") { if (metaTypes.has(metatype)) { isUnique = false; } else { metaTypes.add(metatype); } } else { const category = h.props[metatype]; const categories = metaCategories[metatype] || new Set(); if ((metatype !== "name" || !hasKey) && categories.has(category)) { isUnique = false; } else { categories.add(category); metaCategories[metatype] = categories; } } } break; } return isUnique; }; } /** * * @param headChildrenElements List of children of <Head> */ function reduceComponents(headChildrenElements, props) { const { inAmpMode } = props; return headChildrenElements.reduce(onlyReactElement, []).reverse().concat(defaultHead(inAmpMode).reverse()).filter(unique()).reverse().map((c, i)=>{ const key = c.key || i; if (process.env.NODE_ENV !== "development" && process.env.__NEXT_OPTIMIZE_FONTS && !inAmpMode) { if (c.type === "link" && c.props["href"] && // TODO(prateekbh@): Replace this with const from `constants` when the tree shaking works. [ "https://fonts.googleapis.com/css", "https://use.typekit.net/" ].some((url)=>c.props["href"].startsWith(url))) { const newProps = { ...c.props || {} }; newProps["data-href"] = newProps["href"]; newProps["href"] = undefined; // Add this attribute to make it easy to identify optimized tags newProps["data-optimized-fonts"] = true; return /*#__PURE__*/ _react.default.cloneElement(c, newProps); } } if (process.env.NODE_ENV === "development") { // omit JSON-LD structured data snippets from the warning if (c.type === "script" && c.props["type"] !== "application/ld+json") { const srcMessage = c.props["src"] ? '<script> tag with src="' + c.props["src"] + '"' : "inline <script>"; (0, _warnonce.warnOnce)("Do not add <script> tags using next/head (see " + srcMessage + "). Use next/script instead. \nSee more info here: https://nextjs.org/docs/messages/no-script-tags-in-head-component"); } else if (c.type === "link" && c.props["rel"] === "stylesheet") { (0, _warnonce.warnOnce)('Do not add stylesheets using next/head (see <link rel="stylesheet"> tag with href="' + c.props["href"] + '"). Use Document instead. \nSee more info here: https://nextjs.org/docs/messages/no-stylesheets-in-head-component'); } } return /*#__PURE__*/ _react.default.cloneElement(c, { key }); }); } /** * This component injects elements to `<head>` of your page. * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once. */ function Head(param) { let { children } = param; const ampState = (0, _react.useContext)(_ampcontextsharedruntime.AmpStateContext); const headManager = (0, _react.useContext)(_headmanagercontextsharedruntime.HeadManagerContext); return /*#__PURE__*/ _react.default.createElement(_sideeffect.default, { reduceComponentsToState: reduceComponents, headManager: headManager, inAmpMode: (0, _ampmode.isInAmpMode)(ampState) }, children); } const _default = Head; if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') { Object.defineProperty(exports.default, '__esModule', { value: true }); Object.assign(exports.default, exports); module.exports = exports.default; } //# sourceMappingURL=head.js.map