@growth-labs/seo 0.1.5 → 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 +101 -14
  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 +13 -1
package/dist/options.d.ts CHANGED
@@ -1,5 +1,82 @@
1
1
  import { z } from 'zod';
2
- import type { ContentProvider } from './types.js';
2
+ import type { ContentItem, ContentProvider } from './types.js';
3
+ declare const aeoTwinsObjectSchema: z.ZodObject<{
4
+ mode: z.ZodDefault<z.ZodEnum<["static", "middleware", "both"]>>;
5
+ twinUrl: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodString], z.ZodUnknown>, z.ZodString>>;
6
+ twinAliases: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
+ summaryTwin: z.ZodDefault<z.ZodBoolean>;
8
+ ragChunkMarkers: z.ZodDefault<z.ZodBoolean>;
9
+ responseHeaders: z.ZodDefault<z.ZodObject<{
10
+ noindex: z.ZodDefault<z.ZodBoolean>;
11
+ canonicalToHtml: z.ZodDefault<z.ZodBoolean>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ noindex: boolean;
14
+ canonicalToHtml: boolean;
15
+ }, {
16
+ noindex?: boolean | undefined;
17
+ canonicalToHtml?: boolean | undefined;
18
+ }>>;
19
+ include: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodType<ContentItem, z.ZodTypeDef, ContentItem>], z.ZodUnknown>, z.ZodBoolean>>;
20
+ stalenessCheck: z.ZodDefault<z.ZodEnum<["content-hash", "dateModified", "none"]>>;
21
+ onDemandRevalidation: z.ZodDefault<z.ZodBoolean>;
22
+ revalidateToken: z.ZodOptional<z.ZodString>;
23
+ freshLayer: z.ZodOptional<z.ZodObject<{
24
+ bindingName: z.ZodDefault<z.ZodString>;
25
+ type: z.ZodDefault<z.ZodEnum<["r2", "kv"]>>;
26
+ coordinatorBindingName: z.ZodDefault<z.ZodString>;
27
+ retentionDays: z.ZodDefault<z.ZodNumber>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ type: "r2" | "kv";
30
+ bindingName: string;
31
+ coordinatorBindingName: string;
32
+ retentionDays: number;
33
+ }, {
34
+ type?: "r2" | "kv" | undefined;
35
+ bindingName?: string | undefined;
36
+ coordinatorBindingName?: string | undefined;
37
+ retentionDays?: number | undefined;
38
+ }>>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ mode: "static" | "middleware" | "both";
41
+ twinAliases: string[];
42
+ summaryTwin: boolean;
43
+ ragChunkMarkers: boolean;
44
+ responseHeaders: {
45
+ noindex: boolean;
46
+ canonicalToHtml: boolean;
47
+ };
48
+ stalenessCheck: "content-hash" | "dateModified" | "none";
49
+ onDemandRevalidation: boolean;
50
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
51
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
52
+ revalidateToken?: string | undefined;
53
+ freshLayer?: {
54
+ type: "r2" | "kv";
55
+ bindingName: string;
56
+ coordinatorBindingName: string;
57
+ retentionDays: number;
58
+ } | undefined;
59
+ }, {
60
+ mode?: "static" | "middleware" | "both" | undefined;
61
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
62
+ twinAliases?: string[] | undefined;
63
+ summaryTwin?: boolean | undefined;
64
+ ragChunkMarkers?: boolean | undefined;
65
+ responseHeaders?: {
66
+ noindex?: boolean | undefined;
67
+ canonicalToHtml?: boolean | undefined;
68
+ } | undefined;
69
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
70
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
71
+ onDemandRevalidation?: boolean | undefined;
72
+ revalidateToken?: string | undefined;
73
+ freshLayer?: {
74
+ type?: "r2" | "kv" | undefined;
75
+ bindingName?: string | undefined;
76
+ coordinatorBindingName?: string | undefined;
77
+ retentionDays?: number | undefined;
78
+ } | undefined;
79
+ }>;
3
80
  export declare const seoOptionsSchema: z.ZodObject<{
4
81
  site: z.ZodString;
5
82
  organization: z.ZodObject<{
@@ -20,9 +97,87 @@ export declare const seoOptionsSchema: z.ZodObject<{
20
97
  }>;
21
98
  schemaType: z.ZodDefault<z.ZodEnum<["Article", "NewsArticle", "BlogPosting"]>>;
22
99
  googleNews: z.ZodDefault<z.ZodBoolean>;
23
- aeoTwins: z.ZodDefault<z.ZodBoolean>;
24
100
  llmsTxt: z.ZodDefault<z.ZodBoolean>;
101
+ llmsFullTxt: z.ZodDefault<z.ZodBoolean>;
102
+ markdownSitemap: z.ZodDefault<z.ZodBoolean>;
25
103
  rss: z.ZodDefault<z.ZodBoolean>;
104
+ aeoTwins: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodObject<{
105
+ mode: z.ZodDefault<z.ZodEnum<["static", "middleware", "both"]>>;
106
+ twinUrl: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodString], z.ZodUnknown>, z.ZodString>>;
107
+ twinAliases: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
108
+ summaryTwin: z.ZodDefault<z.ZodBoolean>;
109
+ ragChunkMarkers: z.ZodDefault<z.ZodBoolean>;
110
+ responseHeaders: z.ZodDefault<z.ZodObject<{
111
+ noindex: z.ZodDefault<z.ZodBoolean>;
112
+ canonicalToHtml: z.ZodDefault<z.ZodBoolean>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ noindex: boolean;
115
+ canonicalToHtml: boolean;
116
+ }, {
117
+ noindex?: boolean | undefined;
118
+ canonicalToHtml?: boolean | undefined;
119
+ }>>;
120
+ include: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodType<ContentItem, z.ZodTypeDef, ContentItem>], z.ZodUnknown>, z.ZodBoolean>>;
121
+ stalenessCheck: z.ZodDefault<z.ZodEnum<["content-hash", "dateModified", "none"]>>;
122
+ onDemandRevalidation: z.ZodDefault<z.ZodBoolean>;
123
+ revalidateToken: z.ZodOptional<z.ZodString>;
124
+ freshLayer: z.ZodOptional<z.ZodObject<{
125
+ bindingName: z.ZodDefault<z.ZodString>;
126
+ type: z.ZodDefault<z.ZodEnum<["r2", "kv"]>>;
127
+ coordinatorBindingName: z.ZodDefault<z.ZodString>;
128
+ retentionDays: z.ZodDefault<z.ZodNumber>;
129
+ }, "strip", z.ZodTypeAny, {
130
+ type: "r2" | "kv";
131
+ bindingName: string;
132
+ coordinatorBindingName: string;
133
+ retentionDays: number;
134
+ }, {
135
+ type?: "r2" | "kv" | undefined;
136
+ bindingName?: string | undefined;
137
+ coordinatorBindingName?: string | undefined;
138
+ retentionDays?: number | undefined;
139
+ }>>;
140
+ }, "strip", z.ZodTypeAny, {
141
+ mode: "static" | "middleware" | "both";
142
+ twinAliases: string[];
143
+ summaryTwin: boolean;
144
+ ragChunkMarkers: boolean;
145
+ responseHeaders: {
146
+ noindex: boolean;
147
+ canonicalToHtml: boolean;
148
+ };
149
+ stalenessCheck: "content-hash" | "dateModified" | "none";
150
+ onDemandRevalidation: boolean;
151
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
152
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
153
+ revalidateToken?: string | undefined;
154
+ freshLayer?: {
155
+ type: "r2" | "kv";
156
+ bindingName: string;
157
+ coordinatorBindingName: string;
158
+ retentionDays: number;
159
+ } | undefined;
160
+ }, {
161
+ mode?: "static" | "middleware" | "both" | undefined;
162
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
163
+ twinAliases?: string[] | undefined;
164
+ summaryTwin?: boolean | undefined;
165
+ ragChunkMarkers?: boolean | undefined;
166
+ responseHeaders?: {
167
+ noindex?: boolean | undefined;
168
+ canonicalToHtml?: boolean | undefined;
169
+ } | undefined;
170
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
171
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
172
+ onDemandRevalidation?: boolean | undefined;
173
+ revalidateToken?: string | undefined;
174
+ freshLayer?: {
175
+ type?: "r2" | "kv" | undefined;
176
+ bindingName?: string | undefined;
177
+ coordinatorBindingName?: string | undefined;
178
+ retentionDays?: number | undefined;
179
+ } | undefined;
180
+ }>]>>;
26
181
  locales: z.ZodOptional<z.ZodArray<z.ZodObject<{
27
182
  lang: z.ZodString;
28
183
  region: z.ZodOptional<z.ZodString>;
@@ -83,6 +238,34 @@ export declare const seoOptionsSchema: z.ZodObject<{
83
238
  feedPath?: string | undefined;
84
239
  copyright?: string | undefined;
85
240
  }>>;
241
+ appleNews: z.ZodOptional<z.ZodObject<{
242
+ enabled: z.ZodDefault<z.ZodBoolean>;
243
+ channelName: z.ZodString;
244
+ channelId: z.ZodOptional<z.ZodString>;
245
+ feedPath: z.ZodDefault<z.ZodString>;
246
+ defaultPublishable: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
247
+ defaultSection: z.ZodOptional<z.ZodString>;
248
+ fullContent: z.ZodDefault<z.ZodBoolean>;
249
+ discoveryLink: z.ZodDefault<z.ZodBoolean>;
250
+ }, "strip", z.ZodTypeAny, {
251
+ enabled: boolean;
252
+ feedPath: string;
253
+ channelName: string;
254
+ defaultPublishable: "yes" | "no";
255
+ fullContent: boolean;
256
+ discoveryLink: boolean;
257
+ channelId?: string | undefined;
258
+ defaultSection?: string | undefined;
259
+ }, {
260
+ channelName: string;
261
+ enabled?: boolean | undefined;
262
+ feedPath?: string | undefined;
263
+ channelId?: string | undefined;
264
+ defaultPublishable?: "yes" | "no" | undefined;
265
+ defaultSection?: string | undefined;
266
+ fullContent?: boolean | undefined;
267
+ discoveryLink?: boolean | undefined;
268
+ }>>;
86
269
  commerce: z.ZodOptional<z.ZodObject<{
87
270
  enabled: z.ZodDefault<z.ZodBoolean>;
88
271
  returnPolicy: z.ZodOptional<z.ZodObject<{
@@ -145,6 +328,35 @@ export declare const seoOptionsSchema: z.ZodObject<{
145
328
  asPodcastFeed?: boolean | undefined;
146
329
  podcastFeedPath?: string | undefined;
147
330
  }>>;
331
+ flexibleSampling: z.ZodDefault<z.ZodObject<{
332
+ enabled: z.ZodDefault<z.ZodBoolean>;
333
+ sampleMode: z.ZodDefault<z.ZodEnum<["metered", "lead-in", "none"]>>;
334
+ leadInParagraphs: z.ZodDefault<z.ZodNumber>;
335
+ meteredLimit: z.ZodDefault<z.ZodNumber>;
336
+ }, "strip", z.ZodTypeAny, {
337
+ enabled: boolean;
338
+ sampleMode: "none" | "metered" | "lead-in";
339
+ leadInParagraphs: number;
340
+ meteredLimit: number;
341
+ }, {
342
+ enabled?: boolean | undefined;
343
+ sampleMode?: "none" | "metered" | "lead-in" | undefined;
344
+ leadInParagraphs?: number | undefined;
345
+ meteredLimit?: number | undefined;
346
+ }>>;
347
+ crawlerPolicy: z.ZodDefault<z.ZodObject<{
348
+ blockLlmTrainingCrawlers: z.ZodDefault<z.ZodBoolean>;
349
+ userDirectedAgentsSeePublicOnly: z.ZodDefault<z.ZodBoolean>;
350
+ verifiedSearchCrawlersSeeFullBody: z.ZodDefault<z.ZodBoolean>;
351
+ }, "strip", z.ZodTypeAny, {
352
+ blockLlmTrainingCrawlers: boolean;
353
+ userDirectedAgentsSeePublicOnly: boolean;
354
+ verifiedSearchCrawlersSeeFullBody: boolean;
355
+ }, {
356
+ blockLlmTrainingCrawlers?: boolean | undefined;
357
+ userDirectedAgentsSeePublicOnly?: boolean | undefined;
358
+ verifiedSearchCrawlersSeeFullBody?: boolean | undefined;
359
+ }>>;
148
360
  trailingSlash: z.ZodDefault<z.ZodEnum<["always", "never", "ignore"]>>;
149
361
  contentSignal: z.ZodDefault<z.ZodObject<{
150
362
  aiTrain: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
@@ -309,9 +521,42 @@ export declare const seoOptionsSchema: z.ZodObject<{
309
521
  };
310
522
  schemaType: "Article" | "NewsArticle" | "BlogPosting";
311
523
  googleNews: boolean;
312
- aeoTwins: boolean;
313
524
  llmsTxt: boolean;
525
+ llmsFullTxt: boolean;
526
+ markdownSitemap: boolean;
314
527
  rss: boolean;
528
+ aeoTwins: boolean | {
529
+ mode: "static" | "middleware" | "both";
530
+ twinAliases: string[];
531
+ summaryTwin: boolean;
532
+ ragChunkMarkers: boolean;
533
+ responseHeaders: {
534
+ noindex: boolean;
535
+ canonicalToHtml: boolean;
536
+ };
537
+ stalenessCheck: "content-hash" | "dateModified" | "none";
538
+ onDemandRevalidation: boolean;
539
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
540
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
541
+ revalidateToken?: string | undefined;
542
+ freshLayer?: {
543
+ type: "r2" | "kv";
544
+ bindingName: string;
545
+ coordinatorBindingName: string;
546
+ retentionDays: number;
547
+ } | undefined;
548
+ };
549
+ flexibleSampling: {
550
+ enabled: boolean;
551
+ sampleMode: "none" | "metered" | "lead-in";
552
+ leadInParagraphs: number;
553
+ meteredLimit: number;
554
+ };
555
+ crawlerPolicy: {
556
+ blockLlmTrainingCrawlers: boolean;
557
+ userDirectedAgentsSeePublicOnly: boolean;
558
+ verifiedSearchCrawlersSeeFullBody: boolean;
559
+ };
315
560
  trailingSlash: "never" | "always" | "ignore";
316
561
  contentSignal: {
317
562
  aiTrain: "yes" | "no";
@@ -354,6 +599,16 @@ export declare const seoOptionsSchema: z.ZodObject<{
354
599
  subcategory?: string | undefined;
355
600
  copyright?: string | undefined;
356
601
  } | undefined;
602
+ appleNews?: {
603
+ enabled: boolean;
604
+ feedPath: string;
605
+ channelName: string;
606
+ defaultPublishable: "yes" | "no";
607
+ fullContent: boolean;
608
+ discoveryLink: boolean;
609
+ channelId?: string | undefined;
610
+ defaultSection?: string | undefined;
611
+ } | undefined;
357
612
  commerce?: {
358
613
  enabled: boolean;
359
614
  currency: string;
@@ -404,9 +659,31 @@ export declare const seoOptionsSchema: z.ZodObject<{
404
659
  } | undefined;
405
660
  schemaType?: "Article" | "NewsArticle" | "BlogPosting" | undefined;
406
661
  googleNews?: boolean | undefined;
407
- aeoTwins?: boolean | undefined;
408
662
  llmsTxt?: boolean | undefined;
663
+ llmsFullTxt?: boolean | undefined;
664
+ markdownSitemap?: boolean | undefined;
409
665
  rss?: boolean | undefined;
666
+ aeoTwins?: boolean | {
667
+ mode?: "static" | "middleware" | "both" | undefined;
668
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
669
+ twinAliases?: string[] | undefined;
670
+ summaryTwin?: boolean | undefined;
671
+ ragChunkMarkers?: boolean | undefined;
672
+ responseHeaders?: {
673
+ noindex?: boolean | undefined;
674
+ canonicalToHtml?: boolean | undefined;
675
+ } | undefined;
676
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
677
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
678
+ onDemandRevalidation?: boolean | undefined;
679
+ revalidateToken?: string | undefined;
680
+ freshLayer?: {
681
+ type?: "r2" | "kv" | undefined;
682
+ bindingName?: string | undefined;
683
+ coordinatorBindingName?: string | undefined;
684
+ retentionDays?: number | undefined;
685
+ } | undefined;
686
+ } | undefined;
410
687
  locales?: {
411
688
  lang: string;
412
689
  urlPrefix: string;
@@ -429,6 +706,16 @@ export declare const seoOptionsSchema: z.ZodObject<{
429
706
  feedPath?: string | undefined;
430
707
  copyright?: string | undefined;
431
708
  } | undefined;
709
+ appleNews?: {
710
+ channelName: string;
711
+ enabled?: boolean | undefined;
712
+ feedPath?: string | undefined;
713
+ channelId?: string | undefined;
714
+ defaultPublishable?: "yes" | "no" | undefined;
715
+ defaultSection?: string | undefined;
716
+ fullContent?: boolean | undefined;
717
+ discoveryLink?: boolean | undefined;
718
+ } | undefined;
432
719
  commerce?: {
433
720
  enabled?: boolean | undefined;
434
721
  returnPolicy?: {
@@ -447,6 +734,998 @@ export declare const seoOptionsSchema: z.ZodObject<{
447
734
  asPodcastFeed?: boolean | undefined;
448
735
  podcastFeedPath?: string | undefined;
449
736
  } | undefined;
737
+ flexibleSampling?: {
738
+ enabled?: boolean | undefined;
739
+ sampleMode?: "none" | "metered" | "lead-in" | undefined;
740
+ leadInParagraphs?: number | undefined;
741
+ meteredLimit?: number | undefined;
742
+ } | undefined;
743
+ crawlerPolicy?: {
744
+ blockLlmTrainingCrawlers?: boolean | undefined;
745
+ userDirectedAgentsSeePublicOnly?: boolean | undefined;
746
+ verifiedSearchCrawlersSeeFullBody?: boolean | undefined;
747
+ } | undefined;
748
+ trailingSlash?: "never" | "always" | "ignore" | undefined;
749
+ contentSignal?: {
750
+ aiTrain?: "yes" | "no" | undefined;
751
+ search?: "yes" | "no" | undefined;
752
+ aiInput?: "yes" | "no" | undefined;
753
+ } | undefined;
754
+ robots?: {
755
+ additionalRules?: {
756
+ userAgent: string;
757
+ allow?: string[] | undefined;
758
+ disallow?: string[] | undefined;
759
+ }[] | undefined;
760
+ } | undefined;
761
+ defaults?: {
762
+ titleSuffix?: string | undefined;
763
+ defaultImage?: string | undefined;
764
+ twitterSite?: string | undefined;
765
+ twitterCardType?: "summary" | "summary_large_image" | undefined;
766
+ locale?: string | undefined;
767
+ } | undefined;
768
+ contentProvider?: ContentProvider | undefined;
769
+ llmsContent?: {
770
+ description: string;
771
+ sections: {
772
+ heading: string;
773
+ links: {
774
+ title: string;
775
+ description: string;
776
+ url: string;
777
+ }[];
778
+ }[];
779
+ optionalLinks?: {
780
+ title: string;
781
+ url: string;
782
+ }[] | undefined;
783
+ } | undefined;
784
+ }>;
785
+ export declare const validatedSeoOptionsSchema: z.ZodEffects<z.ZodObject<{
786
+ site: z.ZodString;
787
+ organization: z.ZodObject<{
788
+ name: z.ZodString;
789
+ url: z.ZodOptional<z.ZodString>;
790
+ logo: z.ZodString;
791
+ sameAs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
792
+ }, "strip", z.ZodTypeAny, {
793
+ name: string;
794
+ logo: string;
795
+ url?: string | undefined;
796
+ sameAs?: string[] | undefined;
797
+ }, {
798
+ name: string;
799
+ logo: string;
800
+ url?: string | undefined;
801
+ sameAs?: string[] | undefined;
802
+ }>;
803
+ schemaType: z.ZodDefault<z.ZodEnum<["Article", "NewsArticle", "BlogPosting"]>>;
804
+ googleNews: z.ZodDefault<z.ZodBoolean>;
805
+ llmsTxt: z.ZodDefault<z.ZodBoolean>;
806
+ llmsFullTxt: z.ZodDefault<z.ZodBoolean>;
807
+ markdownSitemap: z.ZodDefault<z.ZodBoolean>;
808
+ rss: z.ZodDefault<z.ZodBoolean>;
809
+ aeoTwins: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodObject<{
810
+ mode: z.ZodDefault<z.ZodEnum<["static", "middleware", "both"]>>;
811
+ twinUrl: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodString], z.ZodUnknown>, z.ZodString>>;
812
+ twinAliases: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
813
+ summaryTwin: z.ZodDefault<z.ZodBoolean>;
814
+ ragChunkMarkers: z.ZodDefault<z.ZodBoolean>;
815
+ responseHeaders: z.ZodDefault<z.ZodObject<{
816
+ noindex: z.ZodDefault<z.ZodBoolean>;
817
+ canonicalToHtml: z.ZodDefault<z.ZodBoolean>;
818
+ }, "strip", z.ZodTypeAny, {
819
+ noindex: boolean;
820
+ canonicalToHtml: boolean;
821
+ }, {
822
+ noindex?: boolean | undefined;
823
+ canonicalToHtml?: boolean | undefined;
824
+ }>>;
825
+ include: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodType<ContentItem, z.ZodTypeDef, ContentItem>], z.ZodUnknown>, z.ZodBoolean>>;
826
+ stalenessCheck: z.ZodDefault<z.ZodEnum<["content-hash", "dateModified", "none"]>>;
827
+ onDemandRevalidation: z.ZodDefault<z.ZodBoolean>;
828
+ revalidateToken: z.ZodOptional<z.ZodString>;
829
+ freshLayer: z.ZodOptional<z.ZodObject<{
830
+ bindingName: z.ZodDefault<z.ZodString>;
831
+ type: z.ZodDefault<z.ZodEnum<["r2", "kv"]>>;
832
+ coordinatorBindingName: z.ZodDefault<z.ZodString>;
833
+ retentionDays: z.ZodDefault<z.ZodNumber>;
834
+ }, "strip", z.ZodTypeAny, {
835
+ type: "r2" | "kv";
836
+ bindingName: string;
837
+ coordinatorBindingName: string;
838
+ retentionDays: number;
839
+ }, {
840
+ type?: "r2" | "kv" | undefined;
841
+ bindingName?: string | undefined;
842
+ coordinatorBindingName?: string | undefined;
843
+ retentionDays?: number | undefined;
844
+ }>>;
845
+ }, "strip", z.ZodTypeAny, {
846
+ mode: "static" | "middleware" | "both";
847
+ twinAliases: string[];
848
+ summaryTwin: boolean;
849
+ ragChunkMarkers: boolean;
850
+ responseHeaders: {
851
+ noindex: boolean;
852
+ canonicalToHtml: boolean;
853
+ };
854
+ stalenessCheck: "content-hash" | "dateModified" | "none";
855
+ onDemandRevalidation: boolean;
856
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
857
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
858
+ revalidateToken?: string | undefined;
859
+ freshLayer?: {
860
+ type: "r2" | "kv";
861
+ bindingName: string;
862
+ coordinatorBindingName: string;
863
+ retentionDays: number;
864
+ } | undefined;
865
+ }, {
866
+ mode?: "static" | "middleware" | "both" | undefined;
867
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
868
+ twinAliases?: string[] | undefined;
869
+ summaryTwin?: boolean | undefined;
870
+ ragChunkMarkers?: boolean | undefined;
871
+ responseHeaders?: {
872
+ noindex?: boolean | undefined;
873
+ canonicalToHtml?: boolean | undefined;
874
+ } | undefined;
875
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
876
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
877
+ onDemandRevalidation?: boolean | undefined;
878
+ revalidateToken?: string | undefined;
879
+ freshLayer?: {
880
+ type?: "r2" | "kv" | undefined;
881
+ bindingName?: string | undefined;
882
+ coordinatorBindingName?: string | undefined;
883
+ retentionDays?: number | undefined;
884
+ } | undefined;
885
+ }>]>>;
886
+ locales: z.ZodOptional<z.ZodArray<z.ZodObject<{
887
+ lang: z.ZodString;
888
+ region: z.ZodOptional<z.ZodString>;
889
+ urlPrefix: z.ZodString;
890
+ domain: z.ZodOptional<z.ZodString>;
891
+ }, "strip", z.ZodTypeAny, {
892
+ lang: string;
893
+ urlPrefix: string;
894
+ region?: string | undefined;
895
+ domain?: string | undefined;
896
+ }, {
897
+ lang: string;
898
+ urlPrefix: string;
899
+ region?: string | undefined;
900
+ domain?: string | undefined;
901
+ }>, "many">>;
902
+ defaultLocale: z.ZodOptional<z.ZodString>;
903
+ podcast: z.ZodOptional<z.ZodObject<{
904
+ enabled: z.ZodDefault<z.ZodBoolean>;
905
+ title: z.ZodString;
906
+ description: z.ZodString;
907
+ author: z.ZodString;
908
+ email: z.ZodString;
909
+ image: z.ZodString;
910
+ category: z.ZodString;
911
+ subcategory: z.ZodOptional<z.ZodString>;
912
+ language: z.ZodDefault<z.ZodString>;
913
+ explicit: z.ZodDefault<z.ZodBoolean>;
914
+ feedPath: z.ZodDefault<z.ZodString>;
915
+ type: z.ZodDefault<z.ZodEnum<["episodic", "serial"]>>;
916
+ copyright: z.ZodOptional<z.ZodString>;
917
+ }, "strip", z.ZodTypeAny, {
918
+ type: "episodic" | "serial";
919
+ enabled: boolean;
920
+ title: string;
921
+ description: string;
922
+ author: string;
923
+ email: string;
924
+ image: string;
925
+ category: string;
926
+ language: string;
927
+ explicit: boolean;
928
+ feedPath: string;
929
+ subcategory?: string | undefined;
930
+ copyright?: string | undefined;
931
+ }, {
932
+ title: string;
933
+ description: string;
934
+ author: string;
935
+ email: string;
936
+ image: string;
937
+ category: string;
938
+ type?: "episodic" | "serial" | undefined;
939
+ enabled?: boolean | undefined;
940
+ subcategory?: string | undefined;
941
+ language?: string | undefined;
942
+ explicit?: boolean | undefined;
943
+ feedPath?: string | undefined;
944
+ copyright?: string | undefined;
945
+ }>>;
946
+ appleNews: z.ZodOptional<z.ZodObject<{
947
+ enabled: z.ZodDefault<z.ZodBoolean>;
948
+ channelName: z.ZodString;
949
+ channelId: z.ZodOptional<z.ZodString>;
950
+ feedPath: z.ZodDefault<z.ZodString>;
951
+ defaultPublishable: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
952
+ defaultSection: z.ZodOptional<z.ZodString>;
953
+ fullContent: z.ZodDefault<z.ZodBoolean>;
954
+ discoveryLink: z.ZodDefault<z.ZodBoolean>;
955
+ }, "strip", z.ZodTypeAny, {
956
+ enabled: boolean;
957
+ feedPath: string;
958
+ channelName: string;
959
+ defaultPublishable: "yes" | "no";
960
+ fullContent: boolean;
961
+ discoveryLink: boolean;
962
+ channelId?: string | undefined;
963
+ defaultSection?: string | undefined;
964
+ }, {
965
+ channelName: string;
966
+ enabled?: boolean | undefined;
967
+ feedPath?: string | undefined;
968
+ channelId?: string | undefined;
969
+ defaultPublishable?: "yes" | "no" | undefined;
970
+ defaultSection?: string | undefined;
971
+ fullContent?: boolean | undefined;
972
+ discoveryLink?: boolean | undefined;
973
+ }>>;
974
+ commerce: z.ZodOptional<z.ZodObject<{
975
+ enabled: z.ZodDefault<z.ZodBoolean>;
976
+ returnPolicy: z.ZodOptional<z.ZodObject<{
977
+ applicableCountry: z.ZodString;
978
+ returnPolicyCategory: z.ZodEnum<["MerchantReturnFiniteReturnWindow", "MerchantReturnNotPermitted", "MerchantReturnUnlimitedWindow"]>;
979
+ merchantReturnDays: z.ZodOptional<z.ZodNumber>;
980
+ returnMethod: z.ZodOptional<z.ZodEnum<["ReturnByMail", "ReturnInStore", "ReturnAtKiosk"]>>;
981
+ returnFees: z.ZodOptional<z.ZodEnum<["FreeReturn", "ReturnFeesCustomerResponsibility"]>>;
982
+ }, "strip", z.ZodTypeAny, {
983
+ applicableCountry: string;
984
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
985
+ merchantReturnDays?: number | undefined;
986
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
987
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
988
+ }, {
989
+ applicableCountry: string;
990
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
991
+ merchantReturnDays?: number | undefined;
992
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
993
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
994
+ }>>;
995
+ currency: z.ZodDefault<z.ZodString>;
996
+ }, "strip", z.ZodTypeAny, {
997
+ enabled: boolean;
998
+ currency: string;
999
+ returnPolicy?: {
1000
+ applicableCountry: string;
1001
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1002
+ merchantReturnDays?: number | undefined;
1003
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1004
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1005
+ } | undefined;
1006
+ }, {
1007
+ enabled?: boolean | undefined;
1008
+ returnPolicy?: {
1009
+ applicableCountry: string;
1010
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1011
+ merchantReturnDays?: number | undefined;
1012
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1013
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1014
+ } | undefined;
1015
+ currency?: string | undefined;
1016
+ }>>;
1017
+ audioNarration: z.ZodOptional<z.ZodObject<{
1018
+ enabled: z.ZodDefault<z.ZodBoolean>;
1019
+ speakableSelectors: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1020
+ narratorName: z.ZodOptional<z.ZodString>;
1021
+ asPodcastFeed: z.ZodDefault<z.ZodBoolean>;
1022
+ podcastFeedPath: z.ZodDefault<z.ZodString>;
1023
+ }, "strip", z.ZodTypeAny, {
1024
+ enabled: boolean;
1025
+ speakableSelectors: string[];
1026
+ asPodcastFeed: boolean;
1027
+ podcastFeedPath: string;
1028
+ narratorName?: string | undefined;
1029
+ }, {
1030
+ enabled?: boolean | undefined;
1031
+ speakableSelectors?: string[] | undefined;
1032
+ narratorName?: string | undefined;
1033
+ asPodcastFeed?: boolean | undefined;
1034
+ podcastFeedPath?: string | undefined;
1035
+ }>>;
1036
+ flexibleSampling: z.ZodDefault<z.ZodObject<{
1037
+ enabled: z.ZodDefault<z.ZodBoolean>;
1038
+ sampleMode: z.ZodDefault<z.ZodEnum<["metered", "lead-in", "none"]>>;
1039
+ leadInParagraphs: z.ZodDefault<z.ZodNumber>;
1040
+ meteredLimit: z.ZodDefault<z.ZodNumber>;
1041
+ }, "strip", z.ZodTypeAny, {
1042
+ enabled: boolean;
1043
+ sampleMode: "none" | "metered" | "lead-in";
1044
+ leadInParagraphs: number;
1045
+ meteredLimit: number;
1046
+ }, {
1047
+ enabled?: boolean | undefined;
1048
+ sampleMode?: "none" | "metered" | "lead-in" | undefined;
1049
+ leadInParagraphs?: number | undefined;
1050
+ meteredLimit?: number | undefined;
1051
+ }>>;
1052
+ crawlerPolicy: z.ZodDefault<z.ZodObject<{
1053
+ blockLlmTrainingCrawlers: z.ZodDefault<z.ZodBoolean>;
1054
+ userDirectedAgentsSeePublicOnly: z.ZodDefault<z.ZodBoolean>;
1055
+ verifiedSearchCrawlersSeeFullBody: z.ZodDefault<z.ZodBoolean>;
1056
+ }, "strip", z.ZodTypeAny, {
1057
+ blockLlmTrainingCrawlers: boolean;
1058
+ userDirectedAgentsSeePublicOnly: boolean;
1059
+ verifiedSearchCrawlersSeeFullBody: boolean;
1060
+ }, {
1061
+ blockLlmTrainingCrawlers?: boolean | undefined;
1062
+ userDirectedAgentsSeePublicOnly?: boolean | undefined;
1063
+ verifiedSearchCrawlersSeeFullBody?: boolean | undefined;
1064
+ }>>;
1065
+ trailingSlash: z.ZodDefault<z.ZodEnum<["always", "never", "ignore"]>>;
1066
+ contentSignal: z.ZodDefault<z.ZodObject<{
1067
+ aiTrain: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
1068
+ search: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
1069
+ aiInput: z.ZodDefault<z.ZodEnum<["yes", "no"]>>;
1070
+ }, "strip", z.ZodTypeAny, {
1071
+ aiTrain: "yes" | "no";
1072
+ search: "yes" | "no";
1073
+ aiInput: "yes" | "no";
1074
+ }, {
1075
+ aiTrain?: "yes" | "no" | undefined;
1076
+ search?: "yes" | "no" | undefined;
1077
+ aiInput?: "yes" | "no" | undefined;
1078
+ }>>;
1079
+ validation: z.ZodDefault<z.ZodObject<{
1080
+ heroMinWidth: z.ZodDefault<z.ZodNumber>;
1081
+ titleMaxLength: z.ZodDefault<z.ZodNumber>;
1082
+ descriptionMaxLength: z.ZodDefault<z.ZodNumber>;
1083
+ enabled: z.ZodDefault<z.ZodBoolean>;
1084
+ }, "strip", z.ZodTypeAny, {
1085
+ enabled: boolean;
1086
+ heroMinWidth: number;
1087
+ titleMaxLength: number;
1088
+ descriptionMaxLength: number;
1089
+ }, {
1090
+ enabled?: boolean | undefined;
1091
+ heroMinWidth?: number | undefined;
1092
+ titleMaxLength?: number | undefined;
1093
+ descriptionMaxLength?: number | undefined;
1094
+ }>>;
1095
+ robots: z.ZodDefault<z.ZodObject<{
1096
+ additionalRules: z.ZodOptional<z.ZodArray<z.ZodObject<{
1097
+ userAgent: z.ZodString;
1098
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1099
+ disallow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1100
+ }, "strip", z.ZodTypeAny, {
1101
+ userAgent: string;
1102
+ allow?: string[] | undefined;
1103
+ disallow?: string[] | undefined;
1104
+ }, {
1105
+ userAgent: string;
1106
+ allow?: string[] | undefined;
1107
+ disallow?: string[] | undefined;
1108
+ }>, "many">>;
1109
+ }, "strip", z.ZodTypeAny, {
1110
+ additionalRules?: {
1111
+ userAgent: string;
1112
+ allow?: string[] | undefined;
1113
+ disallow?: string[] | undefined;
1114
+ }[] | undefined;
1115
+ }, {
1116
+ additionalRules?: {
1117
+ userAgent: string;
1118
+ allow?: string[] | undefined;
1119
+ disallow?: string[] | undefined;
1120
+ }[] | undefined;
1121
+ }>>;
1122
+ defaults: z.ZodDefault<z.ZodObject<{
1123
+ titleSuffix: z.ZodOptional<z.ZodString>;
1124
+ defaultImage: z.ZodOptional<z.ZodString>;
1125
+ twitterSite: z.ZodOptional<z.ZodString>;
1126
+ twitterCardType: z.ZodDefault<z.ZodEnum<["summary", "summary_large_image"]>>;
1127
+ locale: z.ZodDefault<z.ZodString>;
1128
+ }, "strip", z.ZodTypeAny, {
1129
+ twitterCardType: "summary" | "summary_large_image";
1130
+ locale: string;
1131
+ titleSuffix?: string | undefined;
1132
+ defaultImage?: string | undefined;
1133
+ twitterSite?: string | undefined;
1134
+ }, {
1135
+ titleSuffix?: string | undefined;
1136
+ defaultImage?: string | undefined;
1137
+ twitterSite?: string | undefined;
1138
+ twitterCardType?: "summary" | "summary_large_image" | undefined;
1139
+ locale?: string | undefined;
1140
+ }>>;
1141
+ contentProvider: z.ZodOptional<z.ZodType<ContentProvider, z.ZodTypeDef, ContentProvider>>;
1142
+ llmsContent: z.ZodOptional<z.ZodObject<{
1143
+ description: z.ZodString;
1144
+ sections: z.ZodArray<z.ZodObject<{
1145
+ heading: z.ZodString;
1146
+ links: z.ZodArray<z.ZodObject<{
1147
+ title: z.ZodString;
1148
+ url: z.ZodString;
1149
+ description: z.ZodString;
1150
+ }, "strip", z.ZodTypeAny, {
1151
+ title: string;
1152
+ description: string;
1153
+ url: string;
1154
+ }, {
1155
+ title: string;
1156
+ description: string;
1157
+ url: string;
1158
+ }>, "many">;
1159
+ }, "strip", z.ZodTypeAny, {
1160
+ heading: string;
1161
+ links: {
1162
+ title: string;
1163
+ description: string;
1164
+ url: string;
1165
+ }[];
1166
+ }, {
1167
+ heading: string;
1168
+ links: {
1169
+ title: string;
1170
+ description: string;
1171
+ url: string;
1172
+ }[];
1173
+ }>, "many">;
1174
+ optionalLinks: z.ZodOptional<z.ZodArray<z.ZodObject<{
1175
+ title: z.ZodString;
1176
+ url: z.ZodString;
1177
+ }, "strip", z.ZodTypeAny, {
1178
+ title: string;
1179
+ url: string;
1180
+ }, {
1181
+ title: string;
1182
+ url: string;
1183
+ }>, "many">>;
1184
+ }, "strip", z.ZodTypeAny, {
1185
+ description: string;
1186
+ sections: {
1187
+ heading: string;
1188
+ links: {
1189
+ title: string;
1190
+ description: string;
1191
+ url: string;
1192
+ }[];
1193
+ }[];
1194
+ optionalLinks?: {
1195
+ title: string;
1196
+ url: string;
1197
+ }[] | undefined;
1198
+ }, {
1199
+ description: string;
1200
+ sections: {
1201
+ heading: string;
1202
+ links: {
1203
+ title: string;
1204
+ description: string;
1205
+ url: string;
1206
+ }[];
1207
+ }[];
1208
+ optionalLinks?: {
1209
+ title: string;
1210
+ url: string;
1211
+ }[] | undefined;
1212
+ }>>;
1213
+ }, "strip", z.ZodTypeAny, {
1214
+ validation: {
1215
+ enabled: boolean;
1216
+ heroMinWidth: number;
1217
+ titleMaxLength: number;
1218
+ descriptionMaxLength: number;
1219
+ };
1220
+ site: string;
1221
+ organization: {
1222
+ name: string;
1223
+ logo: string;
1224
+ url?: string | undefined;
1225
+ sameAs?: string[] | undefined;
1226
+ };
1227
+ schemaType: "Article" | "NewsArticle" | "BlogPosting";
1228
+ googleNews: boolean;
1229
+ llmsTxt: boolean;
1230
+ llmsFullTxt: boolean;
1231
+ markdownSitemap: boolean;
1232
+ rss: boolean;
1233
+ aeoTwins: boolean | {
1234
+ mode: "static" | "middleware" | "both";
1235
+ twinAliases: string[];
1236
+ summaryTwin: boolean;
1237
+ ragChunkMarkers: boolean;
1238
+ responseHeaders: {
1239
+ noindex: boolean;
1240
+ canonicalToHtml: boolean;
1241
+ };
1242
+ stalenessCheck: "content-hash" | "dateModified" | "none";
1243
+ onDemandRevalidation: boolean;
1244
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
1245
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
1246
+ revalidateToken?: string | undefined;
1247
+ freshLayer?: {
1248
+ type: "r2" | "kv";
1249
+ bindingName: string;
1250
+ coordinatorBindingName: string;
1251
+ retentionDays: number;
1252
+ } | undefined;
1253
+ };
1254
+ flexibleSampling: {
1255
+ enabled: boolean;
1256
+ sampleMode: "none" | "metered" | "lead-in";
1257
+ leadInParagraphs: number;
1258
+ meteredLimit: number;
1259
+ };
1260
+ crawlerPolicy: {
1261
+ blockLlmTrainingCrawlers: boolean;
1262
+ userDirectedAgentsSeePublicOnly: boolean;
1263
+ verifiedSearchCrawlersSeeFullBody: boolean;
1264
+ };
1265
+ trailingSlash: "never" | "always" | "ignore";
1266
+ contentSignal: {
1267
+ aiTrain: "yes" | "no";
1268
+ search: "yes" | "no";
1269
+ aiInput: "yes" | "no";
1270
+ };
1271
+ robots: {
1272
+ additionalRules?: {
1273
+ userAgent: string;
1274
+ allow?: string[] | undefined;
1275
+ disallow?: string[] | undefined;
1276
+ }[] | undefined;
1277
+ };
1278
+ defaults: {
1279
+ twitterCardType: "summary" | "summary_large_image";
1280
+ locale: string;
1281
+ titleSuffix?: string | undefined;
1282
+ defaultImage?: string | undefined;
1283
+ twitterSite?: string | undefined;
1284
+ };
1285
+ locales?: {
1286
+ lang: string;
1287
+ urlPrefix: string;
1288
+ region?: string | undefined;
1289
+ domain?: string | undefined;
1290
+ }[] | undefined;
1291
+ defaultLocale?: string | undefined;
1292
+ podcast?: {
1293
+ type: "episodic" | "serial";
1294
+ enabled: boolean;
1295
+ title: string;
1296
+ description: string;
1297
+ author: string;
1298
+ email: string;
1299
+ image: string;
1300
+ category: string;
1301
+ language: string;
1302
+ explicit: boolean;
1303
+ feedPath: string;
1304
+ subcategory?: string | undefined;
1305
+ copyright?: string | undefined;
1306
+ } | undefined;
1307
+ appleNews?: {
1308
+ enabled: boolean;
1309
+ feedPath: string;
1310
+ channelName: string;
1311
+ defaultPublishable: "yes" | "no";
1312
+ fullContent: boolean;
1313
+ discoveryLink: boolean;
1314
+ channelId?: string | undefined;
1315
+ defaultSection?: string | undefined;
1316
+ } | undefined;
1317
+ commerce?: {
1318
+ enabled: boolean;
1319
+ currency: string;
1320
+ returnPolicy?: {
1321
+ applicableCountry: string;
1322
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1323
+ merchantReturnDays?: number | undefined;
1324
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1325
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1326
+ } | undefined;
1327
+ } | undefined;
1328
+ audioNarration?: {
1329
+ enabled: boolean;
1330
+ speakableSelectors: string[];
1331
+ asPodcastFeed: boolean;
1332
+ podcastFeedPath: string;
1333
+ narratorName?: string | undefined;
1334
+ } | undefined;
1335
+ contentProvider?: ContentProvider | undefined;
1336
+ llmsContent?: {
1337
+ description: string;
1338
+ sections: {
1339
+ heading: string;
1340
+ links: {
1341
+ title: string;
1342
+ description: string;
1343
+ url: string;
1344
+ }[];
1345
+ }[];
1346
+ optionalLinks?: {
1347
+ title: string;
1348
+ url: string;
1349
+ }[] | undefined;
1350
+ } | undefined;
1351
+ }, {
1352
+ site: string;
1353
+ organization: {
1354
+ name: string;
1355
+ logo: string;
1356
+ url?: string | undefined;
1357
+ sameAs?: string[] | undefined;
1358
+ };
1359
+ validation?: {
1360
+ enabled?: boolean | undefined;
1361
+ heroMinWidth?: number | undefined;
1362
+ titleMaxLength?: number | undefined;
1363
+ descriptionMaxLength?: number | undefined;
1364
+ } | undefined;
1365
+ schemaType?: "Article" | "NewsArticle" | "BlogPosting" | undefined;
1366
+ googleNews?: boolean | undefined;
1367
+ llmsTxt?: boolean | undefined;
1368
+ llmsFullTxt?: boolean | undefined;
1369
+ markdownSitemap?: boolean | undefined;
1370
+ rss?: boolean | undefined;
1371
+ aeoTwins?: boolean | {
1372
+ mode?: "static" | "middleware" | "both" | undefined;
1373
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
1374
+ twinAliases?: string[] | undefined;
1375
+ summaryTwin?: boolean | undefined;
1376
+ ragChunkMarkers?: boolean | undefined;
1377
+ responseHeaders?: {
1378
+ noindex?: boolean | undefined;
1379
+ canonicalToHtml?: boolean | undefined;
1380
+ } | undefined;
1381
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
1382
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
1383
+ onDemandRevalidation?: boolean | undefined;
1384
+ revalidateToken?: string | undefined;
1385
+ freshLayer?: {
1386
+ type?: "r2" | "kv" | undefined;
1387
+ bindingName?: string | undefined;
1388
+ coordinatorBindingName?: string | undefined;
1389
+ retentionDays?: number | undefined;
1390
+ } | undefined;
1391
+ } | undefined;
1392
+ locales?: {
1393
+ lang: string;
1394
+ urlPrefix: string;
1395
+ region?: string | undefined;
1396
+ domain?: string | undefined;
1397
+ }[] | undefined;
1398
+ defaultLocale?: string | undefined;
1399
+ podcast?: {
1400
+ title: string;
1401
+ description: string;
1402
+ author: string;
1403
+ email: string;
1404
+ image: string;
1405
+ category: string;
1406
+ type?: "episodic" | "serial" | undefined;
1407
+ enabled?: boolean | undefined;
1408
+ subcategory?: string | undefined;
1409
+ language?: string | undefined;
1410
+ explicit?: boolean | undefined;
1411
+ feedPath?: string | undefined;
1412
+ copyright?: string | undefined;
1413
+ } | undefined;
1414
+ appleNews?: {
1415
+ channelName: string;
1416
+ enabled?: boolean | undefined;
1417
+ feedPath?: string | undefined;
1418
+ channelId?: string | undefined;
1419
+ defaultPublishable?: "yes" | "no" | undefined;
1420
+ defaultSection?: string | undefined;
1421
+ fullContent?: boolean | undefined;
1422
+ discoveryLink?: boolean | undefined;
1423
+ } | undefined;
1424
+ commerce?: {
1425
+ enabled?: boolean | undefined;
1426
+ returnPolicy?: {
1427
+ applicableCountry: string;
1428
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1429
+ merchantReturnDays?: number | undefined;
1430
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1431
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1432
+ } | undefined;
1433
+ currency?: string | undefined;
1434
+ } | undefined;
1435
+ audioNarration?: {
1436
+ enabled?: boolean | undefined;
1437
+ speakableSelectors?: string[] | undefined;
1438
+ narratorName?: string | undefined;
1439
+ asPodcastFeed?: boolean | undefined;
1440
+ podcastFeedPath?: string | undefined;
1441
+ } | undefined;
1442
+ flexibleSampling?: {
1443
+ enabled?: boolean | undefined;
1444
+ sampleMode?: "none" | "metered" | "lead-in" | undefined;
1445
+ leadInParagraphs?: number | undefined;
1446
+ meteredLimit?: number | undefined;
1447
+ } | undefined;
1448
+ crawlerPolicy?: {
1449
+ blockLlmTrainingCrawlers?: boolean | undefined;
1450
+ userDirectedAgentsSeePublicOnly?: boolean | undefined;
1451
+ verifiedSearchCrawlersSeeFullBody?: boolean | undefined;
1452
+ } | undefined;
1453
+ trailingSlash?: "never" | "always" | "ignore" | undefined;
1454
+ contentSignal?: {
1455
+ aiTrain?: "yes" | "no" | undefined;
1456
+ search?: "yes" | "no" | undefined;
1457
+ aiInput?: "yes" | "no" | undefined;
1458
+ } | undefined;
1459
+ robots?: {
1460
+ additionalRules?: {
1461
+ userAgent: string;
1462
+ allow?: string[] | undefined;
1463
+ disallow?: string[] | undefined;
1464
+ }[] | undefined;
1465
+ } | undefined;
1466
+ defaults?: {
1467
+ titleSuffix?: string | undefined;
1468
+ defaultImage?: string | undefined;
1469
+ twitterSite?: string | undefined;
1470
+ twitterCardType?: "summary" | "summary_large_image" | undefined;
1471
+ locale?: string | undefined;
1472
+ } | undefined;
1473
+ contentProvider?: ContentProvider | undefined;
1474
+ llmsContent?: {
1475
+ description: string;
1476
+ sections: {
1477
+ heading: string;
1478
+ links: {
1479
+ title: string;
1480
+ description: string;
1481
+ url: string;
1482
+ }[];
1483
+ }[];
1484
+ optionalLinks?: {
1485
+ title: string;
1486
+ url: string;
1487
+ }[] | undefined;
1488
+ } | undefined;
1489
+ }>, {
1490
+ validation: {
1491
+ enabled: boolean;
1492
+ heroMinWidth: number;
1493
+ titleMaxLength: number;
1494
+ descriptionMaxLength: number;
1495
+ };
1496
+ site: string;
1497
+ organization: {
1498
+ name: string;
1499
+ logo: string;
1500
+ url?: string | undefined;
1501
+ sameAs?: string[] | undefined;
1502
+ };
1503
+ schemaType: "Article" | "NewsArticle" | "BlogPosting";
1504
+ googleNews: boolean;
1505
+ llmsTxt: boolean;
1506
+ llmsFullTxt: boolean;
1507
+ markdownSitemap: boolean;
1508
+ rss: boolean;
1509
+ aeoTwins: boolean | {
1510
+ mode: "static" | "middleware" | "both";
1511
+ twinAliases: string[];
1512
+ summaryTwin: boolean;
1513
+ ragChunkMarkers: boolean;
1514
+ responseHeaders: {
1515
+ noindex: boolean;
1516
+ canonicalToHtml: boolean;
1517
+ };
1518
+ stalenessCheck: "content-hash" | "dateModified" | "none";
1519
+ onDemandRevalidation: boolean;
1520
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
1521
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
1522
+ revalidateToken?: string | undefined;
1523
+ freshLayer?: {
1524
+ type: "r2" | "kv";
1525
+ bindingName: string;
1526
+ coordinatorBindingName: string;
1527
+ retentionDays: number;
1528
+ } | undefined;
1529
+ };
1530
+ flexibleSampling: {
1531
+ enabled: boolean;
1532
+ sampleMode: "none" | "metered" | "lead-in";
1533
+ leadInParagraphs: number;
1534
+ meteredLimit: number;
1535
+ };
1536
+ crawlerPolicy: {
1537
+ blockLlmTrainingCrawlers: boolean;
1538
+ userDirectedAgentsSeePublicOnly: boolean;
1539
+ verifiedSearchCrawlersSeeFullBody: boolean;
1540
+ };
1541
+ trailingSlash: "never" | "always" | "ignore";
1542
+ contentSignal: {
1543
+ aiTrain: "yes" | "no";
1544
+ search: "yes" | "no";
1545
+ aiInput: "yes" | "no";
1546
+ };
1547
+ robots: {
1548
+ additionalRules?: {
1549
+ userAgent: string;
1550
+ allow?: string[] | undefined;
1551
+ disallow?: string[] | undefined;
1552
+ }[] | undefined;
1553
+ };
1554
+ defaults: {
1555
+ twitterCardType: "summary" | "summary_large_image";
1556
+ locale: string;
1557
+ titleSuffix?: string | undefined;
1558
+ defaultImage?: string | undefined;
1559
+ twitterSite?: string | undefined;
1560
+ };
1561
+ locales?: {
1562
+ lang: string;
1563
+ urlPrefix: string;
1564
+ region?: string | undefined;
1565
+ domain?: string | undefined;
1566
+ }[] | undefined;
1567
+ defaultLocale?: string | undefined;
1568
+ podcast?: {
1569
+ type: "episodic" | "serial";
1570
+ enabled: boolean;
1571
+ title: string;
1572
+ description: string;
1573
+ author: string;
1574
+ email: string;
1575
+ image: string;
1576
+ category: string;
1577
+ language: string;
1578
+ explicit: boolean;
1579
+ feedPath: string;
1580
+ subcategory?: string | undefined;
1581
+ copyright?: string | undefined;
1582
+ } | undefined;
1583
+ appleNews?: {
1584
+ enabled: boolean;
1585
+ feedPath: string;
1586
+ channelName: string;
1587
+ defaultPublishable: "yes" | "no";
1588
+ fullContent: boolean;
1589
+ discoveryLink: boolean;
1590
+ channelId?: string | undefined;
1591
+ defaultSection?: string | undefined;
1592
+ } | undefined;
1593
+ commerce?: {
1594
+ enabled: boolean;
1595
+ currency: string;
1596
+ returnPolicy?: {
1597
+ applicableCountry: string;
1598
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1599
+ merchantReturnDays?: number | undefined;
1600
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1601
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1602
+ } | undefined;
1603
+ } | undefined;
1604
+ audioNarration?: {
1605
+ enabled: boolean;
1606
+ speakableSelectors: string[];
1607
+ asPodcastFeed: boolean;
1608
+ podcastFeedPath: string;
1609
+ narratorName?: string | undefined;
1610
+ } | undefined;
1611
+ contentProvider?: ContentProvider | undefined;
1612
+ llmsContent?: {
1613
+ description: string;
1614
+ sections: {
1615
+ heading: string;
1616
+ links: {
1617
+ title: string;
1618
+ description: string;
1619
+ url: string;
1620
+ }[];
1621
+ }[];
1622
+ optionalLinks?: {
1623
+ title: string;
1624
+ url: string;
1625
+ }[] | undefined;
1626
+ } | undefined;
1627
+ }, {
1628
+ site: string;
1629
+ organization: {
1630
+ name: string;
1631
+ logo: string;
1632
+ url?: string | undefined;
1633
+ sameAs?: string[] | undefined;
1634
+ };
1635
+ validation?: {
1636
+ enabled?: boolean | undefined;
1637
+ heroMinWidth?: number | undefined;
1638
+ titleMaxLength?: number | undefined;
1639
+ descriptionMaxLength?: number | undefined;
1640
+ } | undefined;
1641
+ schemaType?: "Article" | "NewsArticle" | "BlogPosting" | undefined;
1642
+ googleNews?: boolean | undefined;
1643
+ llmsTxt?: boolean | undefined;
1644
+ llmsFullTxt?: boolean | undefined;
1645
+ markdownSitemap?: boolean | undefined;
1646
+ rss?: boolean | undefined;
1647
+ aeoTwins?: boolean | {
1648
+ mode?: "static" | "middleware" | "both" | undefined;
1649
+ twinUrl?: ((args_0: string, ...args: unknown[]) => string) | undefined;
1650
+ twinAliases?: string[] | undefined;
1651
+ summaryTwin?: boolean | undefined;
1652
+ ragChunkMarkers?: boolean | undefined;
1653
+ responseHeaders?: {
1654
+ noindex?: boolean | undefined;
1655
+ canonicalToHtml?: boolean | undefined;
1656
+ } | undefined;
1657
+ include?: ((args_0: ContentItem, ...args: unknown[]) => boolean) | undefined;
1658
+ stalenessCheck?: "content-hash" | "dateModified" | "none" | undefined;
1659
+ onDemandRevalidation?: boolean | undefined;
1660
+ revalidateToken?: string | undefined;
1661
+ freshLayer?: {
1662
+ type?: "r2" | "kv" | undefined;
1663
+ bindingName?: string | undefined;
1664
+ coordinatorBindingName?: string | undefined;
1665
+ retentionDays?: number | undefined;
1666
+ } | undefined;
1667
+ } | undefined;
1668
+ locales?: {
1669
+ lang: string;
1670
+ urlPrefix: string;
1671
+ region?: string | undefined;
1672
+ domain?: string | undefined;
1673
+ }[] | undefined;
1674
+ defaultLocale?: string | undefined;
1675
+ podcast?: {
1676
+ title: string;
1677
+ description: string;
1678
+ author: string;
1679
+ email: string;
1680
+ image: string;
1681
+ category: string;
1682
+ type?: "episodic" | "serial" | undefined;
1683
+ enabled?: boolean | undefined;
1684
+ subcategory?: string | undefined;
1685
+ language?: string | undefined;
1686
+ explicit?: boolean | undefined;
1687
+ feedPath?: string | undefined;
1688
+ copyright?: string | undefined;
1689
+ } | undefined;
1690
+ appleNews?: {
1691
+ channelName: string;
1692
+ enabled?: boolean | undefined;
1693
+ feedPath?: string | undefined;
1694
+ channelId?: string | undefined;
1695
+ defaultPublishable?: "yes" | "no" | undefined;
1696
+ defaultSection?: string | undefined;
1697
+ fullContent?: boolean | undefined;
1698
+ discoveryLink?: boolean | undefined;
1699
+ } | undefined;
1700
+ commerce?: {
1701
+ enabled?: boolean | undefined;
1702
+ returnPolicy?: {
1703
+ applicableCountry: string;
1704
+ returnPolicyCategory: "MerchantReturnFiniteReturnWindow" | "MerchantReturnNotPermitted" | "MerchantReturnUnlimitedWindow";
1705
+ merchantReturnDays?: number | undefined;
1706
+ returnMethod?: "ReturnByMail" | "ReturnInStore" | "ReturnAtKiosk" | undefined;
1707
+ returnFees?: "FreeReturn" | "ReturnFeesCustomerResponsibility" | undefined;
1708
+ } | undefined;
1709
+ currency?: string | undefined;
1710
+ } | undefined;
1711
+ audioNarration?: {
1712
+ enabled?: boolean | undefined;
1713
+ speakableSelectors?: string[] | undefined;
1714
+ narratorName?: string | undefined;
1715
+ asPodcastFeed?: boolean | undefined;
1716
+ podcastFeedPath?: string | undefined;
1717
+ } | undefined;
1718
+ flexibleSampling?: {
1719
+ enabled?: boolean | undefined;
1720
+ sampleMode?: "none" | "metered" | "lead-in" | undefined;
1721
+ leadInParagraphs?: number | undefined;
1722
+ meteredLimit?: number | undefined;
1723
+ } | undefined;
1724
+ crawlerPolicy?: {
1725
+ blockLlmTrainingCrawlers?: boolean | undefined;
1726
+ userDirectedAgentsSeePublicOnly?: boolean | undefined;
1727
+ verifiedSearchCrawlersSeeFullBody?: boolean | undefined;
1728
+ } | undefined;
450
1729
  trailingSlash?: "never" | "always" | "ignore" | undefined;
451
1730
  contentSignal?: {
452
1731
  aiTrain?: "yes" | "no" | undefined;
@@ -484,6 +1763,14 @@ export declare const seoOptionsSchema: z.ZodObject<{
484
1763
  }[] | undefined;
485
1764
  } | undefined;
486
1765
  }>;
487
- export type SeoOptions = z.input<typeof seoOptionsSchema>;
488
- export type ResolvedSeoOptions = z.output<typeof seoOptionsSchema>;
1766
+ export type SeoOptions = z.input<typeof validatedSeoOptionsSchema>;
1767
+ export type ResolvedSeoOptions = z.output<typeof validatedSeoOptionsSchema>;
1768
+ /**
1769
+ * Resolves the aeoTwins field to its object form for downstream consumers.
1770
+ * `aeoTwins: true` -> { mode: 'static', ...defaults }
1771
+ * `aeoTwins: false` -> undefined (no twins)
1772
+ * `aeoTwins: { ... }` -> as-is with schema defaults applied
1773
+ */
1774
+ export declare function resolveAeoTwins(aeoTwins: ResolvedSeoOptions['aeoTwins']): z.output<typeof aeoTwinsObjectSchema> | undefined;
1775
+ export {};
489
1776
  //# sourceMappingURL=options.d.ts.map