react-ssr-seo-toolkit 1.0.5 → 1.2.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 +633 -460
- package/dist/adapters/nextjs.cjs +2 -0
- package/dist/adapters/nextjs.cjs.map +1 -0
- package/dist/adapters/nextjs.d.cts +86 -0
- package/dist/adapters/nextjs.d.ts +86 -0
- package/dist/adapters/nextjs.js +2 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/adapters/react-router.cjs +2 -0
- package/dist/adapters/react-router.cjs.map +1 -0
- package/dist/adapters/react-router.d.cts +71 -0
- package/dist/adapters/react-router.d.ts +71 -0
- package/dist/adapters/react-router.js +2 -0
- package/dist/adapters/react-router.js.map +1 -0
- package/dist/chunk-3UCLUFOI.js +5 -0
- package/dist/chunk-3UCLUFOI.js.map +1 -0
- package/dist/chunk-A62THBIS.cjs +3 -0
- package/dist/chunk-A62THBIS.cjs.map +1 -0
- package/dist/chunk-FKDMHECL.cjs +2 -0
- package/dist/chunk-FKDMHECL.cjs.map +1 -0
- package/dist/chunk-GNLXGAS6.js +3 -0
- package/dist/chunk-GNLXGAS6.js.map +1 -0
- package/dist/chunk-LEOORZQY.cjs +5 -0
- package/dist/chunk-LEOORZQY.cjs.map +1 -0
- package/dist/chunk-LP66SUGR.js +2 -0
- package/dist/chunk-LP66SUGR.js.map +1 -0
- package/dist/chunk-ROA74LH6.cjs +61 -0
- package/dist/chunk-ROA74LH6.cjs.map +1 -0
- package/dist/chunk-WM5VVPED.js +61 -0
- package/dist/chunk-WM5VVPED.js.map +1 -0
- package/dist/chunk-X535MU7Z.js +5 -0
- package/dist/chunk-X535MU7Z.js.map +1 -0
- package/dist/chunk-ZADUJHVR.cjs +5 -0
- package/dist/chunk-ZADUJHVR.cjs.map +1 -0
- package/dist/chunk-ZECSTNEE.cjs +3 -0
- package/dist/chunk-ZECSTNEE.cjs.map +1 -0
- package/dist/chunk-ZVFEGG25.js +3 -0
- package/dist/chunk-ZVFEGG25.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.cts +2 -2
- package/dist/components.d.ts +2 -2
- package/dist/components.js +1 -1
- package/dist/index-Br7Sh9Ur.d.cts +329 -0
- package/dist/index-Br7Sh9Ur.d.ts +329 -0
- package/dist/{index-DAGfo2Fc.d.ts → index-CKNcgAj8.d.ts} +10 -2
- package/dist/{index-RBSUcdqN.d.cts → index-Wgogf4CX.d.cts} +10 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +1 -1
- package/dist/og.cjs +2 -0
- package/dist/og.cjs.map +1 -0
- package/dist/og.d.cts +5 -0
- package/dist/og.d.ts +5 -0
- package/dist/og.js +2 -0
- package/dist/og.js.map +1 -0
- package/dist/schema.cjs +1 -1
- package/dist/schema.d.cts +6 -2
- package/dist/schema.d.ts +6 -2
- package/dist/schema.js +1 -1
- package/dist/sitemap.cjs +2 -0
- package/dist/sitemap.cjs.map +1 -0
- package/dist/sitemap.d.cts +12 -0
- package/dist/sitemap.d.ts +12 -0
- package/dist/sitemap.js +2 -0
- package/dist/sitemap.js.map +1 -0
- package/dist/validation.cjs +2 -0
- package/dist/validation.cjs.map +1 -0
- package/dist/validation.d.cts +8 -0
- package/dist/validation.d.ts +8 -0
- package/dist/validation.js +2 -0
- package/dist/validation.js.map +1 -0
- package/package.json +58 -2
- package/dist/chunk-63ETSZTD.cjs +0 -3
- package/dist/chunk-63ETSZTD.cjs.map +0 -1
- package/dist/chunk-ES4OXVOR.js +0 -3
- package/dist/chunk-ES4OXVOR.js.map +0 -1
- package/dist/chunk-QBHCTDUJ.cjs +0 -2
- package/dist/chunk-QBHCTDUJ.cjs.map +0 -1
- package/dist/chunk-YMCW2G4X.js +0 -2
- package/dist/chunk-YMCW2G4X.js.map +0 -1
- package/dist/index-Dr2yktvz.d.cts +0 -136
- package/dist/index-Dr2yktvz.d.ts +0 -136
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-ssr-seo-toolkit",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Framework-agnostic SEO utilities, metadata builders, structured data helpers, and React components for SSR applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"seo",
|
|
@@ -18,7 +18,13 @@
|
|
|
18
18
|
"schema-org",
|
|
19
19
|
"breadcrumb",
|
|
20
20
|
"hreflang",
|
|
21
|
-
"server-side-rendering"
|
|
21
|
+
"server-side-rendering",
|
|
22
|
+
"sitemap",
|
|
23
|
+
"robots-txt",
|
|
24
|
+
"seo-validation",
|
|
25
|
+
"og-image",
|
|
26
|
+
"seo-score",
|
|
27
|
+
"social-preview"
|
|
22
28
|
],
|
|
23
29
|
"author": "tonmoy1996",
|
|
24
30
|
"license": "MIT",
|
|
@@ -64,6 +70,56 @@
|
|
|
64
70
|
"types": "./dist/components.d.cts",
|
|
65
71
|
"default": "./dist/components.cjs"
|
|
66
72
|
}
|
|
73
|
+
},
|
|
74
|
+
"./sitemap": {
|
|
75
|
+
"import": {
|
|
76
|
+
"types": "./dist/sitemap.d.ts",
|
|
77
|
+
"default": "./dist/sitemap.js"
|
|
78
|
+
},
|
|
79
|
+
"require": {
|
|
80
|
+
"types": "./dist/sitemap.d.cts",
|
|
81
|
+
"default": "./dist/sitemap.cjs"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"./validation": {
|
|
85
|
+
"import": {
|
|
86
|
+
"types": "./dist/validation.d.ts",
|
|
87
|
+
"default": "./dist/validation.js"
|
|
88
|
+
},
|
|
89
|
+
"require": {
|
|
90
|
+
"types": "./dist/validation.d.cts",
|
|
91
|
+
"default": "./dist/validation.cjs"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"./og": {
|
|
95
|
+
"import": {
|
|
96
|
+
"types": "./dist/og.d.ts",
|
|
97
|
+
"default": "./dist/og.js"
|
|
98
|
+
},
|
|
99
|
+
"require": {
|
|
100
|
+
"types": "./dist/og.d.cts",
|
|
101
|
+
"default": "./dist/og.cjs"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"./adapters/nextjs": {
|
|
105
|
+
"import": {
|
|
106
|
+
"types": "./dist/adapters/nextjs.d.ts",
|
|
107
|
+
"default": "./dist/adapters/nextjs.js"
|
|
108
|
+
},
|
|
109
|
+
"require": {
|
|
110
|
+
"types": "./dist/adapters/nextjs.d.cts",
|
|
111
|
+
"default": "./dist/adapters/nextjs.cjs"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"./adapters/react-router": {
|
|
115
|
+
"import": {
|
|
116
|
+
"types": "./dist/adapters/react-router.d.ts",
|
|
117
|
+
"default": "./dist/adapters/react-router.js"
|
|
118
|
+
},
|
|
119
|
+
"require": {
|
|
120
|
+
"types": "./dist/adapters/react-router.d.cts",
|
|
121
|
+
"default": "./dist/adapters/react-router.cjs"
|
|
122
|
+
}
|
|
67
123
|
}
|
|
68
124
|
},
|
|
69
125
|
"files": [
|
package/dist/chunk-63ETSZTD.cjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-ES4OXVOR.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-QBHCTDUJ.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-YMCW2G4X.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1,136 +0,0 @@
|
|
|
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 };
|
package/dist/index-Dr2yktvz.d.ts
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
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 };
|