@rimelight/seo 0.0.6 → 0.0.7

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 (66) hide show
  1. package/dist/assets.d.mts +39 -0
  2. package/dist/assets.mjs +96 -0
  3. package/dist/catalog.d.mts +7 -0
  4. package/dist/catalog.mjs +10 -0
  5. package/dist/index.d.mts +6 -2
  6. package/dist/index.mjs +5 -1
  7. package/dist/integration.mjs +182 -0
  8. package/dist/manifest.d.mts +7 -0
  9. package/dist/manifest.mjs +44 -0
  10. package/dist/og.mjs +1 -1
  11. package/dist/routes/api-catalog.d.mts +5 -0
  12. package/dist/routes/api-catalog.mjs +38 -0
  13. package/dist/routes/apple-touch-icon.png.d.mts +5 -0
  14. package/dist/routes/apple-touch-icon.png.mjs +17 -0
  15. package/dist/routes/favicon.ico.d.mts +5 -0
  16. package/dist/routes/favicon.ico.mjs +14 -0
  17. package/dist/routes/favicon.svg.d.mts +5 -0
  18. package/dist/routes/favicon.svg.mjs +12 -0
  19. package/dist/routes/icon-192.png.d.mts +5 -0
  20. package/dist/routes/icon-192.png.mjs +17 -0
  21. package/dist/routes/icon-512.png.d.mts +5 -0
  22. package/dist/routes/icon-512.png.mjs +17 -0
  23. package/dist/routes/icon-maskable-512.png.d.mts +5 -0
  24. package/dist/routes/icon-maskable-512.png.mjs +18 -0
  25. package/dist/routes/llms.txt.mjs +1 -1
  26. package/dist/routes/robots.txt.mjs +1 -1
  27. package/dist/routes/rss.xml.mjs +48 -20
  28. package/dist/routes/security.txt.d.mts +5 -0
  29. package/dist/routes/security.txt.mjs +24 -0
  30. package/dist/routes/site.webmanifest.d.mts +5 -0
  31. package/dist/routes/site.webmanifest.mjs +23 -0
  32. package/dist/routes/sitemap.xml.mjs +1 -1
  33. package/dist/security.d.mts +7 -0
  34. package/dist/security.mjs +34 -0
  35. package/dist/types.d.mts +191 -8
  36. package/package.json +23 -2
  37. package/src/assets.test.ts +70 -0
  38. package/src/assets.ts +137 -0
  39. package/src/catalog.test.ts +26 -0
  40. package/src/catalog.ts +11 -0
  41. package/src/components/SEOHead.astro +1 -1
  42. package/src/env.d.ts +56 -33
  43. package/src/index.ts +18 -1
  44. package/src/integration.ts +353 -172
  45. package/src/manifest.test.ts +41 -0
  46. package/src/manifest.ts +59 -0
  47. package/src/og.ts +1 -9
  48. package/src/routes/api-catalog.ts +55 -0
  49. package/src/routes/apple-touch-icon.png.ts +19 -0
  50. package/src/routes/favicon.ico.ts +19 -0
  51. package/src/routes/favicon.svg.ts +17 -0
  52. package/src/routes/icon-192.png.ts +19 -0
  53. package/src/routes/icon-512.png.ts +19 -0
  54. package/src/routes/icon-maskable-512.png.ts +24 -0
  55. package/src/routes/llms-full.txt.ts +77 -77
  56. package/src/routes/llms.txt.ts +93 -90
  57. package/src/routes/robots.txt.ts +63 -63
  58. package/src/routes/rss.xml.ts +129 -87
  59. package/src/routes/security.txt.ts +30 -0
  60. package/src/routes/site.webmanifest.ts +28 -0
  61. package/src/routes/sitemap.xml.ts +43 -43
  62. package/src/rss.test.ts +28 -28
  63. package/src/rss.ts +63 -63
  64. package/src/security.test.ts +46 -0
  65. package/src/security.ts +78 -0
  66. package/src/types.ts +564 -367
package/src/types.ts CHANGED
@@ -1,367 +1,564 @@
1
- /**
2
- * Change frequency for sitemap entries
3
- */
4
- export type ChangeFreq = "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never"
5
-
6
- /**
7
- * SEO entry — a single page to include in sitemaps
8
- */
9
- export interface SeoEntry {
10
- /**
11
- * Locale-less path, e.g. "/company/blog/hello". Leading slash required.
12
- */
13
- path: string
14
- lastmod?: Date
15
- changefreq?: ChangeFreq
16
- priority?: number
17
- /**
18
- * Restrict to a subset of locales; defaults to all configured locales.
19
- */
20
- locales?: readonly string[]
21
- }
22
-
23
- /**
24
- * Locale configuration for SEO builders
25
- */
26
- export interface LocaleConfig {
27
- /**
28
- * Absolute origin, e.g. "https://rimelight.com"
29
- */
30
- site: string
31
- /**
32
- * Map of locale segment -> hreflang, e.g. { en: "en-US", pt: "pt-BR" }
33
- */
34
- locales: Record<string, string>
35
- defaultLocale: string
36
- /**
37
- * Emit the default locale without a prefix. Default: false.
38
- */
39
- prefixDefaultLocale?: boolean
40
- trailingSlash?: "always" | "never"
41
- }
42
-
43
- /**
44
- * Fully resolved sitemap URL with alternates
45
- */
46
- export interface SitemapUrl {
47
- loc: string
48
- lastmod?: string
49
- changefreq?: ChangeFreq
50
- priority?: number
51
- alternates?: SitemapAlternate[]
52
- }
53
-
54
- /**
55
- * Language alternate for a sitemap URL
56
- */
57
- export interface SitemapAlternate {
58
- hreflang: string
59
- href: string
60
- }
61
-
62
- /**
63
- * Options for robots.txt generation
64
- */
65
- export interface RobotsOptions {
66
- /**
67
- * The sitemap URL to reference
68
- */
69
- sitemapUrl: string
70
- /**
71
- * Paths to disallow for all user agents
72
- */
73
- disallow?: string[]
74
- /**
75
- * Paths to allow for all user agents
76
- */
77
- allow?: string[]
78
- /**
79
- * User-agent specific rules
80
- */
81
- userAgentRules?: UserAgentRule[]
82
- }
83
-
84
- /**
85
- * User-agent specific robots.txt rule
86
- */
87
- export interface UserAgentRule {
88
- userAgent: string
89
- disallow?: string[]
90
- allow?: string[]
91
- }
92
-
93
- export interface OpenGraphMeta {
94
- type?: string
95
- locale?: string
96
- url?: string
97
- title?: string
98
- description?: string
99
- images?: OGImage[] | OGImage
100
- siteName?: string
101
- [key: string]: unknown
102
- }
103
-
104
- export interface TwitterMeta {
105
- card?: "summary" | "summary_large_image" | "player" | "app"
106
- site?: string
107
- creator?: string
108
- title?: string
109
- description?: string
110
- images?: OGImage[] | OGImage | string
111
- [key: string]: unknown
112
- }
113
-
114
- /**
115
- * Site identity and SEO defaults shared across all Rimelight Astro sites. The UI-specific overrides
116
- * (component themes, shortcuts, etc.) live in UIConfig (packages/ui) and are passed directly to the
117
- * ui() integration.
118
- */
119
- export interface SiteConfig {
120
- id: string
121
- name: string
122
- description: string
123
- url: string
124
- ogImage: string
125
- author: string
126
- email: string
127
- branding: {
128
- logo: {
129
- alt: string
130
- }
131
- favicon: {
132
- svg: string
133
- }
134
- colors: {
135
- themeColor: string
136
- backgroundColor: string
137
- }
138
- }
139
- seo: {
140
- titleTemplate: string
141
- ogImageFallback: string
142
- maxDescriptionLength: number
143
- authorHandle?: string
144
- }
145
- openGraph?: OpenGraphMeta
146
- twitter?: TwitterMeta
147
- }
148
-
149
- /**
150
- * Open Graph image with alt text
151
- */
152
- export interface OGImage {
153
- /**
154
- * Image URL (relative or absolute)
155
- */
156
- src: string
157
- /**
158
- * Alt text for the image
159
- */
160
- alt: string
161
- }
162
-
163
- /**
164
- * RSS feed link configuration
165
- */
166
- export interface RSSFeed {
167
- /**
168
- * RSS feed URL
169
- */
170
- href: string
171
- /**
172
- * Feed title (defaults to "RSS")
173
- */
174
- title?: string
175
- }
176
-
177
- /**
178
- * Props for the RLAHead Astro component. Defined here so consumers can construct head props without
179
- * importing @rimelight/ui.
180
- */
181
- export interface HeadProps {
182
- /**
183
- * Page title
184
- */
185
- title?: string
186
- /**
187
- * Page description
188
- */
189
- description?: string
190
- /**
191
- * Open Graph image with alt text
192
- */
193
- ogImage?: OGImage
194
- /**
195
- * Open Graph type (e.g., "website", "article")
196
- */
197
- ogType?: string
198
- /**
199
- * Open Graph locale (defaults to "en_US")
200
- */
201
- ogLocale?: string
202
- /**
203
- * Whether to prevent indexing
204
- */
205
- noindex?: boolean
206
- /**
207
- * Whether this is a 404 page
208
- */
209
- is404?: boolean
210
- /**
211
- * Robots metadata (overrides noindex/is404 logic if provided)
212
- */
213
- robots?: string
214
- /**
215
- * Canonical URL
216
- */
217
- canonical?: string
218
- /**
219
- * Language alternates for i18n
220
- */
221
- languageAlternates?: Array<{ hreflang: string; href: string }>
222
- /**
223
- * Custom favicon SVG or image path (overrides config.branding.favicon.svg)
224
- */
225
- favicon?: string
226
- /**
227
- * Site configuration for defaults
228
- */
229
- config?: SiteConfig
230
- /**
231
- * Whether to enable View Transitions (ClientRouter)
232
- */
233
- transitions?: boolean
234
- /**
235
- * Meta charset
236
- */
237
- charset?: string
238
- /**
239
- * Meta viewport
240
- */
241
- viewport?: string
242
- /**
243
- * RSS feed configuration
244
- */
245
- rssFeed?: RSSFeed
246
- /**
247
- * Article or BlogPosting JSON-LD configuration
248
- */
249
- articleSchema?: import("./schema.js").ArticleSchemaOptions
250
- /**
251
- * Breadcrumb list for JSON-LD structured data
252
- */
253
- breadcrumbs?: import("./schema.js").BreadcrumbItem[]
254
- /**
255
- * URL for this page's raw Markdown alternate twin
256
- */
257
- markdownUrl?: string
258
- /**
259
- * Version alternates for multi-version documentation
260
- */
261
- versionAlternates?: Array<{ version: string; href: string }>
262
- /**
263
- * Whether the title should bypass site title template
264
- */
265
- absolute?: boolean
266
- /**
267
- * Twitter card type
268
- */
269
- twitterCard?: "summary" | "summary_large_image" | "player" | "app"
270
- /**
271
- * Open Graph metadata overrides
272
- */
273
- openGraph?: OpenGraphMeta
274
- /**
275
- * Twitter metadata overrides
276
- */
277
- twitter?: TwitterMeta
278
- }
279
-
280
- export interface RssItem {
281
- title: string
282
- link: string
283
- pubDate: Date | string | number
284
- description?: string
285
- content?: string
286
- guid?: string
287
- author?: string
288
- }
289
-
290
- export interface RssFeedOptions {
291
- title: string
292
- description: string
293
- site: string
294
- feedUrl?: string
295
- language?: string
296
- items: RssItem[]
297
- }
298
-
299
- export interface RssOptions extends Partial<RssFeedOptions> {
300
- /**
301
- * Custom RSS route pattern (default: "/rss.xml")
302
- */
303
- path?: string
304
- /**
305
- * Custom items loader
306
- */
307
- items?: RssItem[]
308
- }
309
-
310
- export interface SitemapOptions {
311
- /**
312
- * Sitemap route pattern (default: "/sitemap.xml")
313
- */
314
- path?: string
315
- urls?: SitemapUrl[]
316
- entries?: () => Promise<SeoEntry[]> | SeoEntry[]
317
- locales?: LocaleConfig
318
- [key: string]: unknown
319
- }
320
-
321
- export interface RobotsRouteOptions extends Partial<RobotsOptions> {
322
- /**
323
- * Route pattern (default: "/robots.txt")
324
- */
325
- path?: string
326
- }
327
-
328
- export interface LlmsRouteOptions extends Partial<LlmsTxtOptions> {
329
- /**
330
- * Route pattern (default: "/llms.txt")
331
- */
332
- path?: string
333
- }
334
-
335
- export interface LlmsFullRouteOptions extends Partial<LlmsFullTxtOptions> {
336
- /**
337
- * Route pattern (default: "/llms-full.txt")
338
- */
339
- path?: string
340
- }
341
-
342
- export interface RimelightSeoOptions {
343
- /**
344
- * Sitemap configuration or false to disable automatic /sitemap.xml (default: true)
345
- */
346
- sitemap?: boolean | SitemapOptions
347
- /**
348
- * Robots.txt configuration or false to disable automatic /robots.txt (default: true)
349
- */
350
- robots?: boolean | RobotsRouteOptions
351
- /**
352
- * RSS feed configuration or false to disable automatic /rss.xml (default: true)
353
- */
354
- rss?: boolean | RssOptions
355
- /**
356
- * LLMs.txt configuration or false to disable automatic /llms.txt (default: true)
357
- */
358
- llms?: boolean | LlmsRouteOptions
359
- /**
360
- * LLMs-full.txt configuration or false to disable automatic /llms-full.txt (default: true)
361
- */
362
- llmsFull?: boolean | LlmsFullRouteOptions
363
- }
364
-
365
- export type { LlmsPage, LlmsTxtOptions, LlmsFullTxtOptions } from "./llms.js"
366
- export type { ArticleSchemaOptions, BreadcrumbItem } from "./schema.js"
367
-
1
+ import type { LlmsTxtOptions, LlmsFullTxtOptions } from "./llms.js"
2
+
3
+ /**
4
+ * Change frequency for sitemap entries
5
+ */
6
+ export type ChangeFreq = "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never"
7
+
8
+ /**
9
+ * SEO entry — a single page to include in sitemaps
10
+ */
11
+ export interface SeoEntry {
12
+ /**
13
+ * Locale-less path, e.g. "/company/blog/hello". Leading slash required.
14
+ */
15
+ path: string
16
+ lastmod?: Date
17
+ changefreq?: ChangeFreq
18
+ priority?: number
19
+ /**
20
+ * Restrict to a subset of locales; defaults to all configured locales.
21
+ */
22
+ locales?: readonly string[]
23
+ }
24
+
25
+ /**
26
+ * Locale configuration for SEO builders
27
+ */
28
+ export interface LocaleConfig {
29
+ /**
30
+ * Absolute origin, e.g. "https://rimelight.com"
31
+ */
32
+ site: string
33
+ /**
34
+ * Map of locale segment -> hreflang, e.g. { en: "en-US", pt: "pt-BR" }
35
+ */
36
+ locales: Record<string, string>
37
+ defaultLocale: string
38
+ /**
39
+ * Emit the default locale without a prefix. Default: false.
40
+ */
41
+ prefixDefaultLocale?: boolean
42
+ trailingSlash?: "always" | "never"
43
+ }
44
+
45
+ /**
46
+ * Fully resolved sitemap URL with alternates
47
+ */
48
+ export interface SitemapUrl {
49
+ loc: string
50
+ lastmod?: string
51
+ changefreq?: ChangeFreq
52
+ priority?: number
53
+ alternates?: SitemapAlternate[]
54
+ }
55
+
56
+ /**
57
+ * Language alternate for a sitemap URL
58
+ */
59
+ export interface SitemapAlternate {
60
+ hreflang: string
61
+ href: string
62
+ }
63
+
64
+ /**
65
+ * Options for robots.txt generation
66
+ */
67
+ export interface RobotsOptions {
68
+ /**
69
+ * The sitemap URL to reference
70
+ */
71
+ sitemapUrl: string
72
+ /**
73
+ * Paths to disallow for all user agents
74
+ */
75
+ disallow?: string[]
76
+ /**
77
+ * Paths to allow for all user agents
78
+ */
79
+ allow?: string[]
80
+ /**
81
+ * User-agent specific rules
82
+ */
83
+ userAgentRules?: UserAgentRule[]
84
+ }
85
+
86
+ /**
87
+ * User-agent specific robots.txt rule
88
+ */
89
+ export interface UserAgentRule {
90
+ userAgent: string
91
+ disallow?: string[]
92
+ allow?: string[]
93
+ }
94
+
95
+ export interface OpenGraphMeta {
96
+ type?: string
97
+ locale?: string
98
+ url?: string
99
+ title?: string
100
+ description?: string
101
+ images?: OGImage[] | OGImage
102
+ siteName?: string
103
+ [key: string]: unknown
104
+ }
105
+
106
+ export interface TwitterMeta {
107
+ card?: "summary" | "summary_large_image" | "player" | "app"
108
+ site?: string
109
+ creator?: string
110
+ title?: string
111
+ description?: string
112
+ images?: OGImage[] | OGImage | string
113
+ [key: string]: unknown
114
+ }
115
+
116
+ /**
117
+ * Site identity and SEO defaults shared across all Rimelight Astro sites. The UI-specific overrides
118
+ * (component themes, shortcuts, etc.) live in UIConfig (packages/ui) and are passed directly to the
119
+ * ui() integration.
120
+ */
121
+ export interface SiteConfig {
122
+ id: string
123
+ name: string
124
+ description: string
125
+ url: string
126
+ ogImage?: string
127
+ author: string
128
+ email: string
129
+ branding: {
130
+ logo: {
131
+ alt: string
132
+ }
133
+ favicon?: {
134
+ svg: string
135
+ }
136
+ icon?: string
137
+ colors: {
138
+ themeColor: string
139
+ backgroundColor: string
140
+ }
141
+ }
142
+ seo: {
143
+ titleTemplate: string
144
+ ogImageFallback?: string
145
+ maxDescriptionLength: number
146
+ authorHandle?: string
147
+ }
148
+ openGraph?: OpenGraphMeta
149
+ twitter?: TwitterMeta
150
+ }
151
+
152
+ /**
153
+ * Open Graph image with alt text
154
+ */
155
+ export interface OGImage {
156
+ /**
157
+ * Image URL (relative or absolute)
158
+ */
159
+ src: string
160
+ /**
161
+ * Alt text for the image
162
+ */
163
+ alt: string
164
+ }
165
+
166
+ /**
167
+ * RSS feed link configuration
168
+ */
169
+ export interface RSSFeed {
170
+ /**
171
+ * RSS feed URL
172
+ */
173
+ href: string
174
+ /**
175
+ * Feed title (defaults to "RSS")
176
+ */
177
+ title?: string
178
+ }
179
+
180
+ /**
181
+ * Props for the RLAHead Astro component. Defined here so consumers can construct head props without
182
+ * importing @rimelight/ui.
183
+ */
184
+ export interface HeadProps {
185
+ /**
186
+ * Page title
187
+ */
188
+ title?: string
189
+ /**
190
+ * Page description
191
+ */
192
+ description?: string
193
+ /**
194
+ * Open Graph image with alt text
195
+ */
196
+ ogImage?: OGImage
197
+ /**
198
+ * Open Graph type (e.g., "website", "article")
199
+ */
200
+ ogType?: string
201
+ /**
202
+ * Open Graph locale (defaults to "en_US")
203
+ */
204
+ ogLocale?: string
205
+ /**
206
+ * Whether to prevent indexing
207
+ */
208
+ noindex?: boolean
209
+ /**
210
+ * Whether this is a 404 page
211
+ */
212
+ is404?: boolean
213
+ /**
214
+ * Robots metadata (overrides noindex/is404 logic if provided)
215
+ */
216
+ robots?: string
217
+ /**
218
+ * Canonical URL
219
+ */
220
+ canonical?: string
221
+ /**
222
+ * Language alternates for i18n
223
+ */
224
+ languageAlternates?: Array<{ hreflang: string; href: string }>
225
+ /**
226
+ * Custom favicon SVG or image path (overrides config.branding.favicon.svg)
227
+ */
228
+ favicon?: string
229
+ /**
230
+ * Site configuration for defaults
231
+ */
232
+ config?: SiteConfig
233
+ /**
234
+ * Whether to enable View Transitions (ClientRouter)
235
+ */
236
+ transitions?: boolean
237
+ /**
238
+ * Meta charset
239
+ */
240
+ charset?: string
241
+ /**
242
+ * Meta viewport
243
+ */
244
+ viewport?: string
245
+ /**
246
+ * RSS feed configuration
247
+ */
248
+ rssFeed?: RSSFeed
249
+ /**
250
+ * Article or BlogPosting JSON-LD configuration
251
+ */
252
+ articleSchema?: import("./schema.js").ArticleSchemaOptions
253
+ /**
254
+ * Breadcrumb list for JSON-LD structured data
255
+ */
256
+ breadcrumbs?: import("./schema.js").BreadcrumbItem[]
257
+ /**
258
+ * URL for this page's raw Markdown alternate twin
259
+ */
260
+ markdownUrl?: string
261
+ /**
262
+ * Version alternates for multi-version documentation
263
+ */
264
+ versionAlternates?: Array<{ version: string; href: string }>
265
+ /**
266
+ * Whether the title should bypass site title template
267
+ */
268
+ absolute?: boolean
269
+ /**
270
+ * Twitter card type
271
+ */
272
+ twitterCard?: "summary" | "summary_large_image" | "player" | "app"
273
+ /**
274
+ * Open Graph metadata overrides
275
+ */
276
+ openGraph?: OpenGraphMeta
277
+ /**
278
+ * Twitter metadata overrides
279
+ */
280
+ twitter?: TwitterMeta
281
+ }
282
+
283
+ export interface RssItem {
284
+ title: string
285
+ link: string
286
+ pubDate: Date | string | number
287
+ description?: string
288
+ content?: string
289
+ guid?: string
290
+ author?: string
291
+ }
292
+
293
+ export interface RssFeedOptions {
294
+ title: string
295
+ description: string
296
+ site: string
297
+ feedUrl?: string
298
+ language?: string
299
+ items: RssItem[]
300
+ }
301
+
302
+ export interface RssCollectionConfig {
303
+ name: string
304
+ pathPrefix?: string
305
+ }
306
+
307
+ export interface RssOptions extends Omit<Partial<RssFeedOptions>, "items"> {
308
+ /**
309
+ * Custom RSS route pattern (default: "/rss.xml")
310
+ */
311
+ path?: string
312
+ /**
313
+ * Custom items loader or static items array
314
+ */
315
+ items?: RssItem[] | (() => Promise<RssItem[]> | RssItem[])
316
+ /**
317
+ * Collections to include in RSS feed (defaults to ["blog", "posts", "news", "articles"])
318
+ */
319
+ collections?: (string | RssCollectionConfig)[]
320
+ }
321
+
322
+ export interface SitemapOptions {
323
+ /**
324
+ * Sitemap route pattern (default: "/sitemap.xml")
325
+ */
326
+ path?: string
327
+ urls?: SitemapUrl[]
328
+ entries?: () => Promise<SeoEntry[]> | SeoEntry[]
329
+ locales?: LocaleConfig
330
+ [key: string]: unknown
331
+ }
332
+
333
+ export interface SecurityTxtOptions {
334
+ /**
335
+ * Contact URI or list of contact URIs (e.g. "mailto:security@example.com") - REQUIRED by RFC 9116
336
+ */
337
+ contact: string | string[]
338
+ /**
339
+ * Expiration date/time (ISO 8601 string or Date) - REQUIRED by RFC 9116
340
+ */
341
+ expires?: Date | string
342
+ /**
343
+ * URI to PGP/GPG public key
344
+ */
345
+ encryption?: string | string[]
346
+ /**
347
+ * URI to security acknowledgments / hall of fame
348
+ */
349
+ acknowledgments?: string | string[]
350
+ /**
351
+ * Comma-separated list of preferred languages (e.g. "en, pt")
352
+ */
353
+ preferredLanguages?: string
354
+ /**
355
+ * Canonical URI of the security.txt file
356
+ */
357
+ canonical?: string
358
+ /**
359
+ * URI to security policy
360
+ */
361
+ policy?: string
362
+ /**
363
+ * URI to security hiring page
364
+ */
365
+ hiring?: string
366
+ /**
367
+ * URI to Common Security Advisory Framework (CSAF) provider
368
+ */
369
+ csaf?: string
370
+ }
371
+
372
+ export interface SecurityRouteOptions extends Partial<SecurityTxtOptions> {
373
+ /**
374
+ * Route pattern (default: "/.well-known/security.txt")
375
+ */
376
+ path?: string
377
+ /**
378
+ * Whether to also inject legacy fallback route at "/security.txt" (default: true)
379
+ */
380
+ legacyRoute?: boolean
381
+ }
382
+
383
+ export interface WebManifestIcon {
384
+ src: string
385
+ sizes: string
386
+ type: string
387
+ purpose?: "any" | "maskable" | "monochrome"
388
+ }
389
+
390
+ export interface WebManifestShortcut {
391
+ name: string
392
+ url: string
393
+ short_name?: string
394
+ description?: string
395
+ icons?: WebManifestIcon[]
396
+ }
397
+
398
+ export interface WebManifest {
399
+ name: string
400
+ short_name?: string
401
+ description?: string
402
+ start_url: string
403
+ display: "fullscreen" | "standalone" | "minimal-ui" | "browser"
404
+ background_color: string
405
+ theme_color: string
406
+ icons: WebManifestIcon[]
407
+ shortcuts?: WebManifestShortcut[]
408
+ categories?: string[]
409
+ lang?: string
410
+ dir?: "auto" | "ltr" | "rtl"
411
+ orientation?: "any" | "natural" | "landscape" | "portrait"
412
+ scope?: string
413
+ [key: string]: unknown
414
+ }
415
+
416
+ export interface WebManifestOptions {
417
+ name: string
418
+ shortName?: string
419
+ description?: string
420
+ startUrl?: string
421
+ display?: "fullscreen" | "standalone" | "minimal-ui" | "browser"
422
+ backgroundColor?: string
423
+ themeColor?: string
424
+ icons?: WebManifestIcon[]
425
+ shortcuts?: WebManifestShortcut[]
426
+ categories?: string[]
427
+ lang?: string
428
+ dir?: "auto" | "ltr" | "rtl"
429
+ orientation?: "any" | "natural" | "landscape" | "portrait"
430
+ scope?: string
431
+ }
432
+
433
+ export interface ManifestRouteOptions extends Partial<WebManifestOptions> {
434
+ /**
435
+ * Route pattern (default: "/site.webmanifest")
436
+ */
437
+ path?: string
438
+ }
439
+
440
+ export interface ApiCatalogItem {
441
+ rel: string
442
+ href: string
443
+ type?: string
444
+ title?: string
445
+ [key: string]: unknown
446
+ }
447
+
448
+ export interface ApiCatalog {
449
+ "api-catalog": ApiCatalogItem[]
450
+ }
451
+
452
+ export interface ApiCatalogOptions {
453
+ items: ApiCatalogItem[]
454
+ }
455
+
456
+ export interface ApiCatalogRouteOptions extends Partial<ApiCatalogOptions> {
457
+ /**
458
+ * Route pattern (default: "/.well-known/api-catalog")
459
+ */
460
+ path?: string
461
+ }
462
+
463
+ export interface RobotsRouteOptions extends Partial<RobotsOptions> {
464
+ /**
465
+ * Route pattern (default: "/robots.txt")
466
+ */
467
+ path?: string
468
+ }
469
+
470
+ export interface LlmsRouteOptions extends Partial<LlmsTxtOptions> {
471
+ /**
472
+ * Route pattern (default: "/llms.txt")
473
+ */
474
+ path?: string
475
+ }
476
+
477
+ export interface LlmsFullRouteOptions extends Partial<LlmsFullTxtOptions> {
478
+ /**
479
+ * Route pattern (default: "/llms-full.txt")
480
+ */
481
+ path?: string
482
+ }
483
+
484
+ export interface AssetRouteOptions {
485
+ /**
486
+ * Path to the master SVG/PNG icon file (relative to project root or absolute). If omitted, will
487
+ * search in src/assets/logos/ or siteConfig.branding.icon.
488
+ */
489
+ icon?: string
490
+ /**
491
+ * Background color for maskable icons (defaults to siteConfig.branding.colors.backgroundColor or
492
+ * #ffffff)
493
+ */
494
+ backgroundColor?: string
495
+ /**
496
+ * Whether to inject /favicon.ico (default: true)
497
+ */
498
+ faviconIco?: boolean
499
+ /**
500
+ * Whether to inject /apple-touch-icon.png (default: true)
501
+ */
502
+ appleTouchIcon?: boolean
503
+ /**
504
+ * Whether to inject /icon-192.png (default: true)
505
+ */
506
+ icon192?: boolean
507
+ /**
508
+ * Whether to inject /icon-512.png (default: true)
509
+ */
510
+ icon512?: boolean
511
+ /**
512
+ * Whether to inject /icon-maskable-512.png (default: true)
513
+ */
514
+ iconMaskable?: boolean
515
+ /**
516
+ * Whether to generate and emit /og.png branded card (default: true)
517
+ */
518
+ ogImage?: boolean
519
+ }
520
+
521
+ export interface RimelightSeoOptions {
522
+ /**
523
+ * Sitemap configuration or false to disable automatic /sitemap.xml (default: true)
524
+ */
525
+ sitemap?: boolean | SitemapOptions
526
+ /**
527
+ * Robots.txt configuration or false to disable automatic /robots.txt (default: true)
528
+ */
529
+ robots?: boolean | RobotsRouteOptions
530
+ /**
531
+ * RSS feed configuration or false to disable automatic /rss.xml (default: true)
532
+ */
533
+ rss?: boolean | RssOptions
534
+ /**
535
+ * LLMs.txt configuration or false to disable automatic /llms.txt (default: true)
536
+ */
537
+ llms?: boolean | LlmsRouteOptions
538
+ /**
539
+ * LLMs-full.txt configuration or false to disable automatic /llms-full.txt (default: true)
540
+ */
541
+ llmsFull?: boolean | LlmsFullRouteOptions
542
+ /**
543
+ * Security.txt configuration or false to disable automatic /.well-known/security.txt (default:
544
+ * true)
545
+ */
546
+ security?: boolean | SecurityRouteOptions
547
+ /**
548
+ * RFC 9652 API Catalog configuration or false to disable automatic /.well-known/api-catalog
549
+ * (default: true)
550
+ */
551
+ apiCatalog?: boolean | ApiCatalogRouteOptions
552
+ /**
553
+ * Web App Manifest configuration or false to disable automatic /site.webmanifest (default: true)
554
+ */
555
+ manifest?: boolean | ManifestRouteOptions
556
+ /**
557
+ * Automatic generation of compliant public image assets (favicon.ico, apple-touch-icon.png, PWA
558
+ * icons) from a single master icon (default: true)
559
+ */
560
+ assets?: boolean | AssetRouteOptions
561
+ }
562
+
563
+ export type { LlmsPage, LlmsTxtOptions, LlmsFullTxtOptions } from "./llms.js"
564
+ export type { ArticleSchemaOptions, BreadcrumbItem } from "./schema.js"