@growth-labs/seo 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +142 -54
  2. package/dist/bindings.d.ts +127 -0
  3. package/dist/bindings.d.ts.map +1 -0
  4. package/dist/bindings.js +11 -0
  5. package/dist/bindings.js.map +1 -0
  6. package/dist/cron/prune-aeo-r2.d.ts +36 -0
  7. package/dist/cron/prune-aeo-r2.d.ts.map +1 -0
  8. package/dist/cron/prune-aeo-r2.js +94 -0
  9. package/dist/cron/prune-aeo-r2.js.map +1 -0
  10. package/dist/durable-objects/aeo-revalidation-coord.d.ts +69 -0
  11. package/dist/durable-objects/aeo-revalidation-coord.d.ts.map +1 -0
  12. package/dist/durable-objects/aeo-revalidation-coord.js +177 -0
  13. package/dist/durable-objects/aeo-revalidation-coord.js.map +1 -0
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +103 -16
  17. package/dist/index.js.map +1 -1
  18. package/dist/middleware/seo.d.ts +44 -4
  19. package/dist/middleware/seo.d.ts.map +1 -1
  20. package/dist/middleware/seo.js +237 -41
  21. package/dist/middleware/seo.js.map +1 -1
  22. package/dist/options.d.ts +1293 -6
  23. package/dist/options.d.ts.map +1 -1
  24. package/dist/options.js +238 -1
  25. package/dist/options.js.map +1 -1
  26. package/dist/routes/apple-news.d.ts +4 -0
  27. package/dist/routes/apple-news.d.ts.map +1 -0
  28. package/dist/routes/apple-news.js +28 -0
  29. package/dist/routes/apple-news.js.map +1 -0
  30. package/dist/routes/llms-full.d.ts +4 -0
  31. package/dist/routes/llms-full.d.ts.map +1 -0
  32. package/dist/routes/llms-full.js +29 -0
  33. package/dist/routes/llms-full.js.map +1 -0
  34. package/dist/routes/revalidate.d.ts +16 -0
  35. package/dist/routes/revalidate.d.ts.map +1 -0
  36. package/dist/routes/revalidate.js +243 -0
  37. package/dist/routes/revalidate.js.map +1 -0
  38. package/dist/routes/rss.d.ts.map +1 -1
  39. package/dist/routes/rss.js +4 -1
  40. package/dist/routes/rss.js.map +1 -1
  41. package/dist/routes/sitemap-markdown.d.ts +4 -0
  42. package/dist/routes/sitemap-markdown.d.ts.map +1 -0
  43. package/dist/routes/sitemap-markdown.js +32 -0
  44. package/dist/routes/sitemap-markdown.js.map +1 -0
  45. package/dist/types.d.ts +16 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/utils/aeo-summary.d.ts +35 -0
  48. package/dist/utils/aeo-summary.d.ts.map +1 -0
  49. package/dist/utils/aeo-summary.js +141 -0
  50. package/dist/utils/aeo-summary.js.map +1 -0
  51. package/dist/utils/aeo-twin-emitter.d.ts +79 -0
  52. package/dist/utils/aeo-twin-emitter.d.ts.map +1 -0
  53. package/dist/utils/aeo-twin-emitter.js +99 -0
  54. package/dist/utils/aeo-twin-emitter.js.map +1 -0
  55. package/dist/utils/aeo.d.ts +62 -12
  56. package/dist/utils/aeo.d.ts.map +1 -1
  57. package/dist/utils/aeo.js +187 -26
  58. package/dist/utils/aeo.js.map +1 -1
  59. package/dist/utils/apple-news-anf.d.ts +38 -0
  60. package/dist/utils/apple-news-anf.d.ts.map +1 -0
  61. package/dist/utils/apple-news-anf.js +120 -0
  62. package/dist/utils/apple-news-anf.js.map +1 -0
  63. package/dist/utils/apple-news-rss.d.ts +31 -0
  64. package/dist/utils/apple-news-rss.d.ts.map +1 -0
  65. package/dist/utils/apple-news-rss.js +103 -0
  66. package/dist/utils/apple-news-rss.js.map +1 -0
  67. package/dist/utils/content-filter.d.ts +52 -0
  68. package/dist/utils/content-filter.d.ts.map +1 -0
  69. package/dist/utils/content-filter.js +75 -0
  70. package/dist/utils/content-filter.js.map +1 -0
  71. package/dist/utils/crawler-class.d.ts +39 -0
  72. package/dist/utils/crawler-class.d.ts.map +1 -0
  73. package/dist/utils/crawler-class.js +127 -0
  74. package/dist/utils/crawler-class.js.map +1 -0
  75. package/dist/utils/effective-auth.d.ts +28 -0
  76. package/dist/utils/effective-auth.d.ts.map +1 -0
  77. package/dist/utils/effective-auth.js +33 -0
  78. package/dist/utils/effective-auth.js.map +1 -0
  79. package/dist/utils/fcrdns.d.ts +73 -0
  80. package/dist/utils/fcrdns.d.ts.map +1 -0
  81. package/dist/utils/fcrdns.js +219 -0
  82. package/dist/utils/fcrdns.js.map +1 -0
  83. package/dist/utils/fresh-layer.d.ts +53 -0
  84. package/dist/utils/fresh-layer.d.ts.map +1 -0
  85. package/dist/utils/fresh-layer.js +147 -0
  86. package/dist/utils/fresh-layer.js.map +1 -0
  87. package/dist/utils/index.d.ts +14 -3
  88. package/dist/utils/index.d.ts.map +1 -1
  89. package/dist/utils/index.js +14 -3
  90. package/dist/utils/index.js.map +1 -1
  91. package/dist/utils/json-ld/article.d.ts +13 -1
  92. package/dist/utils/json-ld/article.d.ts.map +1 -1
  93. package/dist/utils/json-ld/article.js +37 -8
  94. package/dist/utils/json-ld/article.js.map +1 -1
  95. package/dist/utils/llms-full.d.ts +29 -0
  96. package/dist/utils/llms-full.d.ts.map +1 -0
  97. package/dist/utils/llms-full.js +67 -0
  98. package/dist/utils/llms-full.js.map +1 -0
  99. package/dist/utils/meta.d.ts +4 -1
  100. package/dist/utils/meta.d.ts.map +1 -1
  101. package/dist/utils/meta.js +25 -2
  102. package/dist/utils/meta.js.map +1 -1
  103. package/dist/utils/sitemap-markdown.d.ts +24 -0
  104. package/dist/utils/sitemap-markdown.d.ts.map +1 -0
  105. package/dist/utils/sitemap-markdown.js +57 -0
  106. package/dist/utils/sitemap-markdown.js.map +1 -0
  107. package/dist/utils/staleness.d.ts +27 -0
  108. package/dist/utils/staleness.d.ts.map +1 -0
  109. package/dist/utils/staleness.js +46 -0
  110. package/dist/utils/staleness.js.map +1 -0
  111. package/dist/utils/validation.d.ts +41 -0
  112. package/dist/utils/validation.d.ts.map +1 -1
  113. package/dist/utils/validation.js +78 -0
  114. package/dist/utils/validation.js.map +1 -1
  115. package/package.json +70 -58
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA2CjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmF3B,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AACzD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
package/dist/options.js CHANGED
@@ -1,10 +1,12 @@
1
1
  import { z } from 'zod';
2
+ // ─── Locale ───
2
3
  const localeSchema = z.object({
3
4
  lang: z.string(),
4
5
  region: z.string().optional(),
5
6
  urlPrefix: z.string(),
6
7
  domain: z.string().optional(),
7
8
  });
9
+ // ─── Podcast ───
8
10
  const podcastSchema = z.object({
9
11
  enabled: z.boolean().default(false),
10
12
  title: z.string(),
@@ -20,6 +22,7 @@ const podcastSchema = z.object({
20
22
  type: z.enum(['episodic', 'serial']).default('episodic'),
21
23
  copyright: z.string().optional(),
22
24
  });
25
+ // ─── Commerce ───
23
26
  const commerceSchema = z.object({
24
27
  enabled: z.boolean().default(false),
25
28
  returnPolicy: z
@@ -37,7 +40,126 @@ const commerceSchema = z.object({
37
40
  .optional(),
38
41
  currency: z.string().default('USD'),
39
42
  });
43
+ // ─── Apple News ───
44
+ const appleNewsSchema = z.object({
45
+ enabled: z.boolean().default(false),
46
+ channelName: z.string(),
47
+ channelId: z.string().optional(),
48
+ feedPath: z.string().default('/apple-news.xml'),
49
+ // Default publishable state applied to items that don't set their own apple-news-publishable.
50
+ // 'yes' opts every public article in by default.
51
+ defaultPublishable: z.enum(['yes', 'no']).default('yes'),
52
+ // Default Apple News section. Per-article sections can override.
53
+ defaultSection: z.string().optional(),
54
+ // If true, include full article body in content:encoded (recommended).
55
+ fullContent: z.boolean().default(true),
56
+ // Emit <link rel="alternate" type="application/rss+xml" title="Apple News"> in <head>.
57
+ discoveryLink: z.boolean().default(true),
58
+ });
59
+ // ─── Fresh-twin storage layer ───
60
+ const freshLayerSchema = z.object({
61
+ // Binding name in wrangler.toml (R2 bucket or KV namespace).
62
+ bindingName: z.string().default('AEO_TWINS'),
63
+ // 'r2' (preferred) or 'kv'. Autodetected from the binding shape at runtime;
64
+ // the explicit hint avoids ambiguity.
65
+ type: z.enum(['r2', 'kv']).default('r2'),
66
+ // Durable Object class binding for revalidation coordination. A single DO class
67
+ // handles rate limit, per-slug lock, and idempotency; one instance per request-hostname.
68
+ coordinatorBindingName: z.string().default('AEO_REVALIDATION_COORD'),
69
+ // Days to retain old-version R2 prefixes before the scheduled prune Worker deletes them.
70
+ retentionDays: z.number().int().min(1).max(365).default(7),
71
+ });
72
+ // ─── AEO twins (object form) ───
73
+ //
74
+ // The boolean form `aeoTwins: true` is equivalent to `{ mode: 'static' }`.
75
+ // The object form exposes full configuration.
76
+ const aeoTwinsObjectSchema = z.object({
77
+ // 'static' — emit prerendered .md files at build time (default, fastest serve path)
78
+ // 'middleware' — serve .md via Accept: text/markdown on same URL (requires SSR)
79
+ // 'both' — emit static twins AND run middleware negotiation (freshness on cache-miss
80
+ // via on-demand revalidation)
81
+ //
82
+ // STALENESS WARNING: `static` mode is frozen at build time. If HTML is editable
83
+ // post-publish (CMS corrections, breaking-news updates), the .md twin will drift.
84
+ // Answer engines that compare the two may downgrade trust.
85
+ // - Immutable-after-publish content -> `static` is safe.
86
+ // - Mutable content -> `both` + `onDemandRevalidation` + CMS webhook.
87
+ // - Gated content with Flexible Sampling -> `middleware` (rejected with `static`).
88
+ mode: z.enum(['static', 'middleware', 'both']).default('static'),
89
+ // Maps an article URL to its PRIMARY markdown twin URL (singular). The primary URL is
90
+ // the canonical twin used in the Link: rel="alternate" header, sitemap-markdown.xml,
91
+ // and summary-twin naming (<primary>.summary.md).
92
+ // Default: appends '.md' (e.g. /article/midway -> /article/midway.md).
93
+ twinUrl: z.function().args(z.string()).returns(z.string()).optional(),
94
+ // Alias suffixes that redirect (301) to the primary twin URL via middleware.
95
+ // Only active when `mode !== 'static'` (pure-static aliases were dropped in v7;
96
+ // they created a weak fallback when Cloudflare Assets can't serve 301s).
97
+ // Default: ['/index.md'] so `/article/midway/index.md` aliases to `/article/midway.md`
98
+ // under middleware-backed modes.
99
+ twinAliases: z.array(z.string()).default(['/index.md']),
100
+ // Emit a short "summary twin" (~300 tokens) at <primary-twin-url>.summary.md
101
+ // for context-limited agents (Perplexity, Apple Intelligence, long-convo ChatGPT).
102
+ summaryTwin: z.boolean().default(true),
103
+ // Emit semantic chunk markers (<!-- aeo:section --> comments) in .md bodies so
104
+ // RAG retrievers split on our boundaries, not theirs.
105
+ ragChunkMarkers: z.boolean().default(true),
106
+ // Headers applied to every emitted .md file. Defaults enforce canonicalization
107
+ // back to the HTML master to prevent duplicate-content issues.
108
+ responseHeaders: z
109
+ .object({
110
+ noindex: z.boolean().default(true), // X-Robots-Tag: noindex
111
+ canonicalToHtml: z.boolean().default(true), // Link: <html-url>; rel="canonical"
112
+ })
113
+ .default({}),
114
+ // Predicate to filter items at twin-emission time. Defaults to the access rule
115
+ // (no twin for members). Override for custom gating (e.g. exclude previews).
116
+ include: z.function().args(z.custom()).returns(z.boolean()).optional(),
117
+ // When to treat static twins as stale vs live HTML.
118
+ // 'content-hash' — SHA-256 of body+description embedded in frontmatter; validation
119
+ // hook compares against the current contentProvider output at build time.
120
+ // 'dateModified' — compare frontmatter.dateModified against item.dateModified.
121
+ // 'none' — never check (only safe for immutable-after-publish content).
122
+ stalenessCheck: z.enum(['content-hash', 'dateModified', 'none']).default('content-hash'),
123
+ // Expose `POST /_seo/revalidate` for CMS webhooks to push fresh twins.
124
+ // Requires `freshLayer` + a `revalidateToken` >= 32 bytes (enforced at parse time).
125
+ onDemandRevalidation: z.boolean().default(false),
126
+ // Authentication token for the revalidate endpoint. Passed as `Authorization: Bearer`.
127
+ // Must be >=32 bytes when `onDemandRevalidation: true`; rejected at config-parse
128
+ // otherwise (a short token means a public unauthenticated DoS vector).
129
+ revalidateToken: z.string().min(32).optional(),
130
+ // Fresh-twin storage layer. Required when `mode !== 'static'` or `onDemandRevalidation: true`.
131
+ // Cloudflare Workers Assets are immutable at runtime, so post-build twin writes go here.
132
+ freshLayer: freshLayerSchema.optional(),
133
+ });
134
+ // ─── Flexible Sampling (Google paywall policy) ───
135
+ const flexibleSamplingSchema = z
136
+ .object({
137
+ enabled: z.boolean().default(false),
138
+ // Free-content strategy visible to anonymous users.
139
+ sampleMode: z.enum(['metered', 'lead-in', 'none']).default('lead-in'),
140
+ // Paragraphs of lead-in visible before the gate.
141
+ leadInParagraphs: z.number().int().min(0).default(2),
142
+ // Free articles per rolling 30 days for 'metered' mode. Consumer enforces count;
143
+ // this option surfaces the signal to the package.
144
+ meteredLimit: z.number().int().min(0).default(3),
145
+ })
146
+ .default({});
147
+ // ─── Crawler policy ───
148
+ const crawlerPolicySchema = z
149
+ .object({
150
+ // Block known LLM training crawlers at robots.txt AND via 403 at middleware on `access: 'members'`.
151
+ blockLlmTrainingCrawlers: z.boolean().default(true),
152
+ // User-directed LLM agents (ChatGPT-User, Claude-User, PerplexityBot-User) get the anonymous
153
+ // gated body, regardless of cookies. Never the full member body.
154
+ userDirectedAgentsSeePublicOnly: z.boolean().default(true),
155
+ // If true, verified Googlebot/Bingbot/Applebot receive full body on `access: 'members'`
156
+ // items with paywall JSON-LD markup (requires `flexibleSampling.enabled`).
157
+ verifiedSearchCrawlersSeeFullBody: z.boolean().default(true),
158
+ })
159
+ .default({});
160
+ // ─── Main schema ───
40
161
  export const seoOptionsSchema = z.object({
162
+ // ─── Required ───
41
163
  site: z.string().url(),
42
164
  organization: z.object({
43
165
  name: z.string(),
@@ -45,15 +167,27 @@ export const seoOptionsSchema = z.object({
45
167
  logo: z.string().url(),
46
168
  sameAs: z.array(z.string().url()).optional(),
47
169
  }),
170
+ // ─── Schema type for articles ───
48
171
  schemaType: z.enum(['Article', 'NewsArticle', 'BlogPosting']).default('Article'),
172
+ // ─── Feature flags ───
49
173
  googleNews: z.boolean().default(false),
50
- aeoTwins: z.boolean().default(false),
51
174
  llmsTxt: z.boolean().default(false),
175
+ llmsFullTxt: z.boolean().default(false),
176
+ markdownSitemap: z.boolean().default(true),
52
177
  rss: z.boolean().default(false),
178
+ // ─── AEO twins ───
179
+ // Boolean form = { mode: 'static' } when true, no twins emitted when false.
180
+ aeoTwins: z.union([z.boolean(), aeoTwinsObjectSchema]).default(false),
181
+ // ─── Multilingual ───
53
182
  locales: z.array(localeSchema).optional(),
54
183
  defaultLocale: z.string().optional(),
184
+ // ─── Podcast ───
55
185
  podcast: podcastSchema.optional(),
186
+ // ─── Apple News ───
187
+ appleNews: appleNewsSchema.optional(),
188
+ // ─── Commerce ───
56
189
  commerce: commerceSchema.optional(),
190
+ // ─── Audio narration ───
57
191
  audioNarration: z
58
192
  .object({
59
193
  enabled: z.boolean().default(false),
@@ -63,7 +197,13 @@ export const seoOptionsSchema = z.object({
63
197
  podcastFeedPath: z.string().default('/listen.xml'),
64
198
  })
65
199
  .optional(),
200
+ // ─── Flexible Sampling ───
201
+ flexibleSampling: flexibleSamplingSchema,
202
+ // ─── Crawler policy ───
203
+ crawlerPolicy: crawlerPolicySchema,
204
+ // ─── Trailing slash policy ───
66
205
  trailingSlash: z.enum(['always', 'never', 'ignore']).default('never'),
206
+ // ─── Content-Signal header (Cloudflare convention) ───
67
207
  contentSignal: z
68
208
  .object({
69
209
  aiTrain: z.enum(['yes', 'no']).default('no'),
@@ -71,6 +211,7 @@ export const seoOptionsSchema = z.object({
71
211
  aiInput: z.enum(['yes', 'no']).default('yes'),
72
212
  })
73
213
  .default({}),
214
+ // ─── Validation thresholds ───
74
215
  validation: z
75
216
  .object({
76
217
  heroMinWidth: z.number().default(1200),
@@ -79,6 +220,7 @@ export const seoOptionsSchema = z.object({
79
220
  enabled: z.boolean().default(true),
80
221
  })
81
222
  .default({}),
223
+ // ─── robots.txt ───
82
224
  robots: z
83
225
  .object({
84
226
  additionalRules: z
@@ -90,6 +232,7 @@ export const seoOptionsSchema = z.object({
90
232
  .optional(),
91
233
  })
92
234
  .default({}),
235
+ // ─── Default meta ───
93
236
  defaults: z
94
237
  .object({
95
238
  titleSuffix: z.string().optional(),
@@ -99,7 +242,13 @@ export const seoOptionsSchema = z.object({
99
242
  locale: z.string().default('en_US'),
100
243
  })
101
244
  .default({}),
245
+ // ─── Content data provider ───
246
+ // Called at build time and at request time (revalidation + fallthrough).
247
+ // `slugs` is optional; when omitted, return all items of the given type.
248
+ // When present, return ONLY items whose url-tail matches one of the slugs.
249
+ // Returning a superset is safe (the package filters).
102
250
  contentProvider: z.custom().optional(),
251
+ // ─── llms.txt content ───
103
252
  llmsContent: z
104
253
  .object({
105
254
  description: z.string(),
@@ -115,4 +264,92 @@ export const seoOptionsSchema = z.object({
115
264
  })
116
265
  .optional(),
117
266
  });
267
+ // ─── Cross-field validation ───
268
+ //
269
+ // Enforces invariants Zod's type system can't express on its own. These are hard
270
+ // errors at parse time — not runtime surprises. Three invariants:
271
+ //
272
+ // 1. `flexibleSampling.enabled: true` + `aeoTwins.mode: 'static'` is rejected
273
+ // (static mode has no Worker to run the verified-Googlebot dispatch).
274
+ // 2. `mode !== 'static'` OR `onDemandRevalidation: true` requires `freshLayer`
275
+ // (the R2/KV binding that stores post-build twin writes).
276
+ // 3. `onDemandRevalidation: true` requires `revalidateToken >= 32` bytes
277
+ // (shorter means a public unauthenticated DoS vector; enforced here rather
278
+ // than discovered at runtime).
279
+ //
280
+ // A fourth implicit rejection: `mode: 'static'` + `onDemandRevalidation: true`
281
+ // is incoherent — static mode has no Worker to intercept revalidation writes,
282
+ // so R2 pushes never reach requests.
283
+ export const validatedSeoOptionsSchema = seoOptionsSchema.superRefine((opts, ctx) => {
284
+ // Normalize aeoTwins to the object form for cross-field checks.
285
+ const aeo = typeof opts.aeoTwins === 'boolean'
286
+ ? opts.aeoTwins
287
+ ? { mode: 'static', onDemandRevalidation: false }
288
+ : undefined
289
+ : opts.aeoTwins;
290
+ if (!aeo) {
291
+ // aeoTwins: false (or unset default false) -> no further checks needed.
292
+ // Flexible Sampling without any AEO mode set is also fine (just no markdown twins).
293
+ return;
294
+ }
295
+ const mode = aeo.mode;
296
+ const onDemand = 'onDemandRevalidation' in aeo && aeo.onDemandRevalidation === true;
297
+ const token = 'revalidateToken' in aeo ? aeo.revalidateToken : undefined;
298
+ const freshLayer = 'freshLayer' in aeo ? aeo.freshLayer : undefined;
299
+ // Invariant 1: Flexible Sampling cannot run on static mode.
300
+ if (opts.flexibleSampling?.enabled && mode === 'static') {
301
+ ctx.addIssue({
302
+ code: z.ZodIssueCode.custom,
303
+ path: ['flexibleSampling', 'enabled'],
304
+ message: "flexibleSampling.enabled requires aeoTwins.mode 'middleware' or 'both'. " +
305
+ 'Static mode has no Worker to run the crawler-class dispatch, so verified Googlebot ' +
306
+ 'never receives the full-body paywall JSON-LD. Set mode to "middleware" or "both".',
307
+ });
308
+ }
309
+ // Invariant 4: static + onDemandRevalidation is incoherent.
310
+ if (mode === 'static' && onDemand) {
311
+ ctx.addIssue({
312
+ code: z.ZodIssueCode.custom,
313
+ path: ['aeoTwins', 'onDemandRevalidation'],
314
+ message: "onDemandRevalidation requires aeoTwins.mode 'middleware' or 'both' — static mode " +
315
+ 'serves files directly from Cloudflare Assets with no Worker hop, so R2 writes from ' +
316
+ 'the revalidate endpoint would never reach requests.',
317
+ });
318
+ }
319
+ // Invariant 2: freshLayer required when mode !== 'static' or onDemandRevalidation.
320
+ const needsFreshLayer = (mode !== undefined && mode !== 'static') || onDemand;
321
+ if (needsFreshLayer && !freshLayer) {
322
+ ctx.addIssue({
323
+ code: z.ZodIssueCode.custom,
324
+ path: ['aeoTwins', 'freshLayer'],
325
+ message: `aeoTwins.freshLayer is required when mode='${mode ?? 'undefined'}' or ` +
326
+ 'onDemandRevalidation=true. Configure an R2 or KV binding plus a Durable Object ' +
327
+ 'binding in wrangler.toml and reference them via { bindingName, coordinatorBindingName }.',
328
+ });
329
+ }
330
+ // Invariant 3: onDemandRevalidation requires >=32 byte token.
331
+ if (onDemand && (!token || token.length < 32)) {
332
+ ctx.addIssue({
333
+ code: z.ZodIssueCode.custom,
334
+ path: ['aeoTwins', 'revalidateToken'],
335
+ message: 'onDemandRevalidation requires a revalidateToken of at least 32 characters. ' +
336
+ 'Generate one with `openssl rand -base64 32` and store it in your environment.',
337
+ });
338
+ }
339
+ });
340
+ /**
341
+ * Resolves the aeoTwins field to its object form for downstream consumers.
342
+ * `aeoTwins: true` -> { mode: 'static', ...defaults }
343
+ * `aeoTwins: false` -> undefined (no twins)
344
+ * `aeoTwins: { ... }` -> as-is with schema defaults applied
345
+ */
346
+ export function resolveAeoTwins(aeoTwins) {
347
+ if (aeoTwins === false)
348
+ return undefined;
349
+ if (aeoTwins === true) {
350
+ // Apply schema defaults by parsing an empty object.
351
+ return aeoTwinsObjectSchema.parse({});
352
+ }
353
+ return aeoTwins;
354
+ }
118
355
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { APIRoute } from 'astro';
2
+ export declare const prerender = false;
3
+ export declare const GET: APIRoute;
4
+ //# sourceMappingURL=apple-news.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple-news.d.ts","sourceRoot":"","sources":["../../src/routes/apple-news.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,SAAS,QAAQ,CAAA;AAE9B,eAAO,MAAM,GAAG,EAAE,QA0BjB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { getConfig, getContentProvider } from '../state.js';
2
+ import { generateAppleNewsRss } from '../utils/apple-news-rss.js';
3
+ export const prerender = false;
4
+ export const GET = async (context) => {
5
+ const config = getConfig();
6
+ const contentProvider = getContentProvider();
7
+ if (!config.appleNews?.enabled) {
8
+ return new Response('Apple News not enabled', { status: 404 });
9
+ }
10
+ let articles = [];
11
+ if (contentProvider) {
12
+ try {
13
+ articles = await contentProvider({ type: 'articles' }, context);
14
+ }
15
+ catch { }
16
+ }
17
+ // content-filter.forAppleNews is applied inside generateAppleNewsRss.
18
+ const xml = generateAppleNewsRss({
19
+ items: articles,
20
+ options: config,
21
+ // Consumers can supply an HTML resolver by extending the config surface.
22
+ // For v1, pass through; description-only is acceptable when fullContent: false.
23
+ });
24
+ return new Response(xml, {
25
+ headers: { 'Content-Type': 'application/rss+xml; charset=utf-8' },
26
+ });
27
+ };
28
+ //# sourceMappingURL=apple-news.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple-news.js","sourceRoot":"","sources":["../../src/routes/apple-news.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAEjE,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAA;AAE9B,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAChC,OAAO,IAAI,QAAQ,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,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,OAAO,CAAC,CAAA;QAChE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,sEAAsE;IACtE,MAAM,GAAG,GAAG,oBAAoB,CAAC;QAChC,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM;QACf,yEAAyE;QACzE,gFAAgF;KAChF,CAAC,CAAA;IAEF,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,oCAAoC,EAAE;KACjE,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { APIRoute } from 'astro';
2
+ export declare const prerender = false;
3
+ export declare const GET: APIRoute;
4
+ //# sourceMappingURL=llms-full.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-full.d.ts","sourceRoot":"","sources":["../../src/routes/llms-full.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKrC,eAAO,MAAM,SAAS,QAAQ,CAAA;AAE9B,eAAO,MAAM,GAAG,EAAE,QA2BjB,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { getConfig, getContentProvider } from '../state.js';
2
+ import { generateLlmsFull } from '../utils/llms-full.js';
3
+ export const prerender = false;
4
+ export const GET = async (context) => {
5
+ const config = getConfig();
6
+ const contentProvider = getContentProvider();
7
+ if (!config.llmsFullTxt) {
8
+ return new Response('llms-full.txt disabled', { status: 404 });
9
+ }
10
+ let articles = [];
11
+ if (contentProvider) {
12
+ try {
13
+ articles = await contentProvider({ type: 'articles' }, context);
14
+ }
15
+ catch { }
16
+ }
17
+ // Members items excluded by forLlmsFull inside the generator.
18
+ const text = generateLlmsFull({
19
+ items: articles,
20
+ siteName: config.organization.name,
21
+ });
22
+ return new Response(text, {
23
+ headers: {
24
+ 'Content-Type': 'text/plain; charset=utf-8',
25
+ 'X-Robots-Tag': 'noindex',
26
+ },
27
+ });
28
+ };
29
+ //# sourceMappingURL=llms-full.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-full.js","sourceRoot":"","sources":["../../src/routes/llms-full.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAA;AAE9B,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAA;IAE5C,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,QAAQ,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,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,OAAO,CAAC,CAAA;QAChE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,8DAA8D;IAC9D,MAAM,IAAI,GAAG,gBAAgB,CAAC;QAC7B,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI;KAClC,CAAC,CAAA;IAEF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACzB,OAAO,EAAE;YACR,cAAc,EAAE,2BAA2B;YAC3C,cAAc,EAAE,SAAS;SACzB;KACD,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { APIRoute } from 'astro';
2
+ export declare const prerender = false;
3
+ /**
4
+ * POST /_seo/revalidate — CMS webhook target. Re-renders the listed slugs,
5
+ * writes to R2 under the current deployment prefix, purges the edge cache for
6
+ * the markdown sitemap so newly-published content is discoverable within seconds.
7
+ *
8
+ * Auth: Authorization: Bearer <revalidateToken>. Token is the same ≥32-byte
9
+ * value configured in aeoTwins.revalidateToken. Compared with constant-time
10
+ * string compare.
11
+ *
12
+ * Rate limit + per-slug lock + idempotency all delegate to the Revalidation
13
+ * Coordinator Durable Object (spec "Revalidation Coordinator DO topology").
14
+ */
15
+ export declare const POST: APIRoute;
16
+ //# sourceMappingURL=revalidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../../src/routes/revalidate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAUrC,eAAO,MAAM,SAAS,QAAQ,CAAA;AAa9B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,EAAE,QAqHlB,CAAA"}