next-seo
Version:
SEO plugin for Next.js projects
1 lines • 33.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/pages/core/buildTags.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\nimport {\n BuildTagsParams,\n OpenGraphMedia,\n NextSeoProps,\n DefaultSeoProps,\n} from \"../types\";\nconst defaults = {\n templateTitle: \"\",\n noindex: false,\n nofollow: false,\n norobots: false,\n defaultOpenGraphImageWidth: 0,\n defaultOpenGraphImageHeight: 0,\n defaultOpenGraphVideoWidth: 0,\n defaultOpenGraphVideoHeight: 0,\n};\n\nconst buildOpenGraphMediaTags = (\n mediaType: \"image\" | \"video\" | \"audio\",\n media: ReadonlyArray<OpenGraphMedia> = [],\n {\n defaultWidth,\n defaultHeight,\n }: { defaultWidth?: number; defaultHeight?: number } = {},\n) => {\n return media.reduce((tags, medium, index) => {\n tags.push(\n <meta\n key={`og:${mediaType}:0${index}`}\n property={`og:${mediaType}`}\n content={medium.url}\n />,\n );\n\n if (medium.alt) {\n tags.push(\n <meta\n key={`og:${mediaType}:alt0${index}`}\n property={`og:${mediaType}:alt`}\n content={medium.alt}\n />,\n );\n }\n\n if (medium.secureUrl) {\n tags.push(\n <meta\n key={`og:${mediaType}:secure_url0${index}`}\n property={`og:${mediaType}:secure_url`}\n content={medium.secureUrl.toString()}\n />,\n );\n }\n\n if (medium.type) {\n tags.push(\n <meta\n key={`og:${mediaType}:type0${index}`}\n property={`og:${mediaType}:type`}\n content={medium.type.toString()}\n />,\n );\n }\n\n if (medium.width) {\n tags.push(\n <meta\n key={`og:${mediaType}:width0${index}`}\n property={`og:${mediaType}:width`}\n content={medium.width.toString()}\n />,\n );\n } else if (defaultWidth) {\n tags.push(\n <meta\n key={`og:${mediaType}:width0${index}`}\n property={`og:${mediaType}:width`}\n content={defaultWidth.toString()}\n />,\n );\n }\n\n if (medium.height) {\n tags.push(\n <meta\n key={`og:${mediaType}:height${index}`}\n property={`og:${mediaType}:height`}\n content={medium.height.toString()}\n />,\n );\n } else if (defaultHeight) {\n tags.push(\n <meta\n key={`og:${mediaType}:height${index}`}\n property={`og:${mediaType}:height`}\n content={defaultHeight.toString()}\n />,\n );\n }\n\n return tags;\n }, [] as ReactNode[]);\n};\n\nconst generateSeoTags = (config: BuildTagsParams) => {\n const tagsToRender: ReactNode[] = [];\n\n if (config.titleTemplate) {\n defaults.templateTitle = config.titleTemplate;\n }\n\n let updatedTitle = \"\";\n if (config.title) {\n updatedTitle = config.title;\n if (defaults.templateTitle) {\n updatedTitle = defaults.templateTitle.replace(/%s/g, () => updatedTitle);\n }\n } else if (config.defaultTitle) {\n updatedTitle = config.defaultTitle;\n }\n\n if (updatedTitle) {\n tagsToRender.push(<title key=\"title\">{updatedTitle}</title>);\n }\n\n const noindex =\n config.noindex === undefined\n ? defaults.noindex || config.dangerouslySetAllPagesToNoIndex\n : config.noindex;\n\n const nofollow =\n config.nofollow === undefined\n ? defaults.nofollow || config.dangerouslySetAllPagesToNoFollow\n : config.nofollow;\n\n const norobots = config.norobots || defaults.norobots;\n\n let robotsParams = \"\";\n\n if (config.robotsProps) {\n const {\n nosnippet,\n maxSnippet,\n maxImagePreview,\n maxVideoPreview,\n noarchive,\n noimageindex,\n notranslate,\n unavailableAfter,\n } = config.robotsProps;\n\n robotsParams = `${nosnippet ? \",nosnippet\" : \"\"}${\n maxSnippet ? `,max-snippet:${maxSnippet}` : \"\"\n }${maxImagePreview ? `,max-image-preview:${maxImagePreview}` : \"\"}${\n noarchive ? \",noarchive\" : \"\"\n }${unavailableAfter ? `,unavailable_after:${unavailableAfter}` : \"\"}${\n noimageindex ? \",noimageindex\" : \"\"\n }${maxVideoPreview ? `,max-video-preview:${maxVideoPreview}` : \"\"}${\n notranslate ? \",notranslate\" : \"\"\n }`;\n }\n\n if (config.norobots) {\n defaults.norobots = true;\n }\n\n if (noindex || nofollow) {\n if (config.dangerouslySetAllPagesToNoIndex) {\n defaults.noindex = true;\n }\n if (config.dangerouslySetAllPagesToNoFollow) {\n defaults.nofollow = true;\n }\n\n tagsToRender.push(\n <meta\n key=\"robots\"\n name=\"robots\"\n content={`${noindex ? \"noindex\" : \"index\"},${\n nofollow ? \"nofollow\" : \"follow\"\n }${robotsParams}`}\n />,\n );\n } else if (!norobots || robotsParams) {\n tagsToRender.push(\n <meta\n key=\"robots\"\n name=\"robots\"\n content={`index,follow${robotsParams}`}\n />,\n );\n }\n\n if (config.description) {\n tagsToRender.push(\n <meta\n key=\"description\"\n name=\"description\"\n content={config.description}\n />,\n );\n }\n\n if (config.themeColor) {\n tagsToRender.push(\n <meta key=\"theme-color\" name=\"theme-color\" content={config.themeColor} />,\n );\n }\n\n if (config.mobileAlternate) {\n tagsToRender.push(\n <link\n rel=\"alternate\"\n key=\"mobileAlternate\"\n media={config.mobileAlternate.media}\n href={config.mobileAlternate.href}\n />,\n );\n }\n\n if (config.languageAlternates && config.languageAlternates.length > 0) {\n config.languageAlternates.forEach((languageAlternate) => {\n tagsToRender.push(\n <link\n rel=\"alternate\"\n key={`languageAlternate-${languageAlternate.hrefLang}`}\n hrefLang={languageAlternate.hrefLang}\n href={languageAlternate.href}\n />,\n );\n });\n }\n\n if (config.twitter) {\n if (config.twitter.cardType) {\n tagsToRender.push(\n <meta\n key=\"twitter:card\"\n name=\"twitter:card\"\n content={config.twitter.cardType}\n />,\n );\n }\n\n if (config.twitter.site) {\n tagsToRender.push(\n <meta\n key=\"twitter:site\"\n name=\"twitter:site\"\n content={config.twitter.site}\n />,\n );\n }\n\n if (config.twitter.handle) {\n tagsToRender.push(\n <meta\n key=\"twitter:creator\"\n name=\"twitter:creator\"\n content={config.twitter.handle}\n />,\n );\n }\n }\n\n if (config.facebook) {\n if (config.facebook.appId) {\n tagsToRender.push(\n <meta\n key=\"fb:app_id\"\n property=\"fb:app_id\"\n content={config.facebook.appId}\n />,\n );\n }\n }\n\n if (config.openGraph?.title || updatedTitle) {\n tagsToRender.push(\n <meta\n key=\"og:title\"\n property=\"og:title\"\n content={config.openGraph?.title || updatedTitle}\n />,\n );\n }\n\n if (config.openGraph?.description || config.description) {\n tagsToRender.push(\n <meta\n key=\"og:description\"\n property=\"og:description\"\n content={config.openGraph?.description || config.description}\n />,\n );\n }\n\n if (config.openGraph) {\n if (config.openGraph.url || config.canonical) {\n tagsToRender.push(\n <meta\n key=\"og:url\"\n property=\"og:url\"\n content={config.openGraph.url || config.canonical}\n />,\n );\n }\n\n if (config.openGraph.type) {\n const type = config.openGraph.type.toLowerCase();\n\n tagsToRender.push(\n <meta key=\"og:type\" property=\"og:type\" content={type} />,\n );\n\n if (type === \"profile\" && config.openGraph.profile) {\n if (config.openGraph.profile.firstName) {\n tagsToRender.push(\n <meta\n key=\"profile:first_name\"\n property=\"profile:first_name\"\n content={config.openGraph.profile.firstName}\n />,\n );\n }\n\n if (config.openGraph.profile.lastName) {\n tagsToRender.push(\n <meta\n key=\"profile:last_name\"\n property=\"profile:last_name\"\n content={config.openGraph.profile.lastName}\n />,\n );\n }\n\n if (config.openGraph.profile.username) {\n tagsToRender.push(\n <meta\n key=\"profile:username\"\n property=\"profile:username\"\n content={config.openGraph.profile.username}\n />,\n );\n }\n\n if (config.openGraph.profile.gender) {\n tagsToRender.push(\n <meta\n key=\"profile:gender\"\n property=\"profile:gender\"\n content={config.openGraph.profile.gender}\n />,\n );\n }\n } else if (type === \"book\" && config.openGraph.book) {\n if (\n config.openGraph.book.authors &&\n config.openGraph.book.authors.length\n ) {\n config.openGraph.book.authors.forEach((author, index) => {\n tagsToRender.push(\n <meta\n key={`book:author:0${index}`}\n property=\"book:author\"\n content={author}\n />,\n );\n });\n }\n\n if (config.openGraph.book.isbn) {\n tagsToRender.push(\n <meta\n key=\"book:isbn\"\n property=\"book:isbn\"\n content={config.openGraph.book.isbn}\n />,\n );\n }\n\n if (config.openGraph.book.releaseDate) {\n tagsToRender.push(\n <meta\n key=\"book:release_date\"\n property=\"book:release_date\"\n content={config.openGraph.book.releaseDate}\n />,\n );\n }\n\n if (config.openGraph.book.tags && config.openGraph.book.tags.length) {\n config.openGraph.book.tags.forEach((tag, index) => {\n tagsToRender.push(\n <meta\n key={`book:tag:0${index}`}\n property=\"book:tag\"\n content={tag}\n />,\n );\n });\n }\n } else if (type === \"article\" && config.openGraph.article) {\n if (config.openGraph.article.publishedTime) {\n tagsToRender.push(\n <meta\n key=\"article:published_time\"\n property=\"article:published_time\"\n content={config.openGraph.article.publishedTime}\n />,\n );\n }\n\n if (config.openGraph.article.modifiedTime) {\n tagsToRender.push(\n <meta\n key=\"article:modified_time\"\n property=\"article:modified_time\"\n content={config.openGraph.article.modifiedTime}\n />,\n );\n }\n\n if (config.openGraph.article.expirationTime) {\n tagsToRender.push(\n <meta\n key=\"article:expiration_time\"\n property=\"article:expiration_time\"\n content={config.openGraph.article.expirationTime}\n />,\n );\n }\n\n if (\n config.openGraph.article.authors &&\n config.openGraph.article.authors.length\n ) {\n config.openGraph.article.authors.forEach((author, index) => {\n tagsToRender.push(\n <meta\n key={`article:author:0${index}`}\n property=\"article:author\"\n content={author}\n />,\n );\n });\n }\n\n if (config.openGraph.article.section) {\n tagsToRender.push(\n <meta\n key=\"article:section\"\n property=\"article:section\"\n content={config.openGraph.article.section}\n />,\n );\n }\n\n if (\n config.openGraph.article.tags &&\n config.openGraph.article.tags.length\n ) {\n config.openGraph.article.tags.forEach((tag, index) => {\n tagsToRender.push(\n <meta\n key={`article:tag:0${index}`}\n property=\"article:tag\"\n content={tag}\n />,\n );\n });\n }\n } else if (\n (type === \"video.movie\" ||\n type === \"video.episode\" ||\n type === \"video.tv_show\" ||\n type === \"video.other\") &&\n config.openGraph.video\n ) {\n if (\n config.openGraph.video.actors &&\n config.openGraph.video.actors.length\n ) {\n config.openGraph.video.actors.forEach((actor, index) => {\n if (actor.profile) {\n tagsToRender.push(\n <meta\n key={`video:actor:0${index}`}\n property=\"video:actor\"\n content={actor.profile}\n />,\n );\n }\n\n if (actor.role) {\n tagsToRender.push(\n <meta\n key={`video:actor:role:0${index}`}\n property=\"video:actor:role\"\n content={actor.role}\n />,\n );\n }\n });\n }\n\n if (\n config.openGraph.video.directors &&\n config.openGraph.video.directors.length\n ) {\n config.openGraph.video.directors.forEach((director, index) => {\n tagsToRender.push(\n <meta\n key={`video:director:0${index}`}\n property=\"video:director\"\n content={director}\n />,\n );\n });\n }\n\n if (\n config.openGraph.video.writers &&\n config.openGraph.video.writers.length\n ) {\n config.openGraph.video.writers.forEach((writer, index) => {\n tagsToRender.push(\n <meta\n key={`video:writer:0${index}`}\n property=\"video:writer\"\n content={writer}\n />,\n );\n });\n }\n\n if (config.openGraph.video.duration) {\n tagsToRender.push(\n <meta\n key=\"video:duration\"\n property=\"video:duration\"\n content={config.openGraph.video.duration.toString()}\n />,\n );\n }\n\n if (config.openGraph.video.releaseDate) {\n tagsToRender.push(\n <meta\n key=\"video:release_date\"\n property=\"video:release_date\"\n content={config.openGraph.video.releaseDate}\n />,\n );\n }\n\n if (config.openGraph.video.tags && config.openGraph.video.tags.length) {\n config.openGraph.video.tags.forEach((tag, index) => {\n tagsToRender.push(\n <meta\n key={`video:tag:0${index}`}\n property=\"video:tag\"\n content={tag}\n />,\n );\n });\n }\n\n if (config.openGraph.video.series) {\n tagsToRender.push(\n <meta\n key=\"video:series\"\n property=\"video:series\"\n content={config.openGraph.video.series}\n />,\n );\n }\n }\n }\n\n // images\n if (config.defaultOpenGraphImageWidth) {\n defaults.defaultOpenGraphImageWidth = config.defaultOpenGraphImageWidth;\n }\n\n if (config.defaultOpenGraphImageHeight) {\n defaults.defaultOpenGraphImageHeight = config.defaultOpenGraphImageHeight;\n }\n\n if (config.openGraph.images && config.openGraph.images.length) {\n tagsToRender.push(\n ...buildOpenGraphMediaTags(\"image\", config.openGraph.images, {\n defaultWidth: defaults.defaultOpenGraphImageWidth,\n defaultHeight: defaults.defaultOpenGraphImageHeight,\n }),\n );\n }\n\n // videos\n if (config.defaultOpenGraphVideoWidth) {\n defaults.defaultOpenGraphVideoWidth = config.defaultOpenGraphVideoWidth;\n }\n\n if (config.defaultOpenGraphVideoHeight) {\n defaults.defaultOpenGraphVideoHeight = config.defaultOpenGraphVideoHeight;\n }\n\n if (config.openGraph.videos && config.openGraph.videos.length) {\n tagsToRender.push(\n ...buildOpenGraphMediaTags(\"video\", config.openGraph.videos, {\n defaultWidth: defaults.defaultOpenGraphVideoWidth,\n defaultHeight: defaults.defaultOpenGraphVideoHeight,\n }),\n );\n }\n\n // audio\n if (config.openGraph.audio) {\n tagsToRender.push(\n ...buildOpenGraphMediaTags(\"audio\", config.openGraph.audio),\n );\n }\n\n if (config.openGraph.locale) {\n tagsToRender.push(\n <meta\n key=\"og:locale\"\n property=\"og:locale\"\n content={config.openGraph.locale}\n />,\n );\n }\n\n if (config.openGraph.siteName || config.openGraph.site_name) {\n tagsToRender.push(\n <meta\n key=\"og:site_name\"\n property=\"og:site_name\"\n content={config.openGraph.siteName || config.openGraph.site_name}\n />,\n );\n }\n }\n\n if (config.canonical) {\n tagsToRender.push(\n <link rel=\"canonical\" href={config.canonical} key=\"canonical\" />,\n );\n }\n\n if (config.additionalMetaTags && config.additionalMetaTags.length > 0) {\n config.additionalMetaTags.forEach(({ keyOverride, ...tag }) => {\n tagsToRender.push(\n <meta\n key={`meta:${\n keyOverride ?? tag.name ?? tag.property ?? tag.httpEquiv\n }`}\n {...tag}\n />,\n );\n });\n }\n\n if (config.additionalLinkTags?.length) {\n config.additionalLinkTags.forEach((tag) => {\n const { crossOrigin: tagCrossOrigin, ...rest } = tag;\n const crossOrigin: \"anonymous\" | \"use-credentials\" | \"\" | undefined =\n tagCrossOrigin === \"anonymous\" ||\n tagCrossOrigin === \"use-credentials\" ||\n tagCrossOrigin === \"\"\n ? tagCrossOrigin\n : undefined;\n\n tagsToRender.push(\n <link\n key={`link${rest.keyOverride ?? rest.href}${rest.rel}`}\n {...rest}\n crossOrigin={crossOrigin}\n />,\n );\n });\n }\n\n return tagsToRender;\n};\n\n/**\n * Generate SEO meta tags for Next.js\n * This is the core function that creates all SEO-related tags\n * @internal\n */\nexport { generateSeoTags };\n\n/**\n * Generate SEO meta tags for NextSeo component\n * Use this when you want to add SEO tags directly in Next.js <Head>\n * without using the NextSeo component wrapper\n *\n * @example\n * ```tsx\n * import Head from 'next/head';\n * import { generateNextSeo } from 'next-seo/pages';\n *\n * export default function Page() {\n * return (\n * <>\n * <Head>\n * {generateNextSeo({\n * title: \"My Page Title\",\n * description: \"My page description\"\n * })}\n * </Head>\n * <h1>Page Content</h1>\n * </>\n * );\n * }\n * ```\n */\nexport function generateNextSeo(props: NextSeoProps): ReactNode[] {\n return generateSeoTags(props);\n}\n\n/**\n * Generate default SEO meta tags for DefaultSeo component\n * Use this when you want to set global SEO defaults directly in Next.js <Head>\n * without using the DefaultSeo component wrapper\n *\n * @example\n * ```tsx\n * // pages/_app.tsx\n * import Head from 'next/head';\n * import { generateDefaultSeo } from 'next-seo/pages';\n *\n * export default function MyApp({ Component, pageProps }) {\n * return (\n * <>\n * <Head>\n * {generateDefaultSeo({\n * titleTemplate: \"MySite | %s\",\n * defaultTitle: \"MySite\",\n * description: \"Default site description\"\n * })}\n * </Head>\n * <Component {...pageProps} />\n * </>\n * );\n * }\n * ```\n */\nexport function generateDefaultSeo(props: DefaultSeoProps): ReactNode[] {\n const {\n title,\n titleTemplate,\n defaultTitle,\n themeColor,\n dangerouslySetAllPagesToNoIndex = false,\n dangerouslySetAllPagesToNoFollow = false,\n description,\n canonical,\n facebook,\n openGraph,\n additionalMetaTags,\n twitter,\n defaultOpenGraphImageWidth,\n defaultOpenGraphImageHeight,\n defaultOpenGraphVideoWidth,\n defaultOpenGraphVideoHeight,\n mobileAlternate,\n languageAlternates,\n additionalLinkTags,\n robotsProps,\n norobots,\n } = props;\n return generateSeoTags({\n title,\n titleTemplate,\n defaultTitle,\n themeColor,\n dangerouslySetAllPagesToNoIndex,\n dangerouslySetAllPagesToNoFollow,\n description,\n canonical,\n facebook,\n openGraph,\n additionalMetaTags,\n twitter,\n defaultOpenGraphImageWidth,\n defaultOpenGraphImageHeight,\n defaultOpenGraphVideoWidth,\n defaultOpenGraphVideoHeight,\n mobileAlternate,\n languageAlternates,\n additionalLinkTags,\n robotsProps,\n norobots,\n });\n}\n"],"mappings":"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","names":[]}