react-ssr-seo-toolkit 1.0.2

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.
@@ -0,0 +1,3 @@
1
+ 'use strict';var r="https://schema.org";function n(e){let a={"@context":r,"@type":"Organization",name:e.name,url:e.url};if(e.logo&&(a.logo=e.logo),e.description&&(a.description=e.description),e.sameAs?.length&&(a.sameAs=e.sameAs),e.contactPoint){let t={"@type":"ContactPoint"};e.contactPoint.telephone&&(t.telephone=e.contactPoint.telephone),e.contactPoint.contactType&&(t.contactType=e.contactPoint.contactType),e.contactPoint.email&&(t.email=e.contactPoint.email),e.contactPoint.areaServed&&(t.areaServed=e.contactPoint.areaServed),e.contactPoint.availableLanguage&&(t.availableLanguage=e.contactPoint.availableLanguage),a.contactPoint=t;}return a}function i(e){let a={"@context":r,"@type":"WebSite",name:e.name,url:e.url};return e.description&&(a.description=e.description),e.searchUrl&&(a.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${e.searchUrl}?${e.searchQueryParam??"q"}={search_term_string}`},"query-input":"required name=search_term_string"}),a}function s(e){return {"@context":r,"@type":"BreadcrumbList",itemListElement:e.map((a,t)=>({"@type":"ListItem",position:t+1,name:a.name,item:a.url}))}}function m(e){let a={"@context":r,"@type":"Article",headline:e.headline,url:e.url};if(e.description&&(a.description=e.description),e.images?.length&&(a.image=e.images),e.datePublished&&(a.datePublished=e.datePublished),e.dateModified&&(a.dateModified=e.dateModified),e.section&&(a.articleSection=e.section),e.keywords?.length&&(a.keywords=e.keywords),e.author){let t=Array.isArray(e.author)?e.author:[e.author];a.author=t.map(o=>{let c={"@type":"Person",name:o.name};return o.url&&(c.url=o.url),c});}if(e.publisher){let t={"@type":"Organization",name:e.publisher.name};e.publisher.logo&&(t.logo={"@type":"ImageObject",url:e.publisher.logo}),a.publisher=t;}return a}function l(e){let a={"@context":r,"@type":"Product",name:e.name,url:e.url};if(e.description&&(a.description=e.description),e.images?.length&&(a.image=e.images),e.brand&&(a.brand={"@type":"Brand",name:e.brand}),e.sku&&(a.sku=e.sku),e.gtin&&(a.gtin=e.gtin),e.price!==void 0){let t={"@type":"Offer",price:e.price,priceCurrency:e.priceCurrency??"USD"};e.availability&&(t.availability=`https://schema.org/${e.availability}`),a.offers=t;}if(e.ratingValue!==void 0){let t={"@type":"AggregateRating",ratingValue:e.ratingValue};e.reviewCount!==void 0&&(t.reviewCount=e.reviewCount),a.aggregateRating=t;}return a}function d(e){return {"@context":r,"@type":"FAQPage",mainEntity:e.map(a=>({"@type":"Question",name:a.question,acceptedAnswer:{"@type":"Answer",text:a.answer}}))}}function g(...e){return {"@context":r,"@type":"ItemList","@graph":e.map(({"@context":a,...t})=>t)}}
2
+ exports.a=n;exports.b=i;exports.c=s;exports.d=m;exports.e=l;exports.f=d;exports.g=g;//# sourceMappingURL=chunk-63ETSZTD.cjs.map
3
+ //# sourceMappingURL=chunk-63ETSZTD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/index.ts"],"names":["CONTEXT","createOrganizationSchema","input","schema","cp","createWebsiteSchema","createBreadcrumbSchema","items","item","index","createArticleSchema","authors","a","person","pub","createProductSchema","offer","rating","createFAQSchema","composeSchemas","schemas","_ctx","rest"],"mappings":"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","file":"chunk-63ETSZTD.cjs","sourcesContent":["import type {\n JSONLDBase,\n BreadcrumbItem,\n OrganizationSchemaInput,\n WebsiteSchemaInput,\n ArticleSchemaInput,\n ProductSchemaInput,\n FAQItem,\n} from \"../types/index.js\";\n\nconst CONTEXT = \"https://schema.org\";\n\n// ─── Organization ─────────────────────────────────────────────\n\nexport function createOrganizationSchema(\n input: OrganizationSchemaInput\n): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Organization\",\n name: input.name,\n url: input.url,\n };\n\n if (input.logo) schema.logo = input.logo;\n if (input.description) schema.description = input.description;\n if (input.sameAs?.length) schema.sameAs = input.sameAs;\n\n if (input.contactPoint) {\n const cp: Record<string, unknown> = {\n \"@type\": \"ContactPoint\",\n };\n if (input.contactPoint.telephone)\n cp.telephone = input.contactPoint.telephone;\n if (input.contactPoint.contactType)\n cp.contactType = input.contactPoint.contactType;\n if (input.contactPoint.email) cp.email = input.contactPoint.email;\n if (input.contactPoint.areaServed)\n cp.areaServed = input.contactPoint.areaServed;\n if (input.contactPoint.availableLanguage)\n cp.availableLanguage = input.contactPoint.availableLanguage;\n schema.contactPoint = cp;\n }\n\n return schema;\n}\n\n// ─── Website ──────────────────────────────────────────────────\n\nexport function createWebsiteSchema(input: WebsiteSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"WebSite\",\n name: input.name,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n\n if (input.searchUrl) {\n schema.potentialAction = {\n \"@type\": \"SearchAction\",\n target: {\n \"@type\": \"EntryPoint\",\n urlTemplate: `${input.searchUrl}?${input.searchQueryParam ?? \"q\"}={search_term_string}`,\n },\n \"query-input\": \"required name=search_term_string\",\n };\n }\n\n return schema;\n}\n\n// ─── Breadcrumb ───────────────────────────────────────────────\n\nexport function createBreadcrumbSchema(items: BreadcrumbItem[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"BreadcrumbList\",\n itemListElement: items.map((item, index) => ({\n \"@type\": \"ListItem\",\n position: index + 1,\n name: item.name,\n item: item.url,\n })),\n };\n}\n\n// ─── Article ──────────────────────────────────────────────────\n\nexport function createArticleSchema(input: ArticleSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Article\",\n headline: input.headline,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n if (input.images?.length) schema.image = input.images;\n if (input.datePublished) schema.datePublished = input.datePublished;\n if (input.dateModified) schema.dateModified = input.dateModified;\n if (input.section) schema.articleSection = input.section;\n if (input.keywords?.length) schema.keywords = input.keywords;\n\n if (input.author) {\n const authors = Array.isArray(input.author)\n ? input.author\n : [input.author];\n schema.author = authors.map((a) => {\n const person: Record<string, string> = {\n \"@type\": \"Person\",\n name: a.name,\n };\n if (a.url) person.url = a.url;\n return person;\n });\n }\n\n if (input.publisher) {\n const pub: Record<string, unknown> = {\n \"@type\": \"Organization\",\n name: input.publisher.name,\n };\n if (input.publisher.logo) {\n pub.logo = {\n \"@type\": \"ImageObject\",\n url: input.publisher.logo,\n };\n }\n schema.publisher = pub;\n }\n\n return schema;\n}\n\n// ─── Product ──────────────────────────────────────────────────\n\nexport function createProductSchema(input: ProductSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Product\",\n name: input.name,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n if (input.images?.length) schema.image = input.images;\n if (input.brand) {\n schema.brand = { \"@type\": \"Brand\", name: input.brand };\n }\n if (input.sku) schema.sku = input.sku;\n if (input.gtin) schema.gtin = input.gtin;\n\n if (input.price !== undefined) {\n const offer: Record<string, unknown> = {\n \"@type\": \"Offer\",\n price: input.price,\n priceCurrency: input.priceCurrency ?? \"USD\",\n };\n if (input.availability) {\n offer.availability = `https://schema.org/${input.availability}`;\n }\n schema.offers = offer;\n }\n\n if (input.ratingValue !== undefined) {\n const rating: Record<string, unknown> = {\n \"@type\": \"AggregateRating\",\n ratingValue: input.ratingValue,\n };\n if (input.reviewCount !== undefined) rating.reviewCount = input.reviewCount;\n schema.aggregateRating = rating;\n }\n\n return schema;\n}\n\n// ─── FAQ ──────────────────────────────────────────────────────\n\nexport function createFAQSchema(items: FAQItem[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"FAQPage\",\n mainEntity: items.map((item) => ({\n \"@type\": \"Question\",\n name: item.question,\n acceptedAnswer: {\n \"@type\": \"Answer\",\n text: item.answer,\n },\n })),\n };\n}\n\n// ─── Schema composition ───────────────────────────────────────\n\n/**\n * Compose multiple JSON-LD schemas into a single @graph array.\n * Useful for embedding multiple structured data blocks in one script tag.\n */\nexport function composeSchemas(...schemas: JSONLDBase[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"ItemList\",\n \"@graph\": schemas.map(({ \"@context\": _ctx, ...rest }) => rest),\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ var r="https://schema.org";function n(e){let a={"@context":r,"@type":"Organization",name:e.name,url:e.url};if(e.logo&&(a.logo=e.logo),e.description&&(a.description=e.description),e.sameAs?.length&&(a.sameAs=e.sameAs),e.contactPoint){let t={"@type":"ContactPoint"};e.contactPoint.telephone&&(t.telephone=e.contactPoint.telephone),e.contactPoint.contactType&&(t.contactType=e.contactPoint.contactType),e.contactPoint.email&&(t.email=e.contactPoint.email),e.contactPoint.areaServed&&(t.areaServed=e.contactPoint.areaServed),e.contactPoint.availableLanguage&&(t.availableLanguage=e.contactPoint.availableLanguage),a.contactPoint=t;}return a}function i(e){let a={"@context":r,"@type":"WebSite",name:e.name,url:e.url};return e.description&&(a.description=e.description),e.searchUrl&&(a.potentialAction={"@type":"SearchAction",target:{"@type":"EntryPoint",urlTemplate:`${e.searchUrl}?${e.searchQueryParam??"q"}={search_term_string}`},"query-input":"required name=search_term_string"}),a}function s(e){return {"@context":r,"@type":"BreadcrumbList",itemListElement:e.map((a,t)=>({"@type":"ListItem",position:t+1,name:a.name,item:a.url}))}}function m(e){let a={"@context":r,"@type":"Article",headline:e.headline,url:e.url};if(e.description&&(a.description=e.description),e.images?.length&&(a.image=e.images),e.datePublished&&(a.datePublished=e.datePublished),e.dateModified&&(a.dateModified=e.dateModified),e.section&&(a.articleSection=e.section),e.keywords?.length&&(a.keywords=e.keywords),e.author){let t=Array.isArray(e.author)?e.author:[e.author];a.author=t.map(o=>{let c={"@type":"Person",name:o.name};return o.url&&(c.url=o.url),c});}if(e.publisher){let t={"@type":"Organization",name:e.publisher.name};e.publisher.logo&&(t.logo={"@type":"ImageObject",url:e.publisher.logo}),a.publisher=t;}return a}function l(e){let a={"@context":r,"@type":"Product",name:e.name,url:e.url};if(e.description&&(a.description=e.description),e.images?.length&&(a.image=e.images),e.brand&&(a.brand={"@type":"Brand",name:e.brand}),e.sku&&(a.sku=e.sku),e.gtin&&(a.gtin=e.gtin),e.price!==void 0){let t={"@type":"Offer",price:e.price,priceCurrency:e.priceCurrency??"USD"};e.availability&&(t.availability=`https://schema.org/${e.availability}`),a.offers=t;}if(e.ratingValue!==void 0){let t={"@type":"AggregateRating",ratingValue:e.ratingValue};e.reviewCount!==void 0&&(t.reviewCount=e.reviewCount),a.aggregateRating=t;}return a}function d(e){return {"@context":r,"@type":"FAQPage",mainEntity:e.map(a=>({"@type":"Question",name:a.question,acceptedAnswer:{"@type":"Answer",text:a.answer}}))}}function g(...e){return {"@context":r,"@type":"ItemList","@graph":e.map(({"@context":a,...t})=>t)}}
2
+ export{n as a,i as b,s as c,m as d,l as e,d as f,g};//# sourceMappingURL=chunk-ES4OXVOR.js.map
3
+ //# sourceMappingURL=chunk-ES4OXVOR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/index.ts"],"names":["CONTEXT","createOrganizationSchema","input","schema","cp","createWebsiteSchema","createBreadcrumbSchema","items","item","index","createArticleSchema","authors","a","person","pub","createProductSchema","offer","rating","createFAQSchema","composeSchemas","schemas","_ctx","rest"],"mappings":"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","file":"chunk-ES4OXVOR.js","sourcesContent":["import type {\n JSONLDBase,\n BreadcrumbItem,\n OrganizationSchemaInput,\n WebsiteSchemaInput,\n ArticleSchemaInput,\n ProductSchemaInput,\n FAQItem,\n} from \"../types/index.js\";\n\nconst CONTEXT = \"https://schema.org\";\n\n// ─── Organization ─────────────────────────────────────────────\n\nexport function createOrganizationSchema(\n input: OrganizationSchemaInput\n): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Organization\",\n name: input.name,\n url: input.url,\n };\n\n if (input.logo) schema.logo = input.logo;\n if (input.description) schema.description = input.description;\n if (input.sameAs?.length) schema.sameAs = input.sameAs;\n\n if (input.contactPoint) {\n const cp: Record<string, unknown> = {\n \"@type\": \"ContactPoint\",\n };\n if (input.contactPoint.telephone)\n cp.telephone = input.contactPoint.telephone;\n if (input.contactPoint.contactType)\n cp.contactType = input.contactPoint.contactType;\n if (input.contactPoint.email) cp.email = input.contactPoint.email;\n if (input.contactPoint.areaServed)\n cp.areaServed = input.contactPoint.areaServed;\n if (input.contactPoint.availableLanguage)\n cp.availableLanguage = input.contactPoint.availableLanguage;\n schema.contactPoint = cp;\n }\n\n return schema;\n}\n\n// ─── Website ──────────────────────────────────────────────────\n\nexport function createWebsiteSchema(input: WebsiteSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"WebSite\",\n name: input.name,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n\n if (input.searchUrl) {\n schema.potentialAction = {\n \"@type\": \"SearchAction\",\n target: {\n \"@type\": \"EntryPoint\",\n urlTemplate: `${input.searchUrl}?${input.searchQueryParam ?? \"q\"}={search_term_string}`,\n },\n \"query-input\": \"required name=search_term_string\",\n };\n }\n\n return schema;\n}\n\n// ─── Breadcrumb ───────────────────────────────────────────────\n\nexport function createBreadcrumbSchema(items: BreadcrumbItem[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"BreadcrumbList\",\n itemListElement: items.map((item, index) => ({\n \"@type\": \"ListItem\",\n position: index + 1,\n name: item.name,\n item: item.url,\n })),\n };\n}\n\n// ─── Article ──────────────────────────────────────────────────\n\nexport function createArticleSchema(input: ArticleSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Article\",\n headline: input.headline,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n if (input.images?.length) schema.image = input.images;\n if (input.datePublished) schema.datePublished = input.datePublished;\n if (input.dateModified) schema.dateModified = input.dateModified;\n if (input.section) schema.articleSection = input.section;\n if (input.keywords?.length) schema.keywords = input.keywords;\n\n if (input.author) {\n const authors = Array.isArray(input.author)\n ? input.author\n : [input.author];\n schema.author = authors.map((a) => {\n const person: Record<string, string> = {\n \"@type\": \"Person\",\n name: a.name,\n };\n if (a.url) person.url = a.url;\n return person;\n });\n }\n\n if (input.publisher) {\n const pub: Record<string, unknown> = {\n \"@type\": \"Organization\",\n name: input.publisher.name,\n };\n if (input.publisher.logo) {\n pub.logo = {\n \"@type\": \"ImageObject\",\n url: input.publisher.logo,\n };\n }\n schema.publisher = pub;\n }\n\n return schema;\n}\n\n// ─── Product ──────────────────────────────────────────────────\n\nexport function createProductSchema(input: ProductSchemaInput): JSONLDBase {\n const schema: JSONLDBase = {\n \"@context\": CONTEXT,\n \"@type\": \"Product\",\n name: input.name,\n url: input.url,\n };\n\n if (input.description) schema.description = input.description;\n if (input.images?.length) schema.image = input.images;\n if (input.brand) {\n schema.brand = { \"@type\": \"Brand\", name: input.brand };\n }\n if (input.sku) schema.sku = input.sku;\n if (input.gtin) schema.gtin = input.gtin;\n\n if (input.price !== undefined) {\n const offer: Record<string, unknown> = {\n \"@type\": \"Offer\",\n price: input.price,\n priceCurrency: input.priceCurrency ?? \"USD\",\n };\n if (input.availability) {\n offer.availability = `https://schema.org/${input.availability}`;\n }\n schema.offers = offer;\n }\n\n if (input.ratingValue !== undefined) {\n const rating: Record<string, unknown> = {\n \"@type\": \"AggregateRating\",\n ratingValue: input.ratingValue,\n };\n if (input.reviewCount !== undefined) rating.reviewCount = input.reviewCount;\n schema.aggregateRating = rating;\n }\n\n return schema;\n}\n\n// ─── FAQ ──────────────────────────────────────────────────────\n\nexport function createFAQSchema(items: FAQItem[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"FAQPage\",\n mainEntity: items.map((item) => ({\n \"@type\": \"Question\",\n name: item.question,\n acceptedAnswer: {\n \"@type\": \"Answer\",\n text: item.answer,\n },\n })),\n };\n}\n\n// ─── Schema composition ───────────────────────────────────────\n\n/**\n * Compose multiple JSON-LD schemas into a single @graph array.\n * Useful for embedding multiple structured data blocks in one script tag.\n */\nexport function composeSchemas(...schemas: JSONLDBase[]): JSONLDBase {\n return {\n \"@context\": CONTEXT,\n \"@type\": \"ItemList\",\n \"@graph\": schemas.map(({ \"@context\": _ctx, ...rest }) => rest),\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var o=require('react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var o__default=/*#__PURE__*/_interopDefault(o);function g(t){let e=JSON.stringify(t,(n,r)=>{if(r!=null)return r});return e?e.replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"):"{}"}function M(t){let e={};for(let n of Object.keys(t)){let r=t[n];r!=null&&r!==""&&(e[n]=r);}return e}function y(t,e){let n={...t},r=e,c=t;for(let a of Object.keys(r)){let p=r[a],f=c[a];p!==void 0&&(p!==null&&typeof p=="object"&&!Array.isArray(p)&&f!==null&&typeof f=="object"&&!Array.isArray(f)?n[a]=y(f,p):n[a]=p);}return n}function u(t){let e=t.trim();return e==="/"||e===""?e:e.replace(/\/+$/,"")}function v(t,e){let n=u(t);if(!e||e==="/")return n;let r=e.startsWith("/")?e:`/${e}`;return n+u(r)}function I(t={}){return E(t)}function _(t,e){let n=y(t,e);return e.alternates!==void 0&&(n.alternates=e.alternates),e.additionalMetaTags!==void 0&&(n.additionalMetaTags=e.additionalMetaTags),e.additionalLinkTags!==void 0&&(n.additionalLinkTags=e.additionalLinkTags),e.jsonLd!==void 0&&(n.jsonLd=e.jsonLd),E(n)}function E(t){let e={...t};return e.title&&(e.title=e.title.trim()),e.description&&(e.description=e.description.trim()),e.canonical&&(e.canonical=u(e.canonical)),e}function b(t,e){if(!t)return "";let n=t.trim();return e?e.replace(/%s/g,n):n}function G(t,e){if(!t)return "";let n=t.trim();return !e||n.length<=e?n:n.slice(0,e).trimEnd()+"\u2026"}function H(t,e){let n=u(t);if(!e||e==="/")return n;let r=e.startsWith("/")?e:`/${e}`;return n+u(r)}function O(t){if(!t)return "";let e=[];return t.index===false?e.push("noindex"):t.index===true&&e.push("index"),t.follow===false?e.push("nofollow"):t.follow===true&&e.push("follow"),t.noarchive&&e.push("noarchive"),t.nosnippet&&e.push("nosnippet"),t.noimageindex&&e.push("noimageindex"),t.notranslate&&e.push("notranslate"),t.maxSnippet!==void 0&&e.push(`max-snippet:${t.maxSnippet}`),t.maxImagePreview&&e.push(`max-image-preview:${t.maxImagePreview}`),t.maxVideoPreview!==void 0&&e.push(`max-video-preview:${t.maxVideoPreview}`),e.join(", ")}function U(){return {index:false,follow:false}}function V(){return {index:false,follow:true}}function S(t){if(!t)return [];let e=[],n=[["title","og:title"],["description","og:description"],["url","og:url"],["siteName","og:site_name"],["type","og:type"],["locale","og:locale"]];for(let[r,c]of n){let a=t[r];typeof a=="string"&&a.trim()&&e.push({property:c,content:a.trim()});}if(t.images)for(let r of t.images)r.url&&(e.push({property:"og:image",content:r.url}),r.alt&&e.push({property:"og:image:alt",content:r.alt}),r.width&&e.push({property:"og:image:width",content:String(r.width)}),r.height&&e.push({property:"og:image:height",content:String(r.height)}),r.type&&e.push({property:"og:image:type",content:r.type}));return e}function C(t){if(!t)return [];let e=[];return t.card&&e.push({name:"twitter:card",content:t.card}),t.site&&e.push({name:"twitter:site",content:t.site}),t.creator&&e.push({name:"twitter:creator",content:t.creator}),t.title&&e.push({name:"twitter:title",content:t.title}),t.description&&e.push({name:"twitter:description",content:t.description}),t.image&&e.push({name:"twitter:image",content:t.image}),t.imageAlt&&e.push({name:"twitter:image:alt",content:t.imageAlt}),e}function T(t){return !t||t.length===0?[]:t.map(e=>({rel:"alternate",hreflang:e.hreflang,href:u(e.href)}))}function W({title:t,titleTemplate:e,description:n,canonical:r,robots:c,openGraph:a,twitter:p,alternates:f,additionalMetaTags:h,additionalLinkTags:x,jsonLd:d,nonce:R}){let s=[],A=0,l=()=>`seo-${A++}`,k=b(t,e);k&&s.push(o__default.default.createElement("title",{key:l()},k)),n?.trim()&&s.push(o__default.default.createElement("meta",{key:l(),name:"description",content:n.trim()})),r?.trim()&&s.push(o__default.default.createElement("link",{key:l(),rel:"canonical",href:r.trim()}));let w=O(c);w&&s.push(o__default.default.createElement("meta",{key:l(),name:"robots",content:w}));let L=S(a);for(let i of L)s.push(o__default.default.createElement("meta",{key:l(),property:i.property,content:i.content}));let P=C(p);for(let i of P)s.push(o__default.default.createElement("meta",{key:l(),name:i.name,content:i.content}));let j=T(f);for(let i of j)s.push(o__default.default.createElement("link",{key:l(),rel:i.rel,hrefLang:i.hreflang,href:i.href}));if(h)for(let i of h){let m={content:i.content};i.name&&(m.name=i.name),i.property&&(m.property=i.property),s.push(o__default.default.createElement("meta",{key:l(),...m}));}if(x)for(let i of x)s.push(o__default.default.createElement("link",{key:l(),...i}));if(d){let i=Array.isArray(d)?d:[d];for(let m of i)s.push(o__default.default.createElement("script",{key:l(),type:"application/ld+json",nonce:R,dangerouslySetInnerHTML:{__html:g(m)}}));}return o__default.default.createElement(o__default.default.Fragment,null,...s)}function X({data:t,nonce:e}){return o__default.default.createElement("script",{type:"application/ld+json",nonce:e,dangerouslySetInnerHTML:{__html:g(t)}})}exports.a=g;exports.b=M;exports.c=y;exports.d=u;exports.e=v;exports.f=I;exports.g=_;exports.h=E;exports.i=b;exports.j=G;exports.k=H;exports.l=O;exports.m=U;exports.n=V;exports.o=S;exports.p=C;exports.q=T;exports.r=W;exports.s=X;//# sourceMappingURL=chunk-QBHCTDUJ.cjs.map
2
+ //# sourceMappingURL=chunk-QBHCTDUJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/core/index.ts","../src/components/SEOHead.tsx","../src/components/JsonLd.tsx"],"names":["safeJsonLdSerialize","data","json","_key","value","omitEmpty","obj","result","key","val","deepMerge","base","override","overrideObj","baseObj","overrideVal","baseVal","normalizeUrl","url","trimmed","buildFullUrl","path","normalizedBase","normalizedPath","createSEOConfig","config","normalizeSEOConfig","mergeSEOConfig","merged","normalized","buildTitle","title","template","buildDescription","description","maxLength","buildCanonicalUrl","baseUrl","buildRobotsDirectives","directives","noIndexNoFollow","noIndex","buildOpenGraph","tags","simple","property","image","buildTwitterMetadata","buildAlternateLinks","alternates","alt","SEOHead","titleTemplate","canonical","robots","openGraph","twitter","additionalMetaTags","additionalLinkTags","jsonLd","nonce","elements","k","resolvedTitle","React","robotsContent","ogTags","tag","twitterTags","altLinks","link","meta","props","schemas","schema","JsonLd"],"mappings":"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","file":"chunk-QBHCTDUJ.cjs","sourcesContent":["/**\n * Safely serialize a value to JSON for use in a <script> tag.\n * Escapes characters that could break out of script context.\n */\nexport function safeJsonLdSerialize(data: unknown): string {\n const json = JSON.stringify(data, (_key, value) => {\n if (value === undefined || value === null) return undefined;\n return value;\n });\n\n if (!json) return \"{}\";\n\n return json\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/&/g, \"\\\\u0026\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\n/**\n * Strip undefined/null values from an object (shallow).\n */\nexport function omitEmpty<T extends Record<string, unknown>>(\n obj: T\n): Partial<T> {\n const result: Partial<T> = {};\n for (const key of Object.keys(obj) as Array<keyof T>) {\n const val = obj[key];\n if (val !== undefined && val !== null && val !== \"\") {\n result[key] = val;\n }\n }\n return result;\n}\n\n/**\n * Deep-merge two objects. Arrays are replaced, not concatenated.\n */\nexport function deepMerge<T>(\n base: T,\n override: Partial<T>\n): T {\n const result = { ...base } as Record<string, unknown>;\n const overrideObj = override as Record<string, unknown>;\n const baseObj = base as Record<string, unknown>;\n\n for (const key of Object.keys(overrideObj)) {\n const overrideVal = overrideObj[key];\n const baseVal = baseObj[key];\n\n if (overrideVal === undefined) continue;\n\n if (\n overrideVal !== null &&\n typeof overrideVal === \"object\" &&\n !Array.isArray(overrideVal) &&\n baseVal !== null &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMerge(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>\n );\n } else {\n result[key] = overrideVal;\n }\n }\n\n return result as T;\n}\n\n/**\n * Normalize a URL by trimming whitespace and removing trailing slashes\n * (except for root \"/\").\n */\nexport function normalizeUrl(url: string): string {\n const trimmed = url.trim();\n if (trimmed === \"/\" || trimmed === \"\") return trimmed;\n return trimmed.replace(/\\/+$/, \"\");\n}\n\n/**\n * Build a full canonical URL from a base and a path.\n */\nexport function buildFullUrl(base: string, path?: string): string {\n const normalizedBase = normalizeUrl(base);\n if (!path || path === \"/\") return normalizedBase;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return normalizedBase + normalizeUrl(normalizedPath);\n}\n","import type {\n SEOConfig,\n OpenGraphConfig,\n TwitterConfig,\n RobotsConfig,\n AlternateLink,\n} from \"../types/index.js\";\nimport { deepMerge, normalizeUrl } from \"../utils/index.js\";\n\n// ─── Config builder ───────────────────────────────────────────\n\n/**\n * Create an SEO config with sensible defaults.\n */\nexport function createSEOConfig(config: SEOConfig = {}): SEOConfig {\n return normalizeSEOConfig(config);\n}\n\n/**\n * Deep-merge a base SEO config with page-level overrides.\n * Useful for combining a global site config with per-page config.\n */\nexport function mergeSEOConfig(\n base: SEOConfig,\n override: SEOConfig\n): SEOConfig {\n const merged = deepMerge(base, override);\n\n // Arrays should be replaced, not deep-merged\n if (override.alternates !== undefined) {\n merged.alternates = override.alternates;\n }\n if (override.additionalMetaTags !== undefined) {\n merged.additionalMetaTags = override.additionalMetaTags;\n }\n if (override.additionalLinkTags !== undefined) {\n merged.additionalLinkTags = override.additionalLinkTags;\n }\n if (override.jsonLd !== undefined) {\n merged.jsonLd = override.jsonLd;\n }\n\n return normalizeSEOConfig(merged);\n}\n\n/**\n * Normalize an SEO config: trim strings, normalize URLs, remove empties.\n */\nexport function normalizeSEOConfig(config: SEOConfig): SEOConfig {\n const normalized: SEOConfig = { ...config };\n\n if (normalized.title) {\n normalized.title = normalized.title.trim();\n }\n if (normalized.description) {\n normalized.description = normalized.description.trim();\n }\n if (normalized.canonical) {\n normalized.canonical = normalizeUrl(normalized.canonical);\n }\n\n return normalized;\n}\n\n// ─── Title ────────────────────────────────────────────────────\n\n/**\n * Build a title string, optionally applying a template.\n * Template uses `%s` as the placeholder for the page title.\n *\n * @example\n * buildTitle(\"About\", \"%s | MySite\") // \"About | MySite\"\n * buildTitle(\"Home\") // \"Home\"\n */\nexport function buildTitle(title?: string, template?: string): string {\n if (!title) return \"\";\n const trimmed = title.trim();\n if (!template) return trimmed;\n return template.replace(/%s/g, trimmed);\n}\n\n/**\n * Build a description, truncating at a max length if specified.\n */\nexport function buildDescription(\n description?: string,\n maxLength?: number\n): string {\n if (!description) return \"\";\n const trimmed = description.trim();\n if (!maxLength || trimmed.length <= maxLength) return trimmed;\n return trimmed.slice(0, maxLength).trimEnd() + \"…\";\n}\n\n// ─── Canonical URL ────────────────────────────────────────────\n\n/**\n * Build a canonical URL from a base URL and optional path.\n */\nexport function buildCanonicalUrl(\n baseUrl: string,\n path?: string\n): string {\n const normalizedBase = normalizeUrl(baseUrl);\n if (!path || path === \"/\") return normalizedBase;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return normalizedBase + normalizeUrl(normalizedPath);\n}\n\n// ─── Robots ───────────────────────────────────────────────────\n\n/**\n * Build a robots meta content string from a config.\n *\n * @example\n * buildRobotsDirectives({ index: true, follow: true }) // \"index, follow\"\n * buildRobotsDirectives({ index: false, follow: false, noarchive: true })\n * // \"noindex, nofollow, noarchive\"\n */\nexport function buildRobotsDirectives(config?: RobotsConfig): string {\n if (!config) return \"\";\n\n const directives: string[] = [];\n\n if (config.index === false) directives.push(\"noindex\");\n else if (config.index === true) directives.push(\"index\");\n\n if (config.follow === false) directives.push(\"nofollow\");\n else if (config.follow === true) directives.push(\"follow\");\n\n if (config.noarchive) directives.push(\"noarchive\");\n if (config.nosnippet) directives.push(\"nosnippet\");\n if (config.noimageindex) directives.push(\"noimageindex\");\n if (config.notranslate) directives.push(\"notranslate\");\n\n if (config.maxSnippet !== undefined)\n directives.push(`max-snippet:${config.maxSnippet}`);\n if (config.maxImagePreview)\n directives.push(`max-image-preview:${config.maxImagePreview}`);\n if (config.maxVideoPreview !== undefined)\n directives.push(`max-video-preview:${config.maxVideoPreview}`);\n\n return directives.join(\", \");\n}\n\n// ─── Convenience helpers ──────────────────────────────────────\n\n/**\n * Create a noindex/nofollow robots config.\n */\nexport function noIndexNoFollow(): RobotsConfig {\n return { index: false, follow: false };\n}\n\n/**\n * Create a noindex robots config that still allows following links.\n */\nexport function noIndex(): RobotsConfig {\n return { index: false, follow: true };\n}\n\n// ─── Open Graph ───────────────────────────────────────────────\n\n/**\n * Build Open Graph meta tag entries from config.\n * Returns an array of { property, content } pairs.\n */\nexport function buildOpenGraph(\n config?: OpenGraphConfig\n): Array<{ property: string; content: string }> {\n if (!config) return [];\n\n const tags: Array<{ property: string; content: string }> = [];\n\n const simple: Array<[keyof OpenGraphConfig, string]> = [\n [\"title\", \"og:title\"],\n [\"description\", \"og:description\"],\n [\"url\", \"og:url\"],\n [\"siteName\", \"og:site_name\"],\n [\"type\", \"og:type\"],\n [\"locale\", \"og:locale\"],\n ];\n\n for (const [key, property] of simple) {\n const value = config[key];\n if (typeof value === \"string\" && value.trim()) {\n tags.push({ property, content: value.trim() });\n }\n }\n\n if (config.images) {\n for (const image of config.images) {\n if (!image.url) continue;\n tags.push({ property: \"og:image\", content: image.url });\n if (image.alt) tags.push({ property: \"og:image:alt\", content: image.alt });\n if (image.width)\n tags.push({\n property: \"og:image:width\",\n content: String(image.width),\n });\n if (image.height)\n tags.push({\n property: \"og:image:height\",\n content: String(image.height),\n });\n if (image.type)\n tags.push({ property: \"og:image:type\", content: image.type });\n }\n }\n\n return tags;\n}\n\n// ─── Twitter ──────────────────────────────────────────────────\n\n/**\n * Build Twitter card meta tag entries from config.\n * Returns an array of { name, content } pairs.\n */\nexport function buildTwitterMetadata(\n config?: TwitterConfig\n): Array<{ name: string; content: string }> {\n if (!config) return [];\n\n const tags: Array<{ name: string; content: string }> = [];\n\n if (config.card) tags.push({ name: \"twitter:card\", content: config.card });\n if (config.site) tags.push({ name: \"twitter:site\", content: config.site });\n if (config.creator)\n tags.push({ name: \"twitter:creator\", content: config.creator });\n if (config.title)\n tags.push({ name: \"twitter:title\", content: config.title });\n if (config.description)\n tags.push({ name: \"twitter:description\", content: config.description });\n if (config.image)\n tags.push({ name: \"twitter:image\", content: config.image });\n if (config.imageAlt)\n tags.push({ name: \"twitter:image:alt\", content: config.imageAlt });\n\n return tags;\n}\n\n// ─── Hreflang ─────────────────────────────────────────────────\n\n/**\n * Build alternate link entries for hreflang from an array of alternates.\n * Returns an array of { rel, hreflang, href } suitable for <link> tags.\n */\nexport function buildAlternateLinks(\n alternates?: AlternateLink[]\n): Array<{ rel: string; hreflang: string; href: string }> {\n if (!alternates || alternates.length === 0) return [];\n return alternates.map((alt) => ({\n rel: \"alternate\",\n hreflang: alt.hreflang,\n href: normalizeUrl(alt.href),\n }));\n}\n","import React from \"react\";\nimport type { SEOConfig } from \"../types/index.js\";\nimport {\n buildTitle,\n buildRobotsDirectives,\n buildOpenGraph,\n buildTwitterMetadata,\n buildAlternateLinks,\n} from \"../core/index.js\";\nimport { safeJsonLdSerialize } from \"../utils/index.js\";\n\nexport interface SEOHeadProps extends SEOConfig {\n /**\n * Optional nonce for CSP-compatible script tags.\n */\n nonce?: string;\n}\n\n/**\n * Generic SSR-safe React component that renders SEO-related tags.\n *\n * Renders: title, meta description, canonical link, robots meta,\n * Open Graph tags, Twitter tags, alternate/hreflang links,\n * additional meta/link tags, and JSON-LD scripts.\n *\n * Designed to be placed inside a <head> element in SSR apps.\n * Does NOT use any browser globals — fully SSR-compatible.\n */\nexport function SEOHead({\n title,\n titleTemplate,\n description,\n canonical,\n robots,\n openGraph,\n twitter,\n alternates,\n additionalMetaTags,\n additionalLinkTags,\n jsonLd,\n nonce,\n}: SEOHeadProps): React.ReactElement {\n const elements: React.ReactElement[] = [];\n let key = 0;\n const k = () => `seo-${key++}`;\n\n // Title\n const resolvedTitle = buildTitle(title, titleTemplate);\n if (resolvedTitle) {\n elements.push(React.createElement(\"title\", { key: k() }, resolvedTitle));\n }\n\n // Description\n if (description?.trim()) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: \"description\",\n content: description.trim(),\n })\n );\n }\n\n // Canonical\n if (canonical?.trim()) {\n elements.push(\n React.createElement(\"link\", {\n key: k(),\n rel: \"canonical\",\n href: canonical.trim(),\n })\n );\n }\n\n // Robots\n const robotsContent = buildRobotsDirectives(robots);\n if (robotsContent) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: \"robots\",\n content: robotsContent,\n })\n );\n }\n\n // Open Graph\n const ogTags = buildOpenGraph(openGraph);\n for (const tag of ogTags) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n property: tag.property,\n content: tag.content,\n })\n );\n }\n\n // Twitter\n const twitterTags = buildTwitterMetadata(twitter);\n for (const tag of twitterTags) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: tag.name,\n content: tag.content,\n })\n );\n }\n\n // Hreflang alternates\n const altLinks = buildAlternateLinks(alternates);\n for (const link of altLinks) {\n elements.push(\n React.createElement(\"link\", {\n key: k(),\n rel: link.rel,\n hrefLang: link.hreflang,\n href: link.href,\n })\n );\n }\n\n // Additional meta tags\n if (additionalMetaTags) {\n for (const meta of additionalMetaTags) {\n const props: Record<string, string> = { content: meta.content };\n if (meta.name) props.name = meta.name;\n if (meta.property) props.property = meta.property;\n elements.push(React.createElement(\"meta\", { key: k(), ...props }));\n }\n }\n\n // Additional link tags\n if (additionalLinkTags) {\n for (const link of additionalLinkTags) {\n elements.push(React.createElement(\"link\", { key: k(), ...link }));\n }\n }\n\n // JSON-LD\n if (jsonLd) {\n const schemas = Array.isArray(jsonLd) ? jsonLd : [jsonLd];\n for (const schema of schemas) {\n elements.push(\n React.createElement(\"script\", {\n key: k(),\n type: \"application/ld+json\",\n nonce,\n dangerouslySetInnerHTML: {\n __html: safeJsonLdSerialize(schema),\n },\n })\n );\n }\n }\n\n return React.createElement(React.Fragment, null, ...elements);\n}\n","import React from \"react\";\nimport { safeJsonLdSerialize } from \"../utils/index.js\";\n\nexport interface JsonLdProps {\n data: Record<string, unknown> | Array<Record<string, unknown>>;\n nonce?: string;\n}\n\n/**\n * Renders a <script type=\"application/ld+json\"> tag with safely serialized JSON-LD.\n * SSR-safe: no browser globals used.\n */\nexport function JsonLd({ data, nonce }: JsonLdProps): React.ReactElement {\n return React.createElement(\"script\", {\n type: \"application/ld+json\",\n nonce,\n dangerouslySetInnerHTML: {\n __html: safeJsonLdSerialize(data),\n },\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import o from'react';function g(t){let e=JSON.stringify(t,(n,r)=>{if(r!=null)return r});return e?e.replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"):"{}"}function M(t){let e={};for(let n of Object.keys(t)){let r=t[n];r!=null&&r!==""&&(e[n]=r);}return e}function y(t,e){let n={...t},r=e,c=t;for(let a of Object.keys(r)){let p=r[a],f=c[a];p!==void 0&&(p!==null&&typeof p=="object"&&!Array.isArray(p)&&f!==null&&typeof f=="object"&&!Array.isArray(f)?n[a]=y(f,p):n[a]=p);}return n}function u(t){let e=t.trim();return e==="/"||e===""?e:e.replace(/\/+$/,"")}function v(t,e){let n=u(t);if(!e||e==="/")return n;let r=e.startsWith("/")?e:`/${e}`;return n+u(r)}function I(t={}){return E(t)}function _(t,e){let n=y(t,e);return e.alternates!==void 0&&(n.alternates=e.alternates),e.additionalMetaTags!==void 0&&(n.additionalMetaTags=e.additionalMetaTags),e.additionalLinkTags!==void 0&&(n.additionalLinkTags=e.additionalLinkTags),e.jsonLd!==void 0&&(n.jsonLd=e.jsonLd),E(n)}function E(t){let e={...t};return e.title&&(e.title=e.title.trim()),e.description&&(e.description=e.description.trim()),e.canonical&&(e.canonical=u(e.canonical)),e}function b(t,e){if(!t)return "";let n=t.trim();return e?e.replace(/%s/g,n):n}function G(t,e){if(!t)return "";let n=t.trim();return !e||n.length<=e?n:n.slice(0,e).trimEnd()+"\u2026"}function H(t,e){let n=u(t);if(!e||e==="/")return n;let r=e.startsWith("/")?e:`/${e}`;return n+u(r)}function O(t){if(!t)return "";let e=[];return t.index===false?e.push("noindex"):t.index===true&&e.push("index"),t.follow===false?e.push("nofollow"):t.follow===true&&e.push("follow"),t.noarchive&&e.push("noarchive"),t.nosnippet&&e.push("nosnippet"),t.noimageindex&&e.push("noimageindex"),t.notranslate&&e.push("notranslate"),t.maxSnippet!==void 0&&e.push(`max-snippet:${t.maxSnippet}`),t.maxImagePreview&&e.push(`max-image-preview:${t.maxImagePreview}`),t.maxVideoPreview!==void 0&&e.push(`max-video-preview:${t.maxVideoPreview}`),e.join(", ")}function U(){return {index:false,follow:false}}function V(){return {index:false,follow:true}}function S(t){if(!t)return [];let e=[],n=[["title","og:title"],["description","og:description"],["url","og:url"],["siteName","og:site_name"],["type","og:type"],["locale","og:locale"]];for(let[r,c]of n){let a=t[r];typeof a=="string"&&a.trim()&&e.push({property:c,content:a.trim()});}if(t.images)for(let r of t.images)r.url&&(e.push({property:"og:image",content:r.url}),r.alt&&e.push({property:"og:image:alt",content:r.alt}),r.width&&e.push({property:"og:image:width",content:String(r.width)}),r.height&&e.push({property:"og:image:height",content:String(r.height)}),r.type&&e.push({property:"og:image:type",content:r.type}));return e}function C(t){if(!t)return [];let e=[];return t.card&&e.push({name:"twitter:card",content:t.card}),t.site&&e.push({name:"twitter:site",content:t.site}),t.creator&&e.push({name:"twitter:creator",content:t.creator}),t.title&&e.push({name:"twitter:title",content:t.title}),t.description&&e.push({name:"twitter:description",content:t.description}),t.image&&e.push({name:"twitter:image",content:t.image}),t.imageAlt&&e.push({name:"twitter:image:alt",content:t.imageAlt}),e}function T(t){return !t||t.length===0?[]:t.map(e=>({rel:"alternate",hreflang:e.hreflang,href:u(e.href)}))}function W({title:t,titleTemplate:e,description:n,canonical:r,robots:c,openGraph:a,twitter:p,alternates:f,additionalMetaTags:h,additionalLinkTags:x,jsonLd:d,nonce:R}){let s=[],A=0,l=()=>`seo-${A++}`,k=b(t,e);k&&s.push(o.createElement("title",{key:l()},k)),n?.trim()&&s.push(o.createElement("meta",{key:l(),name:"description",content:n.trim()})),r?.trim()&&s.push(o.createElement("link",{key:l(),rel:"canonical",href:r.trim()}));let w=O(c);w&&s.push(o.createElement("meta",{key:l(),name:"robots",content:w}));let L=S(a);for(let i of L)s.push(o.createElement("meta",{key:l(),property:i.property,content:i.content}));let P=C(p);for(let i of P)s.push(o.createElement("meta",{key:l(),name:i.name,content:i.content}));let j=T(f);for(let i of j)s.push(o.createElement("link",{key:l(),rel:i.rel,hrefLang:i.hreflang,href:i.href}));if(h)for(let i of h){let m={content:i.content};i.name&&(m.name=i.name),i.property&&(m.property=i.property),s.push(o.createElement("meta",{key:l(),...m}));}if(x)for(let i of x)s.push(o.createElement("link",{key:l(),...i}));if(d){let i=Array.isArray(d)?d:[d];for(let m of i)s.push(o.createElement("script",{key:l(),type:"application/ld+json",nonce:R,dangerouslySetInnerHTML:{__html:g(m)}}));}return o.createElement(o.Fragment,null,...s)}function X({data:t,nonce:e}){return o.createElement("script",{type:"application/ld+json",nonce:e,dangerouslySetInnerHTML:{__html:g(t)}})}export{g as a,M as b,y as c,u as d,v as e,I as f,_ as g,E as h,b as i,G as j,H as k,O as l,U as m,V as n,S as o,C as p,T as q,W as r,X as s};//# sourceMappingURL=chunk-YMCW2G4X.js.map
2
+ //# sourceMappingURL=chunk-YMCW2G4X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/core/index.ts","../src/components/SEOHead.tsx","../src/components/JsonLd.tsx"],"names":["safeJsonLdSerialize","data","json","_key","value","omitEmpty","obj","result","key","val","deepMerge","base","override","overrideObj","baseObj","overrideVal","baseVal","normalizeUrl","url","trimmed","buildFullUrl","path","normalizedBase","normalizedPath","createSEOConfig","config","normalizeSEOConfig","mergeSEOConfig","merged","normalized","buildTitle","title","template","buildDescription","description","maxLength","buildCanonicalUrl","baseUrl","buildRobotsDirectives","directives","noIndexNoFollow","noIndex","buildOpenGraph","tags","simple","property","image","buildTwitterMetadata","buildAlternateLinks","alternates","alt","SEOHead","titleTemplate","canonical","robots","openGraph","twitter","additionalMetaTags","additionalLinkTags","jsonLd","nonce","elements","k","resolvedTitle","React","robotsContent","ogTags","tag","twitterTags","altLinks","link","meta","props","schemas","schema","JsonLd"],"mappings":"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","file":"chunk-YMCW2G4X.js","sourcesContent":["/**\n * Safely serialize a value to JSON for use in a <script> tag.\n * Escapes characters that could break out of script context.\n */\nexport function safeJsonLdSerialize(data: unknown): string {\n const json = JSON.stringify(data, (_key, value) => {\n if (value === undefined || value === null) return undefined;\n return value;\n });\n\n if (!json) return \"{}\";\n\n return json\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/&/g, \"\\\\u0026\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\n/**\n * Strip undefined/null values from an object (shallow).\n */\nexport function omitEmpty<T extends Record<string, unknown>>(\n obj: T\n): Partial<T> {\n const result: Partial<T> = {};\n for (const key of Object.keys(obj) as Array<keyof T>) {\n const val = obj[key];\n if (val !== undefined && val !== null && val !== \"\") {\n result[key] = val;\n }\n }\n return result;\n}\n\n/**\n * Deep-merge two objects. Arrays are replaced, not concatenated.\n */\nexport function deepMerge<T>(\n base: T,\n override: Partial<T>\n): T {\n const result = { ...base } as Record<string, unknown>;\n const overrideObj = override as Record<string, unknown>;\n const baseObj = base as Record<string, unknown>;\n\n for (const key of Object.keys(overrideObj)) {\n const overrideVal = overrideObj[key];\n const baseVal = baseObj[key];\n\n if (overrideVal === undefined) continue;\n\n if (\n overrideVal !== null &&\n typeof overrideVal === \"object\" &&\n !Array.isArray(overrideVal) &&\n baseVal !== null &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMerge(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>\n );\n } else {\n result[key] = overrideVal;\n }\n }\n\n return result as T;\n}\n\n/**\n * Normalize a URL by trimming whitespace and removing trailing slashes\n * (except for root \"/\").\n */\nexport function normalizeUrl(url: string): string {\n const trimmed = url.trim();\n if (trimmed === \"/\" || trimmed === \"\") return trimmed;\n return trimmed.replace(/\\/+$/, \"\");\n}\n\n/**\n * Build a full canonical URL from a base and a path.\n */\nexport function buildFullUrl(base: string, path?: string): string {\n const normalizedBase = normalizeUrl(base);\n if (!path || path === \"/\") return normalizedBase;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return normalizedBase + normalizeUrl(normalizedPath);\n}\n","import type {\n SEOConfig,\n OpenGraphConfig,\n TwitterConfig,\n RobotsConfig,\n AlternateLink,\n} from \"../types/index.js\";\nimport { deepMerge, normalizeUrl } from \"../utils/index.js\";\n\n// ─── Config builder ───────────────────────────────────────────\n\n/**\n * Create an SEO config with sensible defaults.\n */\nexport function createSEOConfig(config: SEOConfig = {}): SEOConfig {\n return normalizeSEOConfig(config);\n}\n\n/**\n * Deep-merge a base SEO config with page-level overrides.\n * Useful for combining a global site config with per-page config.\n */\nexport function mergeSEOConfig(\n base: SEOConfig,\n override: SEOConfig\n): SEOConfig {\n const merged = deepMerge(base, override);\n\n // Arrays should be replaced, not deep-merged\n if (override.alternates !== undefined) {\n merged.alternates = override.alternates;\n }\n if (override.additionalMetaTags !== undefined) {\n merged.additionalMetaTags = override.additionalMetaTags;\n }\n if (override.additionalLinkTags !== undefined) {\n merged.additionalLinkTags = override.additionalLinkTags;\n }\n if (override.jsonLd !== undefined) {\n merged.jsonLd = override.jsonLd;\n }\n\n return normalizeSEOConfig(merged);\n}\n\n/**\n * Normalize an SEO config: trim strings, normalize URLs, remove empties.\n */\nexport function normalizeSEOConfig(config: SEOConfig): SEOConfig {\n const normalized: SEOConfig = { ...config };\n\n if (normalized.title) {\n normalized.title = normalized.title.trim();\n }\n if (normalized.description) {\n normalized.description = normalized.description.trim();\n }\n if (normalized.canonical) {\n normalized.canonical = normalizeUrl(normalized.canonical);\n }\n\n return normalized;\n}\n\n// ─── Title ────────────────────────────────────────────────────\n\n/**\n * Build a title string, optionally applying a template.\n * Template uses `%s` as the placeholder for the page title.\n *\n * @example\n * buildTitle(\"About\", \"%s | MySite\") // \"About | MySite\"\n * buildTitle(\"Home\") // \"Home\"\n */\nexport function buildTitle(title?: string, template?: string): string {\n if (!title) return \"\";\n const trimmed = title.trim();\n if (!template) return trimmed;\n return template.replace(/%s/g, trimmed);\n}\n\n/**\n * Build a description, truncating at a max length if specified.\n */\nexport function buildDescription(\n description?: string,\n maxLength?: number\n): string {\n if (!description) return \"\";\n const trimmed = description.trim();\n if (!maxLength || trimmed.length <= maxLength) return trimmed;\n return trimmed.slice(0, maxLength).trimEnd() + \"…\";\n}\n\n// ─── Canonical URL ────────────────────────────────────────────\n\n/**\n * Build a canonical URL from a base URL and optional path.\n */\nexport function buildCanonicalUrl(\n baseUrl: string,\n path?: string\n): string {\n const normalizedBase = normalizeUrl(baseUrl);\n if (!path || path === \"/\") return normalizedBase;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return normalizedBase + normalizeUrl(normalizedPath);\n}\n\n// ─── Robots ───────────────────────────────────────────────────\n\n/**\n * Build a robots meta content string from a config.\n *\n * @example\n * buildRobotsDirectives({ index: true, follow: true }) // \"index, follow\"\n * buildRobotsDirectives({ index: false, follow: false, noarchive: true })\n * // \"noindex, nofollow, noarchive\"\n */\nexport function buildRobotsDirectives(config?: RobotsConfig): string {\n if (!config) return \"\";\n\n const directives: string[] = [];\n\n if (config.index === false) directives.push(\"noindex\");\n else if (config.index === true) directives.push(\"index\");\n\n if (config.follow === false) directives.push(\"nofollow\");\n else if (config.follow === true) directives.push(\"follow\");\n\n if (config.noarchive) directives.push(\"noarchive\");\n if (config.nosnippet) directives.push(\"nosnippet\");\n if (config.noimageindex) directives.push(\"noimageindex\");\n if (config.notranslate) directives.push(\"notranslate\");\n\n if (config.maxSnippet !== undefined)\n directives.push(`max-snippet:${config.maxSnippet}`);\n if (config.maxImagePreview)\n directives.push(`max-image-preview:${config.maxImagePreview}`);\n if (config.maxVideoPreview !== undefined)\n directives.push(`max-video-preview:${config.maxVideoPreview}`);\n\n return directives.join(\", \");\n}\n\n// ─── Convenience helpers ──────────────────────────────────────\n\n/**\n * Create a noindex/nofollow robots config.\n */\nexport function noIndexNoFollow(): RobotsConfig {\n return { index: false, follow: false };\n}\n\n/**\n * Create a noindex robots config that still allows following links.\n */\nexport function noIndex(): RobotsConfig {\n return { index: false, follow: true };\n}\n\n// ─── Open Graph ───────────────────────────────────────────────\n\n/**\n * Build Open Graph meta tag entries from config.\n * Returns an array of { property, content } pairs.\n */\nexport function buildOpenGraph(\n config?: OpenGraphConfig\n): Array<{ property: string; content: string }> {\n if (!config) return [];\n\n const tags: Array<{ property: string; content: string }> = [];\n\n const simple: Array<[keyof OpenGraphConfig, string]> = [\n [\"title\", \"og:title\"],\n [\"description\", \"og:description\"],\n [\"url\", \"og:url\"],\n [\"siteName\", \"og:site_name\"],\n [\"type\", \"og:type\"],\n [\"locale\", \"og:locale\"],\n ];\n\n for (const [key, property] of simple) {\n const value = config[key];\n if (typeof value === \"string\" && value.trim()) {\n tags.push({ property, content: value.trim() });\n }\n }\n\n if (config.images) {\n for (const image of config.images) {\n if (!image.url) continue;\n tags.push({ property: \"og:image\", content: image.url });\n if (image.alt) tags.push({ property: \"og:image:alt\", content: image.alt });\n if (image.width)\n tags.push({\n property: \"og:image:width\",\n content: String(image.width),\n });\n if (image.height)\n tags.push({\n property: \"og:image:height\",\n content: String(image.height),\n });\n if (image.type)\n tags.push({ property: \"og:image:type\", content: image.type });\n }\n }\n\n return tags;\n}\n\n// ─── Twitter ──────────────────────────────────────────────────\n\n/**\n * Build Twitter card meta tag entries from config.\n * Returns an array of { name, content } pairs.\n */\nexport function buildTwitterMetadata(\n config?: TwitterConfig\n): Array<{ name: string; content: string }> {\n if (!config) return [];\n\n const tags: Array<{ name: string; content: string }> = [];\n\n if (config.card) tags.push({ name: \"twitter:card\", content: config.card });\n if (config.site) tags.push({ name: \"twitter:site\", content: config.site });\n if (config.creator)\n tags.push({ name: \"twitter:creator\", content: config.creator });\n if (config.title)\n tags.push({ name: \"twitter:title\", content: config.title });\n if (config.description)\n tags.push({ name: \"twitter:description\", content: config.description });\n if (config.image)\n tags.push({ name: \"twitter:image\", content: config.image });\n if (config.imageAlt)\n tags.push({ name: \"twitter:image:alt\", content: config.imageAlt });\n\n return tags;\n}\n\n// ─── Hreflang ─────────────────────────────────────────────────\n\n/**\n * Build alternate link entries for hreflang from an array of alternates.\n * Returns an array of { rel, hreflang, href } suitable for <link> tags.\n */\nexport function buildAlternateLinks(\n alternates?: AlternateLink[]\n): Array<{ rel: string; hreflang: string; href: string }> {\n if (!alternates || alternates.length === 0) return [];\n return alternates.map((alt) => ({\n rel: \"alternate\",\n hreflang: alt.hreflang,\n href: normalizeUrl(alt.href),\n }));\n}\n","import React from \"react\";\nimport type { SEOConfig } from \"../types/index.js\";\nimport {\n buildTitle,\n buildRobotsDirectives,\n buildOpenGraph,\n buildTwitterMetadata,\n buildAlternateLinks,\n} from \"../core/index.js\";\nimport { safeJsonLdSerialize } from \"../utils/index.js\";\n\nexport interface SEOHeadProps extends SEOConfig {\n /**\n * Optional nonce for CSP-compatible script tags.\n */\n nonce?: string;\n}\n\n/**\n * Generic SSR-safe React component that renders SEO-related tags.\n *\n * Renders: title, meta description, canonical link, robots meta,\n * Open Graph tags, Twitter tags, alternate/hreflang links,\n * additional meta/link tags, and JSON-LD scripts.\n *\n * Designed to be placed inside a <head> element in SSR apps.\n * Does NOT use any browser globals — fully SSR-compatible.\n */\nexport function SEOHead({\n title,\n titleTemplate,\n description,\n canonical,\n robots,\n openGraph,\n twitter,\n alternates,\n additionalMetaTags,\n additionalLinkTags,\n jsonLd,\n nonce,\n}: SEOHeadProps): React.ReactElement {\n const elements: React.ReactElement[] = [];\n let key = 0;\n const k = () => `seo-${key++}`;\n\n // Title\n const resolvedTitle = buildTitle(title, titleTemplate);\n if (resolvedTitle) {\n elements.push(React.createElement(\"title\", { key: k() }, resolvedTitle));\n }\n\n // Description\n if (description?.trim()) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: \"description\",\n content: description.trim(),\n })\n );\n }\n\n // Canonical\n if (canonical?.trim()) {\n elements.push(\n React.createElement(\"link\", {\n key: k(),\n rel: \"canonical\",\n href: canonical.trim(),\n })\n );\n }\n\n // Robots\n const robotsContent = buildRobotsDirectives(robots);\n if (robotsContent) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: \"robots\",\n content: robotsContent,\n })\n );\n }\n\n // Open Graph\n const ogTags = buildOpenGraph(openGraph);\n for (const tag of ogTags) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n property: tag.property,\n content: tag.content,\n })\n );\n }\n\n // Twitter\n const twitterTags = buildTwitterMetadata(twitter);\n for (const tag of twitterTags) {\n elements.push(\n React.createElement(\"meta\", {\n key: k(),\n name: tag.name,\n content: tag.content,\n })\n );\n }\n\n // Hreflang alternates\n const altLinks = buildAlternateLinks(alternates);\n for (const link of altLinks) {\n elements.push(\n React.createElement(\"link\", {\n key: k(),\n rel: link.rel,\n hrefLang: link.hreflang,\n href: link.href,\n })\n );\n }\n\n // Additional meta tags\n if (additionalMetaTags) {\n for (const meta of additionalMetaTags) {\n const props: Record<string, string> = { content: meta.content };\n if (meta.name) props.name = meta.name;\n if (meta.property) props.property = meta.property;\n elements.push(React.createElement(\"meta\", { key: k(), ...props }));\n }\n }\n\n // Additional link tags\n if (additionalLinkTags) {\n for (const link of additionalLinkTags) {\n elements.push(React.createElement(\"link\", { key: k(), ...link }));\n }\n }\n\n // JSON-LD\n if (jsonLd) {\n const schemas = Array.isArray(jsonLd) ? jsonLd : [jsonLd];\n for (const schema of schemas) {\n elements.push(\n React.createElement(\"script\", {\n key: k(),\n type: \"application/ld+json\",\n nonce,\n dangerouslySetInnerHTML: {\n __html: safeJsonLdSerialize(schema),\n },\n })\n );\n }\n }\n\n return React.createElement(React.Fragment, null, ...elements);\n}\n","import React from \"react\";\nimport { safeJsonLdSerialize } from \"../utils/index.js\";\n\nexport interface JsonLdProps {\n data: Record<string, unknown> | Array<Record<string, unknown>>;\n nonce?: string;\n}\n\n/**\n * Renders a <script type=\"application/ld+json\"> tag with safely serialized JSON-LD.\n * SSR-safe: no browser globals used.\n */\nexport function JsonLd({ data, nonce }: JsonLdProps): React.ReactElement {\n return React.createElement(\"script\", {\n type: \"application/ld+json\",\n nonce,\n dangerouslySetInnerHTML: {\n __html: safeJsonLdSerialize(data),\n },\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkQBHCTDUJ_cjs=require('./chunk-QBHCTDUJ.cjs');Object.defineProperty(exports,"JsonLd",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.s}});Object.defineProperty(exports,"SEOHead",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.r}});//# sourceMappingURL=components.cjs.map
2
+ //# sourceMappingURL=components.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"components.cjs"}
@@ -0,0 +1,3 @@
1
+ export { J as JsonLd, S as SEOHead } from './index-RBSUcdqN.cjs';
2
+ import 'react';
3
+ import './index-Dr2yktvz.cjs';
@@ -0,0 +1,3 @@
1
+ export { J as JsonLd, S as SEOHead } from './index-DAGfo2Fc.js';
2
+ import 'react';
3
+ import './index-Dr2yktvz.js';
@@ -0,0 +1,2 @@
1
+ export{s as JsonLd,r as SEOHead}from'./chunk-YMCW2G4X.js';//# sourceMappingURL=components.js.map
2
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"components.js"}
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { S as SEOConfig } from './index-Dr2yktvz.js';
3
+
4
+ interface SEOHeadProps extends SEOConfig {
5
+ /**
6
+ * Optional nonce for CSP-compatible script tags.
7
+ */
8
+ nonce?: string;
9
+ }
10
+ /**
11
+ * Generic SSR-safe React component that renders SEO-related tags.
12
+ *
13
+ * Renders: title, meta description, canonical link, robots meta,
14
+ * Open Graph tags, Twitter tags, alternate/hreflang links,
15
+ * additional meta/link tags, and JSON-LD scripts.
16
+ *
17
+ * Designed to be placed inside a <head> element in SSR apps.
18
+ * Does NOT use any browser globals — fully SSR-compatible.
19
+ */
20
+ declare function SEOHead({ title, titleTemplate, description, canonical, robots, openGraph, twitter, alternates, additionalMetaTags, additionalLinkTags, jsonLd, nonce, }: SEOHeadProps): React.ReactElement;
21
+
22
+ interface JsonLdProps {
23
+ data: Record<string, unknown> | Array<Record<string, unknown>>;
24
+ nonce?: string;
25
+ }
26
+ /**
27
+ * Renders a <script type="application/ld+json"> tag with safely serialized JSON-LD.
28
+ * SSR-safe: no browser globals used.
29
+ */
30
+ declare function JsonLd({ data, nonce }: JsonLdProps): React.ReactElement;
31
+
32
+ export { JsonLd as J, SEOHead as S, type JsonLdProps as a, type SEOHeadProps as b };
@@ -0,0 +1,136 @@
1
+ type OpenGraphType = "website" | "article" | "product" | "profile" | "book" | "music.song" | "music.album" | "video.movie" | "video.episode" | (string & {});
2
+ interface OpenGraphImage {
3
+ url: string;
4
+ alt?: string;
5
+ width?: number;
6
+ height?: number;
7
+ type?: string;
8
+ }
9
+ interface OpenGraphConfig {
10
+ title?: string;
11
+ description?: string;
12
+ url?: string;
13
+ siteName?: string;
14
+ type?: OpenGraphType;
15
+ locale?: string;
16
+ images?: OpenGraphImage[];
17
+ }
18
+ type TwitterCardType = "summary" | "summary_large_image" | "app" | "player";
19
+ interface TwitterConfig {
20
+ card?: TwitterCardType;
21
+ site?: string;
22
+ creator?: string;
23
+ title?: string;
24
+ description?: string;
25
+ image?: string;
26
+ imageAlt?: string;
27
+ }
28
+ interface RobotsConfig {
29
+ index?: boolean;
30
+ follow?: boolean;
31
+ noarchive?: boolean;
32
+ nosnippet?: boolean;
33
+ noimageindex?: boolean;
34
+ notranslate?: boolean;
35
+ maxSnippet?: number;
36
+ maxImagePreview?: "none" | "standard" | "large";
37
+ maxVideoPreview?: number;
38
+ }
39
+ interface AlternateLink {
40
+ hreflang: string;
41
+ href: string;
42
+ }
43
+ interface SEOConfig {
44
+ title?: string;
45
+ titleTemplate?: string;
46
+ description?: string;
47
+ canonical?: string;
48
+ robots?: RobotsConfig;
49
+ openGraph?: OpenGraphConfig;
50
+ twitter?: TwitterConfig;
51
+ alternates?: AlternateLink[];
52
+ additionalMetaTags?: Array<{
53
+ name?: string;
54
+ property?: string;
55
+ content: string;
56
+ }>;
57
+ additionalLinkTags?: Array<{
58
+ rel: string;
59
+ href: string;
60
+ hreflang?: string;
61
+ type?: string;
62
+ sizes?: string;
63
+ }>;
64
+ jsonLd?: Record<string, unknown> | Array<Record<string, unknown>>;
65
+ }
66
+ interface JSONLDBase {
67
+ "@context"?: string;
68
+ "@type": string;
69
+ [key: string]: unknown;
70
+ }
71
+ interface BreadcrumbItem {
72
+ name: string;
73
+ url: string;
74
+ }
75
+ interface OrganizationSchemaInput {
76
+ name: string;
77
+ url: string;
78
+ logo?: string;
79
+ description?: string;
80
+ sameAs?: string[];
81
+ contactPoint?: {
82
+ telephone?: string;
83
+ contactType?: string;
84
+ email?: string;
85
+ areaServed?: string | string[];
86
+ availableLanguage?: string | string[];
87
+ };
88
+ }
89
+ interface WebsiteSchemaInput {
90
+ name: string;
91
+ url: string;
92
+ description?: string;
93
+ searchUrl?: string;
94
+ searchQueryParam?: string;
95
+ }
96
+ interface ArticleSchemaInput {
97
+ headline: string;
98
+ url: string;
99
+ description?: string;
100
+ images?: string[];
101
+ datePublished?: string;
102
+ dateModified?: string;
103
+ author?: {
104
+ name: string;
105
+ url?: string;
106
+ } | Array<{
107
+ name: string;
108
+ url?: string;
109
+ }>;
110
+ publisher?: {
111
+ name: string;
112
+ logo?: string;
113
+ };
114
+ section?: string;
115
+ keywords?: string[];
116
+ }
117
+ interface ProductSchemaInput {
118
+ name: string;
119
+ url: string;
120
+ description?: string;
121
+ images?: string[];
122
+ brand?: string;
123
+ sku?: string;
124
+ gtin?: string;
125
+ price?: number | string;
126
+ priceCurrency?: string;
127
+ availability?: "InStock" | "OutOfStock" | "PreOrder" | "Discontinued" | (string & {});
128
+ ratingValue?: number;
129
+ reviewCount?: number;
130
+ }
131
+ interface FAQItem {
132
+ question: string;
133
+ answer: string;
134
+ }
135
+
136
+ export type { ArticleSchemaInput as A, BreadcrumbItem as B, FAQItem as F, JSONLDBase as J, OrganizationSchemaInput as O, ProductSchemaInput as P, RobotsConfig as R, SEOConfig as S, TwitterConfig as T, WebsiteSchemaInput as W, AlternateLink as a, OpenGraphConfig as b, OpenGraphImage as c, OpenGraphType as d, TwitterCardType as e };
@@ -0,0 +1,136 @@
1
+ type OpenGraphType = "website" | "article" | "product" | "profile" | "book" | "music.song" | "music.album" | "video.movie" | "video.episode" | (string & {});
2
+ interface OpenGraphImage {
3
+ url: string;
4
+ alt?: string;
5
+ width?: number;
6
+ height?: number;
7
+ type?: string;
8
+ }
9
+ interface OpenGraphConfig {
10
+ title?: string;
11
+ description?: string;
12
+ url?: string;
13
+ siteName?: string;
14
+ type?: OpenGraphType;
15
+ locale?: string;
16
+ images?: OpenGraphImage[];
17
+ }
18
+ type TwitterCardType = "summary" | "summary_large_image" | "app" | "player";
19
+ interface TwitterConfig {
20
+ card?: TwitterCardType;
21
+ site?: string;
22
+ creator?: string;
23
+ title?: string;
24
+ description?: string;
25
+ image?: string;
26
+ imageAlt?: string;
27
+ }
28
+ interface RobotsConfig {
29
+ index?: boolean;
30
+ follow?: boolean;
31
+ noarchive?: boolean;
32
+ nosnippet?: boolean;
33
+ noimageindex?: boolean;
34
+ notranslate?: boolean;
35
+ maxSnippet?: number;
36
+ maxImagePreview?: "none" | "standard" | "large";
37
+ maxVideoPreview?: number;
38
+ }
39
+ interface AlternateLink {
40
+ hreflang: string;
41
+ href: string;
42
+ }
43
+ interface SEOConfig {
44
+ title?: string;
45
+ titleTemplate?: string;
46
+ description?: string;
47
+ canonical?: string;
48
+ robots?: RobotsConfig;
49
+ openGraph?: OpenGraphConfig;
50
+ twitter?: TwitterConfig;
51
+ alternates?: AlternateLink[];
52
+ additionalMetaTags?: Array<{
53
+ name?: string;
54
+ property?: string;
55
+ content: string;
56
+ }>;
57
+ additionalLinkTags?: Array<{
58
+ rel: string;
59
+ href: string;
60
+ hreflang?: string;
61
+ type?: string;
62
+ sizes?: string;
63
+ }>;
64
+ jsonLd?: Record<string, unknown> | Array<Record<string, unknown>>;
65
+ }
66
+ interface JSONLDBase {
67
+ "@context"?: string;
68
+ "@type": string;
69
+ [key: string]: unknown;
70
+ }
71
+ interface BreadcrumbItem {
72
+ name: string;
73
+ url: string;
74
+ }
75
+ interface OrganizationSchemaInput {
76
+ name: string;
77
+ url: string;
78
+ logo?: string;
79
+ description?: string;
80
+ sameAs?: string[];
81
+ contactPoint?: {
82
+ telephone?: string;
83
+ contactType?: string;
84
+ email?: string;
85
+ areaServed?: string | string[];
86
+ availableLanguage?: string | string[];
87
+ };
88
+ }
89
+ interface WebsiteSchemaInput {
90
+ name: string;
91
+ url: string;
92
+ description?: string;
93
+ searchUrl?: string;
94
+ searchQueryParam?: string;
95
+ }
96
+ interface ArticleSchemaInput {
97
+ headline: string;
98
+ url: string;
99
+ description?: string;
100
+ images?: string[];
101
+ datePublished?: string;
102
+ dateModified?: string;
103
+ author?: {
104
+ name: string;
105
+ url?: string;
106
+ } | Array<{
107
+ name: string;
108
+ url?: string;
109
+ }>;
110
+ publisher?: {
111
+ name: string;
112
+ logo?: string;
113
+ };
114
+ section?: string;
115
+ keywords?: string[];
116
+ }
117
+ interface ProductSchemaInput {
118
+ name: string;
119
+ url: string;
120
+ description?: string;
121
+ images?: string[];
122
+ brand?: string;
123
+ sku?: string;
124
+ gtin?: string;
125
+ price?: number | string;
126
+ priceCurrency?: string;
127
+ availability?: "InStock" | "OutOfStock" | "PreOrder" | "Discontinued" | (string & {});
128
+ ratingValue?: number;
129
+ reviewCount?: number;
130
+ }
131
+ interface FAQItem {
132
+ question: string;
133
+ answer: string;
134
+ }
135
+
136
+ export type { ArticleSchemaInput as A, BreadcrumbItem as B, FAQItem as F, JSONLDBase as J, OrganizationSchemaInput as O, ProductSchemaInput as P, RobotsConfig as R, SEOConfig as S, TwitterConfig as T, WebsiteSchemaInput as W, AlternateLink as a, OpenGraphConfig as b, OpenGraphImage as c, OpenGraphType as d, TwitterCardType as e };
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { S as SEOConfig } from './index-Dr2yktvz.cjs';
3
+
4
+ interface SEOHeadProps extends SEOConfig {
5
+ /**
6
+ * Optional nonce for CSP-compatible script tags.
7
+ */
8
+ nonce?: string;
9
+ }
10
+ /**
11
+ * Generic SSR-safe React component that renders SEO-related tags.
12
+ *
13
+ * Renders: title, meta description, canonical link, robots meta,
14
+ * Open Graph tags, Twitter tags, alternate/hreflang links,
15
+ * additional meta/link tags, and JSON-LD scripts.
16
+ *
17
+ * Designed to be placed inside a <head> element in SSR apps.
18
+ * Does NOT use any browser globals — fully SSR-compatible.
19
+ */
20
+ declare function SEOHead({ title, titleTemplate, description, canonical, robots, openGraph, twitter, alternates, additionalMetaTags, additionalLinkTags, jsonLd, nonce, }: SEOHeadProps): React.ReactElement;
21
+
22
+ interface JsonLdProps {
23
+ data: Record<string, unknown> | Array<Record<string, unknown>>;
24
+ nonce?: string;
25
+ }
26
+ /**
27
+ * Renders a <script type="application/ld+json"> tag with safely serialized JSON-LD.
28
+ * SSR-safe: no browser globals used.
29
+ */
30
+ declare function JsonLd({ data, nonce }: JsonLdProps): React.ReactElement;
31
+
32
+ export { JsonLd as J, SEOHead as S, type JsonLdProps as a, type SEOHeadProps as b };
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunk63ETSZTD_cjs=require('./chunk-63ETSZTD.cjs'),chunkQBHCTDUJ_cjs=require('./chunk-QBHCTDUJ.cjs');Object.defineProperty(exports,"composeSchemas",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.g}});Object.defineProperty(exports,"createArticleSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.d}});Object.defineProperty(exports,"createBreadcrumbSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.c}});Object.defineProperty(exports,"createFAQSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.f}});Object.defineProperty(exports,"createOrganizationSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.a}});Object.defineProperty(exports,"createProductSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.e}});Object.defineProperty(exports,"createWebsiteSchema",{enumerable:true,get:function(){return chunk63ETSZTD_cjs.b}});Object.defineProperty(exports,"JsonLd",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.s}});Object.defineProperty(exports,"SEOHead",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.r}});Object.defineProperty(exports,"buildAlternateLinks",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.q}});Object.defineProperty(exports,"buildCanonicalUrl",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.k}});Object.defineProperty(exports,"buildDescription",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.j}});Object.defineProperty(exports,"buildFullUrl",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.e}});Object.defineProperty(exports,"buildOpenGraph",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.o}});Object.defineProperty(exports,"buildRobotsDirectives",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.l}});Object.defineProperty(exports,"buildTitle",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.i}});Object.defineProperty(exports,"buildTwitterMetadata",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.p}});Object.defineProperty(exports,"createSEOConfig",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.f}});Object.defineProperty(exports,"deepMerge",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.c}});Object.defineProperty(exports,"mergeSEOConfig",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.g}});Object.defineProperty(exports,"noIndex",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.n}});Object.defineProperty(exports,"noIndexNoFollow",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.m}});Object.defineProperty(exports,"normalizeSEOConfig",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.h}});Object.defineProperty(exports,"normalizeUrl",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.d}});Object.defineProperty(exports,"omitEmpty",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.b}});Object.defineProperty(exports,"safeJsonLdSerialize",{enumerable:true,get:function(){return chunkQBHCTDUJ_cjs.a}});//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}