@growth-labs/seo 0.1.3

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.
Files changed (158) hide show
  1. package/README.md +80 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +162 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/middleware/seo.d.ts +5 -0
  7. package/dist/middleware/seo.d.ts.map +1 -0
  8. package/dist/middleware/seo.js +70 -0
  9. package/dist/middleware/seo.js.map +1 -0
  10. package/dist/options.d.ts +489 -0
  11. package/dist/options.d.ts.map +1 -0
  12. package/dist/options.js +118 -0
  13. package/dist/options.js.map +1 -0
  14. package/dist/routes/llms.d.ts +4 -0
  15. package/dist/routes/llms.d.ts.map +1 -0
  16. package/dist/routes/llms.js +11 -0
  17. package/dist/routes/llms.js.map +1 -0
  18. package/dist/routes/podcast-narration.d.ts +4 -0
  19. package/dist/routes/podcast-narration.d.ts.map +1 -0
  20. package/dist/routes/podcast-narration.js +36 -0
  21. package/dist/routes/podcast-narration.js.map +1 -0
  22. package/dist/routes/podcast.d.ts +4 -0
  23. package/dist/routes/podcast.d.ts.map +1 -0
  24. package/dist/routes/podcast.js +20 -0
  25. package/dist/routes/podcast.js.map +1 -0
  26. package/dist/routes/robots.d.ts +4 -0
  27. package/dist/routes/robots.d.ts.map +1 -0
  28. package/dist/routes/robots.js +11 -0
  29. package/dist/routes/robots.js.map +1 -0
  30. package/dist/routes/rss.d.ts +4 -0
  31. package/dist/routes/rss.d.ts.map +1 -0
  32. package/dist/routes/rss.js +19 -0
  33. package/dist/routes/rss.js.map +1 -0
  34. package/dist/routes/sitemap-articles.d.ts +4 -0
  35. package/dist/routes/sitemap-articles.d.ts.map +1 -0
  36. package/dist/routes/sitemap-articles.js +19 -0
  37. package/dist/routes/sitemap-articles.js.map +1 -0
  38. package/dist/routes/sitemap-index.d.ts +4 -0
  39. package/dist/routes/sitemap-index.d.ts.map +1 -0
  40. package/dist/routes/sitemap-index.js +77 -0
  41. package/dist/routes/sitemap-index.js.map +1 -0
  42. package/dist/routes/sitemap-pages.d.ts +4 -0
  43. package/dist/routes/sitemap-pages.d.ts.map +1 -0
  44. package/dist/routes/sitemap-pages.js +18 -0
  45. package/dist/routes/sitemap-pages.js.map +1 -0
  46. package/dist/routes/sitemap-products.d.ts +4 -0
  47. package/dist/routes/sitemap-products.d.ts.map +1 -0
  48. package/dist/routes/sitemap-products.js +18 -0
  49. package/dist/routes/sitemap-products.js.map +1 -0
  50. package/dist/routes/sitemap-videos.d.ts +4 -0
  51. package/dist/routes/sitemap-videos.d.ts.map +1 -0
  52. package/dist/routes/sitemap-videos.js +18 -0
  53. package/dist/routes/sitemap-videos.js.map +1 -0
  54. package/dist/state.d.ts +7 -0
  55. package/dist/state.d.ts.map +1 -0
  56. package/dist/state.js +18 -0
  57. package/dist/state.js.map +1 -0
  58. package/dist/types.d.ts +103 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils/aeo.d.ts +16 -0
  63. package/dist/utils/aeo.d.ts.map +1 -0
  64. package/dist/utils/aeo.js +38 -0
  65. package/dist/utils/aeo.js.map +1 -0
  66. package/dist/utils/discover.d.ts +18 -0
  67. package/dist/utils/discover.d.ts.map +1 -0
  68. package/dist/utils/discover.js +41 -0
  69. package/dist/utils/discover.js.map +1 -0
  70. package/dist/utils/hreflang.d.ts +3 -0
  71. package/dist/utils/hreflang.d.ts.map +1 -0
  72. package/dist/utils/hreflang.js +20 -0
  73. package/dist/utils/hreflang.js.map +1 -0
  74. package/dist/utils/index.d.ts +12 -0
  75. package/dist/utils/index.d.ts.map +1 -0
  76. package/dist/utils/index.js +12 -0
  77. package/dist/utils/index.js.map +1 -0
  78. package/dist/utils/json-ld/article.d.ts +4 -0
  79. package/dist/utils/json-ld/article.d.ts.map +1 -0
  80. package/dist/utils/json-ld/article.js +66 -0
  81. package/dist/utils/json-ld/article.js.map +1 -0
  82. package/dist/utils/json-ld/audio.d.ts +7 -0
  83. package/dist/utils/json-ld/audio.d.ts.map +1 -0
  84. package/dist/utils/json-ld/audio.js +25 -0
  85. package/dist/utils/json-ld/audio.js.map +1 -0
  86. package/dist/utils/json-ld/breadcrumb.d.ts +7 -0
  87. package/dist/utils/json-ld/breadcrumb.d.ts.map +1 -0
  88. package/dist/utils/json-ld/breadcrumb.js +20 -0
  89. package/dist/utils/json-ld/breadcrumb.js.map +1 -0
  90. package/dist/utils/json-ld/faq.d.ts +6 -0
  91. package/dist/utils/json-ld/faq.d.ts.map +1 -0
  92. package/dist/utils/json-ld/faq.js +15 -0
  93. package/dist/utils/json-ld/faq.js.map +1 -0
  94. package/dist/utils/json-ld/howto.d.ts +7 -0
  95. package/dist/utils/json-ld/howto.d.ts.map +1 -0
  96. package/dist/utils/json-ld/howto.js +19 -0
  97. package/dist/utils/json-ld/howto.js.map +1 -0
  98. package/dist/utils/json-ld/index.d.ts +13 -0
  99. package/dist/utils/json-ld/index.d.ts.map +1 -0
  100. package/dist/utils/json-ld/index.js +12 -0
  101. package/dist/utils/json-ld/index.js.map +1 -0
  102. package/dist/utils/json-ld/item-list.d.ts +5 -0
  103. package/dist/utils/json-ld/item-list.d.ts.map +1 -0
  104. package/dist/utils/json-ld/item-list.js +20 -0
  105. package/dist/utils/json-ld/item-list.js.map +1 -0
  106. package/dist/utils/json-ld/organization.d.ts +4 -0
  107. package/dist/utils/json-ld/organization.d.ts.map +1 -0
  108. package/dist/utils/json-ld/organization.js +36 -0
  109. package/dist/utils/json-ld/organization.js.map +1 -0
  110. package/dist/utils/json-ld/person.d.ts +6 -0
  111. package/dist/utils/json-ld/person.d.ts.map +1 -0
  112. package/dist/utils/json-ld/person.js +23 -0
  113. package/dist/utils/json-ld/person.js.map +1 -0
  114. package/dist/utils/json-ld/product.d.ts +5 -0
  115. package/dist/utils/json-ld/product.d.ts.map +1 -0
  116. package/dist/utils/json-ld/product.js +112 -0
  117. package/dist/utils/json-ld/product.js.map +1 -0
  118. package/dist/utils/json-ld/video.d.ts +3 -0
  119. package/dist/utils/json-ld/video.d.ts.map +1 -0
  120. package/dist/utils/json-ld/video.js +20 -0
  121. package/dist/utils/json-ld/video.js.map +1 -0
  122. package/dist/utils/json-ld/website.d.ts +4 -0
  123. package/dist/utils/json-ld/website.d.ts.map +1 -0
  124. package/dist/utils/json-ld/website.js +22 -0
  125. package/dist/utils/json-ld/website.js.map +1 -0
  126. package/dist/utils/llms.d.ts +7 -0
  127. package/dist/utils/llms.d.ts.map +1 -0
  128. package/dist/utils/llms.js +38 -0
  129. package/dist/utils/llms.js.map +1 -0
  130. package/dist/utils/meta.d.ts +7 -0
  131. package/dist/utils/meta.d.ts.map +1 -0
  132. package/dist/utils/meta.js +122 -0
  133. package/dist/utils/meta.js.map +1 -0
  134. package/dist/utils/podcast.d.ts +8 -0
  135. package/dist/utils/podcast.d.ts.map +1 -0
  136. package/dist/utils/podcast.js +94 -0
  137. package/dist/utils/podcast.js.map +1 -0
  138. package/dist/utils/robots.d.ts +3 -0
  139. package/dist/utils/robots.d.ts.map +1 -0
  140. package/dist/utils/robots.js +28 -0
  141. package/dist/utils/robots.js.map +1 -0
  142. package/dist/utils/rss.d.ts +4 -0
  143. package/dist/utils/rss.d.ts.map +1 -0
  144. package/dist/utils/rss.js +53 -0
  145. package/dist/utils/rss.js.map +1 -0
  146. package/dist/utils/sitemap.d.ts +13 -0
  147. package/dist/utils/sitemap.d.ts.map +1 -0
  148. package/dist/utils/sitemap.js +133 -0
  149. package/dist/utils/sitemap.js.map +1 -0
  150. package/dist/utils/validation.d.ts +18 -0
  151. package/dist/utils/validation.d.ts.map +1 -0
  152. package/dist/utils/validation.js +141 -0
  153. package/dist/utils/validation.js.map +1 -0
  154. package/dist/vite-plugin.d.ts +4 -0
  155. package/dist/vite-plugin.d.ts.map +1 -0
  156. package/dist/vite-plugin.js +22 -0
  157. package/dist/vite-plugin.js.map +1 -0
  158. package/package.json +59 -0
@@ -0,0 +1,41 @@
1
+ const DISCOVER_VARIANTS = [
2
+ { width: 1200, height: 675 },
3
+ { width: 1200, height: 900 },
4
+ { width: 1200, height: 1200 },
5
+ ];
6
+ export function buildDiscoverImageUrls(imageUrl, site) {
7
+ const sourceUrl = new URL(imageUrl, site);
8
+ return DISCOVER_VARIANTS.map(({ width, height }) => `${sourceUrl.origin}/cdn-cgi/image/width=${width},height=${height},fit=cover,format=auto${sourceUrl.pathname}`);
9
+ }
10
+ /**
11
+ * Returns three ImageObject entries for Google Discover optimization.
12
+ * Google Discover requires images in 16:9, 4:3, and 1:1 aspect ratios,
13
+ * each at least 1200px wide.
14
+ *
15
+ * Consumers should supply the actual image URLs (typically generated via
16
+ * @growth-labs/media image transformations). This utility wraps them in
17
+ * schema.org ImageObject format suitable for JSON-LD `image` arrays.
18
+ */
19
+ export function getDiscoverImages(imageUrl16x9, imageUrl4x3, imageUrl1x1) {
20
+ return [
21
+ {
22
+ '@type': 'ImageObject',
23
+ url: imageUrl16x9,
24
+ width: 1200,
25
+ height: 675,
26
+ },
27
+ {
28
+ '@type': 'ImageObject',
29
+ url: imageUrl4x3,
30
+ width: 1200,
31
+ height: 900,
32
+ },
33
+ {
34
+ '@type': 'ImageObject',
35
+ url: imageUrl1x1,
36
+ width: 1200,
37
+ height: 1200,
38
+ },
39
+ ];
40
+ }
41
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/utils/discover.ts"],"names":[],"mappings":"AAOA,MAAM,iBAAiB,GAAG;IACzB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACpB,CAAA;AAEV,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,IAAY;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAEzC,OAAO,iBAAiB,CAAC,GAAG,CAC3B,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CACrB,GAAG,SAAS,CAAC,MAAM,wBAAwB,KAAK,WAAW,MAAM,yBAAyB,SAAS,CAAC,QAAQ,EAAE,CAC/G,CAAA;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAChC,YAAoB,EACpB,WAAmB,EACnB,WAAmB;IAEnB,OAAO;QACN;YACC,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACX;QACD;YACC,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACX;QACD;YACC,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;SACZ;KACD,CAAA;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ContentLocaleAlternate, HreflangLink } from '../types.js';
2
+ export declare function generateHreflang(alternates: ContentLocaleAlternate[], defaultLocale: string): HreflangLink[];
3
+ //# sourceMappingURL=hreflang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hreflang.d.ts","sourceRoot":"","sources":["../../src/utils/hreflang.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvE,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,sBAAsB,EAAE,EACpC,aAAa,EAAE,MAAM,GACnB,YAAY,EAAE,CAoBhB"}
@@ -0,0 +1,20 @@
1
+ export function generateHreflang(alternates, defaultLocale) {
2
+ if (!alternates.length)
3
+ return [];
4
+ const links = alternates.map((alt) => ({
5
+ rel: 'alternate',
6
+ hreflang: alt.lang,
7
+ href: alt.url,
8
+ }));
9
+ // Add x-default pointing to the URL of the defaultLocale
10
+ const defaultEntry = alternates.find((a) => a.lang === defaultLocale);
11
+ if (defaultEntry) {
12
+ links.push({
13
+ rel: 'alternate',
14
+ hreflang: 'x-default',
15
+ href: defaultEntry.url,
16
+ });
17
+ }
18
+ return links;
19
+ }
20
+ //# sourceMappingURL=hreflang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hreflang.js","sourceRoot":"","sources":["../../src/utils/hreflang.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC/B,UAAoC,EACpC,aAAqB;IAErB,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAEjC,MAAM,KAAK,GAAmB,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,IAAI,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC,CAAA;IAEH,yDAAyD;IACzD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAA;IACrE,IAAI,YAAY,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC;YACV,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,YAAY,CAAC,GAAG;SACtB,CAAC,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { estimateTokenCount, generateAeoMarkdown } from './aeo.js';
2
+ export { type DiscoverImage, getDiscoverImages } from './discover.js';
3
+ export { generateHreflang } from './hreflang.js';
4
+ export * from './json-ld/index.js';
5
+ export { generateLlmsTxt } from './llms.js';
6
+ export { applyTrailingSlash, generateCanonical, generateMeta, type OgVariant } from './meta.js';
7
+ export { generatePodcastFeed } from './podcast.js';
8
+ export { generateRobotsTxt } from './robots.js';
9
+ export { generateRssFeed } from './rss.js';
10
+ export { generateArticleSitemap, generatePagesSitemap, generateProductSitemap, generateSitemapIndex, generateVideoSitemap, type SitemapEntry, } from './sitemap.js';
11
+ export { type PageValidationOptions, type ValidationResult, validateJsonLd, validatePage, } from './validation.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,YAAY,GACjB,MAAM,cAAc,CAAA;AACrB,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,cAAc,EACd,YAAY,GACZ,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,12 @@
1
+ export { estimateTokenCount, generateAeoMarkdown } from './aeo.js';
2
+ export { getDiscoverImages } from './discover.js';
3
+ export { generateHreflang } from './hreflang.js';
4
+ export * from './json-ld/index.js';
5
+ export { generateLlmsTxt } from './llms.js';
6
+ export { applyTrailingSlash, generateCanonical, generateMeta } from './meta.js';
7
+ export { generatePodcastFeed } from './podcast.js';
8
+ export { generateRobotsTxt } from './robots.js';
9
+ export { generateRssFeed } from './rss.js';
10
+ export { generateArticleSitemap, generatePagesSitemap, generateProductSitemap, generateSitemapIndex, generateVideoSitemap, } from './sitemap.js';
11
+ export { validateJsonLd, validatePage, } from './validation.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAsB,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAkB,MAAM,WAAW,CAAA;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,GAEpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAGN,cAAc,EACd,YAAY,GACZ,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ResolvedSeoOptions } from '../../options.js';
2
+ import type { ContentItem, JsonLdObject } from '../../types.js';
3
+ export declare function generateArticleJsonLd(item: ContentItem, options: ResolvedSeoOptions): JsonLdObject;
4
+ //# sourceMappingURL=article.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/article.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG/D,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,kBAAkB,GACzB,YAAY,CAiEd"}
@@ -0,0 +1,66 @@
1
+ import { buildDiscoverImageUrls } from '../discover.js';
2
+ export function generateArticleJsonLd(item, options) {
3
+ const { organization, schemaType, audioNarration } = options;
4
+ const authors = (item.authors ?? []).map((author) => {
5
+ const person = { '@type': 'Person', name: author.name };
6
+ if (author.url)
7
+ person.url = author.url;
8
+ if (author.jobTitle)
9
+ person.jobTitle = author.jobTitle;
10
+ if (author.sameAs?.length)
11
+ person.sameAs = author.sameAs;
12
+ return person;
13
+ });
14
+ const result = {
15
+ '@context': 'https://schema.org',
16
+ '@type': schemaType,
17
+ headline: item.title,
18
+ url: item.url,
19
+ mainEntityOfPage: {
20
+ '@type': 'WebPage',
21
+ '@id': item.url,
22
+ },
23
+ publisher: {
24
+ '@type': 'Organization',
25
+ name: organization.name,
26
+ logo: {
27
+ '@type': 'ImageObject',
28
+ url: organization.logo,
29
+ },
30
+ },
31
+ author: authors,
32
+ isAccessibleForFree: item.isAccessibleForFree ?? true,
33
+ };
34
+ if (item.image) {
35
+ result.image = buildDiscoverImageUrls(item.image, options.site);
36
+ }
37
+ if (item.description)
38
+ result.description = item.description;
39
+ if (item.datePublished)
40
+ result.datePublished = item.datePublished;
41
+ if (item.dateModified)
42
+ result.dateModified = item.dateModified;
43
+ if (item.isAccessibleForFree === false && item.paywallCssSelector) {
44
+ result.hasPart = {
45
+ '@type': 'WebPageElement',
46
+ isAccessibleForFree: false,
47
+ cssSelector: item.paywallCssSelector,
48
+ };
49
+ }
50
+ if (item.audio) {
51
+ result.associatedMedia = {
52
+ '@type': 'AudioObject',
53
+ contentUrl: item.audio.url,
54
+ duration: item.audio.duration,
55
+ ...(item.audio.narrator ? { name: item.audio.narrator } : {}),
56
+ };
57
+ }
58
+ if (audioNarration?.enabled) {
59
+ result.speakable = {
60
+ '@type': 'SpeakableSpecification',
61
+ cssSelector: audioNarration.speakableSelectors,
62
+ };
63
+ }
64
+ return result;
65
+ }
66
+ //# sourceMappingURL=article.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article.js","sourceRoot":"","sources":["../../../src/utils/json-ld/article.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ContentAudio, JsonLdObject } from '../../types.js';
2
+ export declare function generateAudioJsonLd(audio: ContentAudio, options: {
3
+ title: string;
4
+ datePublished?: string;
5
+ articleUrl?: string;
6
+ }): JsonLdObject;
7
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/audio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEhE,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,YAAY,CA0Bd"}
@@ -0,0 +1,25 @@
1
+ export function generateAudioJsonLd(audio, options) {
2
+ const result = {
3
+ '@context': 'https://schema.org',
4
+ '@type': 'AudioObject',
5
+ name: options.title,
6
+ contentUrl: audio.url,
7
+ duration: audio.duration,
8
+ };
9
+ if (audio.narrator) {
10
+ result.creator = {
11
+ '@type': 'Person',
12
+ name: audio.narrator,
13
+ };
14
+ }
15
+ if (options.datePublished)
16
+ result.datePublished = options.datePublished;
17
+ if (options.articleUrl) {
18
+ result.isPartOf = {
19
+ '@type': 'Article',
20
+ url: options.articleUrl,
21
+ };
22
+ }
23
+ return result;
24
+ }
25
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../../src/utils/json-ld/audio.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAClC,KAAmB,EACnB,OAAuE;IAEvE,MAAM,MAAM,GAAiB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,OAAO,CAAC,KAAK;QACnB,UAAU,EAAE,KAAK,CAAC,GAAG;QACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACxB,CAAA;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG;YAChB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,KAAK,CAAC,QAAQ;SACpB,CAAA;IACF,CAAC;IAED,IAAI,OAAO,CAAC,aAAa;QAAE,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IAEvE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,GAAG;YACjB,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,OAAO,CAAC,UAAU;SACvB,CAAA;IACF,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { JsonLdObject } from '../../types.js';
2
+ export interface BreadcrumbItem {
3
+ name: string;
4
+ url: string;
5
+ }
6
+ export declare function generateBreadcrumbJsonLd(items: BreadcrumbItem[]): JsonLdObject;
7
+ //# sourceMappingURL=breadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/breadcrumb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACX;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAoB9E"}
@@ -0,0 +1,20 @@
1
+ export function generateBreadcrumbJsonLd(items) {
2
+ const lastIndex = items.length - 1;
3
+ const itemListElement = items.map((item, index) => {
4
+ const listItem = {
5
+ '@type': 'ListItem',
6
+ position: index + 1,
7
+ name: item.name,
8
+ };
9
+ if (index !== lastIndex) {
10
+ listItem.item = item.url;
11
+ }
12
+ return listItem;
13
+ });
14
+ return {
15
+ '@context': 'https://schema.org',
16
+ '@type': 'BreadcrumbList',
17
+ itemListElement,
18
+ };
19
+ }
20
+ //# sourceMappingURL=breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../../../src/utils/json-ld/breadcrumb.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IAElC,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAiB;YAC9B,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,KAAK,GAAG,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;SACf,CAAA;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAA;QACzB,CAAC;QACD,OAAO,QAAQ,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,OAAO;QACN,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,gBAAgB;QACzB,eAAe;KACf,CAAA;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { JsonLdObject } from '../../types.js';
2
+ export declare function generateFaqJsonLd(items: Array<{
3
+ question: string;
4
+ answer: string;
5
+ }>): JsonLdObject;
6
+ //# sourceMappingURL=faq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/faq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAChD,YAAY,CAad"}
@@ -0,0 +1,15 @@
1
+ export function generateFaqJsonLd(items) {
2
+ return {
3
+ '@context': 'https://schema.org',
4
+ '@type': 'FAQPage',
5
+ mainEntity: items.map((item) => ({
6
+ '@type': 'Question',
7
+ name: item.question,
8
+ acceptedAnswer: {
9
+ '@type': 'Answer',
10
+ text: item.answer,
11
+ },
12
+ })),
13
+ };
14
+ }
15
+ //# sourceMappingURL=faq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faq.js","sourceRoot":"","sources":["../../../src/utils/json-ld/faq.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAChC,KAAkD;IAElD,OAAO;QACN,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,cAAc,EAAE;gBACf,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,IAAI,CAAC,MAAM;aACjB;SACD,CAAC,CAAC;KACH,CAAA;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { JsonLdObject } from '../../types.js';
2
+ export declare function generateHowToJsonLd(name: string, description: string, steps: Array<{
3
+ name: string;
4
+ text: string;
5
+ image?: string;
6
+ }>): JsonLdObject;
7
+ //# sourceMappingURL=howto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"howto.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/howto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1D,YAAY,CAgBd"}
@@ -0,0 +1,19 @@
1
+ export function generateHowToJsonLd(name, description, steps) {
2
+ return {
3
+ '@context': 'https://schema.org',
4
+ '@type': 'HowTo',
5
+ name,
6
+ description,
7
+ step: steps.map((step) => {
8
+ const s = {
9
+ '@type': 'HowToStep',
10
+ name: step.name,
11
+ text: step.text,
12
+ };
13
+ if (step.image)
14
+ s.image = step.image;
15
+ return s;
16
+ }),
17
+ };
18
+ }
19
+ //# sourceMappingURL=howto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"howto.js","sourceRoot":"","sources":["../../../src/utils/json-ld/howto.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAClC,IAAY,EACZ,WAAmB,EACnB,KAA4D;IAE5D,OAAO;QACN,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,OAAO;QAChB,IAAI;QACJ,WAAW;QACX,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC,GAAiB;gBACvB,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;aACf,CAAA;YACD,IAAI,IAAI,CAAC,KAAK;gBAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;YACpC,OAAO,CAAC,CAAA;QACT,CAAC,CAAC;KACF,CAAA;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { generateArticleJsonLd } from './article.js';
2
+ export { generateAudioJsonLd } from './audio.js';
3
+ export type { BreadcrumbItem } from './breadcrumb.js';
4
+ export { generateBreadcrumbJsonLd } from './breadcrumb.js';
5
+ export { generateFaqJsonLd } from './faq.js';
6
+ export { generateHowToJsonLd } from './howto.js';
7
+ export { generateItemListJsonLd } from './item-list.js';
8
+ export { generateOrganizationJsonLd } from './organization.js';
9
+ export { generatePersonJsonLd } from './person.js';
10
+ export { generateProductGroupJsonLd, generateProductJsonLd } from './product.js';
11
+ export { generateVideoJsonLd } from './video.js';
12
+ export { generateWebSiteJsonLd } from './website.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,12 @@
1
+ export { generateArticleJsonLd } from './article.js';
2
+ export { generateAudioJsonLd } from './audio.js';
3
+ export { generateBreadcrumbJsonLd } from './breadcrumb.js';
4
+ export { generateFaqJsonLd } from './faq.js';
5
+ export { generateHowToJsonLd } from './howto.js';
6
+ export { generateItemListJsonLd } from './item-list.js';
7
+ export { generateOrganizationJsonLd } from './organization.js';
8
+ export { generatePersonJsonLd } from './person.js';
9
+ export { generateProductGroupJsonLd, generateProductJsonLd } from './product.js';
10
+ export { generateVideoJsonLd } from './video.js';
11
+ export { generateWebSiteJsonLd } from './website.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/json-ld/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { JsonLdObject } from '../../types.js';
2
+ export declare function generateItemListJsonLd(name: string, items: Array<{
3
+ url: string;
4
+ }>, order?: 'ascending' | 'descending' | 'unordered'): JsonLdObject;
5
+ //# sourceMappingURL=item-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-list.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/item-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAQlD,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7B,KAAK,GAAE,WAAW,GAAG,YAAY,GAAG,WAAyB,GAC3D,YAAY,CAad"}
@@ -0,0 +1,20 @@
1
+ const ORDER_MAP = {
2
+ ascending: 'https://schema.org/ItemListOrderAscending',
3
+ descending: 'https://schema.org/ItemListOrderDescending',
4
+ unordered: 'https://schema.org/ItemListUnordered',
5
+ };
6
+ export function generateItemListJsonLd(name, items, order = 'ascending') {
7
+ return {
8
+ '@context': 'https://schema.org',
9
+ '@type': 'ItemList',
10
+ name,
11
+ itemListOrder: ORDER_MAP[order],
12
+ numberOfItems: items.length,
13
+ itemListElement: items.map((item, index) => ({
14
+ '@type': 'ListItem',
15
+ position: index + 1,
16
+ url: item.url,
17
+ })),
18
+ };
19
+ }
20
+ //# sourceMappingURL=item-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-list.js","sourceRoot":"","sources":["../../../src/utils/json-ld/item-list.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAA2B;IACzC,SAAS,EAAE,2CAA2C;IACtD,UAAU,EAAE,4CAA4C;IACxD,SAAS,EAAE,sCAAsC;CACjD,CAAA;AAED,MAAM,UAAU,sBAAsB,CACrC,IAAY,EACZ,KAA6B,EAC7B,QAAkD,WAAW;IAE7D,OAAO;QACN,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,UAAU;QACnB,IAAI;QACJ,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC;QAC/B,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,KAAK,GAAG,CAAC;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;SACb,CAAC,CAAC;KACH,CAAA;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ResolvedSeoOptions } from '../../options.js';
2
+ import type { JsonLdObject } from '../../types.js';
3
+ export declare function generateOrganizationJsonLd(options: ResolvedSeoOptions): JsonLdObject;
4
+ //# sourceMappingURL=organization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAsCpF"}
@@ -0,0 +1,36 @@
1
+ export function generateOrganizationJsonLd(options) {
2
+ const { organization, site, commerce } = options;
3
+ const result = {
4
+ '@context': 'https://schema.org',
5
+ '@type': 'Organization',
6
+ name: organization.name,
7
+ url: organization.url ?? site,
8
+ logo: {
9
+ '@type': 'ImageObject',
10
+ url: organization.logo,
11
+ },
12
+ };
13
+ if (organization.sameAs?.length) {
14
+ result.sameAs = organization.sameAs;
15
+ }
16
+ if (commerce?.enabled && commerce.returnPolicy) {
17
+ const policy = commerce.returnPolicy;
18
+ const policyObj = {
19
+ '@type': 'MerchantReturnPolicy',
20
+ applicableCountry: policy.applicableCountry,
21
+ returnPolicyCategory: `https://schema.org/${policy.returnPolicyCategory}`,
22
+ };
23
+ if (policy.merchantReturnDays !== undefined) {
24
+ policyObj.merchantReturnDays = policy.merchantReturnDays;
25
+ }
26
+ if (policy.returnMethod) {
27
+ policyObj.returnMethod = `https://schema.org/${policy.returnMethod}`;
28
+ }
29
+ if (policy.returnFees) {
30
+ policyObj.returnFees = `https://schema.org/${policy.returnFees}`;
31
+ }
32
+ result.hasMerchantReturnPolicy = policyObj;
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=organization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization.js","sourceRoot":"","sources":["../../../src/utils/json-ld/organization.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CAAC,OAA2B;IACrE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAEhD,MAAM,MAAM,GAAiB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,GAAG,EAAE,YAAY,CAAC,GAAG,IAAI,IAAI;QAC7B,IAAI,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,YAAY,CAAC,IAAI;SACtB;KACD,CAAA;IAED,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAA;IACpC,CAAC;IAED,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAA;QACpC,MAAM,SAAS,GAAiB;YAC/B,OAAO,EAAE,sBAAsB;YAC/B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,oBAAoB,EAAE,sBAAsB,MAAM,CAAC,oBAAoB,EAAE;SACzE,CAAA;QACD,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC7C,SAAS,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAA;QACzD,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,SAAS,CAAC,YAAY,GAAG,sBAAsB,MAAM,CAAC,YAAY,EAAE,CAAA;QACrE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,SAAS,CAAC,UAAU,GAAG,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAA;QACjE,CAAC;QACD,MAAM,CAAC,uBAAuB,GAAG,SAAS,CAAA;IAC3C,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ContentAuthor, JsonLdObject } from '../../types.js';
2
+ export declare function generatePersonJsonLd(author: ContentAuthor, options?: {
3
+ image?: string;
4
+ organizationName?: string;
5
+ }): JsonLdObject;
6
+ //# sourceMappingURL=person.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/person.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEjE,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,YAAY,CAmBd"}
@@ -0,0 +1,23 @@
1
+ export function generatePersonJsonLd(author, options) {
2
+ const result = {
3
+ '@context': 'https://schema.org',
4
+ '@type': 'Person',
5
+ name: author.name,
6
+ };
7
+ if (author.url)
8
+ result.url = author.url;
9
+ if (author.jobTitle)
10
+ result.jobTitle = author.jobTitle;
11
+ if (author.sameAs?.length)
12
+ result.sameAs = author.sameAs;
13
+ if (options?.image)
14
+ result.image = options.image;
15
+ if (options?.organizationName) {
16
+ result.worksFor = {
17
+ '@type': 'Organization',
18
+ name: options.organizationName,
19
+ };
20
+ }
21
+ return result;
22
+ }
23
+ //# sourceMappingURL=person.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person.js","sourceRoot":"","sources":["../../../src/utils/json-ld/person.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CACnC,MAAqB,EACrB,OAAuD;IAEvD,MAAM,MAAM,GAAiB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;KACjB,CAAA;IAED,IAAI,MAAM,CAAC,GAAG;QAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACvC,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IACtD,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IACxD,IAAI,OAAO,EAAE,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAChD,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,GAAG;YACjB,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,OAAO,CAAC,gBAAgB;SAC9B,CAAA;IACF,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ResolvedSeoOptions } from '../../options.js';
2
+ import type { ContentProduct, JsonLdObject } from '../../types.js';
3
+ export declare function generateProductJsonLd(product: ContentProduct, url: string, options: ResolvedSeoOptions): JsonLdObject;
4
+ export declare function generateProductGroupJsonLd(product: ContentProduct, url: string, options: ResolvedSeoOptions): JsonLdObject;
5
+ //# sourceMappingURL=product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/product.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAA;AAyDlF,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GACzB,YAAY,CAwDd;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GACzB,YAAY,CA8Bd"}