@growth-labs/seo 0.5.1 → 0.6.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 (95) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +28 -10
  3. package/dist/index.js.map +1 -1
  4. package/dist/middleware/seo.d.ts +1 -1
  5. package/dist/middleware/seo.d.ts.map +1 -1
  6. package/dist/middleware/seo.js +10 -1
  7. package/dist/middleware/seo.js.map +1 -1
  8. package/dist/routes/apple-news.d.ts +0 -1
  9. package/dist/routes/apple-news.d.ts.map +1 -1
  10. package/dist/routes/apple-news.js +0 -1
  11. package/dist/routes/apple-news.js.map +1 -1
  12. package/dist/routes/llms-full.d.ts +0 -1
  13. package/dist/routes/llms-full.d.ts.map +1 -1
  14. package/dist/routes/llms-full.js +0 -1
  15. package/dist/routes/llms-full.js.map +1 -1
  16. package/dist/routes/llms.d.ts +0 -1
  17. package/dist/routes/llms.d.ts.map +1 -1
  18. package/dist/routes/llms.js +0 -1
  19. package/dist/routes/llms.js.map +1 -1
  20. package/dist/routes/podcast-narration.d.ts +0 -1
  21. package/dist/routes/podcast-narration.d.ts.map +1 -1
  22. package/dist/routes/podcast-narration.js +0 -1
  23. package/dist/routes/podcast-narration.js.map +1 -1
  24. package/dist/routes/podcast.d.ts +0 -1
  25. package/dist/routes/podcast.d.ts.map +1 -1
  26. package/dist/routes/podcast.js +0 -1
  27. package/dist/routes/podcast.js.map +1 -1
  28. package/dist/routes/robots.d.ts +0 -1
  29. package/dist/routes/robots.d.ts.map +1 -1
  30. package/dist/routes/robots.js +0 -1
  31. package/dist/routes/robots.js.map +1 -1
  32. package/dist/routes/rss.d.ts +0 -1
  33. package/dist/routes/rss.d.ts.map +1 -1
  34. package/dist/routes/rss.js +0 -1
  35. package/dist/routes/rss.js.map +1 -1
  36. package/dist/routes/sitemap-articles.d.ts +0 -1
  37. package/dist/routes/sitemap-articles.d.ts.map +1 -1
  38. package/dist/routes/sitemap-articles.js +0 -1
  39. package/dist/routes/sitemap-articles.js.map +1 -1
  40. package/dist/routes/sitemap-index.d.ts +0 -1
  41. package/dist/routes/sitemap-index.d.ts.map +1 -1
  42. package/dist/routes/sitemap-index.js +0 -1
  43. package/dist/routes/sitemap-index.js.map +1 -1
  44. package/dist/routes/sitemap-markdown.d.ts +0 -1
  45. package/dist/routes/sitemap-markdown.d.ts.map +1 -1
  46. package/dist/routes/sitemap-markdown.js +0 -1
  47. package/dist/routes/sitemap-markdown.js.map +1 -1
  48. package/dist/routes/sitemap-pages.d.ts +0 -1
  49. package/dist/routes/sitemap-pages.d.ts.map +1 -1
  50. package/dist/routes/sitemap-pages.js +0 -1
  51. package/dist/routes/sitemap-pages.js.map +1 -1
  52. package/dist/routes/sitemap-products.d.ts +0 -1
  53. package/dist/routes/sitemap-products.d.ts.map +1 -1
  54. package/dist/routes/sitemap-products.js +0 -1
  55. package/dist/routes/sitemap-products.js.map +1 -1
  56. package/dist/routes/sitemap-videos.d.ts +0 -1
  57. package/dist/routes/sitemap-videos.d.ts.map +1 -1
  58. package/dist/routes/sitemap-videos.js +0 -1
  59. package/dist/routes/sitemap-videos.js.map +1 -1
  60. package/dist/utils/apple-news-rss.d.ts.map +1 -1
  61. package/dist/utils/apple-news-rss.js +10 -6
  62. package/dist/utils/apple-news-rss.js.map +1 -1
  63. package/dist/utils/rss.d.ts.map +1 -1
  64. package/dist/utils/rss.js +22 -1
  65. package/dist/utils/rss.js.map +1 -1
  66. package/dist/utils/validation.d.ts.map +1 -1
  67. package/dist/utils/validation.js +24 -1
  68. package/dist/utils/validation.js.map +1 -1
  69. package/dist/vite-plugin.d.ts +1 -1
  70. package/dist/vite-plugin.d.ts.map +1 -1
  71. package/dist/vite-plugin.js +45 -7
  72. package/dist/vite-plugin.js.map +1 -1
  73. package/package.json +2 -2
  74. package/src/components/AeoHead.astro +5 -2
  75. package/src/components/SeoHead.astro +5 -1
  76. package/src/index.ts +30 -10
  77. package/src/middleware/seo.ts +10 -1
  78. package/src/routes/apple-news.ts +0 -2
  79. package/src/routes/llms-full.ts +0 -2
  80. package/src/routes/llms.ts +0 -2
  81. package/src/routes/podcast-narration.ts +0 -2
  82. package/src/routes/podcast.ts +0 -2
  83. package/src/routes/robots.ts +0 -2
  84. package/src/routes/rss.ts +0 -2
  85. package/src/routes/sitemap-articles.ts +0 -2
  86. package/src/routes/sitemap-index.ts +0 -2
  87. package/src/routes/sitemap-markdown.ts +0 -2
  88. package/src/routes/sitemap-pages.ts +0 -2
  89. package/src/routes/sitemap-products.ts +0 -2
  90. package/src/routes/sitemap-videos.ts +0 -2
  91. package/src/utils/apple-news-rss.ts +9 -6
  92. package/src/utils/rss.ts +24 -1
  93. package/src/utils/validation.ts +25 -1
  94. package/src/virtual.d.ts +12 -0
  95. package/src/vite-plugin.ts +47 -8
@@ -1,5 +1,4 @@
1
1
  import 'virtual:growth-labs/seo/config';
2
2
  import type { APIRoute } from 'astro';
3
- export declare const prerender = false;
4
3
  export declare const GET: APIRoute;
5
4
  //# sourceMappingURL=sitemap-products.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-products.d.ts","sourceRoot":"","sources":["../../src/routes/sitemap-products.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,SAAS,QAAQ,CAAA;AAE9B,eAAO,MAAM,GAAG,EAAE,QAejB,CAAA"}
1
+ {"version":3,"file":"sitemap-products.d.ts","sourceRoot":"","sources":["../../src/routes/sitemap-products.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,GAAG,EAAE,QAejB,CAAA"}
@@ -1,7 +1,6 @@
1
1
  import 'virtual:growth-labs/seo/config';
2
2
  import { getContentProvider } from '../_internal/state.js';
3
3
  import { generateProductSitemap } from '../utils/sitemap.js';
4
- export const prerender = false;
5
4
  export const GET = async (context) => {
6
5
  const contentProvider = getContentProvider();
7
6
  let products = [];
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-products.js","sourceRoot":"","sources":["../../src/routes/sitemap-products.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAA;AAE9B,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,QAAQ,GAAkB,EAAE,CAAA;IAChC,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAc,CAAC,CAAA;QACvE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAE5C,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,gCAAgC,EAAE;KAC7D,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"sitemap-products.js","sourceRoot":"","sources":["../../src/routes/sitemap-products.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,QAAQ,GAAkB,EAAE,CAAA;IAChC,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAc,CAAC,CAAA;QACvE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAE5C,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,gCAAgC,EAAE;KAC7D,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import 'virtual:growth-labs/seo/config';
2
2
  import type { APIRoute } from 'astro';
3
- export declare const prerender = false;
4
3
  export declare const GET: APIRoute;
5
4
  //# sourceMappingURL=sitemap-videos.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-videos.d.ts","sourceRoot":"","sources":["../../src/routes/sitemap-videos.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,SAAS,QAAQ,CAAA;AAE9B,eAAO,MAAM,GAAG,EAAE,QAejB,CAAA"}
1
+ {"version":3,"file":"sitemap-videos.d.ts","sourceRoot":"","sources":["../../src/routes/sitemap-videos.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,GAAG,EAAE,QAejB,CAAA"}
@@ -1,7 +1,6 @@
1
1
  import 'virtual:growth-labs/seo/config';
2
2
  import { getContentProvider } from '../_internal/state.js';
3
3
  import { generateVideoSitemap } from '../utils/sitemap.js';
4
- export const prerender = false;
5
4
  export const GET = async (context) => {
6
5
  const contentProvider = getContentProvider();
7
6
  let videos = [];
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-videos.js","sourceRoot":"","sources":["../../src/routes/sitemap-videos.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAA;AAE9B,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,MAAM,GAAkB,EAAE,CAAA;IAC9B,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAc,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAExC,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,gCAAgC,EAAE;KAC7D,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"sitemap-videos.js","sourceRoot":"","sources":["../../src/routes/sitemap-videos.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,MAAM,GAAkB,EAAE,CAAA;IAC9B,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAc,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAExC,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,gCAAgC,EAAE;KAC7D,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-news-rss.d.ts","sourceRoot":"","sources":["../../src/utils/apple-news-rss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAgB9C;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,GAAG,SAAS,CAAA;AAE3E,MAAM,WAAW,2BAA2B;IAC3C,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,OAAO,EAAE,0BAA0B,CAAA;IAInC,WAAW,CAAC,EAAE,mBAAmB,CAAA;CACjC;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,EACpC,KAAK,EACL,OAAO,EACP,WAAW,GACX,EAAE,2BAA2B,GAAG,MAAM,CAgFtC"}
1
+ {"version":3,"file":"apple-news-rss.d.ts","sourceRoot":"","sources":["../../src/utils/apple-news-rss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAgB9C;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,GAAG,SAAS,CAAA;AAE3E,MAAM,WAAW,2BAA2B;IAC3C,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,OAAO,EAAE,0BAA0B,CAAA;IAInC,WAAW,CAAC,EAAE,mBAAmB,CAAA;CACjC;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,EACpC,KAAK,EACL,OAAO,EACP,WAAW,GACX,EAAE,2BAA2B,GAAG,MAAM,CAmFtC"}
@@ -32,14 +32,18 @@ export function generateAppleNewsRss({ items, options, contentHtml, }) {
32
32
  throw new Error('generateAppleNewsRss called without appleNews.enabled');
33
33
  }
34
34
  const filtered = forAppleNews(items, { publishable: appleNews.defaultPublishable });
35
- // Newest-first ordering.
35
+ // Newest-first ordering. Coerce missing/unparseable dates to 0 (sort last) —
36
+ // a NaN comparator result makes Array.sort leave the element in place, which
37
+ // could park a junk-dated item at the front of the capped feed.
38
+ const publishTime = (value) => {
39
+ if (!value)
40
+ return 0;
41
+ const t = new Date(value).getTime();
42
+ return Number.isNaN(t) ? 0 : t;
43
+ };
36
44
  const sorted = filtered
37
45
  .slice()
38
- .sort((a, b) => {
39
- const at = a.datePublished ? new Date(a.datePublished).getTime() : 0;
40
- const bt = b.datePublished ? new Date(b.datePublished).getTime() : 0;
41
- return bt - at;
42
- })
46
+ .sort((a, b) => publishTime(b.datePublished) - publishTime(a.datePublished))
43
47
  .slice(0, MAX_ITEMS);
44
48
  const selfLink = `${options.site.replace(/\/$/, '')}${appleNews.feedPath}`;
45
49
  const channelImage = options.organization.logo;
@@ -1 +1 @@
1
- {"version":3,"file":"apple-news-rss.js","sourceRoot":"","sources":["../../src/utils/apple-news-rss.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apple-news-rss.js","sourceRoot":"","sources":["../../src/utils/apple-news-rss.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
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
+ {"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;AAiC9C,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,0BAA0B,EACnC,WAAW,CAAC,EAAE,MAAM,GAClB,MAAM,CAgDR"}
package/dist/utils/rss.js CHANGED
@@ -1,3 +1,9 @@
1
+ // RSS is a "recent updates" surface, not a full archive (that's the sitemap).
2
+ // Capping the item count keeps the feed lightweight for readers AND bounds the
3
+ // prerendered /feed.xml asset — an uncapped full-body feed on a large catalog
4
+ // would eventually breach Cloudflare's 25 MiB per-asset limit. Mirrors the
5
+ // Apple News feed cap.
6
+ const RSS_MAX_ITEMS = 50;
1
7
  function escapeXml(str) {
2
8
  return str
3
9
  .replace(/&/g, '&')
@@ -9,12 +15,27 @@ function escapeXml(str) {
9
15
  function toRfc822(dateStr) {
10
16
  return new Date(dateStr).toUTCString();
11
17
  }
18
+ // Parse to epoch ms, coercing missing/unparseable dates to 0 so they sort last.
19
+ // A raw `new Date(bad).getTime()` returns NaN, and a NaN comparator result makes
20
+ // Array.sort leave the element in place — which can park a junk-dated item at the
21
+ // front of the capped feed. Content dates come from hand/LLM-authored frontmatter,
22
+ // so malformed values are realistic.
23
+ function publishTime(value) {
24
+ if (!value)
25
+ return 0;
26
+ const t = new Date(value).getTime();
27
+ return Number.isNaN(t) ? 0 : t;
28
+ }
12
29
  export function generateRssFeed(items, options, description) {
13
30
  const { site, organization, defaults } = options;
14
31
  const feedDescription = description ?? organization.name;
15
32
  const language = defaults.locale.replace('_', '-').toLowerCase();
16
33
  const lastBuildDate = new Date().toUTCString();
17
- const itemsXml = items
34
+ // Newest first, then cap. Missing/unparseable dates sort last (time 0).
35
+ const recentItems = [...items]
36
+ .sort((a, b) => publishTime(b.datePublished) - publishTime(a.datePublished))
37
+ .slice(0, RSS_MAX_ITEMS);
38
+ const itemsXml = recentItems
18
39
  .map((item) => {
19
40
  const pubDate = item.datePublished ? toRfc822(item.datePublished) : '';
20
41
  const pubDateTag = pubDate ? `\n <pubDate>${escapeXml(pubDate)}</pubDate>` : '';
@@ -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,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"}
1
+ {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../src/utils/rss.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,uBAAuB;AACvB,MAAM,aAAa,GAAG,EAAE,CAAA;AAExB,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,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,mFAAmF;AACnF,qCAAqC;AACrC,SAAS,WAAW,CAAC,KAAyB;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAA;IACpB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC/B,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,wEAAwE;IACxE,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;SAC3E,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IAEzB,MAAM,QAAQ,GAAG,WAAW;SAC1B,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 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACrC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAqEhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CA8G3F;AA6FD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,qBAAqB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,wBAAwB,EAAE,CAkC5F;AAID,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,EAC9C,eAAe,EACf,KAAK,GACL,EAAE;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,KAAK,EAAE,WAAW,EAAE,CAAA;CACpB,GAAG,mBAAmB,EAAE,CAmBxB"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACrC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAqEhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAwH3F;AA2GD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,qBAAqB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,wBAAwB,EAAE,CAkC5F;AAID,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,EAC9C,eAAe,EACf,KAAK,GACL,EAAE;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,KAAK,EAAE,WAAW,EAAE,CAAA;CACpB,GAAG,mBAAmB,EAAE,CAmBxB"}
@@ -150,7 +150,15 @@ export function validatePage(html, options) {
150
150
  !hasArticleJsonLd(html)) {
151
151
  errors.push('Missing valid Article JSON-LD for article route');
152
152
  }
153
- if (options.requireMaxImagePreviewLarge && !hasMaxImagePreviewLarge(html)) {
153
+ // max-image-preview:large tells search engines to show large image previews
154
+ // in Discover / News results — meaningful only for INDEXABLE pages. A noindex
155
+ // page (404, login, account, etc.) is excluded from search entirely, so the
156
+ // directive is moot there. Requiring it would force every consumer's noindex
157
+ // layout to carry a contradictory `noindex, ..., max-image-preview:large`
158
+ // robots string just to satisfy the linter. Skip the check on noindex pages.
159
+ if (options.requireMaxImagePreviewLarge &&
160
+ !isNoindexPage(html) &&
161
+ !hasMaxImagePreviewLarge(html)) {
154
162
  errors.push('Missing robots max-image-preview:large directive');
155
163
  }
156
164
  return { errors, warnings };
@@ -212,6 +220,21 @@ function hasMaxImagePreviewLarge(html) {
212
220
  }
213
221
  return false;
214
222
  }
223
+ function isNoindexPage(html) {
224
+ const metaTags = html.match(/<meta\s+[^>]*>/gi) ?? [];
225
+ for (const tag of metaTags) {
226
+ const name = getHtmlAttr(tag, 'name')?.toLowerCase();
227
+ // Per the robots spec a per-bot directive (e.g. name="googlebot") counts;
228
+ // `content="none"` is equivalent to `noindex, nofollow`.
229
+ if (name !== 'robots' && name !== 'googlebot')
230
+ continue;
231
+ const content = getHtmlAttr(tag, 'content')?.toLowerCase() ?? '';
232
+ const directives = content.split(',').map((part) => part.trim());
233
+ if (directives.includes('noindex') || directives.includes('none'))
234
+ return true;
235
+ }
236
+ return false;
237
+ }
215
238
  function isRecord(value) {
216
239
  return typeof value === 'object' && value !== null;
217
240
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Plugin } from 'vite';
2
- import type { ResolvedSeoOptions } from './options.js';
2
+ import { type ResolvedSeoOptions } from './options.js';
3
3
  export interface SeoVitePluginOptions {
4
4
  config: ResolvedSeoOptions;
5
5
  /**
@@ -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,CA4C3F"}
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,EAAE,KAAK,kBAAkB,EAAmB,MAAM,cAAc,CAAA;AA8BvE,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,CA0D3F"}
@@ -1,5 +1,30 @@
1
+ import { resolveAeoTwins } from './options.js';
1
2
  const VIRTUAL_MODULE_ID = 'virtual:growth-labs/seo/config';
2
3
  const RESOLVED_VIRTUAL_MODULE_ID = `\0${VIRTUAL_MODULE_ID}`;
4
+ // Mode-aware twin of the virtual config module, imported by the always-runtime
5
+ // SEO middleware and the head components (SeoHead/AeoHead). It seeds `_setConfig`
6
+ // always, and seeds the contentProvider ONLY in non-static modes:
7
+ //
8
+ // - STATIC mode (aeoTwins false/'static', no flexibleSampling): provider-free.
9
+ // The middleware runs in the DEPLOYED Worker on every request; importing the
10
+ // provider-bearing `config` here would pull the consumer's contentProviderModule
11
+ // — and transitively `astro:content` plus the whole content store (tens of MB
12
+ // on a large catalog) — into the runtime Worker, blowing Cloudflare's 10 MB
13
+ // limit even though the middleware only needs metadata. In static mode the
14
+ // middleware needs no provider (AEO twins are prerendered, members-gating is
15
+ // unavailable), so it stays out.
16
+ //
17
+ // - NON-STATIC mode (aeoTwins 'middleware'/'both', or flexibleSampling): the
18
+ // middleware genuinely needs the provider at runtime (Accept: text/markdown
19
+ // negotiation, LLM-training-crawler 403 on members items). Route modules load
20
+ // lazily under the Cloudflare adapter, so we cannot rely on an SSR route's
21
+ // import to seed the provider before the middleware runs. Seeding it via THIS
22
+ // module — imported at the middleware's own module load — is deterministic.
23
+ // Bundling the store is acceptable here: non-static consumers serve dynamic
24
+ // content at runtime by design and are not the ones relying on prerender to
25
+ // stay under 10 MB.
26
+ const VIRTUAL_LITE_ID = 'virtual:growth-labs/seo/config-lite';
27
+ const RESOLVED_VIRTUAL_LITE_ID = `\0${VIRTUAL_LITE_ID}`;
3
28
  export function growthLabsSeoPlugin(opts) {
4
29
  // Back-compat: callers from 0.2.x passed ResolvedSeoOptions directly.
5
30
  const normalized = 'config' in opts && 'site' in opts.config
@@ -15,23 +40,36 @@ export function growthLabsSeoPlugin(opts) {
15
40
  if (id === VIRTUAL_MODULE_ID) {
16
41
  return RESOLVED_VIRTUAL_MODULE_ID;
17
42
  }
43
+ if (id === VIRTUAL_LITE_ID) {
44
+ return RESOLVED_VIRTUAL_LITE_ID;
45
+ }
18
46
  },
19
47
  load(id) {
20
- if (id !== RESOLVED_VIRTUAL_MODULE_ID)
48
+ if (id !== RESOLVED_VIRTUAL_MODULE_ID && id !== RESOLVED_VIRTUAL_LITE_ID)
21
49
  return;
50
+ // `config` always seeds the provider (when a module is wired). `config-lite`
51
+ // seeds the provider only in NON-static modes (see the module comment): in
52
+ // static mode it must stay provider-free so the always-runtime middleware
53
+ // doesn't drag the content store into the deployed Worker; in non-static
54
+ // modes the middleware needs the provider at runtime, so config-lite seeds
55
+ // it deterministically at the middleware's own load.
56
+ const aeo = resolveAeoTwins(config.aeoTwins);
57
+ const staticMode = (!aeo || aeo.mode === 'static') && !config.flexibleSampling.enabled;
58
+ const isLite = id === RESOLVED_VIRTUAL_LITE_ID;
59
+ const withProvider = Boolean(contentProviderModule) && (!isLite || !staticMode);
22
60
  // The generated module seeds state via side-effect at import time.
23
- // Routes/middleware that `import 'virtual:growth-labs/seo/config'` before
24
- // calling getConfig() populate state in whatever environment they run —
25
- // the main Worker AND the Cloudflare prerender worker.
61
+ // Routes/middleware that import it before calling getConfig() populate
62
+ // state in whatever environment they run — the main Worker AND the
63
+ // Cloudflare prerender worker.
26
64
  const lines = [
27
- `import { _setConfig, _setContentProvider } from '@growth-labs/seo/_internal/state';`,
65
+ `import { _setConfig${withProvider ? ', _setContentProvider' : ''} } from '@growth-labs/seo/_internal/state';`,
28
66
  ];
29
- if (contentProviderModule) {
67
+ if (withProvider) {
30
68
  lines.push(`import _cp from ${JSON.stringify(contentProviderModule)};`);
31
69
  }
32
70
  lines.push(`const config = ${JSON.stringify(staticConfig)};`);
33
71
  lines.push(`_setConfig(config);`);
34
- if (contentProviderModule) {
72
+ if (withProvider) {
35
73
  lines.push(`_setContentProvider(_cp);`);
36
74
  }
37
75
  lines.push(`export { config };`);
@@ -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,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"}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/seo",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -73,7 +73,7 @@
73
73
  "astro": "^6.1.10",
74
74
  "typescript": "^5.7.0",
75
75
  "vite": "^7.3.2",
76
- "vitest": "^3.0.0"
76
+ "vitest": "^4.1.8"
77
77
  },
78
78
  "scripts": {
79
79
  "build": "tsc",
@@ -1,7 +1,10 @@
1
1
  ---
2
2
  // Side-effect: seeds state in whatever environment Vite bundles for.
3
- // Required so `getConfig()` works in the Cloudflare prerender Worker.
4
- import 'virtual:growth-labs/seo/config'
3
+ // Required so `getConfig()` works in the Cloudflare prerender Worker. Uses the
4
+ // provider-free (in static mode) `config-lite` twin — AeoHead only reads
5
+ // getConfig()/resolveAeoTwins(), never getContentProvider() — so it doesn't drag
6
+ // the content store into an SSR page that renders this head component.
7
+ import 'virtual:growth-labs/seo/config-lite'
5
8
 
6
9
  // Use package self-imports (not relative ../options.js / ../state.js) because
7
10
  // this component ships as source from src/components/ but options.ts and state.ts
@@ -20,7 +20,11 @@
20
20
  // Centralizing here eliminates that class of bug across ~12 sites.
21
21
  //
22
22
  // Side-effect import seeds state in both main and Cloudflare prerender Workers.
23
- import 'virtual:growth-labs/seo/config'
23
+ // SeoHead only reads getConfig() — never getContentProvider() — so it imports the
24
+ // mode-aware `config-lite` twin. In static mode that keeps the contentProvider (and
25
+ // the content store) out of any SSR page that renders this layout; the feed/AEO
26
+ // routes that DO need the provider import the full `config` themselves.
27
+ import 'virtual:growth-labs/seo/config-lite'
24
28
 
25
29
  import { getConfig, type ContentItem } from '@growth-labs/seo'
26
30
  import { resolveSeoConfig } from '@growth-labs/seo/site-url'
package/src/index.ts CHANGED
@@ -91,11 +91,29 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
91
91
  const skipped: Array<{ pattern: string; reason: string }> = []
92
92
  const injectedRoutes = options.injectedRoutes
93
93
 
94
+ // ─── Prerender content routes in static mode ───
95
+ // The injected feed/sitemap/llms routes call the contentProvider, which
96
+ // (for content-layer-backed providers) transitively imports `astro:content`
97
+ // and the entire content store. As SSR (`prerender: false`) routes, that
98
+ // store ships in the DEPLOYED Worker — on a large catalog this blows
99
+ // Cloudflare's 10 MB Worker size limit. In "static" mode the feeds carry
100
+ // no per-request variation, so we prerender them: the provider runs in the
101
+ // build-time prerender Worker and the feeds are emitted as static Assets
102
+ // (which are NOT counted against the Worker size limit). Non-static modes
103
+ // (aeo 'middleware'/'both', flexibleSampling) keep SSR behavior unchanged —
104
+ // they genuinely branch per request and the middleware needs the provider.
105
+ //
106
+ // NOTE: the route modules must NOT carry a literal `export const prerender`
107
+ // — Astro's regex scanner would override this injected value. They were
108
+ // stripped of that export so this flag is authoritative.
109
+ const prerenderContentRoutes =
110
+ (!aeo || aeo.mode === 'static') && !options.flexibleSampling.enabled
111
+
94
112
  const injectSeoRoute = (pattern: string, entrypoint: string) => {
95
113
  injectRoute({
96
114
  pattern,
97
115
  entrypoint: resolveEntrypoint(entrypoint),
98
- prerender: false,
116
+ prerender: prerenderContentRoutes,
99
117
  })
100
118
  injected.push(pattern)
101
119
  }
@@ -177,7 +195,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
177
195
  injectRoute({
178
196
  pattern: '/robots.txt',
179
197
  entrypoint: resolveEntrypoint('./routes/robots'),
180
- prerender: false,
198
+ prerender: prerenderContentRoutes,
181
199
  })
182
200
  injected.push('/robots.txt')
183
201
  } else {
@@ -193,7 +211,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
193
211
  injectRoute({
194
212
  pattern: '/llms.txt',
195
213
  entrypoint: resolveEntrypoint('./routes/llms'),
196
- prerender: false,
214
+ prerender: prerenderContentRoutes,
197
215
  })
198
216
  injected.push('/llms.txt')
199
217
  }
@@ -201,7 +219,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
201
219
  injectRoute({
202
220
  pattern: '/llms-full.txt',
203
221
  entrypoint: resolveEntrypoint('./routes/llms-full'),
204
- prerender: false,
222
+ prerender: prerenderContentRoutes,
205
223
  })
206
224
  injected.push('/llms-full.txt')
207
225
  }
@@ -211,7 +229,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
211
229
  injectRoute({
212
230
  pattern: '/feed.xml',
213
231
  entrypoint: resolveEntrypoint('./routes/rss'),
214
- prerender: false,
232
+ prerender: prerenderContentRoutes,
215
233
  })
216
234
  injected.push('/feed.xml')
217
235
  }
@@ -221,7 +239,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
221
239
  injectRoute({
222
240
  pattern: options.appleNews.feedPath,
223
241
  entrypoint: resolveEntrypoint('./routes/apple-news'),
224
- prerender: false,
242
+ prerender: prerenderContentRoutes,
225
243
  })
226
244
  injected.push(options.appleNews.feedPath)
227
245
  }
@@ -231,7 +249,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
231
249
  injectRoute({
232
250
  pattern: options.podcast.feedPath,
233
251
  entrypoint: resolveEntrypoint('./routes/podcast'),
234
- prerender: false,
252
+ prerender: prerenderContentRoutes,
235
253
  })
236
254
  injected.push(options.podcast.feedPath)
237
255
  }
@@ -241,7 +259,7 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
241
259
  injectRoute({
242
260
  pattern: options.audioNarration.podcastFeedPath,
243
261
  entrypoint: resolveEntrypoint('./routes/podcast-narration'),
244
- prerender: false,
262
+ prerender: prerenderContentRoutes,
245
263
  })
246
264
  injected.push(options.audioNarration.podcastFeedPath)
247
265
  }
@@ -294,8 +312,10 @@ export default function seo(userOptions: SeoOptions): AstroIntegration {
294
312
  // Note: we try to load items here to check the guard, but this is
295
313
  // best-effort. If contentProvider uses astro:content or other Vite
296
314
  // virtuals, it will fail at raw-Node import time and we skip silently.
297
- // The guard is a defence-in-depth check; the primary guarantee comes
298
- // from the consumer-set `export const prerender = false` on gated routes.
315
+ // The guard is a defence-in-depth check. Note flexibleSampling forces
316
+ // non-static mode, so `prerenderContentRoutes` is false here and the
317
+ // injected content routes stay SSR (their prerender is controlled by the
318
+ // injectRoute flag above, not a literal `export const prerender`).
299
319
  if (contentProvider && options.flexibleSampling?.enabled) {
300
320
  try {
301
321
  const items = await contentProvider({ type: 'articles' }, {} as never)
@@ -1,4 +1,13 @@
1
- import 'virtual:growth-labs/seo/config'
1
+ // Provider-free config import: the middleware runs in the deployed Worker on
2
+ // every request and only needs metadata-level lookups. Importing the
3
+ // provider-bearing 'config' module here would pull the consumer's
4
+ // contentProviderModule — and transitively `astro:content` plus the whole
5
+ // content-layer store — into the runtime Worker, blowing Cloudflare's 10 MB
6
+ // size limit on large catalogs. The provider is seeded separately by the
7
+ // injected content routes (prerendered in static mode). getContentProvider()
8
+ // returns undefined here in static mode, which the provider-gated branches
9
+ // below already tolerate.
10
+ import 'virtual:growth-labs/seo/config-lite'
2
11
  import { getConfig, getContentProvider } from '../_internal/state.js'
3
12
  import type { SeoEnv } from '../bindings.js'
4
13
  import { type ResolvedSeoOptions, resolveAeoTwins } from '../options.js'
@@ -5,8 +5,6 @@ import { resolveSeoConfig } from '../site-url.js'
5
5
  import type { ContentItem } from '../types.js'
6
6
  import { generateAppleNewsRss } from '../utils/apple-news-rss.js'
7
7
 
8
- export const prerender = false
9
-
10
8
  export const GET: APIRoute = async (context) => {
11
9
  const config = resolveSeoConfig(getConfig())
12
10
  const contentProvider = getContentProvider()
@@ -4,8 +4,6 @@ import { getConfig, getContentProvider } from '../_internal/state.js'
4
4
  import type { ContentItem } from '../types.js'
5
5
  import { generateLlmsFull } from '../utils/llms-full.js'
6
6
 
7
- export const prerender = false
8
-
9
7
  export const GET: APIRoute = async (context) => {
10
8
  const config = getConfig()
11
9
  const contentProvider = getContentProvider()
@@ -3,8 +3,6 @@ import type { APIRoute } from 'astro'
3
3
  import { getConfig } from '../_internal/state.js'
4
4
  import { generateLlmsTxt } from '../utils/llms.js'
5
5
 
6
- export const prerender = false
7
-
8
6
  export const GET: APIRoute = async () => {
9
7
  const config = getConfig()
10
8
  const txt = generateLlmsTxt(config)
@@ -5,8 +5,6 @@ import { resolveSeoConfig } from '../site-url.js'
5
5
  import type { ContentItem } from '../types.js'
6
6
  import { generatePodcastFeed } from '../utils/podcast.js'
7
7
 
8
- export const prerender = false
9
-
10
8
  export const GET: APIRoute = async (context) => {
11
9
  const config = resolveSeoConfig(getConfig())
12
10
  const contentProvider = getContentProvider()
@@ -5,8 +5,6 @@ import { resolveSeoConfig } from '../site-url.js'
5
5
  import type { ContentItem } from '../types.js'
6
6
  import { generatePodcastFeed } from '../utils/podcast.js'
7
7
 
8
- export const prerender = false
9
-
10
8
  export const GET: APIRoute = async (context) => {
11
9
  const config = resolveSeoConfig(getConfig())
12
10
  const contentProvider = getContentProvider()
@@ -4,8 +4,6 @@ import { getConfig, getContentProvider } from '../_internal/state.js'
4
4
  import { resolveSeoConfig } from '../site-url.js'
5
5
  import { generateRobotsTxt } from '../utils/robots.js'
6
6
 
7
- export const prerender = false
8
-
9
7
  export const GET: APIRoute = async () => {
10
8
  const config = resolveSeoConfig(getConfig())
11
9
  // The sitemap-index route is only injected when a content provider is wired.
package/src/routes/rss.ts CHANGED
@@ -6,8 +6,6 @@ import type { ContentItem } from '../types.js'
6
6
  import { forRss } from '../utils/content-filter.js'
7
7
  import { generateRssFeed } from '../utils/rss.js'
8
8
 
9
- export const prerender = false
10
-
11
9
  export const GET: APIRoute = async (context) => {
12
10
  const config = resolveSeoConfig(getConfig())
13
11
  const contentProvider = getContentProvider()