187 lines
7.6 KiB
JavaScript
187 lines
7.6 KiB
JavaScript
"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 <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__*/ _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
|