You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			189 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | "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 _jsxruntime = require("react/jsx-runtime"); | ||
|  | 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__*/ (0, _jsxruntime.jsx)("meta", { | ||
|  |             charSet: "utf-8" | ||
|  |         }) | ||
|  |     ]; | ||
|  |     if (!inAmpMode) { | ||
|  |         head.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("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 <title/> | ||
|  |  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__*/ (0, _jsxruntime.jsx)(_sideeffect.default, { | ||
|  |         reduceComponentsToState: reduceComponents, | ||
|  |         headManager: headManager, | ||
|  |         inAmpMode: (0, _ampmode.isInAmpMode)(ampState), | ||
|  |         children: 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
 |