sanity-plugin-seofields 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -26
- package/dist/SeoHealthTool-2COI27KI.cjs +8 -0
- package/dist/SeoHealthTool-2COI27KI.cjs.map +1 -0
- package/dist/SeoHealthTool-CWI3KB2V.js +8 -0
- package/dist/SeoHealthTool-CWI3KB2V.js.map +1 -0
- package/dist/{SeoPreview-3EXR6FD4.cjs → SeoPreview-LMZAWWOE.cjs} +35 -38
- package/dist/SeoPreview-LMZAWWOE.cjs.map +1 -0
- package/dist/{SeoPreview-4PPAF4NO.js → SeoPreview-UNQBKTQO.js} +14 -11
- package/dist/SeoPreview-UNQBKTQO.js.map +1 -0
- package/dist/chunk-3OK3S2F7.cjs +673 -0
- package/dist/chunk-3OK3S2F7.cjs.map +1 -0
- package/dist/{chunk-B5IVI5LP.cjs → chunk-5XTQRILL.cjs} +286 -236
- package/dist/chunk-5XTQRILL.cjs.map +1 -0
- package/dist/{chunk-254YHUN3.cjs → chunk-7N4MLTMR.js} +8 -6
- package/dist/chunk-7N4MLTMR.js.map +1 -0
- package/dist/{chunk-DDAAVRWG.js → chunk-A57XNQC7.cjs} +9 -4
- package/dist/chunk-A57XNQC7.cjs.map +1 -0
- package/dist/chunk-BWLJDK5J.js +624 -0
- package/dist/chunk-BWLJDK5J.js.map +1 -0
- package/dist/chunk-FUUWBQE2.cjs +195 -0
- package/dist/chunk-FUUWBQE2.cjs.map +1 -0
- package/dist/{chunk-ZBHLMQTS.cjs → chunk-HHO2AKAP.js} +44 -17
- package/dist/chunk-HHO2AKAP.js.map +1 -0
- package/dist/chunk-KIEO6QG3.js +195 -0
- package/dist/chunk-KIEO6QG3.js.map +1 -0
- package/dist/chunk-R2U7JF7U.cjs +624 -0
- package/dist/chunk-R2U7JF7U.cjs.map +1 -0
- package/dist/{chunk-VR44E62I.js → chunk-XZKQWV2H.js} +204 -33
- package/dist/chunk-XZKQWV2H.js.map +1 -0
- package/dist/{chunk-HDZZQCH7.js → chunk-Y46ACXM4.cjs} +45 -5
- package/dist/chunk-Y46ACXM4.cjs.map +1 -0
- package/dist/chunk-Z5AOUU4H.js +673 -0
- package/dist/chunk-Z5AOUU4H.js.map +1 -0
- package/dist/cli.js +27 -27
- package/dist/{component-DEXwtemT.d.ts → component-CjT1hvxh.d.ts} +2 -2
- package/dist/{component-BzI-LHPw.d.cts → component-WYh0z8as.d.cts} +2 -2
- package/dist/define-cli.cjs +2 -4
- package/dist/define-cli.cjs.map +1 -1
- package/dist/define-cli.js +4 -4
- package/dist/define-cli.js.map +1 -1
- package/dist/head.cjs +14 -0
- package/dist/head.cjs.map +1 -0
- package/dist/head.d.cts +254 -0
- package/dist/head.d.ts +254 -0
- package/dist/head.js +14 -0
- package/dist/head.js.map +1 -0
- package/dist/index.cjs +978 -367
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -374
- package/dist/index.d.ts +6 -374
- package/dist/index.js +920 -286
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +204 -455
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +8 -206
- package/dist/next.d.ts +8 -206
- package/dist/next.js +181 -111
- package/dist/next.js.map +1 -1
- package/dist/plugin-DQdThyxG.d.ts +449 -0
- package/dist/plugin-DoGeZP79.d.cts +449 -0
- package/dist/schema/next.cjs +173 -327
- package/dist/schema/next.cjs.map +1 -1
- package/dist/schema/next.d.cts +4 -4
- package/dist/schema/next.d.ts +4 -4
- package/dist/schema/next.js +172 -8
- package/dist/schema/next.js.map +1 -1
- package/dist/schema.cjs +376 -517
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +5 -5
- package/dist/schema.d.ts +5 -5
- package/dist/schema.js +216 -11
- package/dist/schema.js.map +1 -1
- package/dist/server.cjs +149 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +102 -0
- package/dist/server.d.ts +102 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/{types-CW8qFdAn.d.ts → types-BAdN1RMu.d.ts} +2 -2
- package/dist/{types-B_vjMPtM.d.cts → types-C5i3KMgs.d.cts} +2 -2
- package/dist/{types-BXSCbl6p.d.cts → types-DP-DiW6f.d.cts} +2 -2
- package/dist/{types-C19cQx5D.d.ts → types-DRLUGLtX.d.ts} +2 -2
- package/dist/{types-yVmQfby9.d.cts → types-DxlPXihz.d.cts} +1 -1
- package/dist/{types-yVmQfby9.d.ts → types-DxlPXihz.d.ts} +1 -1
- package/package.json +25 -4
- package/dist/SeoHealthDashboard-AEKVVMUR-7NWV3C3Y.js +0 -4
- package/dist/SeoHealthDashboard-AEKVVMUR-7NWV3C3Y.js.map +0 -1
- package/dist/SeoHealthDashboard-AEKVVMUR-XWKJUH24.cjs +0 -10
- package/dist/SeoHealthDashboard-AEKVVMUR-XWKJUH24.cjs.map +0 -1
- package/dist/SeoHealthTool-2KKQJLJL.cjs +0 -11
- package/dist/SeoHealthTool-2KKQJLJL.cjs.map +0 -1
- package/dist/SeoHealthTool-3CUKGADZ.js +0 -5
- package/dist/SeoHealthTool-3CUKGADZ.js.map +0 -1
- package/dist/SeoPreview-3EXR6FD4.cjs.map +0 -1
- package/dist/SeoPreview-4PPAF4NO.js.map +0 -1
- package/dist/chunk-254YHUN3.cjs.map +0 -1
- package/dist/chunk-27XSYENH.js +0 -2215
- package/dist/chunk-27XSYENH.js.map +0 -1
- package/dist/chunk-B5IVI5LP.cjs.map +0 -1
- package/dist/chunk-BNXMFD3T.cjs +0 -431
- package/dist/chunk-BNXMFD3T.cjs.map +0 -1
- package/dist/chunk-DDAAVRWG.js.map +0 -1
- package/dist/chunk-HDZZQCH7.js.map +0 -1
- package/dist/chunk-P6IOWIO2.cjs +0 -480
- package/dist/chunk-P6IOWIO2.cjs.map +0 -1
- package/dist/chunk-UOCZFYYP.js +0 -407
- package/dist/chunk-UOCZFYYP.js.map +0 -1
- package/dist/chunk-VR44E62I.js.map +0 -1
- package/dist/chunk-WKXHX3GO.js +0 -424
- package/dist/chunk-WKXHX3GO.js.map +0 -1
- package/dist/chunk-XZDLJ2N6.cjs +0 -2224
- package/dist/chunk-XZDLJ2N6.cjs.map +0 -1
- package/dist/chunk-ZBHLMQTS.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema/aggregateRating/component.tsx","../src/schema/article/component.tsx","../src/schema/blogPosting/component.tsx","../src/schema/book/component.tsx","../src/schema/brand/component.tsx","../src/schema/breadcrumbList/component.tsx","../src/schema/contactPoint/component.tsx","../src/schema/country/component.tsx","../src/schema/course/component.tsx","../src/schema/event/component.tsx","../src/schema/faqPage/component.tsx","../src/schema/howTo/component.tsx","../src/schema/imageObject/component.tsx","../src/schema/itemList/component.tsx","../src/schema/jobPosting/component.tsx","../src/schema/legalService/component.tsx","../src/schema/localBusiness/component.tsx","../src/schema/movie/component.tsx","../src/schema/musicAlbum/component.tsx","../src/schema/musicRecording/component.tsx","../src/schema/newsArticle/component.tsx","../src/schema/offer/component.tsx","../src/schema/opinionNewsArticle/component.tsx","../src/schema/person/component.tsx","../src/schema/place/component.tsx","../src/schema/postalAddress/component.tsx","../src/schema/product/component.tsx","../src/schema/profilePage/component.tsx","../src/schema/recipe/component.tsx","../src/schema/restaurant/component.tsx","../src/schema/review/component.tsx","../src/schema/service/component.tsx","../src/schema/softwareApplication/component.tsx","../src/schema/videoObject/component.tsx","../src/schema/webApplication/component.tsx","../src/schema/webPage/component.tsx"],"sourcesContent":["import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {aggregateRatingFields} from './schema'\nimport type {SchemaOrgAggregateRatingData} from './types'\n\nexport interface AggregateRatingSchemaProps {\n data?: SchemaOrgAggregateRatingData | null\n}\n\nexport function buildAggregateRatingJsonLd(\n data?: SchemaOrgAggregateRatingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'AggregateRating',\n data as Record<string, unknown> | null | undefined,\n aggregateRatingFields,\n ['ratingValue'],\n )\n}\n\nexport function AggregateRatingSchema({data}: AggregateRatingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildAggregateRatingJsonLd(data)} />\n}\n\nexport default AggregateRatingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {articleFields} from './schema'\nimport type {SchemaOrgArticleData} from './types'\n\nexport interface ArticleSchemaProps {\n /** The Schema.org Article data from your Sanity GROQ query. */\n data?: SchemaOrgArticleData | null\n}\n\n/**\n * Builds a Schema.org Article JSON-LD object from Sanity data.\n * Returns `null` if required fields (headline) are missing.\n */\nexport function buildArticleJsonLd(\n data?: SchemaOrgArticleData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Article',\n data as Record<string, unknown> | null | undefined,\n articleFields,\n ['headline'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Article data.\n * Renders nothing if required fields are missing.\n */\nexport function ArticleSchema({data}: ArticleSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildArticleJsonLd(data)} />\n}\n\nexport default ArticleSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {blogPostingFields} from './schema'\nimport type {SchemaOrgBlogPostingData} from './types'\n\nexport interface BlogPostingSchemaProps {\n /** The Schema.org BlogPosting data from your Sanity GROQ query. */\n data?: SchemaOrgBlogPostingData | null\n}\n\n/**\n * Builds a Schema.org BlogPosting JSON-LD object from Sanity data.\n * Returns `null` if required fields (headline) are missing.\n */\nexport function buildBlogPostingJsonLd(\n data?: SchemaOrgBlogPostingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'BlogPosting',\n data as Record<string, unknown> | null | undefined,\n blogPostingFields,\n ['headline'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org BlogPosting data.\n * Renders nothing if required fields are missing.\n */\nexport function BlogPostingSchema({data}: BlogPostingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBlogPostingJsonLd(data)} />\n}\n\nexport default BlogPostingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {bookFields} from './schema'\nimport type {SchemaOrgBookData} from './types'\n\nexport interface BookSchemaProps {\n data?: SchemaOrgBookData | null\n}\n\nexport function buildBookJsonLd(data?: SchemaOrgBookData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Book',\n data as Record<string, unknown> | null | undefined,\n bookFields,\n ['name'],\n )\n}\n\nexport function BookSchema({data}: BookSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBookJsonLd(data)} />\n}\n\nexport default BookSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {brandFields} from './schema'\nimport type {SchemaOrgBrandData} from './types'\n\nexport interface BrandSchemaProps {\n data?: SchemaOrgBrandData | null\n}\n\nexport function buildBrandJsonLd(data?: SchemaOrgBrandData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Brand',\n data as Record<string, unknown> | null | undefined,\n brandFields,\n ['name'],\n )\n}\n\nexport function BrandSchema({data}: BrandSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBrandJsonLd(data)} />\n}\n\nexport default BrandSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {breadcrumbListFields} from './schema'\nimport type {SchemaOrgBreadcrumbListData} from './types'\n\nexport interface BreadcrumbListSchemaProps {\n /** The Schema.org BreadcrumbList data from your Sanity GROQ query. */\n data?: SchemaOrgBreadcrumbListData | null\n}\n\n/**\n * Builds a Schema.org BreadcrumbList JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildBreadcrumbListJsonLd(\n data?: SchemaOrgBreadcrumbListData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'BreadcrumbList',\n data as Record<string, unknown> | null | undefined,\n breadcrumbListFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org BreadcrumbList data.\n * Renders nothing if data is missing.\n */\nexport function BreadcrumbListSchema({data}: BreadcrumbListSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBreadcrumbListJsonLd(data)} />\n}\n\nexport default BreadcrumbListSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {contactPointFields} from './schema'\nimport type {SchemaOrgContactPointData} from './types'\n\nexport interface ContactPointSchemaProps {\n data?: SchemaOrgContactPointData | null\n}\n\nexport function buildContactPointJsonLd(\n data?: SchemaOrgContactPointData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ContactPoint',\n data as Record<string, unknown> | null | undefined,\n contactPointFields,\n ['contactType'],\n )\n}\n\nexport function ContactPointSchema({data}: ContactPointSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildContactPointJsonLd(data)} />\n}\n\nexport default ContactPointSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {countryFields} from './schema'\nimport type {SchemaOrgCountryData} from './types'\n\nexport interface CountrySchemaProps {\n /** The Schema.org Country data from your Sanity GROQ query. */\n data?: SchemaOrgCountryData | null\n}\n\n/**\n * Builds a Schema.org Country JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildCountryJsonLd(\n data?: SchemaOrgCountryData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Country',\n data as Record<string, unknown> | null | undefined,\n countryFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Country data.\n * Renders nothing if required fields are missing.\n */\nexport function CountrySchema({data}: CountrySchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildCountryJsonLd(data)} />\n}\n\nexport default CountrySchema\n","/**\n * <CourseSchema> — Renders Schema.org Course JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { CourseSchema } from 'sanity-plugin-seofields/next/course'\n *\n * const data = await sanityFetch({ query: `*[_type == \"course\"][0]{ seo }` })\n *\n * <CourseSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {courseFields} from './schema'\nimport type {SchemaOrgCourseData} from './types'\n\nexport interface CourseSchemaProps {\n /** The Schema.org Course data from your Sanity GROQ query. */\n data?: SchemaOrgCourseData | null\n}\n\n/**\n * Builds a Schema.org Course JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildCourseJsonLd(\n data?: SchemaOrgCourseData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Course',\n data as Record<string, unknown> | null | undefined,\n courseFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Course data.\n * Renders nothing if required fields are missing.\n */\nexport function CourseSchema({data}: CourseSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildCourseJsonLd(data)} />\n}\n\nexport default CourseSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {eventFields} from './schema'\nimport type {SchemaOrgEventData} from './types'\n\nexport interface EventSchemaProps {\n /** The Schema.org Event data from your Sanity GROQ query. */\n data?: SchemaOrgEventData | null\n}\n\n/**\n * Builds a Schema.org Event JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildEventJsonLd(data?: SchemaOrgEventData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Event',\n data as Record<string, unknown> | null | undefined,\n eventFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Event data.\n * Renders nothing if required fields are missing.\n */\nexport function EventSchema({data}: EventSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildEventJsonLd(data)} />\n}\n\nexport default EventSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {faqPageFields} from './schema'\nimport type {SchemaOrgFAQPageData} from './types'\n\nexport interface FAQPageSchemaProps {\n /** The Schema.org FAQPage data from your Sanity GROQ query. */\n data?: SchemaOrgFAQPageData | null\n}\n\n/**\n * Builds a Schema.org FAQPage JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildFAQPageJsonLd(\n data?: SchemaOrgFAQPageData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'FAQPage',\n data as Record<string, unknown> | null | undefined,\n faqPageFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org FAQPage data.\n * Renders nothing if data is missing.\n */\nexport function FAQPageSchema({data}: FAQPageSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildFAQPageJsonLd(data)} />\n}\n\nexport default FAQPageSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {howToFields} from './schema'\nimport type {SchemaOrgHowToData} from './types'\n\nexport interface HowToSchemaProps {\n /** The Schema.org HowTo data from your Sanity GROQ query. */\n data?: SchemaOrgHowToData | null\n}\n\n/**\n * Builds a Schema.org HowTo JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildHowToJsonLd(data?: SchemaOrgHowToData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'HowTo',\n data as Record<string, unknown> | null | undefined,\n howToFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org HowTo data.\n * Renders nothing if required fields are missing.\n */\nexport function HowToSchema({data}: HowToSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildHowToJsonLd(data)} />\n}\n\nexport default HowToSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {imageObjectFields} from './schema'\nimport type {SchemaOrgImageObjectData} from './types'\n\nexport interface ImageObjectSchemaProps {\n data?: SchemaOrgImageObjectData | null\n}\n\nexport function buildImageObjectJsonLd(\n data?: SchemaOrgImageObjectData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ImageObject',\n data as Record<string, unknown> | null | undefined,\n imageObjectFields,\n ['url'],\n )\n}\n\nexport function ImageObjectSchema({data}: ImageObjectSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildImageObjectJsonLd(data)} />\n}\n\nexport default ImageObjectSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {itemListFields} from './schema'\nimport type {SchemaOrgItemListData} from './types'\n\nexport interface ItemListSchemaProps {\n data?: SchemaOrgItemListData | null\n}\n\nexport function buildItemListJsonLd(\n data?: SchemaOrgItemListData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ItemList',\n data as Record<string, unknown> | null | undefined,\n itemListFields,\n [],\n )\n}\n\nexport function ItemListSchema({data}: ItemListSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildItemListJsonLd(data)} />\n}\n\nexport default ItemListSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {jobPostingFields} from './schema'\nimport type {SchemaOrgJobPostingData} from './types'\n\nexport interface JobPostingSchemaProps {\n data?: SchemaOrgJobPostingData | null\n}\n\nexport function buildJobPostingJsonLd(\n data?: SchemaOrgJobPostingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'JobPosting',\n data as Record<string, unknown> | null | undefined,\n jobPostingFields,\n ['title', 'description', 'datePosted'],\n )\n}\n\nexport function JobPostingSchema({data}: JobPostingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildJobPostingJsonLd(data)} />\n}\n\nexport default JobPostingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {legalServiceFields} from './schema'\nimport type {SchemaOrgLegalServiceData} from './types'\n\nexport interface LegalServiceSchemaProps {\n /** The Schema.org LegalService data from your Sanity GROQ query. */\n data?: SchemaOrgLegalServiceData | null\n}\n\n/**\n * Builds a Schema.org LegalService JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildLegalServiceJsonLd(\n data?: SchemaOrgLegalServiceData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'LegalService',\n data as Record<string, unknown> | null | undefined,\n legalServiceFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org LegalService data.\n * Renders nothing if required fields are missing.\n */\nexport function LegalServiceSchema({data}: LegalServiceSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildLegalServiceJsonLd(data)} />\n}\n\nexport default LegalServiceSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {localBusinessFields} from './schema'\nimport type {SchemaOrgLocalBusinessData} from './types'\n\nexport interface LocalBusinessSchemaProps {\n /** The Schema.org LocalBusiness data from your Sanity GROQ query. */\n data?: SchemaOrgLocalBusinessData | null\n}\n\n/**\n * Builds a Schema.org LocalBusiness JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildLocalBusinessJsonLd(\n data?: SchemaOrgLocalBusinessData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'LocalBusiness',\n data as Record<string, unknown> | null | undefined,\n localBusinessFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org LocalBusiness data.\n * Renders nothing if required fields are missing.\n */\nexport function LocalBusinessSchema({data}: LocalBusinessSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildLocalBusinessJsonLd(data)} />\n}\n\nexport default LocalBusinessSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {movieFields} from './schema'\nimport type {SchemaOrgMovieData} from './types'\n\nexport interface MovieSchemaProps {\n data?: SchemaOrgMovieData | null\n}\n\nexport function buildMovieJsonLd(data?: SchemaOrgMovieData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Movie',\n data as Record<string, unknown> | null | undefined,\n movieFields,\n ['name'],\n )\n}\n\nexport function MovieSchema({data}: MovieSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildMovieJsonLd(data)} />\n}\n\nexport default MovieSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {musicAlbumFields} from './schema'\nimport type {SchemaOrgMusicAlbumData} from './types'\n\nexport interface MusicAlbumSchemaProps {\n data?: SchemaOrgMusicAlbumData | null\n}\n\nexport function buildMusicAlbumJsonLd(\n data?: SchemaOrgMusicAlbumData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'MusicAlbum',\n data as Record<string, unknown> | null | undefined,\n musicAlbumFields,\n ['name'],\n )\n}\n\nexport function MusicAlbumSchema({data}: MusicAlbumSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildMusicAlbumJsonLd(data)} />\n}\n\nexport default MusicAlbumSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {musicRecordingFields} from './schema'\nimport type {SchemaOrgMusicRecordingData} from './types'\n\nexport interface MusicRecordingSchemaProps {\n data?: SchemaOrgMusicRecordingData | null\n}\n\nexport function buildMusicRecordingJsonLd(\n data?: SchemaOrgMusicRecordingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'MusicRecording',\n data as Record<string, unknown> | null | undefined,\n musicRecordingFields,\n ['name'],\n )\n}\n\nexport function MusicRecordingSchema({data}: MusicRecordingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildMusicRecordingJsonLd(data)} />\n}\n\nexport default MusicRecordingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {newsArticleFields} from './schema'\nimport type {SchemaOrgNewsArticleData} from './types'\n\nexport interface NewsArticleSchemaProps {\n data?: SchemaOrgNewsArticleData | null\n}\n\nexport function buildNewsArticleJsonLd(\n data?: SchemaOrgNewsArticleData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'NewsArticle',\n data as Record<string, unknown> | null | undefined,\n newsArticleFields,\n ['headline', 'datePublished'],\n )\n}\n\nexport function NewsArticleSchema({data}: NewsArticleSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildNewsArticleJsonLd(data)} />\n}\n\nexport default NewsArticleSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {offerFields} from './schema'\nimport type {SchemaOrgOfferData} from './types'\n\nexport interface OfferSchemaProps {\n data?: SchemaOrgOfferData | null\n}\n\nexport function buildOfferJsonLd(data?: SchemaOrgOfferData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Offer',\n data as Record<string, unknown> | null | undefined,\n offerFields,\n ['price'],\n )\n}\n\nexport function OfferSchema({data}: OfferSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildOfferJsonLd(data)} />\n}\n\nexport default OfferSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {opinionNewsArticleFields} from './schema'\nimport type {SchemaOrgOpinionNewsArticleData} from './types'\n\nexport interface OpinionNewsArticleSchemaProps {\n data?: SchemaOrgOpinionNewsArticleData | null\n}\n\nexport function buildOpinionNewsArticleJsonLd(\n data?: SchemaOrgOpinionNewsArticleData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'OpinionNewsArticle',\n data as Record<string, unknown> | null | undefined,\n opinionNewsArticleFields,\n ['headline', 'datePublished'],\n )\n}\n\nexport function OpinionNewsArticleSchema({\n data,\n}: OpinionNewsArticleSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildOpinionNewsArticleJsonLd(data)} />\n}\n\nexport default OpinionNewsArticleSchema\n","/**\n * <PersonSchema> — Renders Schema.org Person JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { PersonSchema } from 'sanity-plugin-seofields/next/person'\n *\n * const data = await sanityFetch({ query: `*[_type == \"teamMember\"][0]{ person }` })\n *\n * <PersonSchema data={data.person} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {personFields} from './schema'\nimport type {SchemaOrgPersonData} from './types'\n\nexport interface PersonSchemaProps {\n /** The Schema.org Person data from your Sanity GROQ query. */\n data?: SchemaOrgPersonData | null\n}\n\n/**\n * Builds a Schema.org Person JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildPersonJsonLd(\n data?: SchemaOrgPersonData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Person',\n data as Record<string, unknown> | null | undefined,\n personFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Person data.\n * Renders nothing if required fields are missing.\n */\nexport function PersonSchema({data}: PersonSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPersonJsonLd(data)} />\n}\n\nexport default PersonSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {placeFields} from './schema'\nimport type {SchemaOrgPlaceData} from './types'\n\nexport interface PlaceSchemaProps {\n /** The Schema.org Place data from your Sanity GROQ query. */\n data?: SchemaOrgPlaceData | null\n}\n\n/**\n * Builds a Schema.org Place JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildPlaceJsonLd(data?: SchemaOrgPlaceData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Place',\n data as Record<string, unknown> | null | undefined,\n placeFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Place data.\n * Renders nothing if required fields are missing.\n */\nexport function PlaceSchema({data}: PlaceSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPlaceJsonLd(data)} />\n}\n\nexport default PlaceSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {postalAddressFields} from './schema'\nimport type {SchemaOrgPostalAddressData} from './types'\n\nexport interface PostalAddressSchemaProps {\n data?: SchemaOrgPostalAddressData | null\n}\n\nexport function buildPostalAddressJsonLd(\n data?: SchemaOrgPostalAddressData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'PostalAddress',\n data as Record<string, unknown> | null | undefined,\n postalAddressFields,\n [],\n )\n}\n\nexport function PostalAddressSchema({data}: PostalAddressSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPostalAddressJsonLd(data)} />\n}\n\nexport default PostalAddressSchema\n","/**\n * <ProductSchema> — Renders Schema.org Product JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { ProductSchema } from 'sanity-plugin-seofields/next/product'\n *\n * const data = await sanityFetch({ query: `*[_type == \"product\"][0]{ seo }` })\n *\n * <ProductSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {productFields} from './schema'\nimport type {SchemaOrgProductData} from './types'\n\nexport interface ProductSchemaProps {\n /** The Schema.org Product data from your Sanity GROQ query. */\n data?: SchemaOrgProductData | null\n}\n\n/**\n * Builds a Schema.org Product JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildProductJsonLd(\n data?: SchemaOrgProductData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Product',\n data as Record<string, unknown> | null | undefined,\n productFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Product data.\n * Renders nothing if required fields are missing.\n */\nexport function ProductSchema({data}: ProductSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildProductJsonLd(data)} />\n}\n\nexport default ProductSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {profilePageFields} from './schema'\nimport type {SchemaOrgProfilePageData} from './types'\n\nexport interface ProfilePageSchemaProps {\n data?: SchemaOrgProfilePageData | null\n}\n\nexport function buildProfilePageJsonLd(\n data?: SchemaOrgProfilePageData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ProfilePage',\n data as Record<string, unknown> | null | undefined,\n profilePageFields,\n [],\n )\n}\n\nexport function ProfilePageSchema({data}: ProfilePageSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildProfilePageJsonLd(data)} />\n}\n\nexport default ProfilePageSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {recipeFields} from './schema'\nimport type {SchemaOrgRecipeData} from './types'\n\nexport interface RecipeSchemaProps {\n data?: SchemaOrgRecipeData | null\n}\n\nexport function buildRecipeJsonLd(\n data?: SchemaOrgRecipeData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Recipe',\n data as Record<string, unknown> | null | undefined,\n recipeFields,\n ['name'],\n )\n}\n\nexport function RecipeSchema({data}: RecipeSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildRecipeJsonLd(data)} />\n}\n\nexport default RecipeSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {restaurantFields} from './schema'\nimport type {SchemaOrgRestaurantData} from './types'\n\nexport interface RestaurantSchemaProps {\n data?: SchemaOrgRestaurantData | null\n}\n\nexport function buildRestaurantJsonLd(\n data?: SchemaOrgRestaurantData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Restaurant',\n data as Record<string, unknown> | null | undefined,\n restaurantFields,\n ['name'],\n )\n}\n\nexport function RestaurantSchema({data}: RestaurantSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildRestaurantJsonLd(data)} />\n}\n\nexport default RestaurantSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {reviewFields} from './schema'\nimport type {SchemaOrgReviewData} from './types'\n\nexport interface ReviewSchemaProps {\n /** The Schema.org Review data from your Sanity GROQ query. */\n data?: SchemaOrgReviewData | null\n}\n\n/**\n * Builds a Schema.org Review JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildReviewJsonLd(\n data?: SchemaOrgReviewData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Review',\n data as Record<string, unknown> | null | undefined,\n reviewFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Review data.\n * Renders nothing if data is missing.\n */\nexport function ReviewSchema({data}: ReviewSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildReviewJsonLd(data)} />\n}\n\nexport default ReviewSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {serviceFields} from './schema'\nimport type {SchemaOrgServiceData} from './types'\n\nexport interface ServiceSchemaProps {\n data?: SchemaOrgServiceData | null\n}\n\nexport function buildServiceJsonLd(\n data?: SchemaOrgServiceData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Service',\n data as Record<string, unknown> | null | undefined,\n serviceFields,\n ['name'],\n )\n}\n\nexport function ServiceSchema({data}: ServiceSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildServiceJsonLd(data)} />\n}\n\nexport default ServiceSchema\n","/**\n * <SoftwareApplicationSchema> — Renders Schema.org SoftwareApplication JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { SoftwareApplicationSchema } from 'sanity-plugin-seofields/next/softwareApplication'\n *\n * const data = await sanityFetch({ query: `*[_type == \"app\"][0]{ seo }` })\n *\n * <SoftwareApplicationSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {softwareApplicationFields} from './schema'\nimport type {SchemaOrgSoftwareApplicationData} from './types'\n\nexport interface SoftwareApplicationSchemaProps {\n /** The Schema.org SoftwareApplication data from your Sanity GROQ query. */\n data?: SchemaOrgSoftwareApplicationData | null\n}\n\n/**\n * Builds a Schema.org SoftwareApplication JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildSoftwareApplicationJsonLd(\n data?: SchemaOrgSoftwareApplicationData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'SoftwareApplication',\n data as Record<string, unknown> | null | undefined,\n softwareApplicationFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org SoftwareApplication data.\n * Renders nothing if required fields are missing.\n */\nexport function SoftwareApplicationSchema({\n data,\n}: SoftwareApplicationSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildSoftwareApplicationJsonLd(data)} />\n}\n\nexport default SoftwareApplicationSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {videoObjectFields} from './schema'\nimport type {SchemaOrgVideoObjectData} from './types'\n\nexport interface VideoObjectSchemaProps {\n data?: SchemaOrgVideoObjectData | null\n}\n\nexport function buildVideoObjectJsonLd(\n data?: SchemaOrgVideoObjectData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'VideoObject',\n data as Record<string, unknown> | null | undefined,\n videoObjectFields,\n ['name'],\n )\n}\n\nexport function VideoObjectSchema({data}: VideoObjectSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildVideoObjectJsonLd(data)} />\n}\n\nexport default VideoObjectSchema\n","/**\n * <WebApplicationSchema> — Renders Schema.org WebApplication JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { WebApplicationSchema } from 'sanity-plugin-seofields/next/webApplication'\n *\n * const data = await sanityFetch({ query: `*[_type == \"app\"][0]{ seo }` })\n *\n * <WebApplicationSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {webApplicationFields} from './schema'\nimport type {SchemaOrgWebApplicationData} from './types'\n\nexport interface WebApplicationSchemaProps {\n /** The Schema.org WebApplication data from your Sanity GROQ query. */\n data?: SchemaOrgWebApplicationData | null\n}\n\n/**\n * Builds a Schema.org WebApplication JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildWebApplicationJsonLd(\n data?: SchemaOrgWebApplicationData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'WebApplication',\n data as Record<string, unknown> | null | undefined,\n webApplicationFields,\n ['name', 'url'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org WebApplication data.\n * Renders nothing if required fields are missing.\n */\nexport function WebApplicationSchema({data}: WebApplicationSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildWebApplicationJsonLd(data)} />\n}\n\nexport default WebApplicationSchema\n","/**\n * <WebPageSchema> — Renders Schema.org WebPage JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { WebPageSchema } from 'sanity-plugin-seofields/next/webPage'\n *\n * const data = await sanityFetch({ query: `*[_type == \"page\"][0]{ seo }` })\n *\n * <WebPageSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {webPageFields} from './schema'\nimport type {SchemaOrgWebPageData} from './types'\n\nexport interface WebPageSchemaProps {\n /** The Schema.org WebPage data from your Sanity GROQ query. */\n data?: SchemaOrgWebPageData | null\n}\n\n/**\n * Builds a Schema.org WebPage JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildWebPageJsonLd(\n data?: SchemaOrgWebPageData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'WebPage',\n data as Record<string, unknown> | null | undefined,\n webPageFields,\n ['name', 'url'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org WebPage data.\n * Renders nothing if required fields are missing.\n */\nexport function WebPageSchema({data}: WebPageSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildWebPageJsonLd(data)} />\n}\n\nexport default WebPageSchema\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBS;AAZF,SAAS,2BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AACF;AAEO,SAAS,sBAAsB,EAAC,KAAI,GAAmD;AAC5F,SAAO,oBAAC,mBAAgB,QAAQ,2BAA2B,IAAI,GAAG;AACpE;;;ACQS,gBAAAA,YAAA;AAhBF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACF;AAMO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;;;ACDS,gBAAAC,YAAA;AAhBF,SAAS,uBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACF;AAMO,SAAS,kBAAkB,EAAC,KAAI,GAA+C;AACpF,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,uBAAuB,IAAI,GAAG;AAChE;;;ACZS,gBAAAC,YAAA;AAVF,SAAS,gBAAgB,MAAiE;AAC/F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,WAAW,EAAC,KAAI,GAAwC;AACtE,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,gBAAgB,IAAI,GAAG;AACzD;;;ACDS,gBAAAC,YAAA;AAVF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACUS,gBAAAC,YAAA;AAhBF,SAAS,0BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAMO,SAAS,qBAAqB,EAAC,KAAI,GAAkD;AAC1F,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,0BAA0B,IAAI,GAAG;AACnE;;;ACVS,gBAAAC,YAAA;AAZF,SAAS,wBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AACF;AAEO,SAAS,mBAAmB,EAAC,KAAI,GAAgD;AACtF,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,wBAAwB,IAAI,GAAG;AACjE;;;ACQS,gBAAAC,YAAA;AAhBF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;;;ACWS,gBAAAC,YAAA;AAhBF,SAAS,kBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,aAAa,EAAC,KAAI,GAA0C;AAC1E,SAAO,gBAAAA,KAAC,mBAAgB,QAAQ,kBAAkB,IAAI,GAAG;AAC3D;;;ACfS,gBAAAC,aAAA;AAdF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACCS,gBAAAC,aAAA;AAhBF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAMO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;;;ACHS,gBAAAC,aAAA;AAdF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACRS,gBAAAC,aAAA;AAZF,SAAS,uBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACF;AAEO,SAAS,kBAAkB,EAAC,KAAI,GAA+C;AACpF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,uBAAuB,IAAI,GAAG;AAChE;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,oBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAEO,SAAS,eAAe,EAAC,KAAI,GAA4C;AAC9E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,oBAAoB,IAAI,GAAG;AAC7D;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,sBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,SAAS,eAAe,YAAY;AAAA,EACvC;AACF;AAEO,SAAS,iBAAiB,EAAC,KAAI,GAA8C;AAClF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,sBAAsB,IAAI,GAAG;AAC/D;;;ACQS,gBAAAC,aAAA;AAhBF,SAAS,wBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,mBAAmB,EAAC,KAAI,GAAgD;AACtF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,wBAAwB,IAAI,GAAG;AACjE;;;ACDS,gBAAAC,aAAA;AAhBF,SAAS,yBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,oBAAoB,EAAC,KAAI,GAAiD;AACxF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,yBAAyB,IAAI,GAAG;AAClE;;;ACZS,gBAAAC,aAAA;AAVF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACCS,gBAAAC,aAAA;AAZF,SAAS,sBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,EAAC,KAAI,GAA8C;AAClF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,sBAAsB,IAAI,GAAG;AAC/D;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,0BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,EAAC,KAAI,GAAkD;AAC1F,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,0BAA0B,IAAI,GAAG;AACnE;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,uBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AACF;AAEO,SAAS,kBAAkB,EAAC,KAAI,GAA+C;AACpF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,uBAAuB,IAAI,GAAG;AAChE;;;ACHS,gBAAAC,aAAA;AAVF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;AAEO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACGS,gBAAAC,aAAA;AAdF,SAAS,8BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AACF,GAAsD;AACpD,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,8BAA8B,IAAI,GAAG;AACvE;;;ACkBS,gBAAAC,aAAA;AAhBF,SAAS,kBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,aAAa,EAAC,KAAI,GAA0C;AAC1E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,kBAAkB,IAAI,GAAG;AAC3D;;;ACfS,gBAAAC,aAAA;AAdF,SAAS,iBAAiB,MAAkE;AACjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,YAAY,EAAC,KAAI,GAAyC;AACxE,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,iBAAiB,IAAI,GAAG;AAC1D;;;ACRS,gBAAAC,aAAA;AAZF,SAAS,yBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAEO,SAAS,oBAAoB,EAAC,KAAI,GAAiD;AACxF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,yBAAyB,IAAI,GAAG;AAClE;;;ACoBS,gBAAAC,aAAA;AAhBF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;;;ACtBS,gBAAAC,aAAA;AAZF,SAAS,uBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAEO,SAAS,kBAAkB,EAAC,KAAI,GAA+C;AACpF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,uBAAuB,IAAI,GAAG;AAChE;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,kBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,aAAa,EAAC,KAAI,GAA0C;AAC1E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,kBAAkB,IAAI,GAAG;AAC3D;;;ACDS,gBAAAC,aAAA;AAZF,SAAS,sBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,EAAC,KAAI,GAA8C;AAClF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,sBAAsB,IAAI,GAAG;AAC/D;;;ACQS,gBAAAC,aAAA;AAhBF,SAAS,kBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAMO,SAAS,aAAa,EAAC,KAAI,GAA0C;AAC1E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,kBAAkB,IAAI,GAAG;AAC3D;;;ACVS,gBAAAC,aAAA;AAZF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;;;ACsBS,gBAAAC,aAAA;AAlBF,SAAS,+BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAMO,SAAS,0BAA0B;AAAA,EACxC;AACF,GAAuD;AACrD,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,+BAA+B,IAAI,GAAG;AACxE;;;ACxBS,gBAAAC,aAAA;AAZF,SAAS,uBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,EAAC,KAAI,GAA+C;AACpF,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,uBAAuB,IAAI,GAAG;AAChE;;;ACoBS,gBAAAC,aAAA;AAhBF,SAAS,0BACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,EAChB;AACF;AAMO,SAAS,qBAAqB,EAAC,KAAI,GAAkD;AAC1F,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,0BAA0B,IAAI,GAAG;AACnE;;;ACDS,gBAAAC,aAAA;AAhBF,SAAS,mBACd,MACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,EAChB;AACF;AAMO,SAAS,cAAc,EAAC,KAAI,GAA2C;AAC5E,SAAO,gBAAAA,MAAC,mBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAC5D;","names":["jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx"]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkA57XNQC7cjs = require('./chunk-A57XNQC7.cjs');
|
|
4
|
+
|
|
5
|
+
// src/helpers/seoMeta.ts
|
|
6
|
+
var VALID_OG_TYPES = [
|
|
7
|
+
"website",
|
|
8
|
+
"article",
|
|
9
|
+
"profile",
|
|
10
|
+
"book",
|
|
11
|
+
"music",
|
|
12
|
+
"video",
|
|
13
|
+
"product"
|
|
14
|
+
];
|
|
15
|
+
function sanitizeOGType(value) {
|
|
16
|
+
if (value && VALID_OG_TYPES.includes(value)) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
return "website";
|
|
20
|
+
}
|
|
21
|
+
var VALID_TWITTER_CARDS = ["summary", "summary_large_image", "app", "player"];
|
|
22
|
+
function sanitizeTwitterCard(value) {
|
|
23
|
+
if (value && VALID_TWITTER_CARDS.includes(value)) {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
return "summary_large_image";
|
|
27
|
+
}
|
|
28
|
+
function resolveOgImage(seo, defaults, imageUrlResolver) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
if (((_a = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _a.imageType) === "url" && seo.openGraph.imageUrl) {
|
|
31
|
+
return seo.openGraph.imageUrl;
|
|
32
|
+
}
|
|
33
|
+
if (((_b = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _b.image) && imageUrlResolver) {
|
|
34
|
+
return imageUrlResolver(seo.openGraph.image) || defaults.ogImage || "";
|
|
35
|
+
}
|
|
36
|
+
if ((seo == null ? void 0 : seo.metaImage) && imageUrlResolver) {
|
|
37
|
+
return imageUrlResolver(seo.metaImage) || defaults.ogImage || "";
|
|
38
|
+
}
|
|
39
|
+
return defaults.ogImage || "";
|
|
40
|
+
}
|
|
41
|
+
function resolveTwitterImage(seo, ogImageURL, imageUrlResolver) {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
if (((_a = seo == null ? void 0 : seo.twitter) == null ? void 0 : _a.imageType) === "url" && seo.twitter.imageUrl) {
|
|
44
|
+
return seo.twitter.imageUrl;
|
|
45
|
+
}
|
|
46
|
+
if (((_b = seo == null ? void 0 : seo.twitter) == null ? void 0 : _b.image) && imageUrlResolver) {
|
|
47
|
+
return imageUrlResolver(seo.twitter.image) || ogImageURL;
|
|
48
|
+
}
|
|
49
|
+
return ogImageURL;
|
|
50
|
+
}
|
|
51
|
+
function buildCustomMetaMap(seo) {
|
|
52
|
+
const other = {};
|
|
53
|
+
if (Array.isArray(seo == null ? void 0 : seo.metaAttributes)) {
|
|
54
|
+
for (const attr of seo.metaAttributes) {
|
|
55
|
+
if (attr.key && attr.value) {
|
|
56
|
+
other[attr.key] = attr.value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return other;
|
|
61
|
+
}
|
|
62
|
+
function buildHreflangMap(hreflangs) {
|
|
63
|
+
if (!Array.isArray(hreflangs)) return void 0;
|
|
64
|
+
const languages = {};
|
|
65
|
+
for (const entry of hreflangs) {
|
|
66
|
+
if ((entry == null ? void 0 : entry.locale) && entry.url) {
|
|
67
|
+
languages[entry.locale] = entry.url;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return Object.keys(languages).length > 0 ? languages : void 0;
|
|
71
|
+
}
|
|
72
|
+
function robotsToContent(meta) {
|
|
73
|
+
var _a, _b, _c, _d;
|
|
74
|
+
return [
|
|
75
|
+
((_a = meta.robots) == null ? void 0 : _a.index) === false ? "noindex" : "index",
|
|
76
|
+
((_b = meta.robots) == null ? void 0 : _b.follow) === false ? "nofollow" : "follow",
|
|
77
|
+
((_c = meta.robots) == null ? void 0 : _c.notranslate) ? "notranslate" : null,
|
|
78
|
+
((_d = meta.robots) == null ? void 0 : _d.noimageindex) ? "noimageindex" : null
|
|
79
|
+
].filter(Boolean).join(", ");
|
|
80
|
+
}
|
|
81
|
+
function pushNameMeta(meta, name, content) {
|
|
82
|
+
if (content) meta.push({ name, content });
|
|
83
|
+
}
|
|
84
|
+
function pushPropertyMeta(meta, property, content) {
|
|
85
|
+
if (content) meta.push({ property, content });
|
|
86
|
+
}
|
|
87
|
+
function customMetaUsesProperty(name) {
|
|
88
|
+
return /^(og|fb|article|book|music|profile|product|video):/.test(name);
|
|
89
|
+
}
|
|
90
|
+
function buildSeoMeta(options) {
|
|
91
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N;
|
|
92
|
+
const { seo, baseUrl = "", path = "", defaults = {}, imageUrlResolver } = options;
|
|
93
|
+
const normalizedBase = baseUrl.replace(/\/+$/, "");
|
|
94
|
+
const normalizedPath = path.replace(/^\/+/, "");
|
|
95
|
+
const fullUrl = [normalizedBase, normalizedPath].filter(Boolean).join("/");
|
|
96
|
+
const ogImageURL = resolveOgImage(seo, defaults, imageUrlResolver);
|
|
97
|
+
const twitterImageURL = resolveTwitterImage(seo, ogImageURL, imageUrlResolver);
|
|
98
|
+
const other = buildCustomMetaMap(seo);
|
|
99
|
+
const languages = buildHreflangMap(seo == null ? void 0 : seo.hreflangs);
|
|
100
|
+
const ogUrl = ((_a = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _a.url) || fullUrl;
|
|
101
|
+
return _chunkA57XNQC7cjs.__spreadValues.call(void 0, {
|
|
102
|
+
title: (_c = (_b = seo == null ? void 0 : seo.title) != null ? _b : defaults.title) != null ? _c : null,
|
|
103
|
+
description: (_e = (_d = seo == null ? void 0 : seo.description) != null ? _d : defaults.description) != null ? _e : null,
|
|
104
|
+
keywords: ((_f = seo == null ? void 0 : seo.keywords) == null ? void 0 : _f.length) ? seo.keywords : void 0,
|
|
105
|
+
robots: {
|
|
106
|
+
index: !((_g = seo == null ? void 0 : seo.robots) == null ? void 0 : _g.noIndex),
|
|
107
|
+
follow: !((_h = seo == null ? void 0 : seo.robots) == null ? void 0 : _h.noFollow),
|
|
108
|
+
notranslate: !!((_i = seo == null ? void 0 : seo.robots) == null ? void 0 : _i.noTranslate),
|
|
109
|
+
noimageindex: !!((_j = seo == null ? void 0 : seo.robots) == null ? void 0 : _j.noImageIndex),
|
|
110
|
+
googleBot: {
|
|
111
|
+
index: !((_k = seo == null ? void 0 : seo.robots) == null ? void 0 : _k.noIndex),
|
|
112
|
+
follow: !((_l = seo == null ? void 0 : seo.robots) == null ? void 0 : _l.noFollow),
|
|
113
|
+
notranslate: !!((_m = seo == null ? void 0 : seo.robots) == null ? void 0 : _m.noTranslate),
|
|
114
|
+
noimageindex: !!((_n = seo == null ? void 0 : seo.robots) == null ? void 0 : _n.noImageIndex)
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
openGraph: {
|
|
118
|
+
type: sanitizeOGType((_p = (_o = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _o.type) != null ? _p : void 0),
|
|
119
|
+
url: ogUrl || void 0,
|
|
120
|
+
title: (_s = (_r = (_q = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _q.title) != null ? _r : seo == null ? void 0 : seo.title) != null ? _s : defaults.title,
|
|
121
|
+
description: (_v = (_u = (_t = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _t.description) != null ? _u : seo == null ? void 0 : seo.description) != null ? _v : defaults.description,
|
|
122
|
+
siteName: (_x = (_w = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _w.siteName) != null ? _x : defaults.siteName,
|
|
123
|
+
images: ogImageURL ? [{ url: ogImageURL }] : []
|
|
124
|
+
},
|
|
125
|
+
twitter: {
|
|
126
|
+
card: sanitizeTwitterCard((_z = (_y = seo == null ? void 0 : seo.twitter) == null ? void 0 : _y.card) != null ? _z : void 0),
|
|
127
|
+
site: (_B = (_A = seo == null ? void 0 : seo.twitter) == null ? void 0 : _A.site) != null ? _B : defaults.twitterSite,
|
|
128
|
+
creator: (_D = (_C = seo == null ? void 0 : seo.twitter) == null ? void 0 : _C.creator) != null ? _D : defaults.twitterCreator,
|
|
129
|
+
title: (_I = (_H = (_G = (_E = seo == null ? void 0 : seo.twitter) == null ? void 0 : _E.title) != null ? _G : (_F = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _F.title) != null ? _H : seo == null ? void 0 : seo.title) != null ? _I : defaults.title,
|
|
130
|
+
description: (_N = (_M = (_L = (_J = seo == null ? void 0 : seo.twitter) == null ? void 0 : _J.description) != null ? _L : (_K = seo == null ? void 0 : seo.openGraph) == null ? void 0 : _K.description) != null ? _M : seo == null ? void 0 : seo.description) != null ? _N : defaults.description,
|
|
131
|
+
images: twitterImageURL ? [twitterImageURL] : []
|
|
132
|
+
},
|
|
133
|
+
alternates: _chunkA57XNQC7cjs.__spreadValues.call(void 0, {
|
|
134
|
+
canonical: (seo == null ? void 0 : seo.canonicalUrl) || fullUrl || void 0
|
|
135
|
+
}, languages ? { languages } : {})
|
|
136
|
+
}, Object.keys(other).length > 0 ? { other } : {});
|
|
137
|
+
}
|
|
138
|
+
function buildSeoHead(options) {
|
|
139
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
|
|
140
|
+
const metadata = buildSeoMeta(options);
|
|
141
|
+
const meta = [];
|
|
142
|
+
const link = [];
|
|
143
|
+
const robotsContent = robotsToContent(metadata);
|
|
144
|
+
pushNameMeta(meta, "description", metadata.description);
|
|
145
|
+
if ((_a = metadata.keywords) == null ? void 0 : _a.length) {
|
|
146
|
+
pushNameMeta(meta, "keywords", metadata.keywords.join(", "));
|
|
147
|
+
}
|
|
148
|
+
pushNameMeta(meta, "robots", robotsContent);
|
|
149
|
+
pushNameMeta(meta, "googlebot", robotsContent);
|
|
150
|
+
pushPropertyMeta(meta, "og:type", (_b = metadata.openGraph) == null ? void 0 : _b.type);
|
|
151
|
+
pushPropertyMeta(meta, "og:url", (_c = metadata.openGraph) == null ? void 0 : _c.url);
|
|
152
|
+
pushPropertyMeta(meta, "og:title", (_d = metadata.openGraph) == null ? void 0 : _d.title);
|
|
153
|
+
pushPropertyMeta(meta, "og:description", (_e = metadata.openGraph) == null ? void 0 : _e.description);
|
|
154
|
+
pushPropertyMeta(meta, "og:site_name", (_f = metadata.openGraph) == null ? void 0 : _f.siteName);
|
|
155
|
+
for (const image of ((_g = metadata.openGraph) == null ? void 0 : _g.images) || []) {
|
|
156
|
+
pushPropertyMeta(meta, "og:image", image.url);
|
|
157
|
+
if (image.width) pushPropertyMeta(meta, "og:image:width", String(image.width));
|
|
158
|
+
if (image.height) pushPropertyMeta(meta, "og:image:height", String(image.height));
|
|
159
|
+
if (image.alt) pushPropertyMeta(meta, "og:image:alt", image.alt);
|
|
160
|
+
}
|
|
161
|
+
pushNameMeta(meta, "twitter:card", (_h = metadata.twitter) == null ? void 0 : _h.card);
|
|
162
|
+
pushNameMeta(meta, "twitter:site", (_i = metadata.twitter) == null ? void 0 : _i.site);
|
|
163
|
+
pushNameMeta(meta, "twitter:creator", (_j = metadata.twitter) == null ? void 0 : _j.creator);
|
|
164
|
+
pushNameMeta(meta, "twitter:title", (_k = metadata.twitter) == null ? void 0 : _k.title);
|
|
165
|
+
pushNameMeta(meta, "twitter:description", (_l = metadata.twitter) == null ? void 0 : _l.description);
|
|
166
|
+
for (const imageUrl of ((_m = metadata.twitter) == null ? void 0 : _m.images) || []) {
|
|
167
|
+
pushNameMeta(meta, "twitter:image", imageUrl);
|
|
168
|
+
}
|
|
169
|
+
for (const [name, content] of Object.entries(metadata.other || {})) {
|
|
170
|
+
if (customMetaUsesProperty(name)) {
|
|
171
|
+
pushPropertyMeta(meta, name, content);
|
|
172
|
+
} else {
|
|
173
|
+
pushNameMeta(meta, name, content);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if ((_n = metadata.alternates) == null ? void 0 : _n.canonical) {
|
|
177
|
+
link.push({ rel: "canonical", href: metadata.alternates.canonical });
|
|
178
|
+
}
|
|
179
|
+
for (const [hreflang, href] of Object.entries(((_o = metadata.alternates) == null ? void 0 : _o.languages) || {})) {
|
|
180
|
+
link.push({ rel: "alternate", hreflang, href });
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
title: metadata.title,
|
|
184
|
+
meta,
|
|
185
|
+
link
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
exports.sanitizeOGType = sanitizeOGType; exports.sanitizeTwitterCard = sanitizeTwitterCard; exports.buildSeoMeta = buildSeoMeta; exports.buildSeoHead = buildSeoHead;
|
|
195
|
+
//# sourceMappingURL=chunk-FUUWBQE2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/chunk-FUUWBQE2.cjs","../src/helpers/seoMeta.ts"],"names":[],"mappings":"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","file":"/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/chunk-FUUWBQE2.cjs","sourcesContent":[null,"/**\n * Headless CMS integration helpers for sanity-plugin-seofields\n *\n * Provides framework-agnostic SEO metadata utilities for use with:\n * - Next.js App Router → buildSeoMeta() inside generateMetadata()\n * - Next.js Pages Router → <SeoMetaTags> inside Next.js <Head>\n * - Astro / Nuxt / Vue / SvelteKit / Remix → buildSeoHead() into native head APIs\n */\n\nimport type {SanityImage, SanityImageWithAlt} from '../types'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** Structured metadata returned by buildSeoMeta(). Compatible with Next.js Metadata (App Router). */\nexport interface SeoMetadata {\n title?: string | null\n description?: string | null\n keywords?: string[]\n robots?: {\n index?: boolean\n follow?: boolean\n notranslate?: boolean\n noimageindex?: boolean\n googleBot?: {\n index?: boolean\n follow?: boolean\n notranslate?: boolean\n noimageindex?: boolean\n }\n }\n openGraph?: {\n type?: string\n url?: string\n title?: string\n description?: string\n siteName?: string\n images?: Array<{url: string; width?: number; height?: number; alt?: string}>\n }\n twitter?: {\n card?: string\n site?: string\n creator?: string\n title?: string\n description?: string\n images?: string[]\n }\n alternates?: {\n canonical?: string\n languages?: Record<string, string>\n }\n /** Any custom meta attributes from seo.metaAttributes */\n other?: Record<string, string>\n}\n\n/** Plain `<meta>` tag data returned by buildSeoHead(). */\nexport type SeoHeadMetaTag = {name: string; content: string} | {property: string; content: string}\n\n/** Plain `<link>` tag data returned by buildSeoHead(). */\nexport interface SeoHeadLinkTag {\n rel: string\n href: string\n hreflang?: string\n}\n\n/**\n * Framework-neutral head data returned by buildSeoHead().\n *\n * Use this in Astro, Nuxt, Vue, SvelteKit, Remix, or any frontend where you\n * need plain values instead of React elements or Next.js Metadata.\n */\nexport interface SeoHead {\n title?: string | null\n meta: SeoHeadMetaTag[]\n link: SeoHeadLinkTag[]\n}\n\n/** Default values used when SEO fields are missing. */\nexport interface SeoMetaDefaults {\n title?: string\n description?: string\n siteName?: string\n twitterSite?: string\n twitterCreator?: string\n /** Fallback image URL when no OG / Twitter image is set. */\n ogImage?: string\n}\n\n/**\n * Permissive image shape accepted by buildSeoMeta — compatible with both the\n * plugin's SanityImage and Sanity's code-generated image type (where `asset`\n * and `alt` are optional).\n */\ninterface SeoImageInput {\n _type?: string\n asset?: {_ref: string; _type: string; _weak?: boolean; [key: string]: unknown}\n hotspot?: unknown\n crop?: unknown\n alt?: string\n}\n\n/**\n * Input-compatible variant of SeoFields. Structurally matches Sanity's\n * code-generated types (where `asset`, `alt`, `key`, and `type` are all\n * optional), so you can pass `data.seo` from a sanityFetch result directly\n * without any `as any` or manual casting.\n */\nexport interface SeoFieldsInput {\n _type?: string\n robots?: {\n noIndex?: boolean | null\n noFollow?: boolean | null\n noTranslate?: boolean | null\n noImageIndex?: boolean | null\n } | null\n title?: string | null\n description?: string | null\n metaImage?: SeoImageInput | null\n metaAttributes?: Array<{_key?: string; key?: string; value?: string; type?: string}> | null\n keywords?: string[] | null\n canonicalUrl?: string | null\n hreflangs?: Array<{locale?: string | null; url?: string | null}> | null\n openGraph?: {\n _type?: string\n url?: string | null\n title?: string | null\n description?: string | null\n siteName?: string | null\n type?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n twitter?: {\n _type?: string\n card?: string | null\n site?: string | null\n creator?: string | null\n title?: string | null\n description?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n}\n\n/** Options accepted by buildSeoMeta(). */\nexport interface BuildSeoMetaOptions {\n /**\n * The raw SEO object from Sanity (_type excluded or included — both work).\n * Pass `null` or `undefined` to fall back entirely to `defaults`.\n *\n * Accepts both the strict plugin `SeoFields` type and Sanity's code-generated\n * type (which has all nested fields optional) without any `as any` cast.\n */\n seo?: SeoFieldsInput | null\n\n /**\n * The base URL of your site, e.g. \"https://example.com\".\n * Used for canonical URL and OpenGraph URL construction.\n */\n baseUrl?: string\n\n /**\n * The path for the current page, e.g. \"/about\".\n * Combined with baseUrl to produce the canonical + OG url.\n * Defaults to \"\".\n */\n path?: string\n\n /**\n * Default values used when the Sanity SEO fields are empty / missing.\n */\n defaults?: SeoMetaDefaults\n\n /**\n * Resolve a Sanity image asset to a plain URL string.\n *\n * @example (using @sanity/image-url)\n * imageUrlResolver: (img) => urlFor(img).width(1200).url()\n */\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nconst VALID_OG_TYPES = [\n 'website',\n 'article',\n 'profile',\n 'book',\n 'music',\n 'video',\n 'product',\n] as const\ntype OGType = (typeof VALID_OG_TYPES)[number]\n\n/**\n * Coerce an arbitrary string to a valid OpenGraph type.\n * Falls back to \"website\" when the value is invalid.\n */\nexport function sanitizeOGType(value?: string): OGType {\n if (value && (VALID_OG_TYPES as readonly string[]).includes(value)) {\n return value as OGType\n }\n return 'website'\n}\n\nconst VALID_TWITTER_CARDS = ['summary', 'summary_large_image', 'app', 'player'] as const\ntype TwitterCard = (typeof VALID_TWITTER_CARDS)[number]\n\n/**\n * Coerce an arbitrary string to a valid Twitter card type.\n * Falls back to \"summary_large_image\" when the value is invalid.\n */\nexport function sanitizeTwitterCard(value?: string): TwitterCard {\n if (value && (VALID_TWITTER_CARDS as readonly string[]).includes(value)) {\n return value as TwitterCard\n }\n return 'summary_large_image'\n}\n\n/**\n * Resolve OG image URL from SEO fields or defaults.\n */\nfunction resolveOgImage(\n seo: SeoFieldsInput | null | undefined,\n defaults: SeoMetaDefaults,\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined,\n): string {\n if (seo?.openGraph?.imageType === 'url' && seo.openGraph.imageUrl) {\n return seo.openGraph.imageUrl\n }\n if (seo?.openGraph?.image && imageUrlResolver) {\n return imageUrlResolver(seo.openGraph.image as SanityImage) || defaults.ogImage || ''\n }\n if (seo?.metaImage && imageUrlResolver) {\n return imageUrlResolver(seo.metaImage as SanityImage) || defaults.ogImage || ''\n }\n return defaults.ogImage || ''\n}\n\n/**\n * Resolve Twitter image URL from SEO fields, falling back to OG image.\n */\nfunction resolveTwitterImage(\n seo: SeoFieldsInput | null | undefined,\n ogImageURL: string,\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined,\n): string {\n if (seo?.twitter?.imageType === 'url' && seo.twitter.imageUrl) {\n return seo.twitter.imageUrl\n }\n if (seo?.twitter?.image && imageUrlResolver) {\n return imageUrlResolver(seo.twitter.image as SanityImage) || ogImageURL\n }\n return ogImageURL\n}\n\n/**\n * Build custom meta attributes map from SEO fields.\n */\nfunction buildCustomMetaMap(seo: SeoFieldsInput | null | undefined): Record<string, string> {\n const other: Record<string, string> = {}\n if (Array.isArray(seo?.metaAttributes)) {\n for (const attr of seo!.metaAttributes!) {\n if (attr.key && attr.value) {\n other[attr.key] = attr.value\n }\n }\n }\n return other\n}\n\nfunction buildHreflangMap(\n hreflangs: SeoFieldsInput['hreflangs'] | null | undefined,\n): Record<string, string> | undefined {\n if (!Array.isArray(hreflangs)) return undefined\n\n const languages: Record<string, string> = {}\n for (const entry of hreflangs) {\n if (entry?.locale && entry.url) {\n languages[entry.locale] = entry.url\n }\n }\n\n return Object.keys(languages).length > 0 ? languages : undefined\n}\n\nfunction robotsToContent(meta: SeoMetadata): string {\n return [\n meta.robots?.index === false ? 'noindex' : 'index',\n meta.robots?.follow === false ? 'nofollow' : 'follow',\n meta.robots?.notranslate ? 'notranslate' : null,\n meta.robots?.noimageindex ? 'noimageindex' : null,\n ]\n .filter(Boolean)\n .join(', ')\n}\n\nfunction pushNameMeta(meta: SeoHeadMetaTag[], name: string, content?: string | null): void {\n if (content) meta.push({name, content})\n}\n\nfunction pushPropertyMeta(meta: SeoHeadMetaTag[], property: string, content?: string | null): void {\n if (content) meta.push({property, content})\n}\n\nfunction customMetaUsesProperty(name: string): boolean {\n return /^(og|fb|article|book|music|profile|product|video):/.test(name)\n}\n\n// ─── Core builder ─────────────────────────────────────────────────────────────\n\n/**\n * Convert a Sanity SEO object into a structured metadata object.\n *\n * The return value is structurally compatible with Next.js App Router's\n * `Metadata` type, so you can return it directly from `generateMetadata()`.\n *\n * @example Next.js App Router\n * ```ts\n * import { buildSeoMeta } from 'sanity-plugin-seofields/next'\n * import { urlFor } from '@/sanity/lib/image'\n *\n * export async function generateMetadata(): Promise<Metadata> {\n * const { seo } = await sanityFetch({ query: PAGE_SEO_QUERY })\n * return buildSeoMeta({\n * seo,\n * baseUrl: process.env.NEXT_PUBLIC_SITE_URL,\n * path: '/about',\n * defaults: { title: 'My Site', siteName: 'My Site' },\n * imageUrlResolver: (img) => urlFor(img).width(1200).url(),\n * })\n * }\n * ```\n */\nexport function buildSeoMeta(options: BuildSeoMetaOptions): SeoMetadata {\n const {seo, baseUrl = '', path = '', defaults = {}, imageUrlResolver} = options\n\n const normalizedBase = baseUrl.replace(/\\/+$/, '') // remove trailing /\n const normalizedPath = path.replace(/^\\/+/, '') // remove leading /\n\n const fullUrl = [normalizedBase, normalizedPath].filter(Boolean).join('/')\n\n const ogImageURL = resolveOgImage(seo, defaults, imageUrlResolver)\n const twitterImageURL = resolveTwitterImage(seo, ogImageURL, imageUrlResolver)\n const other = buildCustomMetaMap(seo)\n const languages = buildHreflangMap(seo?.hreflangs)\n\n const ogUrl = seo?.openGraph?.url || fullUrl\n\n return {\n title: seo?.title ?? defaults.title ?? null,\n description: seo?.description ?? defaults.description ?? null,\n keywords: seo?.keywords?.length ? (seo.keywords as string[]) : undefined,\n robots: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n notranslate: !!seo?.robots?.noTranslate,\n noimageindex: !!seo?.robots?.noImageIndex,\n googleBot: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n notranslate: !!seo?.robots?.noTranslate,\n noimageindex: !!seo?.robots?.noImageIndex,\n },\n },\n openGraph: {\n type: sanitizeOGType(seo?.openGraph?.type ?? undefined),\n url: ogUrl || undefined,\n title: seo?.openGraph?.title ?? seo?.title ?? defaults.title,\n description: seo?.openGraph?.description ?? seo?.description ?? defaults.description,\n siteName: seo?.openGraph?.siteName ?? defaults.siteName,\n images: ogImageURL ? [{url: ogImageURL}] : [],\n },\n twitter: {\n card: sanitizeTwitterCard(seo?.twitter?.card ?? undefined),\n site: seo?.twitter?.site ?? defaults.twitterSite,\n creator: seo?.twitter?.creator ?? defaults.twitterCreator,\n title: seo?.twitter?.title ?? seo?.openGraph?.title ?? seo?.title ?? defaults.title,\n description:\n seo?.twitter?.description ??\n seo?.openGraph?.description ??\n seo?.description ??\n defaults.description,\n images: twitterImageURL ? [twitterImageURL] : [],\n },\n alternates: {\n canonical: seo?.canonicalUrl || fullUrl || undefined,\n ...(languages ? {languages} : {}),\n },\n ...(Object.keys(other).length > 0 ? {other} : {}),\n }\n}\n\n/**\n * Convert Sanity SEO fields into plain head tag data.\n *\n * This helper is framework-neutral: it returns serializable `title`, `meta`,\n * and `link` arrays that can be passed to Astro layouts, Nuxt/Vue `useHead`,\n * SvelteKit `<svelte:head>`, Remix `meta()` exports, or any custom renderer.\n *\n * @example Astro / Nuxt / SvelteKit\n * ```ts\n * import { buildSeoHead } from 'sanity-plugin-seofields/head'\n *\n * const head = buildSeoHead({\n * seo: page.seo,\n * baseUrl: 'https://example.com',\n * path: `/blog/${page.slug}`,\n * defaults: { title: page.title, siteName: 'My Site' },\n * imageUrlResolver: (img) => urlFor(img).width(1200).height(630).url(),\n * })\n * ```\n */\nexport function buildSeoHead(options: BuildSeoMetaOptions): SeoHead {\n const metadata = buildSeoMeta(options)\n const meta: SeoHeadMetaTag[] = []\n const link: SeoHeadLinkTag[] = []\n const robotsContent = robotsToContent(metadata)\n\n pushNameMeta(meta, 'description', metadata.description)\n if (metadata.keywords?.length) {\n pushNameMeta(meta, 'keywords', metadata.keywords.join(', '))\n }\n pushNameMeta(meta, 'robots', robotsContent)\n pushNameMeta(meta, 'googlebot', robotsContent)\n\n pushPropertyMeta(meta, 'og:type', metadata.openGraph?.type)\n pushPropertyMeta(meta, 'og:url', metadata.openGraph?.url)\n pushPropertyMeta(meta, 'og:title', metadata.openGraph?.title)\n pushPropertyMeta(meta, 'og:description', metadata.openGraph?.description)\n pushPropertyMeta(meta, 'og:site_name', metadata.openGraph?.siteName)\n\n for (const image of metadata.openGraph?.images || []) {\n pushPropertyMeta(meta, 'og:image', image.url)\n if (image.width) pushPropertyMeta(meta, 'og:image:width', String(image.width))\n if (image.height) pushPropertyMeta(meta, 'og:image:height', String(image.height))\n if (image.alt) pushPropertyMeta(meta, 'og:image:alt', image.alt)\n }\n\n pushNameMeta(meta, 'twitter:card', metadata.twitter?.card)\n pushNameMeta(meta, 'twitter:site', metadata.twitter?.site)\n pushNameMeta(meta, 'twitter:creator', metadata.twitter?.creator)\n pushNameMeta(meta, 'twitter:title', metadata.twitter?.title)\n pushNameMeta(meta, 'twitter:description', metadata.twitter?.description)\n\n for (const imageUrl of metadata.twitter?.images || []) {\n pushNameMeta(meta, 'twitter:image', imageUrl)\n }\n\n for (const [name, content] of Object.entries(metadata.other || {})) {\n if (customMetaUsesProperty(name)) {\n pushPropertyMeta(meta, name, content)\n } else {\n pushNameMeta(meta, name, content)\n }\n }\n\n if (metadata.alternates?.canonical) {\n link.push({rel: 'canonical', href: metadata.alternates.canonical})\n }\n\n for (const [hreflang, href] of Object.entries(metadata.alternates?.languages || {})) {\n link.push({rel: 'alternate', hreflang, href})\n }\n\n return {\n title: metadata.title,\n meta,\n link,\n }\n}\n"]}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
// src/utils/seoUtils.ts
|
|
4
2
|
var stopWords = ["the", "a", "an", "and", "or", "but"];
|
|
5
3
|
var hasMatchingKeyword = (title, keywordList) => {
|
|
@@ -7,12 +5,13 @@ var hasMatchingKeyword = (title, keywordList) => {
|
|
|
7
5
|
const lowerTitle = title.toLowerCase();
|
|
8
6
|
return keywordList.some((keyword) => keyword && lowerTitle.includes(keyword.toLowerCase()));
|
|
9
7
|
};
|
|
8
|
+
var escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
10
9
|
var hasKeywordOveruse = (title, keywordList, maxOccurrences = 3) => {
|
|
11
10
|
if (!title || keywordList.length === 0) return false;
|
|
12
11
|
const lowerTitle = title.toLowerCase();
|
|
13
12
|
return keywordList.some((keyword) => {
|
|
14
13
|
if (!keyword) return false;
|
|
15
|
-
const matches = lowerTitle.match(new RegExp(keyword.toLowerCase(), "g"));
|
|
14
|
+
const matches = lowerTitle.match(new RegExp(escapeRegExp(keyword.toLowerCase()), "g"));
|
|
16
15
|
return matches ? matches.length > maxOccurrences : false;
|
|
17
16
|
});
|
|
18
17
|
};
|
|
@@ -21,7 +20,31 @@ var startsWithStopWord = (title) => {
|
|
|
21
20
|
const firstWord = title.trim().split(" ")[0].toLowerCase();
|
|
22
21
|
return stopWords.includes(firstWord);
|
|
23
22
|
};
|
|
23
|
+
var primaryKeywordAtStart = (title, keywords) => {
|
|
24
|
+
if (!title || keywords.length === 0) return true;
|
|
25
|
+
return title.toLowerCase().startsWith(keywords[0].toLowerCase());
|
|
26
|
+
};
|
|
24
27
|
var truncate = (text, maxLength) => text.length > maxLength ? `${text.slice(0, maxLength)}\u2026` : text;
|
|
28
|
+
var getFocusKeywordPlacement = (focusKeyword, title, description) => {
|
|
29
|
+
const keyword = (focusKeyword || "").trim();
|
|
30
|
+
if (!keyword) {
|
|
31
|
+
return {
|
|
32
|
+
hasFocusKeyword: false,
|
|
33
|
+
inTitle: false,
|
|
34
|
+
atStartOfTitle: false,
|
|
35
|
+
inDescription: false,
|
|
36
|
+
isStuffed: false
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const keywordList = [keyword];
|
|
40
|
+
return {
|
|
41
|
+
hasFocusKeyword: true,
|
|
42
|
+
inTitle: hasMatchingKeyword(title || "", keywordList),
|
|
43
|
+
atStartOfTitle: !!title && primaryKeywordAtStart(title, keywordList),
|
|
44
|
+
inDescription: hasMatchingKeyword(description || "", keywordList),
|
|
45
|
+
isStuffed: hasKeywordOveruse(title || "", keywordList, 2)
|
|
46
|
+
};
|
|
47
|
+
};
|
|
25
48
|
var hasExcessivePunctuation = (title) => /[!@#$%^&*]{2,}/.test(title);
|
|
26
49
|
var getMetaTitleValidationMessages = (title, keywords, isParentseoField, suffixLength = 0) => {
|
|
27
50
|
const feedback = [];
|
|
@@ -475,17 +498,21 @@ var getTwitterImageUrlValidation = (imageUrl, seoParent) => {
|
|
|
475
498
|
return feedback;
|
|
476
499
|
};
|
|
477
500
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
501
|
+
export {
|
|
502
|
+
hasMatchingKeyword,
|
|
503
|
+
hasKeywordOveruse,
|
|
504
|
+
truncate,
|
|
505
|
+
getFocusKeywordPlacement,
|
|
506
|
+
getMetaTitleValidationMessages,
|
|
507
|
+
getMetaDescriptionValidationMessages,
|
|
508
|
+
getOgTitleValidation,
|
|
509
|
+
getOgDescriptionValidation,
|
|
510
|
+
getTwitterTitleValidation,
|
|
511
|
+
getTwitterDescriptionValidation,
|
|
512
|
+
getMetaImageValidation,
|
|
513
|
+
getOgImageValidation,
|
|
514
|
+
getOgImageUrlValidation,
|
|
515
|
+
getTwitterImageValidation,
|
|
516
|
+
getTwitterImageUrlValidation
|
|
517
|
+
};
|
|
518
|
+
//# sourceMappingURL=chunk-HHO2AKAP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/seoUtils.ts"],"sourcesContent":["import {FeedbackType} from '../types'\n\nexport const stopWords = ['the', 'a', 'an', 'and', 'or', 'but']\n\nexport const hasMatchingKeyword = (title: string, keywordList: string[]): boolean => {\n if (!title || keywordList.length === 0) return false\n const lowerTitle = title.toLowerCase()\n return keywordList.some((keyword) => keyword && lowerTitle.includes(keyword.toLowerCase()))\n}\n\nconst escapeRegExp = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nexport const hasKeywordOveruse = (\n title: string,\n keywordList: string[],\n maxOccurrences = 3,\n): boolean => {\n if (!title || keywordList.length === 0) return false\n const lowerTitle = title.toLowerCase()\n return keywordList.some((keyword) => {\n if (!keyword) return false\n const matches = lowerTitle.match(new RegExp(escapeRegExp(keyword.toLowerCase()), 'g'))\n return matches ? matches.length > maxOccurrences : false\n })\n}\n\nexport const startsWithStopWord = (title: string): boolean => {\n if (!title) return false\n const firstWord = title.trim().split(' ')[0].toLowerCase()\n return stopWords.includes(firstWord)\n}\n\nexport const primaryKeywordAtStart = (title: string, keywords: string[]): boolean => {\n if (!title || keywords.length === 0) return true\n return title.toLowerCase().startsWith(keywords[0].toLowerCase())\n}\n\nexport const truncate = (text: string, maxLength: number): string =>\n text.length > maxLength ? `${text.slice(0, maxLength)}…` : text\n\nexport interface FocusKeywordPlacement {\n hasFocusKeyword: boolean\n inTitle: boolean\n atStartOfTitle: boolean\n inDescription: boolean\n isStuffed: boolean\n}\n\n/** Shared placement facts for a single focus keyword, used by both the live editor UI and health scoring. */\nexport const getFocusKeywordPlacement = (\n focusKeyword: string | undefined,\n title: string | undefined,\n description: string | undefined,\n): FocusKeywordPlacement => {\n const keyword = (focusKeyword || '').trim()\n if (!keyword) {\n return {\n hasFocusKeyword: false,\n inTitle: false,\n atStartOfTitle: false,\n inDescription: false,\n isStuffed: false,\n }\n }\n\n const keywordList = [keyword]\n return {\n hasFocusKeyword: true,\n inTitle: hasMatchingKeyword(title || '', keywordList),\n atStartOfTitle: !!title && primaryKeywordAtStart(title, keywordList),\n inDescription: hasMatchingKeyword(description || '', keywordList),\n isStuffed: hasKeywordOveruse(title || '', keywordList, 2),\n }\n}\n\nexport const hasExcessivePunctuation = (title: string): boolean => /[!@#$%^&*]{2,}/.test(title)\n\nexport const getMetaTitleValidationMessages = (\n title: string,\n keywords: string[],\n isParentseoField: boolean,\n suffixLength = 0,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n const minChar = 50\n const maxChar = 60\n const charCount = title?.length || 0\n const combinedLength = charCount + suffixLength\n const suffixMessage = suffixLength > 0 ? ` Suffix value is included (${suffixLength} chars).` : ''\n\n // Empty check\n if (!title?.trim()) {\n feedback.push({text: 'Meta Title is empty. Add content to improve SEO.', color: 'red'})\n return feedback\n }\n\n // Length check (evaluated against combined title + suffix length)\n if (combinedLength < minChar)\n feedback.push({\n text: `Title is ${combinedLength} characters — below recommended ${minChar}.${suffixMessage}`,\n color: 'orange',\n })\n else if (combinedLength > maxChar)\n feedback.push({\n text: `Title is ${combinedLength} characters — exceeds recommended ${maxChar}.${suffixMessage}`,\n color: 'red',\n })\n else\n feedback.push({\n text: `Title length (${combinedLength}) looks good for SEO.${suffixMessage}`,\n color: 'green',\n })\n\n // Keyword checks\n if (isParentseoField) {\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(title, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in title — good job!'\n : 'Keywords defined but missing in title.',\n color: hasKeyword ? 'green' : 'red',\n })\n\n if (hasKeywordOveruse(title, keywords)) {\n feedback.push({\n text: 'Keyword appears too many times — avoid keyword stuffing.',\n color: 'orange',\n })\n }\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Stop word check\n if (startsWithStopWord(title))\n feedback.push({text: 'Title starts with a stop word — consider rephrasing.', color: 'orange'})\n\n // Punctuation check\n if (hasExcessivePunctuation(title))\n feedback.push({text: 'Title contains excessive punctuation — simplify it.', color: 'orange'})\n\n return feedback\n}\n\nexport const getMetaDescriptionValidationMessages = (\n description: string,\n keywords: string[],\n isParentseoField: boolean,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n const minChar = 120\n const maxChar = 160\n const charCount = description?.length || 0\n\n if (!description?.trim()) {\n feedback.push({text: 'Meta description is empty. Add content to improve SEO.', color: 'red'})\n return feedback\n }\n\n // Length check\n if (charCount < minChar)\n feedback.push({\n text: `Description is ${charCount} chars — below recommended ${minChar}.`,\n color: 'orange',\n })\n else if (charCount > maxChar)\n feedback.push({\n text: `Description is ${charCount} chars — exceeds recommended ${maxChar}.`,\n color: 'red',\n })\n else\n feedback.push({text: `Description length (${charCount}) looks good for SEO.`, color: 'green'})\n\n // Keyword checks\n if (isParentseoField) {\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(description, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in description — good job!'\n : 'Keywords defined but missing in description.',\n color: hasKeyword ? 'green' : 'red',\n })\n\n if (hasKeywordOveruse(description, keywords)) {\n feedback.push({\n text: 'Keyword appears too many times — avoid keyword stuffing.',\n color: 'orange',\n })\n }\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Stop word / filler check\n if (startsWithStopWord(description))\n feedback.push({\n text: 'Description starts with a stop word — consider rephrasing.',\n color: 'orange',\n })\n\n // Punctuation / special characters\n if (hasExcessivePunctuation(description))\n feedback.push({\n text: 'Description contains excessive punctuation — simplify it.',\n color: 'orange',\n })\n\n return feedback\n}\n\nexport const getOgTitleValidation = (\n title: string,\n keywords: string[] = [],\n isParentseoField: boolean,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n const min = 40\n const max = 60\n const count = title?.length || 0\n\n // Empty check\n if (!title?.trim()) {\n feedback.push({text: 'OG Title is empty. Add content for better social preview.', color: 'red'})\n return feedback\n }\n\n // Length check\n if (count < min)\n feedback.push({\n text: `OG Title is ${count} chars — shorter than recommended ${min}.`,\n color: 'orange',\n })\n else if (count > max)\n feedback.push({text: `OG Title is ${count} chars — exceeds recommended ${max}.`, color: 'red'})\n else feedback.push({text: `OG Title length (${count}) looks good.`, color: 'green'})\n\n if (isParentseoField) {\n // Keyword checks\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(title, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in OG title — good job!'\n : 'Keywords defined but missing in OG title.',\n color: hasKeyword ? 'green' : 'red',\n })\n\n if (hasKeywordOveruse(title, keywords)) {\n feedback.push({\n text: 'Keyword appears too many times in OG title — avoid keyword stuffing.',\n color: 'orange',\n })\n }\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Additional OG-specific checks\n if (startsWithStopWord(title))\n feedback.push({\n text: 'OG Title starts with a stop word — consider rephrasing.',\n color: 'orange',\n })\n\n if (hasExcessivePunctuation(title))\n feedback.push({text: 'OG Title contains excessive punctuation — simplify it.', color: 'orange'})\n\n return feedback\n}\n\nexport const getOgDescriptionValidation = (\n desc: string,\n keywords: string[] = [],\n isParentseoField: boolean,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n const min = 90\n const max = 120\n const count = desc?.length || 0\n\n // Empty check\n if (!desc?.trim()) {\n feedback.push({\n text: 'OG Description is empty. Add content for better social preview.',\n color: 'red',\n })\n return feedback\n }\n\n // Length check\n if (count < min)\n feedback.push({\n text: `OG Description is ${count} chars — shorter than recommended ${min}.`,\n color: 'orange',\n })\n else if (count > max)\n feedback.push({\n text: `OG Description is ${count} chars — exceeds recommended ${max}.`,\n color: 'red',\n })\n else feedback.push({text: `OG Description length (${count}) looks good.`, color: 'green'})\n\n // Keyword checks\n if (isParentseoField) {\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(desc, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in OG description — good job!'\n : 'Keywords defined but missing in OG description.',\n color: hasKeyword ? 'green' : 'red',\n })\n\n if (hasKeywordOveruse(desc, keywords)) {\n feedback.push({\n text: 'Keyword appears too many times in OG description — avoid keyword stuffing.',\n color: 'orange',\n })\n }\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Additional OG-specific checks\n if (startsWithStopWord(desc))\n feedback.push({\n text: 'OG Description starts with a stop word — consider rephrasing.',\n color: 'orange',\n })\n\n if (hasExcessivePunctuation(desc))\n feedback.push({\n text: 'OG Description contains excessive punctuation — simplify it.',\n color: 'orange',\n })\n\n return feedback\n}\n\nexport const getTwitterTitleValidation = (\n title: string,\n keywords: string[] = [],\n isParentseoField: boolean,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n const min = 30\n const max = 70\n const count = title?.length || 0\n\n if (!title?.trim()) {\n feedback.push({text: 'X Title is empty. Add content for better SEO.', color: 'red'})\n return feedback\n }\n\n // Length check\n if (count < min)\n feedback.push({\n text: `X Title is ${count} chars — shorter than recommended ${min}.`,\n color: 'orange',\n })\n else if (count > max)\n feedback.push({\n text: `X Title is ${count} chars — exceeds recommended ${max}.`,\n color: 'red',\n })\n else feedback.push({text: `X Title length (${count}) looks good.`, color: 'green'})\n\n if (isParentseoField) {\n // Keyword checks\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(title, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in X title — good job!'\n : 'Keywords defined but missing in X title.',\n color: hasKeyword ? 'green' : 'red',\n })\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Punctuation check\n if (/[!@#$%^&*]{2,}/.test(title))\n feedback.push({text: 'X Title has excessive punctuation — simplify it.', color: 'orange'})\n\n return feedback\n}\n\nexport const getTwitterDescriptionValidation = (\n desc: string,\n keywords: string[] = [],\n isParentseoField: boolean,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n const min = 50\n const max = 200\n const count = desc?.length || 0\n\n if (!desc?.trim()) {\n feedback.push({text: 'X Description is empty. Add content for better SEO.', color: 'red'})\n return feedback\n }\n\n // Length check\n if (count < min)\n feedback.push({\n text: `X Description is ${count} chars — shorter than recommended ${min}.`,\n color: 'orange',\n })\n else if (count > max)\n feedback.push({\n text: `X Description is ${count} chars — exceeds recommended ${max}.`,\n color: 'red',\n })\n else feedback.push({text: `X Description length (${count}) looks good.`, color: 'green'})\n\n if (isParentseoField) {\n // Keyword checks\n if (keywords.length > 0) {\n const hasKeyword = hasMatchingKeyword(desc, keywords)\n feedback.push({\n text: hasKeyword\n ? 'Keyword found in X description — good job!'\n : 'Keywords defined but missing in X description.',\n color: hasKeyword ? 'green' : 'red',\n })\n } else {\n feedback.push({\n text: 'No keywords defined. Consider adding relevant keywords.',\n color: 'orange',\n })\n }\n }\n\n // Punctuation check\n if (/[!@#$%^&*]{2,}/.test(desc))\n feedback.push({\n text: 'X Description has excessive punctuation — simplify it.',\n color: 'orange',\n })\n\n return feedback\n}\n\n// ── Image Validation Helpers ──\n\n/** Check if an image is set in an OG/Twitter sub-object (handles upload vs URL) */\nexport const isSubImageSet = (subObj: Record<string, unknown> | null | undefined): boolean => {\n if (!subObj) return false\n if (subObj.imageType === 'url') return !!(subObj.imageUrl as string)?.trim()\n const img = subObj.image as Record<string, unknown> | undefined\n return !!img?.asset\n}\n\n/** Check if metaImage asset is set */\nconst isMetaImageSet = (seoParent: Record<string, unknown> | null | undefined): boolean => {\n if (!seoParent) return false\n const metaImage = seoParent.metaImage as Record<string, unknown> | undefined\n return !!metaImage?.asset\n}\n\nexport const getMetaImageValidation = (\n hasImage: boolean,\n seoParent: Record<string, unknown> | null | undefined,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n if (!hasImage) {\n feedback.push({\n text: 'No meta image provided. Adding an image improves click-through rates.',\n color: 'red',\n })\n return feedback\n }\n\n feedback.push({text: 'Meta image is set — great for SEO and social sharing.', color: 'green'})\n\n const ogSet = isSubImageSet(seoParent?.openGraph as Record<string, unknown> | undefined)\n const twSet = isSubImageSet(seoParent?.twitter as Record<string, unknown> | undefined)\n\n if (!ogSet && !twSet) {\n feedback.push({\n text: 'OG and Twitter images are missing — add them for full social coverage.',\n color: 'orange',\n })\n } else if (!ogSet) {\n feedback.push({\n text: 'OG image is missing — add it for better Facebook/LinkedIn previews.',\n color: 'orange',\n })\n } else if (twSet) {\n feedback.push({text: 'All images set (Meta, OG, Twitter) — full coverage!', color: 'green'})\n } else {\n feedback.push({\n text: 'Twitter image is missing — add it for better X (Twitter) cards.',\n color: 'orange',\n })\n }\n\n return feedback\n}\n\nexport const getOgImageValidation = (\n hasImage: boolean,\n altText: string | undefined,\n seoParent: Record<string, unknown> | null | undefined,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n if (!hasImage) {\n feedback.push({\n text: 'No OG image provided. Social shares will lack a visual preview.',\n color: 'red',\n })\n return feedback\n }\n\n feedback.push({text: 'OG image is set — good for social sharing.', color: 'green'})\n\n if (altText?.trim()) {\n feedback.push({text: 'Alt text is set — good for accessibility.', color: 'green'})\n } else {\n feedback.push({text: 'Consider adding alt text for better accessibility.', color: 'orange'})\n }\n\n const metaSet = isMetaImageSet(seoParent)\n const twSet = isSubImageSet(seoParent?.twitter as Record<string, unknown> | undefined)\n\n if (metaSet && twSet) {\n feedback.push({text: 'All images set (Meta, OG, Twitter) — full coverage!', color: 'green'})\n } else {\n if (!metaSet)\n feedback.push({\n text: 'Meta image is missing — add it for search engine results.',\n color: 'orange',\n })\n if (!twSet)\n feedback.push({\n text: 'Twitter image is missing — add it for X (Twitter) cards.',\n color: 'orange',\n })\n }\n\n return feedback\n}\n\nexport const getOgImageUrlValidation = (\n imageUrl: string | undefined,\n seoParent: Record<string, unknown> | null | undefined,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n if (!imageUrl?.trim()) {\n feedback.push({\n text: 'No OG image URL provided. Social shares will lack a visual preview.',\n color: 'red',\n })\n return feedback\n }\n\n feedback.push({text: 'OG image URL is set — good for social sharing.', color: 'green'})\n\n const metaSet = isMetaImageSet(seoParent)\n const twSet = isSubImageSet(seoParent?.twitter as Record<string, unknown> | undefined)\n\n if (metaSet && twSet) {\n feedback.push({text: 'All images set (Meta, OG, Twitter) — full coverage!', color: 'green'})\n } else {\n if (!metaSet)\n feedback.push({\n text: 'Meta image is missing — add it for search engine results.',\n color: 'orange',\n })\n if (!twSet)\n feedback.push({\n text: 'Twitter image is missing — add it for X (Twitter) cards.',\n color: 'orange',\n })\n }\n\n return feedback\n}\n\nexport const getTwitterImageValidation = (\n hasImage: boolean,\n altText: string | undefined,\n seoParent: Record<string, unknown> | null | undefined,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n if (!hasImage) {\n feedback.push({\n text: 'No Twitter image provided. Posts on X will lack a visual.',\n color: 'red',\n })\n return feedback\n }\n\n feedback.push({text: 'Twitter image is set — good for X sharing.', color: 'green'})\n\n if (altText?.trim()) {\n feedback.push({text: 'Alt text is set — good for accessibility.', color: 'green'})\n } else {\n feedback.push({text: 'Consider adding alt text for better accessibility.', color: 'orange'})\n }\n\n const metaSet = isMetaImageSet(seoParent)\n const ogSet = isSubImageSet(seoParent?.openGraph as Record<string, unknown> | undefined)\n\n if (metaSet && ogSet) {\n feedback.push({text: 'All images set (Meta, OG, Twitter) — full coverage!', color: 'green'})\n } else {\n if (!metaSet)\n feedback.push({\n text: 'Meta image is missing — add it for search engine results.',\n color: 'orange',\n })\n if (!ogSet)\n feedback.push({\n text: 'OG image is missing — add it for Facebook/LinkedIn sharing.',\n color: 'orange',\n })\n }\n\n return feedback\n}\n\nexport const getTwitterImageUrlValidation = (\n imageUrl: string | undefined,\n seoParent: Record<string, unknown> | null | undefined,\n): FeedbackType[] => {\n const feedback: FeedbackType[] = []\n\n if (!imageUrl?.trim()) {\n feedback.push({\n text: 'No Twitter image URL provided. Posts on X will lack a visual.',\n color: 'red',\n })\n return feedback\n }\n\n feedback.push({text: 'Twitter image URL is set — good for X sharing.', color: 'green'})\n\n const metaSet = isMetaImageSet(seoParent)\n const ogSet = isSubImageSet(seoParent?.openGraph as Record<string, unknown> | undefined)\n\n if (metaSet && ogSet) {\n feedback.push({text: 'All images set (Meta, OG, Twitter) — full coverage!', color: 'green'})\n } else {\n if (!metaSet)\n feedback.push({\n text: 'Meta image is missing — add it for search engine results.',\n color: 'orange',\n })\n if (!ogSet)\n feedback.push({\n text: 'OG image is missing — add it for Facebook/LinkedIn sharing.',\n color: 'orange',\n })\n }\n\n return feedback\n}\n"],"mappings":"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","names":[]}
|