@growth-labs/seo 0.2.7 → 0.3.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.
Files changed (101) hide show
  1. package/README.md +20 -7
  2. package/dist/_internal/state.d.ts +7 -0
  3. package/dist/_internal/state.d.ts.map +1 -0
  4. package/dist/_internal/state.js +18 -0
  5. package/dist/_internal/state.js.map +1 -0
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +161 -44
  9. package/dist/index.js.map +1 -1
  10. package/dist/middleware/seo.d.ts.map +1 -1
  11. package/dist/middleware/seo.js +1 -1
  12. package/dist/middleware/seo.js.map +1 -1
  13. package/dist/options.d.ts +87 -40
  14. package/dist/options.d.ts.map +1 -1
  15. package/dist/options.js +22 -6
  16. package/dist/options.js.map +1 -1
  17. package/dist/routes/aeo-twin.js +1 -1
  18. package/dist/routes/aeo-twin.js.map +1 -1
  19. package/dist/routes/apple-news.d.ts.map +1 -1
  20. package/dist/routes/apple-news.js +3 -2
  21. package/dist/routes/apple-news.js.map +1 -1
  22. package/dist/routes/llms-full.js +1 -1
  23. package/dist/routes/llms-full.js.map +1 -1
  24. package/dist/routes/llms.js +1 -1
  25. package/dist/routes/llms.js.map +1 -1
  26. package/dist/routes/podcast-narration.d.ts.map +1 -1
  27. package/dist/routes/podcast-narration.js +3 -2
  28. package/dist/routes/podcast-narration.js.map +1 -1
  29. package/dist/routes/podcast.d.ts.map +1 -1
  30. package/dist/routes/podcast.js +3 -2
  31. package/dist/routes/podcast.js.map +1 -1
  32. package/dist/routes/revalidate.d.ts.map +1 -1
  33. package/dist/routes/revalidate.js +5 -3
  34. package/dist/routes/revalidate.js.map +1 -1
  35. package/dist/routes/robots.d.ts.map +1 -1
  36. package/dist/routes/robots.js +9 -3
  37. package/dist/routes/robots.js.map +1 -1
  38. package/dist/routes/rss.d.ts.map +1 -1
  39. package/dist/routes/rss.js +3 -2
  40. package/dist/routes/rss.js.map +1 -1
  41. package/dist/routes/sitemap-articles.js +1 -1
  42. package/dist/routes/sitemap-articles.js.map +1 -1
  43. package/dist/routes/sitemap-index.d.ts.map +1 -1
  44. package/dist/routes/sitemap-index.js +3 -2
  45. package/dist/routes/sitemap-index.js.map +1 -1
  46. package/dist/routes/sitemap-markdown.js +1 -1
  47. package/dist/routes/sitemap-markdown.js.map +1 -1
  48. package/dist/routes/sitemap-pages.js +1 -1
  49. package/dist/routes/sitemap-pages.js.map +1 -1
  50. package/dist/routes/sitemap-products.js +1 -1
  51. package/dist/routes/sitemap-products.js.map +1 -1
  52. package/dist/routes/sitemap-videos.js +1 -1
  53. package/dist/routes/sitemap-videos.js.map +1 -1
  54. package/dist/runtime.d.ts +1 -5
  55. package/dist/runtime.d.ts.map +1 -1
  56. package/dist/runtime.js +3 -5
  57. package/dist/runtime.js.map +1 -1
  58. package/dist/site-url-core.d.ts +10 -0
  59. package/dist/site-url-core.d.ts.map +1 -0
  60. package/dist/site-url-core.js +46 -0
  61. package/dist/site-url-core.js.map +1 -0
  62. package/dist/site-url.d.ts +5 -0
  63. package/dist/site-url.d.ts.map +1 -0
  64. package/dist/site-url.js +9 -0
  65. package/dist/site-url.js.map +1 -0
  66. package/dist/utils/apple-news-rss.d.ts +2 -2
  67. package/dist/utils/apple-news-rss.d.ts.map +1 -1
  68. package/dist/utils/define-content-provider.d.ts +61 -0
  69. package/dist/utils/define-content-provider.d.ts.map +1 -0
  70. package/dist/utils/define-content-provider.js +38 -0
  71. package/dist/utils/define-content-provider.js.map +1 -0
  72. package/dist/utils/index.d.ts +2 -0
  73. package/dist/utils/index.d.ts.map +1 -1
  74. package/dist/utils/index.js +2 -0
  75. package/dist/utils/index.js.map +1 -1
  76. package/dist/utils/json-ld/organization.d.ts +2 -2
  77. package/dist/utils/json-ld/organization.d.ts.map +1 -1
  78. package/dist/utils/json-ld/organization.js.map +1 -1
  79. package/dist/utils/json-ld/website.d.ts +2 -2
  80. package/dist/utils/json-ld/website.d.ts.map +1 -1
  81. package/dist/utils/json-ld/website.js.map +1 -1
  82. package/dist/utils/podcast.d.ts +2 -2
  83. package/dist/utils/podcast.d.ts.map +1 -1
  84. package/dist/utils/podcast.js.map +1 -1
  85. package/dist/utils/robots.d.ts +13 -2
  86. package/dist/utils/robots.d.ts.map +1 -1
  87. package/dist/utils/robots.js +4 -4
  88. package/dist/utils/robots.js.map +1 -1
  89. package/dist/utils/rss.d.ts +2 -2
  90. package/dist/utils/rss.d.ts.map +1 -1
  91. package/dist/utils/rss.js.map +1 -1
  92. package/dist/utils/seo-head.d.ts +22 -0
  93. package/dist/utils/seo-head.d.ts.map +1 -0
  94. package/dist/utils/seo-head.js +40 -0
  95. package/dist/utils/seo-head.js.map +1 -0
  96. package/dist/vite-plugin.d.ts.map +1 -1
  97. package/dist/vite-plugin.js +2 -2
  98. package/dist/vite-plugin.js.map +1 -1
  99. package/package.json +8 -4
  100. package/src/components/AeoHead.astro +2 -1
  101. package/src/components/SeoHead.astro +30 -10
@@ -1 +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"}
1
+ {"version":3,"file":"organization.js","sourceRoot":"","sources":["../../../src/utils/json-ld/organization.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CAAC,OAAmC;IAC7E,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"}
@@ -1,4 +1,4 @@
1
- import type { ResolvedSeoOptions } from '../../options.js';
1
+ import type { SeoOptionsWithResolvedSite } from '../../options.js';
2
2
  import type { JsonLdObject } from '../../types.js';
3
- export declare function generateWebSiteJsonLd(options: ResolvedSeoOptions): JsonLdObject;
3
+ export declare function generateWebSiteJsonLd(options: SeoOptionsWithResolvedSite): JsonLdObject;
4
4
  //# sourceMappingURL=website.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"website.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAuB/E"}
1
+ {"version":3,"file":"website.d.ts","sourceRoot":"","sources":["../../../src/utils/json-ld/website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,0BAA0B,GAAG,YAAY,CAuBvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"website.js","sourceRoot":"","sources":["../../../src/utils/json-ld/website.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAChE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAE/C,MAAM,MAAM,GAAiB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,GAAG,EAAE,IAAI;QACT,eAAe,EAAE;YAChB,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE;gBACP,OAAO,EAAE,YAAY;gBACrB,WAAW,EAAE,GAAG,IAAI,0BAA0B;aAC9C;YACD,aAAa,EAAE,kCAAkC;SACjD;KACD,CAAA;IAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"website.js","sourceRoot":"","sources":["../../../src/utils/json-ld/website.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CAAC,OAAmC;IACxE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAE/C,MAAM,MAAM,GAAiB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,GAAG,EAAE,IAAI;QACT,eAAe,EAAE;YAChB,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE;gBACP,OAAO,EAAE,YAAY;gBACrB,WAAW,EAAE,GAAG,IAAI,0BAA0B;aAC9C;YACD,aAAa,EAAE,kCAAkC;SACjD;KACD,CAAA;IAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -1,8 +1,8 @@
1
- import type { ResolvedSeoOptions } from '../options.js';
1
+ import type { SeoOptionsWithResolvedSite } from '../options.js';
2
2
  import type { ContentItem } from '../types.js';
3
3
  /**
4
4
  * Convert ISO 8601 duration (e.g. PT8M30S, PT1H2M3S) to M:SS or H:MM:SS
5
5
  */
6
6
  export declare function convertIso8601Duration(duration: string): string;
7
- export declare function generatePodcastFeed(episodes: ContentItem[], options: ResolvedSeoOptions): string;
7
+ export declare function generatePodcastFeed(episodes: ContentItem[], options: SeoOptionsWithResolvedSite): string;
8
8
  //# sourceMappingURL=podcast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"podcast.d.ts","sourceRoot":"","sources":["../../src/utils/podcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAW9C;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe/D;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAwEhG"}
1
+ {"version":3,"file":"podcast.d.ts","sourceRoot":"","sources":["../../src/utils/podcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAW9C;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe/D;AAMD,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,0BAA0B,GACjC,MAAM,CAwER"}
@@ -1 +1 @@
1
- {"version":3,"file":"podcast.js","sourceRoot":"","sources":["../../src/utils/podcast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"podcast.js","sourceRoot":"","sources":["../../src/utils/podcast.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
- import type { ResolvedSeoOptions } from '../options.js';
2
- export declare function generateRobotsTxt(options: ResolvedSeoOptions): string;
1
+ import type { SeoOptionsWithResolvedSite } from '../options.js';
2
+ export interface GenerateRobotsTxtOptions {
3
+ /**
4
+ * Emit a `Sitemap:` line pointing at SITEMAP_INDEX_PATH.
5
+ *
6
+ * The caller is responsible for ensuring the sitemap index route is
7
+ * actually being served. Pass `false` when no content provider is wired;
8
+ * otherwise crawlers follow the Sitemap: line to an empty or 404 index,
9
+ * which is a live, crawler-visible SEO regression.
10
+ */
11
+ includeSitemap: boolean;
12
+ }
13
+ export declare function generateRobotsTxt(options: SeoOptionsWithResolvedSite, { includeSitemap }: GenerateRobotsTxtOptions): string;
3
14
  //# sourceMappingURL=robots.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAGvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA4BrE"}
1
+ {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAG/D,MAAM,WAAW,wBAAwB;IACxC;;;;;;;OAOG;IACH,cAAc,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,0BAA0B,EACnC,EAAE,cAAc,EAAE,EAAE,wBAAwB,GAC1C,MAAM,CA4BR"}
@@ -1,12 +1,12 @@
1
1
  import { SITEMAP_INDEX_PATH } from './sitemap.js';
2
- export function generateRobotsTxt(options) {
2
+ export function generateRobotsTxt(options, { includeSitemap }) {
3
3
  const { site, robots } = options;
4
4
  const lines = [];
5
- // Default rules
6
5
  lines.push('User-agent: *');
7
6
  lines.push('Allow: /');
8
- lines.push(`Sitemap: ${new URL(SITEMAP_INDEX_PATH, site).toString()}`);
9
- // Additional rules
7
+ if (includeSitemap) {
8
+ lines.push(`Sitemap: ${new URL(SITEMAP_INDEX_PATH, site).toString()}`);
9
+ }
10
10
  if (robots.additionalRules?.length) {
11
11
  for (const rule of robots.additionalRules) {
12
12
  lines.push('');
@@ -1 +1 @@
1
- {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC5D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAEtE,mBAAmB;IACnB,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAC3C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;gBAC7B,CAAC;YACF,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;gBAChC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAcjD,MAAM,UAAU,iBAAiB,CAChC,OAAmC,EACnC,EAAE,cAAc,EAA4B;IAE5C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,IAAI,cAAc,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAC3C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;gBAC7B,CAAC;YACF,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;gBAChC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ResolvedSeoOptions } from '../options.js';
1
+ import type { SeoOptionsWithResolvedSite } from '../options.js';
2
2
  import type { ContentItem } from '../types.js';
3
- export declare function generateRssFeed(items: ContentItem[], options: ResolvedSeoOptions, description?: string): string;
3
+ export declare function generateRssFeed(items: ContentItem[], options: SeoOptionsWithResolvedSite, description?: string): string;
4
4
  //# sourceMappingURL=rss.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rss.d.ts","sourceRoot":"","sources":["../../src/utils/rss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAe9C,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,kBAAkB,EAC3B,WAAW,CAAC,EAAE,MAAM,GAClB,MAAM,CA2CR"}
1
+ {"version":3,"file":"rss.d.ts","sourceRoot":"","sources":["../../src/utils/rss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAe9C,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,0BAA0B,EACnC,WAAW,CAAC,EAAE,MAAM,GAClB,MAAM,CA2CR"}
@@ -1 +1 @@
1
- {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../src/utils/rss.ts"],"names":[],"mappings":"AAGA,SAAS,SAAS,CAAC,GAAW;IAC7B,OAAO,GAAG;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAChC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,KAAoB,EACpB,OAA2B,EAC3B,WAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,eAAe,GAAG,WAAW,IAAI,YAAY,CAAC,IAAI,CAAA;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAChE,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE9C,MAAM,QAAQ,GAAG,KAAK;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW;YAC/B,CAAC,CAAC,wBAAwB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB;YACrE,CAAC,CAAC,EAAE,CAAA;QACL,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;aACnE,IAAI,CAAC,EAAE,CAAC,CAAA;QACV,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK;YAC9B,CAAC,CAAC,2BAA2B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC;YACxF,CAAC,CAAC,EAAE,CAAA;QAEL,OAAO;eACK,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;cACtB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;iCACA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY;YACnG,CAAA;IACV,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,OAAO;;;;;;aAMK,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;mBACtB,SAAS,CAAC,eAAe,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC;gBACX,SAAS,CAAC,QAAQ,CAAC;uBACZ,SAAS,CAAC,GAAG,IAAI,WAAW,CAAC;qBAC/B,aAAa;EAChC,QAAQ;;OAEH,CAAA;AACP,CAAC"}
1
+ {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../src/utils/rss.ts"],"names":[],"mappings":"AAGA,SAAS,SAAS,CAAC,GAAW;IAC7B,OAAO,GAAG;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAChC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,KAAoB,EACpB,OAAmC,EACnC,WAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,eAAe,GAAG,WAAW,IAAI,YAAY,CAAC,IAAI,CAAA;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAChE,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE9C,MAAM,QAAQ,GAAG,KAAK;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW;YAC/B,CAAC,CAAC,wBAAwB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB;YACrE,CAAC,CAAC,EAAE,CAAA;QACL,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;aACnE,IAAI,CAAC,EAAE,CAAC,CAAA;QACV,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK;YAC9B,CAAC,CAAC,2BAA2B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC;YACxF,CAAC,CAAC,EAAE,CAAA;QAEL,OAAO;eACK,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;cACtB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;iCACA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY;YACnG,CAAA;IACV,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,OAAO;;;;;;aAMK,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;mBACtB,SAAS,CAAC,eAAe,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC;gBACX,SAAS,CAAC,QAAQ,CAAC;uBACZ,SAAS,CAAC,GAAG,IAAI,WAAW,CAAC;qBAC/B,aAAa;EAChC,QAAQ;;OAEH,CAAA;AACP,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { SeoOptionsWithResolvedSite } from '../options.js';
2
+ import type { ContentItem, JsonLdObject } from '../types.js';
3
+ import type { OgVariant } from './meta.js';
4
+ interface BuildSeoHeadTitleDescriptionOptions {
5
+ item?: ContentItem;
6
+ options: SeoOptionsWithResolvedSite;
7
+ title?: string;
8
+ description?: string;
9
+ }
10
+ interface BuildSeoHeadJsonLdOptions {
11
+ item?: ContentItem;
12
+ options: SeoOptionsWithResolvedSite;
13
+ variant: OgVariant;
14
+ emitJsonLd?: boolean;
15
+ }
16
+ export declare function buildSeoHeadTitleDescription({ item, options, title, description, }: BuildSeoHeadTitleDescriptionOptions): {
17
+ title: string;
18
+ description?: string;
19
+ };
20
+ export declare function buildSeoHeadJsonLd({ item, options, variant, emitJsonLd, }: BuildSeoHeadJsonLdOptions): JsonLdObject[];
21
+ export {};
22
+ //# sourceMappingURL=seo-head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-head.d.ts","sourceRoot":"","sources":["../../src/utils/seo-head.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAQ5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE1C,UAAU,mCAAmC;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,0BAA0B,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,yBAAyB;IAClC,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,0BAA0B,CAAA;IACnC,OAAO,EAAE,SAAS,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,4BAA4B,CAAC,EAC5C,IAAI,EACJ,OAAO,EACP,KAAK,EACL,WAAW,GACX,EAAE,mCAAmC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAU/E;AAED,wBAAgB,kBAAkB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,OAAO,EACP,UAAiB,GACjB,EAAE,yBAAyB,GAAG,YAAY,EAAE,CAgC5C"}
@@ -0,0 +1,40 @@
1
+ import { generateArticleJsonLd, generateAudioJsonLd, generateProductJsonLd, generateVideoJsonLd, generateWebSiteJsonLd, } from './json-ld/index.js';
2
+ export function buildSeoHeadTitleDescription({ item, options, title, description, }) {
3
+ const baseTitle = title ?? item?.title ?? options.organization.name;
4
+ const suffix = options.defaults.titleSuffix;
5
+ const resolvedTitle = suffix && !baseTitle.endsWith(suffix) ? `${baseTitle}${suffix}` : baseTitle;
6
+ const resolvedDescription = description ?? item?.description;
7
+ return {
8
+ title: resolvedTitle,
9
+ description: resolvedDescription,
10
+ };
11
+ }
12
+ export function buildSeoHeadJsonLd({ item, options, variant, emitJsonLd = true, }) {
13
+ if (!emitJsonLd)
14
+ return [];
15
+ if (!item) {
16
+ return [generateWebSiteJsonLd(options)];
17
+ }
18
+ const jsonLd = [];
19
+ if (variant === 'article') {
20
+ jsonLd.push(generateArticleJsonLd(item, options));
21
+ }
22
+ else if (variant === 'product' && item.product) {
23
+ jsonLd.push(generateProductJsonLd(item.product, item.url, options));
24
+ }
25
+ else if (variant === 'website') {
26
+ jsonLd.push(generateWebSiteJsonLd(options));
27
+ }
28
+ if (item.video) {
29
+ jsonLd.push(generateVideoJsonLd(item));
30
+ }
31
+ if (item.audio) {
32
+ jsonLd.push(generateAudioJsonLd(item.audio, {
33
+ title: item.title,
34
+ datePublished: item.datePublished,
35
+ articleUrl: item.url,
36
+ }));
37
+ }
38
+ return jsonLd;
39
+ }
40
+ //# sourceMappingURL=seo-head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-head.js","sourceRoot":"","sources":["../../src/utils/seo-head.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,oBAAoB,CAAA;AAiB3B,MAAM,UAAU,4BAA4B,CAAC,EAC5C,IAAI,EACJ,OAAO,EACP,KAAK,EACL,WAAW,GAC0B;IACrC,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAA;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAA;IAC3C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IACjG,MAAM,mBAAmB,GAAG,WAAW,IAAI,IAAI,EAAE,WAAW,CAAA;IAE5D,OAAO;QACN,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,mBAAmB;KAChC,CAAA;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,OAAO,EACP,UAAU,GAAG,IAAI,GACU;IAC3B,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAA;IAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAClD,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IACpE,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CACV,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,GAAG;SACpB,CAAC,CACF,CAAA;IACF,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAKtD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,kBAAkB,CAAA;IAC1B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,CA0C3F"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAKtD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,kBAAkB,CAAA;IAC1B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,CA4C3F"}
@@ -24,7 +24,7 @@ export function growthLabsSeoPlugin(opts) {
24
24
  // calling getConfig() populate state in whatever environment they run —
25
25
  // the main Worker AND the Cloudflare prerender worker.
26
26
  const lines = [
27
- `import { _setConfig, _setContentProvider } from '@growth-labs/seo/state';`,
27
+ `import { _setConfig, _setContentProvider } from '@growth-labs/seo/_internal/state';`,
28
28
  ];
29
29
  if (contentProviderModule) {
30
30
  lines.push(`import _cp from ${JSON.stringify(contentProviderModule)};`);
@@ -35,7 +35,7 @@ export function growthLabsSeoPlugin(opts) {
35
35
  lines.push(`_setContentProvider(_cp);`);
36
36
  }
37
37
  lines.push(`export { config };`);
38
- lines.push(`export { getConfig, getContentProvider } from '@growth-labs/seo/state';`);
38
+ lines.push(`export { getConfig, getContentProvider } from '@growth-labs/seo/_internal/state';`);
39
39
  return lines.join('\n');
40
40
  },
41
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB,GAAG,gCAAgC,CAAA;AAC1D,MAAM,0BAA0B,GAAG,KAAK,iBAAiB,EAAE,CAAA;AAiB3D,MAAM,UAAU,mBAAmB,CAAC,IAA+C;IAClF,sEAAsE;IACtE,MAAM,UAAU,GACf,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAK,IAA6B,CAAC,MAAM;QAClE,CAAC,CAAE,IAA6B;QAChC,CAAC,CAAC,EAAE,MAAM,EAAE,IAA0B,EAAE,CAAA;IAE1C,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,UAAU,CAAA;IACpD,uEAAuE;IACvE,2CAA2C;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,MAAiC,CAAA;IAEjF,OAAO;QACN,IAAI,EAAE,wBAAwB;QAC9B,SAAS,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,0BAA0B,CAAA;YAClC,CAAC;QACF,CAAC;QACD,IAAI,CAAC,EAAE;YACN,IAAI,EAAE,KAAK,0BAA0B;gBAAE,OAAM;YAE7C,mEAAmE;YACnE,0EAA0E;YAC1E,wEAAwE;YACxE,uDAAuD;YACvD,MAAM,KAAK,GAAa;gBACvB,2EAA2E;aAC3E,CAAA;YACD,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAA;YACxE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC7D,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;YACjC,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;YACxC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;YACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;KACD,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB,GAAG,gCAAgC,CAAA;AAC1D,MAAM,0BAA0B,GAAG,KAAK,iBAAiB,EAAE,CAAA;AAiB3D,MAAM,UAAU,mBAAmB,CAAC,IAA+C;IAClF,sEAAsE;IACtE,MAAM,UAAU,GACf,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAK,IAA6B,CAAC,MAAM;QAClE,CAAC,CAAE,IAA6B;QAChC,CAAC,CAAC,EAAE,MAAM,EAAE,IAA0B,EAAE,CAAA;IAE1C,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,UAAU,CAAA;IACpD,uEAAuE;IACvE,2CAA2C;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,MAAiC,CAAA;IAEjF,OAAO;QACN,IAAI,EAAE,wBAAwB;QAC9B,SAAS,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,0BAA0B,CAAA;YAClC,CAAC;QACF,CAAC;QACD,IAAI,CAAC,EAAE;YACN,IAAI,EAAE,KAAK,0BAA0B;gBAAE,OAAM;YAE7C,mEAAmE;YACnE,0EAA0E;YAC1E,wEAAwE;YACxE,uDAAuD;YACvD,MAAM,KAAK,GAAa;gBACvB,qFAAqF;aACrF,CAAA;YACD,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAA;YACxE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC7D,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;YACjC,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;YACxC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,CACT,mFAAmF,CACnF,CAAA;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;KACD,CAAA;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/seo",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -26,9 +26,13 @@
26
26
  "import": "./dist/routes/*.js",
27
27
  "default": "./dist/routes/*.js"
28
28
  },
29
- "./state": {
30
- "types": "./dist/state.d.ts",
31
- "import": "./dist/state.js"
29
+ "./_internal/state": {
30
+ "types": "./dist/_internal/state.d.ts",
31
+ "import": "./dist/_internal/state.js"
32
+ },
33
+ "./site-url": {
34
+ "types": "./dist/site-url.d.ts",
35
+ "import": "./dist/site-url.js"
32
36
  },
33
37
  "./bindings": {
34
38
  "types": "./dist/bindings.d.ts",
@@ -9,6 +9,7 @@ import 'virtual:growth-labs/seo/config'
9
9
  // src/options.js inside the consumer's node_modules. Package specifiers route
10
10
  // through the exports map to the compiled dist output.
11
11
  import { getConfig, resolveAeoTwins } from '@growth-labs/seo'
12
+ import { resolveSeoConfig } from '@growth-labs/seo/site-url'
12
13
 
13
14
  export interface Props {
14
15
  /**
@@ -32,7 +33,7 @@ export interface Props {
32
33
  }
33
34
 
34
35
  const { canonical, emitTwinLink = true } = Astro.props
35
- const config = getConfig()
36
+ const config = resolveSeoConfig(getConfig())
36
37
  const aeo = resolveAeoTwins(config.aeoTwins)
37
38
 
38
39
  // ─── Apple News discovery link ───
@@ -23,8 +23,10 @@
23
23
  import 'virtual:growth-labs/seo/config'
24
24
 
25
25
  import { getConfig, type ContentItem } from '@growth-labs/seo'
26
+ import { resolveSeoConfig } from '@growth-labs/seo/site-url'
26
27
  import {
27
- generateArticleJsonLd,
28
+ buildSeoHeadJsonLd,
29
+ buildSeoHeadTitleDescription,
28
30
  generateCanonical,
29
31
  generateHreflang,
30
32
  generateMeta,
@@ -76,6 +78,13 @@ export interface Props {
76
78
  * have a twin), false otherwise (homepage doesn't).
77
79
  */
78
80
  emitTwinLink?: boolean
81
+
82
+ /**
83
+ * Explicit document title/description overrides. When omitted, title and
84
+ * description come from the content item, then the organization name.
85
+ */
86
+ title?: string
87
+ description?: string
79
88
  }
80
89
 
81
90
  const {
@@ -85,9 +94,12 @@ const {
85
94
  emitJsonLd,
86
95
  canonical,
87
96
  emitTwinLink,
97
+ title,
98
+ description,
88
99
  } = Astro.props
89
100
 
90
- const config = getConfig()
101
+ const config = resolveSeoConfig(getConfig())
102
+ const titleDescription = buildSeoHeadTitleDescription({ item, options: config, title, description })
91
103
 
92
104
  // Canonical: item.url if item provided, else explicit prop, else Astro.url.
93
105
  const canonicalHref = (() => {
@@ -98,7 +110,9 @@ const canonicalHref = (() => {
98
110
  const canonicalLink = generateCanonical(canonicalHref, config)
99
111
 
100
112
  // Meta tags (OG + Twitter + news_keywords + apple-news-*): item required.
101
- const metaTags = item ? generateMeta(item, variant, config) : []
113
+ const metaTags = item
114
+ ? generateMeta(item, variant, config).filter((tag) => tag.name !== 'robots')
115
+ : []
102
116
 
103
117
  // Hreflang: item's alternateLocales when present. generateHreflang tolerates
104
118
  // empty input; we gate on length anyway to avoid a call when unnecessary.
@@ -106,16 +120,22 @@ const hreflangLinks = item?.alternateLocales?.length
106
120
  ? generateHreflang(item.alternateLocales, config.defaultLocale ?? 'en')
107
121
  : []
108
122
 
109
- // JSON-LD emission default: on when item + variant are set.
110
- const shouldEmitJsonLd = emitJsonLd ?? Boolean(item)
111
- const jsonLd = shouldEmitJsonLd && item && variant === 'article'
112
- ? generateArticleJsonLd(item, config)
113
- : null
123
+ // JSON-LD emission default: on for both global and content pages.
124
+ const shouldEmitJsonLd = emitJsonLd ?? true
125
+ const jsonLdEntries = buildSeoHeadJsonLd({
126
+ item,
127
+ options: config,
128
+ variant,
129
+ emitJsonLd: shouldEmitJsonLd,
130
+ })
114
131
 
115
132
  // Twin-link default: on when there's an item (article-ish page), off otherwise.
116
133
  const shouldEmitTwinLink = emitTwinLink ?? Boolean(item)
117
134
  ---
118
135
 
136
+ <title>{titleDescription.title}</title>
137
+ {titleDescription.description && <meta name="description" content={titleDescription.description} />}
138
+
119
139
  {robots !== null && <meta name="robots" content={robots} />}
120
140
 
121
141
  <link {...canonicalLink} />
@@ -126,6 +146,6 @@ const shouldEmitTwinLink = emitTwinLink ?? Boolean(item)
126
146
 
127
147
  <AeoHead canonical={canonicalHref} emitTwinLink={shouldEmitTwinLink} />
128
148
 
129
- {jsonLd && (
149
+ {jsonLdEntries.map((jsonLd) => (
130
150
  <script type="application/ld+json" set:html={JSON.stringify(jsonLd)} />
131
- )}
151
+ ))}