reroute-js 0.34.8 → 0.35.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 (186) hide show
  1. package/cli/bin.d.ts +1 -1
  2. package/cli/bin.js +178 -71
  3. package/cli/bin.js.map +8 -8
  4. package/cli/index.d.ts +1 -1
  5. package/cli/index.js +4 -4
  6. package/cli/index.js.map +1 -1
  7. package/cli/src/cli.d.ts +1 -1
  8. package/cli/src/commands/analyze.d.ts +1 -1
  9. package/cli/src/commands/build.d.ts +1 -1
  10. package/cli/src/commands/dev.d.ts +1 -1
  11. package/cli/src/commands/gen.d.ts +1 -1
  12. package/cli/src/commands/index.d.ts +1 -1
  13. package/cli/src/commands/init.d.ts +1 -1
  14. package/cli/src/commands/lib/assets.d.ts +1 -1
  15. package/cli/src/commands/lib/bundler.d.ts +1 -1
  16. package/cli/src/commands/lib/command.d.ts +1 -1
  17. package/cli/src/commands/lib/env.d.ts +1 -1
  18. package/cli/src/commands/lib/index.d.ts +1 -1
  19. package/cli/src/commands/lib/log.d.ts +1 -1
  20. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  21. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  22. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  23. package/cli/src/commands/lib/production.d.ts +1 -1
  24. package/cli/src/commands/lib/server.d.ts +1 -1
  25. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  26. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  27. package/cli/src/commands/lib/tailwind.d.ts +1 -1
  28. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  29. package/cli/src/commands/lib/version.d.ts +1 -1
  30. package/cli/src/commands/og.d.ts +1 -1
  31. package/cli/src/commands/start.d.ts +1 -1
  32. package/cli/src/index.d.ts +1 -1
  33. package/core/index.d.ts +1 -1
  34. package/core/index.js +174 -67
  35. package/core/index.js.map +8 -8
  36. package/core/src/bundler/hash.d.ts +1 -1
  37. package/core/src/bundler/index.d.ts +1 -1
  38. package/core/src/config.d.ts +3 -1
  39. package/core/src/config.d.ts.map +1 -1
  40. package/core/src/content/discovery.d.ts +1 -1
  41. package/core/src/content/index.d.ts +1 -1
  42. package/core/src/content/metadata.d.ts +1 -1
  43. package/core/src/index.d.ts +1 -1
  44. package/core/src/llms/extractor.d.ts +1 -1
  45. package/core/src/llms/formatter.d.ts +1 -1
  46. package/core/src/llms/full-generator.d.ts +1 -1
  47. package/core/src/llms/full-generator.d.ts.map +1 -1
  48. package/core/src/llms/index-generator.d.ts +2 -3
  49. package/core/src/llms/index-generator.d.ts.map +1 -1
  50. package/core/src/llms/index.d.ts +1 -1
  51. package/core/src/og/discovery.d.ts +1 -1
  52. package/core/src/og/index.d.ts +1 -1
  53. package/core/src/og/meta.d.ts +1 -1
  54. package/core/src/og/render.d.ts +1 -1
  55. package/core/src/og/types.d.ts +1 -1
  56. package/core/src/robots/discovery.d.ts +1 -1
  57. package/core/src/robots/discovery.d.ts.map +1 -1
  58. package/core/src/robots/generator.d.ts +1 -1
  59. package/core/src/robots/index.d.ts +1 -1
  60. package/core/src/robots/policies.d.ts +1 -1
  61. package/core/src/rss/discovery.d.ts +4 -4
  62. package/core/src/rss/discovery.d.ts.map +1 -1
  63. package/core/src/rss/generator.d.ts +1 -1
  64. package/core/src/rss/index.d.ts +1 -1
  65. package/core/src/sitemap/discovery.d.ts +3 -3
  66. package/core/src/sitemap/discovery.d.ts.map +1 -1
  67. package/core/src/sitemap/generator.d.ts +1 -1
  68. package/core/src/sitemap/index.d.ts +1 -1
  69. package/core/src/ssr/index.d.ts +1 -1
  70. package/core/src/ssr/lib/cache.d.ts +1 -1
  71. package/core/src/ssr/lib/collections.d.ts +1 -1
  72. package/core/src/ssr/lib/compression.d.ts +1 -1
  73. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  74. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  75. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  76. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  77. package/core/src/ssr/lib/data.d.ts +1 -1
  78. package/core/src/ssr/lib/html.d.ts +1 -1
  79. package/core/src/ssr/lib/imports.d.ts +1 -1
  80. package/core/src/ssr/lib/index.d.ts +1 -1
  81. package/core/src/ssr/lib/layouts.d.ts +1 -1
  82. package/core/src/ssr/lib/metadata.d.ts +1 -1
  83. package/core/src/ssr/lib/mime.d.ts +1 -1
  84. package/core/src/ssr/lib/modules.d.ts +1 -1
  85. package/core/src/ssr/lib/path.d.ts +1 -1
  86. package/core/src/ssr/lib/preload.d.ts +1 -1
  87. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  88. package/core/src/ssr/lib/scripts/data.d.ts +1 -1
  89. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  90. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  91. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  92. package/core/src/ssr/lib/seed.d.ts +1 -1
  93. package/core/src/ssr/lib/serialize.d.ts +1 -1
  94. package/core/src/ssr/lib/setup.d.ts +1 -1
  95. package/core/src/ssr/lib/styles.d.ts +1 -1
  96. package/core/src/ssr/lib/template.d.ts +1 -1
  97. package/core/src/ssr/lib/types.d.ts +1 -1
  98. package/core/src/ssr/render.d.ts +1 -1
  99. package/core/src/ssr/stream.d.ts +1 -1
  100. package/elysia/index.d.ts +1 -1
  101. package/elysia/index.js +189 -82
  102. package/elysia/index.js.map +13 -13
  103. package/elysia/src/index.d.ts +1 -1
  104. package/elysia/src/libs/assets.d.ts +1 -1
  105. package/elysia/src/libs/cache.d.ts +1 -1
  106. package/elysia/src/libs/caching.d.ts +1 -1
  107. package/elysia/src/libs/http.d.ts +1 -1
  108. package/elysia/src/libs/image.d.ts +1 -1
  109. package/elysia/src/libs/index.d.ts +1 -1
  110. package/elysia/src/libs/llms.d.ts +1 -1
  111. package/elysia/src/libs/response.d.ts +1 -1
  112. package/elysia/src/libs/serving.d.ts +1 -1
  113. package/elysia/src/plugin.d.ts +1 -1
  114. package/elysia/src/plugin.d.ts.map +1 -1
  115. package/elysia/src/routes/artifacts.d.ts +1 -1
  116. package/elysia/src/routes/content.d.ts +1 -1
  117. package/elysia/src/routes/image.d.ts +1 -1
  118. package/elysia/src/routes/index.d.ts +1 -1
  119. package/elysia/src/routes/internal.d.ts +1 -1
  120. package/elysia/src/routes/llms.d.ts +1 -1
  121. package/elysia/src/routes/llms.d.ts.map +1 -1
  122. package/elysia/src/routes/og.d.ts +1 -1
  123. package/elysia/src/routes/redirects.d.ts +1 -1
  124. package/elysia/src/routes/redirects.d.ts.map +1 -1
  125. package/elysia/src/routes/robots.d.ts +1 -1
  126. package/elysia/src/routes/rss.d.ts +1 -1
  127. package/elysia/src/routes/rss.d.ts.map +1 -1
  128. package/elysia/src/routes/search.d.ts +1 -1
  129. package/elysia/src/routes/sitemap.d.ts +1 -2
  130. package/elysia/src/routes/sitemap.d.ts.map +1 -1
  131. package/elysia/src/routes/ssr.d.ts +1 -1
  132. package/elysia/src/routes/static.d.ts +1 -1
  133. package/elysia/src/types.d.ts +1 -1
  134. package/package.json +1 -1
  135. package/react/index.d.ts +1 -1
  136. package/react/index.js +2 -2
  137. package/react/index.js.map +1 -1
  138. package/react/src/components/ClientOnly.d.ts +1 -1
  139. package/react/src/components/ContentRoute.d.ts +1 -1
  140. package/react/src/components/Image.d.ts +1 -1
  141. package/react/src/components/LazyRoute.d.ts +1 -1
  142. package/react/src/components/Link.d.ts +1 -1
  143. package/react/src/components/Markdown.d.ts +1 -1
  144. package/react/src/components/Outlet.d.ts +1 -1
  145. package/react/src/components/index.d.ts +1 -1
  146. package/react/src/hooks/index.d.ts +1 -1
  147. package/react/src/hooks/useContent.d.ts +1 -1
  148. package/react/src/hooks/useData.d.ts +1 -1
  149. package/react/src/hooks/useFeed.d.ts +1 -1
  150. package/react/src/hooks/useLayoutData.d.ts +1 -1
  151. package/react/src/hooks/useLlms.d.ts +1 -1
  152. package/react/src/hooks/useNavigate.d.ts +1 -1
  153. package/react/src/hooks/useParams.d.ts +1 -1
  154. package/react/src/hooks/useRouter.d.ts +1 -1
  155. package/react/src/hooks/useSearch.d.ts +1 -1
  156. package/react/src/hooks/useSearchParams.d.ts +1 -1
  157. package/react/src/hooks/useToc.d.ts +1 -1
  158. package/react/src/index.d.ts +1 -1
  159. package/react/src/lib/collection.d.ts +1 -1
  160. package/react/src/lib/content.d.ts +1 -1
  161. package/react/src/lib/head.d.ts +1 -1
  162. package/react/src/lib/index.d.ts +1 -1
  163. package/react/src/lib/lazy-route.d.ts +1 -1
  164. package/react/src/lib/route-loader.d.ts +1 -1
  165. package/react/src/providers/ContentProvider.d.ts +1 -1
  166. package/react/src/providers/RerouteProvider.d.ts +1 -1
  167. package/react/src/providers/RouterProvider.d.ts +1 -1
  168. package/react/src/providers/index.d.ts +1 -1
  169. package/react/src/types/any.d.ts +1 -1
  170. package/react/src/types/index.d.ts +1 -1
  171. package/react/src/types/router.d.ts +1 -1
  172. package/telemetry/react.d.ts +1 -1
  173. package/telemetry/react.js +2 -2
  174. package/telemetry/react.js.map +1 -1
  175. package/telemetry/server.d.ts +1 -1
  176. package/telemetry/server.js +2 -2
  177. package/telemetry/server.js.map +5 -5
  178. package/telemetry/src/react/api.d.ts +1 -1
  179. package/telemetry/src/react/context.d.ts +1 -1
  180. package/telemetry/src/react/index.d.ts +1 -1
  181. package/telemetry/src/react/telemetry.d.ts +1 -1
  182. package/telemetry/src/server/context.d.ts +1 -1
  183. package/telemetry/src/server/index.d.ts +1 -1
  184. package/telemetry/src/server/instrumentation.d.ts +1 -1
  185. package/telemetry/src/server/plugin.d.ts +1 -1
  186. package/telemetry/src/server/sourcemap.d.ts +1 -1
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "import { AsyncLocalStorage } from 'node:async_hooks';\n\n/**\n * Context attributes storage using AsyncLocalStorage for request-scoped context\n * This ensures concurrent requests don't mix context data\n */\nconst contextStorage = new AsyncLocalStorage<Record<string, string>>();\n\n/**\n * Set context attributes that will be automatically attached to all telemetry\n *\n * All attributes are prefixed with 'context.' when attached to spans/logs.\n *\n * **Privacy-first:** You control what data to track. No assumptions about PII.\n *\n * @example\n * ```typescript\n * // In your auth middleware\n * setContext({\n * 'user_id': user.id,\n * 'plan': user.subscription,\n * 'region': user.region,\n * });\n *\n * // Later, when an error happens, telemetry will include:\n * // context.user_id, context.plan, context.region\n * ```\n *\n * @param attributes - Key-value pairs to attach to telemetry (values must be strings)\n */\nexport function setContext(attributes: Record<string, string>): void {\n\tconst current = contextStorage.getStore() || {};\n\tconst updated = { ...current, ...attributes };\n\n\t// Store the updated attributes in the current async context\n\t// Note: This only works within an async context (e.g., inside a request handler)\n\t// For server-wide context (rare), use a global Map with request IDs instead\n\ttry {\n\t\t// If we're already in an async context, merge\n\t\tif (contextStorage.getStore()) {\n\t\t\t// AsyncLocalStorage doesn't have a way to update in place\n\t\t\t// So we need to be called from within the context that was created\n\t\t\t// This is typically fine since it's called from request handlers\n\t\t}\n\t} catch {\n\t\t// Not in async context - will be set when request starts\n\t}\n\n\t// Store globally as fallback for non-async contexts\n\tglobalContextAttributes = updated;\n}\n\n/**\n * Clear all context attributes\n *\n * Call this when a user logs out or when you want to reset context\n *\n * @example\n * ```typescript\n * app.post('/logout', async () => {\n * clearContext();\n * // ... logout logic\n * });\n * ```\n */\nexport function clearContext(): void {\n\tglobalContextAttributes = {};\n}\n\n/**\n * Get current context attributes\n * Returns attributes from async context if available, otherwise from global fallback\n *\n * @internal\n */\nexport function getContextAttr(): Record<string, string> {\n\treturn contextStorage.getStore() || globalContextAttributes || {};\n}\n\n// Global fallback for non-async contexts\nlet globalContextAttributes: Record<string, string> = {};\n\n/**\n * Get context attributes formatted for OpenTelemetry spans/logs\n * Prefixes all keys with 'context.'\n *\n * @internal\n */\nexport function getContextAttributesForTelemetry(): Record<string, string> {\n\tconst attrs = getContextAttr();\n\tconst prefixed: Record<string, string> = {};\n\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tprefixed[`context.${key}`] = value;\n\t}\n\n\treturn prefixed;\n}\n",
6
6
  "/**\n * Telemetry utilities for instrumenting operations\n *\n * This module provides helpers to create spans for custom instrumentation:\n * - API endpoints\n * - Database queries\n * - External service calls\n * - Business logic operations\n */\n\nimport { context, type Span, SpanStatusCode, trace } from '@opentelemetry/api';\n\n// Check if OpenTelemetry is available (lazy loaded to avoid requiring it)\nlet otelAvailable: boolean | undefined;\n\nfunction isOtelAvailable(): boolean {\n\tif (otelAvailable !== undefined) return otelAvailable;\n\n\ttry {\n\t\t// Check if @opentelemetry/api is available\n\t\trequire('@opentelemetry/api');\n\t\totelAvailable = true;\n\t\treturn true;\n\t} catch {\n\t\totelAvailable = false;\n\t\treturn false;\n\t}\n}\n\n/**\n * No-op span implementation when OpenTelemetry is not available\n * Implements the Span interface but all methods do nothing\n */\nclass NoopSpan implements Span {\n\tspanContext() {\n\t\treturn {\n\t\t\ttraceId: '',\n\t\t\tspanId: '',\n\t\t\ttraceFlags: 0,\n\t\t};\n\t}\n\tsetAttribute() {\n\t\treturn this;\n\t}\n\tsetAttributes() {\n\t\treturn this;\n\t}\n\taddEvent() {\n\t\treturn this;\n\t}\n\taddLink() {\n\t\treturn this;\n\t}\n\taddLinks() {\n\t\treturn this;\n\t}\n\tsetStatus() {\n\t\treturn this;\n\t}\n\tupdateName() {\n\t\treturn this;\n\t}\n\tend() {}\n\tisRecording() {\n\t\treturn false;\n\t}\n\trecordException() {}\n}\n\n// Singleton instance\nconst noopSpan = new NoopSpan();\n\n/**\n * Execute a function within a named span for distributed tracing\n *\n * @example\n * ```ts\n * const result = await withSpan('database.query', async (span) => {\n * span.setAttribute('query', 'SELECT * FROM users');\n * return await db.query('SELECT * FROM users');\n * });\n * ```\n */\nexport async function withSpan<T>(\n\tname: string,\n\tfn: (span: Span) => Promise<T>,\n\tattributes?: Record<string, string | number | boolean>,\n): Promise<T> {\n\tif (!isOtelAvailable()) {\n\t\treturn fn(noopSpan);\n\t}\n\n\tconst tracer = trace.getTracer('reroute');\n\treturn tracer.startActiveSpan(name, { attributes }, async (span) => {\n\t\ttry {\n\t\t\tconst result = await fn(span);\n\t\t\tspan.end();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tspan.recordException(error as Error);\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\tspan.end();\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\n/**\n * Execute a synchronous function within a named span\n */\nexport function withSpanSync<T>(\n\tname: string,\n\tfn: (span: Span) => T,\n\tattributes?: Record<string, string | number | boolean>,\n): T {\n\tif (!isOtelAvailable()) {\n\t\treturn fn(noopSpan);\n\t}\n\n\tconst tracer = trace.getTracer('reroute');\n\treturn tracer.startActiveSpan(name, { attributes }, (span) => {\n\t\ttry {\n\t\t\tconst result = fn(span);\n\t\t\tspan.end();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tspan.recordException(error as Error);\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\tspan.end();\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\n/**\n * Add attributes to the current active span (if available)\n */\nexport function setSpanAttributes(\n\tattributes: Record<string, string | number | boolean>,\n) {\n\tif (!isOtelAvailable()) return;\n\n\tconst span = trace.getActiveSpan();\n\tif (span) {\n\t\tspan.setAttributes(attributes);\n\t}\n}\n\n/**\n * Record an event in the current active span\n */\nexport function addSpanEvent(\n\tname: string,\n\tattributes?: Record<string, string | number | boolean>,\n) {\n\tif (!isOtelAvailable()) return;\n\n\tconst span = trace.getActiveSpan();\n\tif (span) {\n\t\tspan.addEvent(name, attributes);\n\t}\n}\n\n/**\n * Execute a function within the context of a parent span\n * This ensures child spans created inside the function are properly nested\n *\n * @example\n * ```ts\n * const parentSpan = store.telemetrySpan;\n * await withParentSpan(parentSpan, async () => {\n * // Any spans created here will be children of parentSpan\n * await withSpan('child.operation', async () => {...});\n * });\n * ```\n */\nexport async function withParentSpan<T>(\n\tparentSpan: Span | undefined | null,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\tif (!(isOtelAvailable() && parentSpan)) {\n\t\treturn fn();\n\t}\n\n\t// Set the parent span as active in the context\n\tconst ctx = trace.setSpan(context.active(), parentSpan);\n\treturn context.with(ctx, fn);\n}\n\n/**\n * Execute a synchronous function within the context of a parent span\n */\nexport function withParentSpanSync<T>(\n\tparentSpan: Span | undefined | null,\n\tfn: () => T,\n): T {\n\tif (!(isOtelAvailable() && parentSpan)) {\n\t\treturn fn();\n\t}\n\n\tconst ctx = trace.setSpan(context.active(), parentSpan);\n\treturn context.with(ctx, fn);\n}\n\n/**\n * Extract W3C Trace Context from incoming HTTP request headers\n * Returns the extracted context or undefined if not available\n *\n * @example\n * ```ts\n * const traceContext = extractTraceContext(request.headers);\n * ```\n */\nexport function extractTraceContext(\n\theaders: Headers | Record<string, string | undefined>,\n): ReturnType<typeof context.active> | undefined {\n\tif (!isOtelAvailable()) return undefined;\n\n\ttry {\n\t\tconst { propagation } = require('@opentelemetry/api');\n\n\t\t// Create a carrier object that matches the W3C Trace Context format\n\t\tconst carrier: Record<string, string | undefined> = {};\n\n\t\tif (headers instanceof Headers) {\n\t\t\tcarrier.traceparent = headers.get('traceparent') || undefined;\n\t\t\tcarrier.tracestate = headers.get('tracestate') || undefined;\n\t\t} else {\n\t\t\tcarrier.traceparent = headers.traceparent;\n\t\t\tcarrier.tracestate = headers.tracestate;\n\t\t}\n\n\t\t// If no traceparent header, return undefined\n\t\tif (!carrier.traceparent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Extract context from carrier\n\t\treturn propagation.extract(context.active(), carrier);\n\t} catch (error) {\n\t\tconsole.error('[telemetry] Failed to extract trace context:', error);\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Get the trace context from a span for injection into browser\n * Returns an object with traceparent and tracestate (if available)\n *\n * @example\n * ```ts\n * const span = store.telemetrySpan;\n * const traceContext = getTraceContextForInjection(span);\n * // Inject into HTML: <script>window.__TRACE_CONTEXT__ = {...traceContext};</script>\n * ```\n */\nexport function getTraceContextForInjection(\n\tspan: Span | undefined | null,\n): { traceparent?: string; tracestate?: string } | undefined {\n\tif (!(isOtelAvailable() && span)) return undefined;\n\n\ttry {\n\t\tconst { propagation } = require('@opentelemetry/api');\n\t\tconst carrier: Record<string, string | undefined> = {};\n\n\t\t// Set the span as active and inject context\n\t\tconst ctx = trace.setSpan(context.active(), span);\n\t\tpropagation.inject(ctx, carrier);\n\n\t\treturn {\n\t\t\ttraceparent: carrier.traceparent,\n\t\t\ttracestate: carrier.tracestate,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t'[telemetry] Failed to get trace context for injection:',\n\t\t\terror,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n",
7
- "import { pathToFileURL } from 'node:url';\nimport type { ComponentType } from 'react';\n\n// biome-ignore lint/suspicious/noExplicitAny: The user document\ntype Doc = any;\ninterface StreamingOptions {\n\tenabled?: boolean;\n\tdefaultSkeleton?: ComponentType | string;\n\tdefaultLayoutSkeleton?: ComponentType | string;\n}\n\ninterface StaticOptions {\n\t/**\n\t * Patterns to ignore when serving static files\n\t * @default ['.DS_Store', '.git', '.env']\n\t */\n\tignorePatterns?: (string | RegExp)[];\n\t/**\n\t * Custom headers to add to static file responses\n\t */\n\theaders?: Record<string, string>;\n\t/**\n\t * Cache duration in seconds for static assets\n\t * @default 3600 (1 hour)\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Cache-Control directive\n\t * @default 'public'\n\t */\n\tdirective?: string;\n}\n\ninterface ImageOptions {\n\t/**\n\t * Cache duration in seconds for optimized images\n\t * @default 31536000 (1 year)\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Allowed external domains for image optimization\n\t * @default []\n\t */\n\tallowedDomains?: string[];\n\t/**\n\t * Maximum image width in pixels\n\t * @default 3840\n\t */\n\tmaxWidth?: number;\n\t/**\n\t * Maximum image height in pixels\n\t * @default 2160\n\t */\n\tmaxHeight?: number;\n}\n\n/**\n * Sitemap configuration options\n */\ninterface SitemapOptions {\n\t/** Enable sitemap generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for sitemap generation (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/**\n\t * Maximum URLs per sitemap file before pagination (default: 50000)\n\t * When exceeded, creates multiple sitemap files with a sitemap index\n\t * Set lower for testing (e.g., 10) to verify pagination works\n\t */\n\tmaxUrlsPerPage?: number;\n\n\t/**\n\t * Completely exclude specific routes from the sitemap\n\t * Routes listed here will not appear in the sitemap at all\n\t * @example ['/admin', '/api']\n\t */\n\texcludeRoutes?: string[];\n\n\t/**\n\t * Exclude specific routes from SSR data array discovery\n\t * Routes listed here will still appear in the sitemap as single entries,\n\t * but won't generate multiple URLs from arrays found in their SSR data\n\t * @example ['/download', '/pricing'] - these routes appear once, not per array item\n\t */\n\texcludeDiscovery?: string[];\n\n\t/**\n\t * Extract urls from ssr.data result (full control over data shape)\n\t * If provided, this takes precedence over automatic array discovery\n\t * @param data - Full ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns Array of items to process, or null/undefined to skip this route\n\t */\n\textractUrls?: (data: Doc, routePattern: string) => Doc[] | null | undefined;\n\n\t/**\n\t * Extract URL segment from ssr.data items\n\t * @param item - Data item from ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns URL segment to append to routePattern (e.g., '0.1.0' -> '/changelog/0.1.0')\n\t */\n\textractUrl?: (item: Doc, routePattern: string) => string | null | undefined;\n\n\t/**\n\t * Extract lastmod date from ssr.data items\n\t * @param item - Data item from ssr.data result\n\t * @returns ISO date string or undefined\n\t */\n\textractLastmod?: (item: Doc) => string | undefined;\n\n\t/** Default changefreq for URLs */\n\tchangefreq?:\n\t\t| 'always'\n\t\t| 'hourly'\n\t\t| 'daily'\n\t\t| 'weekly'\n\t\t| 'monthly'\n\t\t| 'yearly'\n\t\t| 'never';\n\n\t/** Default priority for URLs */\n\tpriority?: number;\n}\n\n/**\n * RSS feed configuration options\n */\ninterface RSSOptions {\n\t/** Enable RSS feed generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for RSS feeds (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Feed title (e.g., 'My Blog') */\n\ttitle?: string;\n\n\t/** Feed description */\n\tdescription?: string;\n\n\t/** Maximum number of items per feed (default: 50) */\n\tlimit?: number;\n\n\t/** Feed format: 'rss' or 'atom' (default: 'rss') */\n\tformat?: 'rss' | 'atom';\n\n\t/**\n\t * Completely exclude specific routes from the RSS feed\n\t * Routes listed here will not appear in the feed at all\n\t * @example ['/admin', '/api']\n\t */\n\texcludeRoutes?: string[];\n\n\t/**\n\t * Exclude specific routes from SSR data array discovery\n\t * Routes listed here won't generate multiple feed items from arrays in their SSR data,\n\t * but may still generate a single feed item if appropriate\n\t * @example ['/download', '/pricing'] - won't generate items per array entry\n\t */\n\texcludeDiscovery?: string[];\n\n\t/**\n\t * Extract items from ssr.data result (full control over data shape)\n\t * If provided, this takes precedence over automatic array discovery\n\t * @param data - Full ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns Array of items to process, or null/undefined to skip this route\n\t */\n\textractUrls?: (data: Doc, routePattern: string) => Doc[] | null | undefined;\n\n\t/**\n\t * Extract URL segment from ssr.data items (same as sitemap)\n\t */\n\textractUrl?: (item: Doc, routePattern: string) => string | null | undefined;\n\n\t/**\n\t * Extract publication date from items\n\t */\n\textractPubDate?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract author from items\n\t */\n\textractAuthor?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract content/body from items\n\t */\n\textractContent?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract description/summary from items\n\t * Falls back to item.description or item.excerpt if not provided\n\t */\n\textractDescription?: (item: Doc) => string | undefined;\n}\n\n/**\n * Markdown configuration options\n */\ninterface MarkdownOptions {\n\t/**\n\t * Custom components to use when rendering markdown\n\t * Path to a module that exports a components object compatible with Streamdown\n\t * @example './src/client/lib/markdown-components'\n\t */\n\tcomponents?: string;\n\n\t/** Enable GitHub Flavored Markdown (default: true if remark-gfm is installed) */\n\tenableGfm?: boolean;\n\n\t/** Shiki theme for syntax highlighting (default: 'github-dark') */\n\ttheme?: string;\n}\n\n/**\n * Search index configuration options\n */\ninterface SearchOptions {\n\t/** Enable search index generation (default: false) */\n\tenabled?: boolean;\n\n\t/**\n\t * Collections to include in search index\n\t * @default [] - all collections will be indexed\n\t * @example ['blog', 'docs']\n\t */\n\tcollections?: string[];\n\n\t/**\n\t * Include full content text in search (increases index size significantly)\n\t * @default false - only index headings and metadata\n\t */\n\tincludeContent?: boolean;\n\n\t/**\n\t * Maximum content length to index per item (characters)\n\t * @default 5000 - prevents huge content from bloating index\n\t */\n\tcontentLimit?: number;\n\n\t/**\n\t * Fields to index from frontmatter metadata\n\t * @default ['title', 'description', 'excerpt', 'tags']\n\t */\n\tmetaFields?: string[];\n\n\t/**\n\t * Minimum heading level to index (1-6)\n\t * @default 1 - index all headings\n\t */\n\tminHeadingLevel?: number;\n\n\t/**\n\t * Maximum heading level to index (1-6)\n\t * @default 6 - index all headings\n\t */\n\tmaxHeadingLevel?: number;\n\n\t/**\n\t * Default page size for paginated results\n\t * @default 20\n\t */\n\tdefaultPageSize?: number;\n\n\t/**\n\t * Maximum allowed page size (prevents excessive results)\n\t * @default 100\n\t */\n\tmaxPageSize?: number;\n}\n\ninterface OGImageFont {\n\t/** Font family name (e.g., 'Inter') */\n\tname: string;\n\t/** Path to font file (TTF, OTF, or WOFF) relative to project root */\n\tpath: string;\n\t/** Font weight (e.g., 400, 700, 900) */\n\tweight?: number;\n\t/** Font style (default: 'normal') */\n\tstyle?:\n\t\t| 'normal'\n\t\t| 'italic'\n\t\t| 'bold'\n\t\t| 'bold-italic'\n\t\t| 'medium'\n\t\t| 'medium-italic'\n\t\t| 'semibold'\n\t\t| 'semibold-italic'\n\t\t| 'light'\n\t\t| 'light-italic'\n\t\t| 'thin'\n\t\t| 'thin-italic'\n\t\t| 'black'\n\t\t| 'black-italic'\n\t\t| 'extra-bold'\n\t\t| 'extra-bold-italic'\n\t\t| 'extra-light'\n\t\t| 'extra-light-italic'\n\t\t| 'extra-medium'\n\t\t| 'extra-medium-italic'\n\t\t| 'extra-semibold'\n\t\t| 'extra-semibold-italic'\n\t\t| 'extra-light'\n\t\t| 'extra-light-italic'\n\t\t| 'extra-medium'\n\t\t| 'extra-medium-italic'\n\t\t| 'extra-semibold'\n\t\t| 'extra-semibold-italic';\n\tdata?: ArrayBuffer | undefined;\n}\n\n/**\n * OG Image generation configuration options\n */\ninterface OGImageOptions {\n\t/** Enable OG image generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for absolute OG image URLs (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Path to default template component or 'default' for built-in template */\n\tdefaultTemplate?: string;\n\n\t/** Image width in pixels (default: 1200) */\n\twidth?: number;\n\n\t/** Image height in pixels (default: 630) */\n\theight?: number;\n\n\t/** Cache duration in seconds (default: 3600 = 1 hour) */\n\tmaxAge?: number;\n\n\t/** Default avatar/logo URL (can be external or local path) */\n\tavatar?: string;\n\n\t/** Site name to display */\n\tsiteName?: string;\n\n\t/** Custom fonts to load for OG images */\n\tfonts?: OGImageFont[];\n}\n\n/**\n * LLMs content configuration options\n */\ninterface LLMsOptions {\n\t/** Enable LLM content features (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for absolute URLs in llms.txt index (e.g., 'https://example.com') */\n\tbaseUrl?: string;\n\n\t/** Enable .txt extension for routes (default: true when enabled) */\n\tenableTextExtension?: boolean;\n\n\t/** Enable .md extension for routes (default: true when enabled) */\n\tenableMarkdownExtension?: boolean;\n\n\t/** Enable Accept header content negotiation (default: true when enabled) */\n\tenableContentNegotiation?: boolean;\n\n\t/** Enable /llms.txt index generation (default: true when enabled) */\n\tenableIndex?: boolean;\n\n\t/** Enable /llms-full.txt generation (default: true when enabled) */\n\tenableFullContent?: boolean;\n\n\t/** Cache duration in seconds for LLM content (default: 86400 = 24 hours, or falls back to options.maxAge) */\n\tmaxAge?: number;\n\n\t/** Cache duration in seconds for llms-full.txt specifically (default: 604800 = 7 days, or falls back to llms.maxAge) */\n\tmaxAgeFull?: number;\n\n\t/** Maximum items in full content bundle (default: 10000) */\n\tmaxItems?: number;\n\n\t/** Maximum file size for full content in bytes (default: 50MB) */\n\tmaxSize?: number;\n\n\t/**\n\t * Exclude specific routes from LLM features\n\t * Supports strings (exact match or substring), RegExp, or custom functions\n\t * @example ['/admin', '/api', /^\\/private/, (path) => path.includes('draft')]\n\t */\n\texcludeRoutes?: (string | RegExp | ((pathname: string) => boolean))[];\n\n\t/**\n\t * Exclude collections from LLM features\n\t * @example ['drafts', 'private']\n\t */\n\texcludeCollections?: string[];\n\n\t/** Site name for index header */\n\tsiteName?: string;\n\n\t/** Site description for index header (brief context for LLMs) */\n\tsiteDescription?: string;\n\n\t/**\n\t * Per-collection customization for titles and descriptions\n\t * @example\n\t * ```ts\n\t * collections: {\n\t * blog: {\n\t * title: 'My Awesome Blog',\n\t * description: 'Insights and tutorials about web development'\n\t * },\n\t * docs: {\n\t * title: 'Documentation',\n\t * description: 'Complete API reference and guides'\n\t * }\n\t * }\n\t * ```\n\t */\n\tcollections?: Record<\n\t\tstring,\n\t\t{\n\t\t\t/** Custom title for this collection's LLMS index */\n\t\t\ttitle?: string;\n\t\t\t/** Custom description for this collection's LLMS index */\n\t\t\tdescription?: string;\n\t\t}\n\t>;\n}\n\n/**\n * Robots policy for specific user-agents\n */\ninterface RobotsPolicy {\n\t/** User-Agent (e.g., '*', 'Googlebot', 'GPTBot') */\n\tuserAgent: string;\n\n\t/** Paths to explicitly allow */\n\tallow?: string[];\n\n\t/** Paths to disallow */\n\tdisallow?: string[];\n\n\t/** Crawl delay for this user-agent (seconds) */\n\tcrawlDelay?: number;\n}\n\n/**\n * Robots.txt generation configuration options\n */\ninterface RobotsOptions {\n\t/** Enable robots.txt generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for sitemap reference (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Cache duration in seconds (default: 86400 = 24 hours) */\n\tmaxAge?: number;\n\n\t/** Custom policies per user-agent (default: permissive) */\n\tpolicies?: RobotsPolicy[];\n\n\t/** Auto-reference sitemap.xml if sitemap is enabled (default: true) */\n\treferenceSitemap?: boolean;\n\n\t/** Auto-disallow routes excluded from sitemap (default: true) */\n\tsitemapExclusion?: boolean;\n\n\t/** Auto-disallow old redirect source paths (default: true) */\n\tredirectExclusion?: boolean;\n\n\t/** Additional raw text appended to robots.txt */\n\tcustomRules?: string;\n\n\t/** Global crawl delay in seconds (optional) */\n\tcrawlDelay?: number;\n}\n\n/**\n * Telemetry proxy configuration for forwarding browser telemetry\n */\ninterface TelemetryProxyOptions {\n\t/**\n\t * Enable browser telemetry proxy (default: true when proxy config exists)\n\t * Creates endpoints to forward browser traces/metrics/logs to OTLP backend\n\t * This avoids CORS issues and ad blockers\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Base path for proxy endpoints (default: '/__reroute_telemetry')\n\t * Creates:\n\t * - {pathname}/v1/traces\n\t * - {pathname}/v1/metrics\n\t * - {pathname}/v1/logs\n\t * - {pathname}/health\n\t */\n\tpathname?: string;\n\n\t/**\n\t * Enable verbose logging for proxy requests\n\t * @default false\n\t */\n\tverbose?: boolean;\n\n\t/**\n\t * Custom handler for proxy requests (advanced)\n\t * If provided, replaces default OTLP forwarding logic\n\t *\n\t * @example\n\t * ```ts\n\t * handler: async ({ body, endpoint, headers }) => {\n\t * // Custom logic: filter, transform, or route to different backends\n\t * await fetch(`https://custom-backend${endpoint}`, {\n\t * method: 'POST',\n\t * headers,\n\t * body: JSON.stringify(body),\n\t * });\n\t * return { status: 200 };\n\t * }\n\t * ```\n\t */\n\thandler?: (params: {\n\t\tbody: unknown;\n\t\tendpoint: string;\n\t\theaders: Record<string, string>;\n\t\totlpEndpoint: string;\n\t}) => Promise<{ status: number }>;\n}\n\n/**\n * Browser telemetry configuration options\n */\ninterface BrowserTelemetryOptions {\n\t/**\n\t * Enable browser telemetry\n\t * @default true\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Service name for browser telemetry\n\t * @default 'reroute-app-browser'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL (use relative URL for same-origin proxy)\n\t * @default '/__reroute_telemetry'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Deployment environment (e.g., 'production', 'staging', 'development')\n\t * @default 'development'\n\t */\n\tenvironment?: string;\n\n\t/**\n\t * Enable console.error capture\n\t * @default true\n\t */\n\tenableConsoleCapture?: boolean;\n\n\t/**\n\t * Ignore specific routes/URLs from breadcrumbs and network tracking\n\t *\n\t * Note: Functions are NOT supported for browser telemetry (closures cannot be serialized)\n\t * Use strings or regex patterns instead\n\t *\n\t * @example\n\t * ```ts\n\t * ignoreRoutes: [\n\t * '/bundles/', // String prefix match\n\t * /\\.(js|css|png)$/, // Regex pattern\n\t * /^\\/assets\\//, // Regex for path prefix\n\t * ]\n\t * ```\n\t */\n\tignoreRoutes?: Array<string | RegExp>;\n}\n\n/**\n * Telemetry configuration options for OpenTelemetry integration\n */\ninterface TelemetryOptions {\n\t/**\n\t * Enable server telemetry collection (default: false)\n\t * Must be explicitly enabled to start collecting traces, metrics, and logs\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Browser telemetry configuration\n\t * Configure browser-side telemetry separately from server\n\t */\n\tbrowser?: BrowserTelemetryOptions;\n\n\t/**\n\t * Service name for server telemetry\n\t * @default 'reroute-app'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default process.env.npm_package_version || '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL\n\t * @default process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional, only needed for SigNoz Cloud)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Deployment environment (e.g., 'production', 'staging', 'development')\n\t * Used as a deployment.environment attribute on all telemetry\n\t * @default process.env.NODE_ENV || 'development'\n\t */\n\tenvironment?: string;\n\n\t/**\n\t * Metric export interval in milliseconds\n\t * @default 5000\n\t */\n\tmetricsInterval?: number;\n\n\t/**\n\t * Browser telemetry proxy configuration\n\t * When configured, creates endpoints to forward browser telemetry to OTLP backend\n\t * This avoids CORS issues and ad blockers\n\t */\n\tproxy?: TelemetryProxyOptions;\n\n\t/**\n\t * Ignore specific routes from telemetry collection\n\t * Supports flexible pattern matching:\n\t * - String: Matches if pathname contains the string (e.g., '/assets' matches '/assets/logo.png')\n\t * - RegExp: Tests pathname against regex (e.g., /\\.(js|css)$/ matches file extensions)\n\t * - Function: Custom logic with pathname and method (server-side only)\n\t *\n\t * Note: For browser telemetry, only strings and regex are supported (functions use closures that cannot be serialized)\n\t *\n\t * @example\n\t * ```ts\n\t * ignoreRoutes: [\n\t * '/health', // String match\n\t * /\\.(js|css|png|jpg|svg|ico|woff2?)$/, // Regex for static assets\n\t * (pathname) => pathname.startsWith('/assets/'), // Function (server-side only)\n\t * (pathname, method) => method === 'OPTIONS', // Access to HTTP method (server-side only)\n\t * ]\n\t * ```\n\t */\n\tignoreRoutes?: (\n\t\t| string\n\t\t| RegExp\n\t\t| ((pathname: string, method: string) => boolean)\n\t)[];\n\n\t/**\n\t * Enable distributed tracing (default: true)\n\t * Captures request flows across services with OpenTelemetry traces\n\t */\n\tenableTraces?: boolean;\n\n\t/**\n\t * Enable metrics collection (default: true)\n\t * Captures counters, gauges, and histograms for request volume, duration, etc.\n\t */\n\tenableMetrics?: boolean;\n\n\t/**\n\t * Enable structured logging (default: true)\n\t * Captures log events with structured attributes for better querying\n\t */\n\tenableLogs?: boolean;\n\n\t/**\n\t * Enable system metrics collection (default: true)\n\t * Captures CPU usage, memory consumption, and process metrics\n\t */\n\tenableSystemMetrics?: boolean;\n\n\t/**\n\t * Enable console.error and console.warn capture (default: true)\n\t * Automatically creates telemetry spans for console.error/warn calls\n\t * Useful for catching errors that are logged but not thrown\n\t */\n\tenableConsoleCapture?: boolean;\n\n\t/**\n\t * Sample rate for regular requests (default: 1.0)\n\t * Controls what percentage of requests to track (0.0 = 0%, 1.0 = 100%)\n\t *\n\t * Use sampling to reduce telemetry volume and costs on high-traffic applications:\n\t * - 1.0 = Track every request (100%)\n\t * - 0.5 = Track half of requests (50%)\n\t * - 0.1 = Track 10% of requests\n\t * - 0.01 = Track 1% of requests\n\t *\n\t * Sampling uses random selection, so a 10% sample of 100,000 requests\n\t * still provides ~10,000 data points for statistical analysis\n\t *\n\t * @example sampleRate: 0.1 // Track 10% of requests\n\t */\n\tsampleRate?: number;\n\n\t/**\n\t * Sample rate for error requests (default: 1.0)\n\t * Controls what percentage of errors to track (0.0 = 0%, 1.0 = 100%)\n\t *\n\t * Typically set higher than sampleRate since errors are more important to track.\n\t * Common pattern: low sample rate for normal requests, 100% for errors\n\t *\n\t * @example\n\t * ```ts\n\t * sampleRate: 0.1, // Track 10% of normal requests\n\t * errorSampleRate: 1.0, // Track 100% of errors\n\t * ```\n\t */\n\terrorSampleRate?: number;\n\n\t/**\n\t * HTTP headers to capture as span/log attributes\n\t * Headers are captured with 'http.request.header.' prefix\n\t *\n\t * @example\n\t * ```ts\n\t * captureHeaders: ['user-agent', 'referer', 'x-custom-header']\n\t * // Creates attributes like:\n\t * // - http.request.header.user-agent\n\t * // - http.request.header.referer\n\t * ```\n\t */\n\tcaptureHeaders?: string[];\n\n\t/**\n\t * Custom attributes to add to all spans and logs\n\t * Useful for tagging telemetry with environment, region, version, etc.\n\t *\n\t * @example\n\t * ```ts\n\t * customAttributes: {\n\t * environment: 'production',\n\t * region: 'us-east-1',\n\t * version: '1.2.3',\n\t * }\n\t * ```\n\t */\n\tcustomAttributes?: Record<string, string | number | boolean>;\n\n\t/**\n\t * Source map configuration for production error tracking\n\t * When enabled, error stack traces are mapped to original source files\n\t * instead of compiled/minified code\n\t *\n\t * @example\n\t * ```ts\n\t * sourcemaps: {\n\t * enabled: true, // Enable sourcemap resolution\n\t * }\n\t * ```\n\t */\n\tsourcemaps?: {\n\t\t/**\n\t\t * Enable sourcemap resolution\n\t\t * @default true in production, false in development\n\t\t */\n\t\tenabled?: boolean;\n\t};\n}\n\n/**\n * Redirect handler function that can dynamically determine destination\n * @param url - The original URL object\n * @returns The destination path/url or null to skip redirect\n */\ntype RedirectHandler = (url: URL) => string | null | Promise<string | null>;\n\n/**\n * Individual redirect rule\n */\ninterface RedirectRule {\n\t/** Source path (string or regex pattern) */\n\tsource: string | RegExp;\n\t/** Destination path or handler function */\n\tdestination: string | RedirectHandler;\n\t/** HTTP status code (301 = permanent, 302 = temporary, 307 = preserve method, 308 = permanent preserve method) */\n\tstatus?: 301 | 302 | 307 | 308;\n\t/** Whether source is a regex pattern (auto-detected if source is RegExp) */\n\tregex?: boolean;\n}\n\ninterface AppOptions {\n\t// App component - must be string path in config (not ReactElement)\n\tsrc?: string;\n\n\t// Base URL for the application (e.g., 'https://example.com')\n\t// Used for canonical URLs, social meta tags, and other absolute URLs\n\tbaseUrl?: string;\n\n\t// SSR options\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\n\t// SEO options\n\t/** Enable automatic canonical URL generation (default: true when baseUrl is set) */\n\tautoCanonical?: boolean;\n\n\t// Build options\n\tminify?: boolean;\n\n\t// Compression (applies to both sync and streaming SSR)\n\tcompression?: boolean;\n\n\t// Cache-Control directive\n\tdirective?: string;\n\n\t// Debug mode - enables detailed performance logging\n\tdebug?: boolean;\n\n\t// Cache configuration (applies to SSR, data endpoints, etc.)\n\tmaxAge?: number;\n\n\t// Bundle caching options\n\tbundleMaxAge?: number;\n}\n\ninterface RerouteConfig {\n\tapp?: AppOptions;\n\tstatic?: StaticOptions;\n\tstreaming?: StreamingOptions;\n\tredirects?: RedirectRule[];\n\timage?: ImageOptions;\n\togImage?: OGImageOptions;\n\tsitemap?: SitemapOptions;\n\trss?: RSSOptions;\n\tmarkdown?: MarkdownOptions;\n\tsearch?: SearchOptions;\n\tllms?: LLMsOptions;\n\trobots?: RobotsOptions;\n\ttelemetry?: TelemetryOptions;\n}\n\nfunction defineConfig(config: RerouteConfig): RerouteConfig {\n\treturn config;\n}\n\nasync function loadConfig(cwd: string): Promise<RerouteConfig> {\n\t// Check for bundled config first (compiled binary support)\n\tconst bundledConfig = (globalThis as Record<string, unknown>)\n\t\t.__REROUTE_CONFIG__ as RerouteConfig | undefined;\n\tif (bundledConfig) {\n\t\treturn bundledConfig;\n\t}\n\n\t// Fallback to filesystem read (dev mode)\n\tconst configPath = `${cwd}/reroute.config.ts`;\n\tconst configFile = Bun.file(configPath);\n\n\tif (!(await configFile.exists())) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst mod = await import(\n\t\t\t`${pathToFileURL(configPath).href}?t=${Date.now()}`\n\t\t);\n\t\treturn (mod.default || mod) as RerouteConfig;\n\t} catch (error) {\n\t\tconsole.warn('[reroute] Failed to load reroute.config.ts:', error);\n\t\treturn {};\n\t}\n}\n\nexport {\n\tdefineConfig,\n\tloadConfig,\n\ttype AppOptions,\n\ttype ImageOptions,\n\ttype LLMsOptions,\n\ttype MarkdownOptions,\n\ttype OGImageOptions,\n\ttype OGImageFont,\n\ttype RedirectRule,\n\ttype RerouteConfig,\n\ttype RobotsOptions,\n\ttype RobotsPolicy,\n\ttype RSSOptions,\n\ttype SearchOptions,\n\ttype SitemapOptions,\n\ttype StaticOptions,\n\ttype StreamingOptions,\n\ttype TelemetryOptions,\n\ttype TelemetryProxyOptions,\n\ttype BrowserTelemetryOptions,\n};\n",
7
+ "import { pathToFileURL } from 'node:url';\nimport type { ComponentType } from 'react';\n\n// biome-ignore lint/suspicious/noExplicitAny: The user document\ntype Doc = any;\ninterface StreamingOptions {\n\tenabled?: boolean;\n\tdefaultSkeleton?: ComponentType | string;\n\tdefaultLayoutSkeleton?: ComponentType | string;\n}\n\ninterface StaticOptions {\n\t/**\n\t * Patterns to ignore when serving static files\n\t * @default ['.DS_Store', '.git', '.env']\n\t */\n\tignorePatterns?: (string | RegExp)[];\n\t/**\n\t * Custom headers to add to static file responses\n\t */\n\theaders?: Record<string, string>;\n\t/**\n\t * Cache duration in seconds for static assets\n\t * @default 3600 (1 hour)\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Cache-Control directive\n\t * @default 'public'\n\t */\n\tdirective?: string;\n}\n\ninterface ImageOptions {\n\t/**\n\t * Cache duration in seconds for optimized images\n\t * @default 31536000 (1 year)\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Allowed external domains for image optimization\n\t * @default []\n\t */\n\tallowedDomains?: string[];\n\t/**\n\t * Maximum image width in pixels\n\t * @default 3840\n\t */\n\tmaxWidth?: number;\n\t/**\n\t * Maximum image height in pixels\n\t * @default 2160\n\t */\n\tmaxHeight?: number;\n}\n\n/**\n * Sitemap configuration options\n */\ninterface SitemapOptions {\n\t/** Enable sitemap generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for sitemap generation (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/**\n\t * Maximum URLs per sitemap file before pagination (default: 50000)\n\t * When exceeded, creates multiple sitemap files with a sitemap index\n\t * Set lower for testing (e.g., 10) to verify pagination works\n\t */\n\tmaxUrlsPerPage?: number;\n\n\t/**\n\t * Completely exclude specific routes from the sitemap\n\t * Routes listed here will not appear in the sitemap at all\n\t * @example ['/admin', '/api']\n\t */\n\texcludeRoutes?: string[];\n\n\t/**\n\t * Exclude specific routes from SSR data array discovery\n\t * Routes listed here will still appear in the sitemap as single entries,\n\t * but won't generate multiple URLs from arrays found in their SSR data\n\t * @example ['/download', '/pricing'] - these routes appear once, not per array item\n\t */\n\texcludeDiscovery?: string[];\n\n\t/**\n\t * Extract urls from ssr.data result (full control over data shape)\n\t * If provided, this takes precedence over automatic array discovery\n\t * @param data - Full ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns Array of items to process, or null/undefined to skip this route\n\t */\n\textractUrls?: (data: Doc, routePattern: string) => Doc[] | null | undefined;\n\n\t/**\n\t * Extract URL segment from ssr.data items\n\t * @param item - Data item from ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns URL segment to append to routePattern (e.g., '0.1.0' -> '/changelog/0.1.0')\n\t */\n\textractUrl?: (item: Doc, routePattern: string) => string | null | undefined;\n\n\t/**\n\t * Extract lastmod date from ssr.data items\n\t * @param item - Data item from ssr.data result\n\t * @returns ISO date string or undefined\n\t */\n\textractLastmod?: (item: Doc) => string | undefined;\n\n\t/** Default changefreq for URLs */\n\tchangefreq?:\n\t\t| 'always'\n\t\t| 'hourly'\n\t\t| 'daily'\n\t\t| 'weekly'\n\t\t| 'monthly'\n\t\t| 'yearly'\n\t\t| 'never';\n\n\t/** Default priority for URLs */\n\tpriority?: number;\n}\n\n/**\n * RSS feed configuration options\n */\ninterface RSSOptions {\n\t/** Enable RSS feed generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for RSS feeds (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Feed title (e.g., 'My Blog') */\n\ttitle?: string;\n\n\t/** Feed description */\n\tdescription?: string;\n\n\t/** Maximum number of items per feed (default: 50) */\n\tlimit?: number;\n\n\t/** Feed format: 'rss' or 'atom' (default: 'rss') */\n\tformat?: 'rss' | 'atom';\n\n\t/**\n\t * Completely exclude specific routes from the RSS feed\n\t * Routes listed here will not appear in the feed at all\n\t * @example ['/admin', '/api']\n\t */\n\texcludeRoutes?: string[];\n\n\t/**\n\t * Exclude specific routes from SSR data array discovery\n\t * Routes listed here won't generate multiple feed items from arrays in their SSR data,\n\t * but may still generate a single feed item if appropriate\n\t * @example ['/download', '/pricing'] - won't generate items per array entry\n\t */\n\texcludeDiscovery?: string[];\n\n\t/**\n\t * Extract items from ssr.data result (full control over data shape)\n\t * If provided, this takes precedence over automatic array discovery\n\t * @param data - Full ssr.data result\n\t * @param routePattern - The route pattern (e.g., '/changelog')\n\t * @returns Array of items to process, or null/undefined to skip this route\n\t */\n\textractUrls?: (data: Doc, routePattern: string) => Doc[] | null | undefined;\n\n\t/**\n\t * Extract URL segment from ssr.data items (same as sitemap)\n\t */\n\textractUrl?: (item: Doc, routePattern: string) => string | null | undefined;\n\n\t/**\n\t * Extract publication date from items\n\t */\n\textractPubDate?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract author from items\n\t */\n\textractAuthor?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract content/body from items\n\t */\n\textractContent?: (item: Doc) => string | undefined;\n\n\t/**\n\t * Extract description/summary from items\n\t * Falls back to item.description or item.excerpt if not provided\n\t */\n\textractDescription?: (item: Doc) => string | undefined;\n}\n\n/**\n * Markdown configuration options\n */\ninterface MarkdownOptions {\n\t/**\n\t * Custom components to use when rendering markdown\n\t * Path to a module that exports a components object compatible with Streamdown\n\t * @example './src/client/lib/markdown-components'\n\t */\n\tcomponents?: string;\n\n\t/** Enable GitHub Flavored Markdown (default: true if remark-gfm is installed) */\n\tenableGfm?: boolean;\n\n\t/** Shiki theme for syntax highlighting (default: 'github-dark') */\n\ttheme?: string;\n}\n\n/**\n * Search index configuration options\n */\ninterface SearchOptions {\n\t/** Enable search index generation (default: false) */\n\tenabled?: boolean;\n\n\t/**\n\t * Collections to include in search index\n\t * @default [] - all collections will be indexed\n\t * @example ['blog', 'docs']\n\t */\n\tcollections?: string[];\n\n\t/**\n\t * Include full content text in search (increases index size significantly)\n\t * @default false - only index headings and metadata\n\t */\n\tincludeContent?: boolean;\n\n\t/**\n\t * Maximum content length to index per item (characters)\n\t * @default 5000 - prevents huge content from bloating index\n\t */\n\tcontentLimit?: number;\n\n\t/**\n\t * Fields to index from frontmatter metadata\n\t * @default ['title', 'description', 'excerpt', 'tags']\n\t */\n\tmetaFields?: string[];\n\n\t/**\n\t * Minimum heading level to index (1-6)\n\t * @default 1 - index all headings\n\t */\n\tminHeadingLevel?: number;\n\n\t/**\n\t * Maximum heading level to index (1-6)\n\t * @default 6 - index all headings\n\t */\n\tmaxHeadingLevel?: number;\n\n\t/**\n\t * Default page size for paginated results\n\t * @default 20\n\t */\n\tdefaultPageSize?: number;\n\n\t/**\n\t * Maximum allowed page size (prevents excessive results)\n\t * @default 100\n\t */\n\tmaxPageSize?: number;\n}\n\ninterface OGImageFont {\n\t/** Font family name (e.g., 'Inter') */\n\tname: string;\n\t/** Path to font file (TTF, OTF, or WOFF) relative to project root */\n\tpath: string;\n\t/** Font weight (e.g., 400, 700, 900) */\n\tweight?: number;\n\t/** Font style (default: 'normal') */\n\tstyle?:\n\t\t| 'normal'\n\t\t| 'italic'\n\t\t| 'bold'\n\t\t| 'bold-italic'\n\t\t| 'medium'\n\t\t| 'medium-italic'\n\t\t| 'semibold'\n\t\t| 'semibold-italic'\n\t\t| 'light'\n\t\t| 'light-italic'\n\t\t| 'thin'\n\t\t| 'thin-italic'\n\t\t| 'black'\n\t\t| 'black-italic'\n\t\t| 'extra-bold'\n\t\t| 'extra-bold-italic'\n\t\t| 'extra-light'\n\t\t| 'extra-light-italic'\n\t\t| 'extra-medium'\n\t\t| 'extra-medium-italic'\n\t\t| 'extra-semibold'\n\t\t| 'extra-semibold-italic'\n\t\t| 'extra-light'\n\t\t| 'extra-light-italic'\n\t\t| 'extra-medium'\n\t\t| 'extra-medium-italic'\n\t\t| 'extra-semibold'\n\t\t| 'extra-semibold-italic';\n\tdata?: ArrayBuffer | undefined;\n}\n\n/**\n * OG Image generation configuration options\n */\ninterface OGImageOptions {\n\t/** Enable OG image generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for absolute OG image URLs (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Path to default template component or 'default' for built-in template */\n\tdefaultTemplate?: string;\n\n\t/** Image width in pixels (default: 1200) */\n\twidth?: number;\n\n\t/** Image height in pixels (default: 630) */\n\theight?: number;\n\n\t/** Cache duration in seconds (default: 3600 = 1 hour) */\n\tmaxAge?: number;\n\n\t/** Default avatar/logo URL (can be external or local path) */\n\tavatar?: string;\n\n\t/** Site name to display */\n\tsiteName?: string;\n\n\t/** Custom fonts to load for OG images */\n\tfonts?: OGImageFont[];\n}\n\n/**\n * LLMs content configuration options\n */\ninterface LLMsOptions {\n\t/** Enable LLM content features (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for absolute URLs in llms.txt index (e.g., 'https://example.com') */\n\tbaseUrl?: string;\n\n\t/** Enable .txt extension for routes (default: true when enabled) */\n\tenableTextExtension?: boolean;\n\n\t/** Enable .md extension for routes (default: true when enabled) */\n\tenableMarkdownExtension?: boolean;\n\n\t/** Enable Accept header content negotiation (default: true when enabled) */\n\tenableContentNegotiation?: boolean;\n\n\t/** Enable /llms.txt index generation (default: true when enabled) */\n\tenableIndex?: boolean;\n\n\t/** Enable /llms-full.txt generation (default: true when enabled) */\n\tenableFullContent?: boolean;\n\n\t/** Cache duration in seconds for LLM content (default: 86400 = 24 hours, or falls back to options.maxAge) */\n\tmaxAge?: number;\n\n\t/** Cache duration in seconds for llms-full.txt specifically (default: 604800 = 7 days, or falls back to llms.maxAge) */\n\tmaxAgeFull?: number;\n\n\t/** Maximum items in full content bundle (default: 10000) */\n\tmaxItems?: number;\n\n\t/** Maximum file size for full content in bytes (default: 50MB) */\n\tmaxSize?: number;\n\n\t/**\n\t * Exclude specific routes from LLM features\n\t * Supports strings (exact match or substring), RegExp, or custom functions\n\t * @example ['/admin', '/api', /^\\/private/, (path) => path.includes('draft')]\n\t */\n\texcludeRoutes?: (string | RegExp | ((pathname: string) => boolean))[];\n\n\t/**\n\t * Exclude collections from LLM features\n\t * @example ['drafts', 'private']\n\t */\n\texcludeCollections?: string[];\n\n\t/** Site name for index header */\n\tsiteName?: string;\n\n\t/** Site description for index header (brief context for LLMs) */\n\tsiteDescription?: string;\n\n\t/**\n\t * Per-collection customization for titles and descriptions\n\t * @example\n\t * ```ts\n\t * collections: {\n\t * blog: {\n\t * title: 'My Awesome Blog',\n\t * description: 'Insights and tutorials about web development'\n\t * },\n\t * docs: {\n\t * title: 'Documentation',\n\t * description: 'Complete API reference and guides'\n\t * }\n\t * }\n\t * ```\n\t */\n\tcollections?: Record<\n\t\tstring,\n\t\t{\n\t\t\t/** Custom title for this collection's LLMS index */\n\t\t\ttitle?: string;\n\t\t\t/** Custom description for this collection's LLMS index */\n\t\t\tdescription?: string;\n\t\t}\n\t>;\n}\n\n/**\n * Robots policy for specific user-agents\n */\ninterface RobotsPolicy {\n\t/** User-Agent (e.g., '*', 'Googlebot', 'GPTBot') */\n\tuserAgent: string;\n\n\t/** Paths to explicitly allow */\n\tallow?: string[];\n\n\t/** Paths to disallow */\n\tdisallow?: string[];\n\n\t/** Crawl delay for this user-agent (seconds) */\n\tcrawlDelay?: number;\n}\n\n/**\n * Robots.txt generation configuration options\n */\ninterface RobotsOptions {\n\t/** Enable robots.txt generation (default: false) */\n\tenabled?: boolean;\n\n\t/** Base URL for sitemap reference (e.g., 'https://example.com') - required when enabled */\n\tbaseUrl?: string;\n\n\t/** Cache duration in seconds (default: 86400 = 24 hours) */\n\tmaxAge?: number;\n\n\t/** Custom policies per user-agent (default: permissive) */\n\tpolicies?: RobotsPolicy[];\n\n\t/** Auto-reference sitemap.xml if sitemap is enabled (default: true) */\n\treferenceSitemap?: boolean;\n\n\t/** Auto-disallow routes excluded from sitemap (default: true) */\n\tsitemapExclusion?: boolean;\n\n\t/** Auto-disallow old redirect source paths (default: true) */\n\tredirectExclusion?: boolean;\n\n\t/** Additional raw text appended to robots.txt */\n\tcustomRules?: string;\n\n\t/** Global crawl delay in seconds (optional) */\n\tcrawlDelay?: number;\n}\n\n/**\n * Telemetry proxy configuration for forwarding browser telemetry\n */\ninterface TelemetryProxyOptions {\n\t/**\n\t * Enable browser telemetry proxy (default: true when proxy config exists)\n\t * Creates endpoints to forward browser traces/metrics/logs to OTLP backend\n\t * This avoids CORS issues and ad blockers\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Base path for proxy endpoints (default: '/__reroute_telemetry')\n\t * Creates:\n\t * - {pathname}/v1/traces\n\t * - {pathname}/v1/metrics\n\t * - {pathname}/v1/logs\n\t * - {pathname}/health\n\t */\n\tpathname?: string;\n\n\t/**\n\t * Enable verbose logging for proxy requests\n\t * @default false\n\t */\n\tverbose?: boolean;\n\n\t/**\n\t * Custom handler for proxy requests (advanced)\n\t * If provided, replaces default OTLP forwarding logic\n\t *\n\t * @example\n\t * ```ts\n\t * handler: async ({ body, endpoint, headers }) => {\n\t * // Custom logic: filter, transform, or route to different backends\n\t * await fetch(`https://custom-backend${endpoint}`, {\n\t * method: 'POST',\n\t * headers,\n\t * body: JSON.stringify(body),\n\t * });\n\t * return { status: 200 };\n\t * }\n\t * ```\n\t */\n\thandler?: (params: {\n\t\tbody: unknown;\n\t\tendpoint: string;\n\t\theaders: Record<string, string>;\n\t\totlpEndpoint: string;\n\t}) => Promise<{ status: number }>;\n}\n\n/**\n * Browser telemetry configuration options\n */\ninterface BrowserTelemetryOptions {\n\t/**\n\t * Enable browser telemetry\n\t * @default true\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Service name for browser telemetry\n\t * @default 'reroute-app-browser'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL (use relative URL for same-origin proxy)\n\t * @default '/__reroute_telemetry'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Deployment environment (e.g., 'production', 'staging', 'development')\n\t * @default 'development'\n\t */\n\tenvironment?: string;\n\n\t/**\n\t * Enable console.error capture\n\t * @default true\n\t */\n\tenableConsoleCapture?: boolean;\n\n\t/**\n\t * Ignore specific routes/URLs from breadcrumbs and network tracking\n\t *\n\t * Note: Functions are NOT supported for browser telemetry (closures cannot be serialized)\n\t * Use strings or regex patterns instead\n\t *\n\t * @example\n\t * ```ts\n\t * ignoreRoutes: [\n\t * '/bundles/', // String prefix match\n\t * /\\.(js|css|png)$/, // Regex pattern\n\t * /^\\/assets\\//, // Regex for path prefix\n\t * ]\n\t * ```\n\t */\n\tignoreRoutes?: Array<string | RegExp>;\n}\n\n/**\n * Telemetry configuration options for OpenTelemetry integration\n */\ninterface TelemetryOptions {\n\t/**\n\t * Enable server telemetry collection (default: false)\n\t * Must be explicitly enabled to start collecting traces, metrics, and logs\n\t */\n\tenabled?: boolean;\n\n\t/**\n\t * Browser telemetry configuration\n\t * Configure browser-side telemetry separately from server\n\t */\n\tbrowser?: BrowserTelemetryOptions;\n\n\t/**\n\t * Service name for server telemetry\n\t * @default 'reroute-app'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default process.env.npm_package_version || '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL\n\t * @default process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional, only needed for SigNoz Cloud)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Deployment environment (e.g., 'production', 'staging', 'development')\n\t * Used as a deployment.environment attribute on all telemetry\n\t * @default process.env.NODE_ENV || 'development'\n\t */\n\tenvironment?: string;\n\n\t/**\n\t * Metric export interval in milliseconds\n\t * @default 5000\n\t */\n\tmetricsInterval?: number;\n\n\t/**\n\t * Browser telemetry proxy configuration\n\t * When configured, creates endpoints to forward browser telemetry to OTLP backend\n\t * This avoids CORS issues and ad blockers\n\t */\n\tproxy?: TelemetryProxyOptions;\n\n\t/**\n\t * Ignore specific routes from telemetry collection\n\t * Supports flexible pattern matching:\n\t * - String: Matches if pathname contains the string (e.g., '/assets' matches '/assets/logo.png')\n\t * - RegExp: Tests pathname against regex (e.g., /\\.(js|css)$/ matches file extensions)\n\t * - Function: Custom logic with pathname and method (server-side only)\n\t *\n\t * Note: For browser telemetry, only strings and regex are supported (functions use closures that cannot be serialized)\n\t *\n\t * @example\n\t * ```ts\n\t * ignoreRoutes: [\n\t * '/health', // String match\n\t * /\\.(js|css|png|jpg|svg|ico|woff2?)$/, // Regex for static assets\n\t * (pathname) => pathname.startsWith('/assets/'), // Function (server-side only)\n\t * (pathname, method) => method === 'OPTIONS', // Access to HTTP method (server-side only)\n\t * ]\n\t * ```\n\t */\n\tignoreRoutes?: (\n\t\t| string\n\t\t| RegExp\n\t\t| ((pathname: string, method: string) => boolean)\n\t)[];\n\n\t/**\n\t * Enable distributed tracing (default: true)\n\t * Captures request flows across services with OpenTelemetry traces\n\t */\n\tenableTraces?: boolean;\n\n\t/**\n\t * Enable metrics collection (default: true)\n\t * Captures counters, gauges, and histograms for request volume, duration, etc.\n\t */\n\tenableMetrics?: boolean;\n\n\t/**\n\t * Enable structured logging (default: true)\n\t * Captures log events with structured attributes for better querying\n\t */\n\tenableLogs?: boolean;\n\n\t/**\n\t * Enable system metrics collection (default: true)\n\t * Captures CPU usage, memory consumption, and process metrics\n\t */\n\tenableSystemMetrics?: boolean;\n\n\t/**\n\t * Enable console.error and console.warn capture (default: true)\n\t * Automatically creates telemetry spans for console.error/warn calls\n\t * Useful for catching errors that are logged but not thrown\n\t */\n\tenableConsoleCapture?: boolean;\n\n\t/**\n\t * Sample rate for regular requests (default: 1.0)\n\t * Controls what percentage of requests to track (0.0 = 0%, 1.0 = 100%)\n\t *\n\t * Use sampling to reduce telemetry volume and costs on high-traffic applications:\n\t * - 1.0 = Track every request (100%)\n\t * - 0.5 = Track half of requests (50%)\n\t * - 0.1 = Track 10% of requests\n\t * - 0.01 = Track 1% of requests\n\t *\n\t * Sampling uses random selection, so a 10% sample of 100,000 requests\n\t * still provides ~10,000 data points for statistical analysis\n\t *\n\t * @example sampleRate: 0.1 // Track 10% of requests\n\t */\n\tsampleRate?: number;\n\n\t/**\n\t * Sample rate for error requests (default: 1.0)\n\t * Controls what percentage of errors to track (0.0 = 0%, 1.0 = 100%)\n\t *\n\t * Typically set higher than sampleRate since errors are more important to track.\n\t * Common pattern: low sample rate for normal requests, 100% for errors\n\t *\n\t * @example\n\t * ```ts\n\t * sampleRate: 0.1, // Track 10% of normal requests\n\t * errorSampleRate: 1.0, // Track 100% of errors\n\t * ```\n\t */\n\terrorSampleRate?: number;\n\n\t/**\n\t * HTTP headers to capture as span/log attributes\n\t * Headers are captured with 'http.request.header.' prefix\n\t *\n\t * @example\n\t * ```ts\n\t * captureHeaders: ['user-agent', 'referer', 'x-custom-header']\n\t * // Creates attributes like:\n\t * // - http.request.header.user-agent\n\t * // - http.request.header.referer\n\t * ```\n\t */\n\tcaptureHeaders?: string[];\n\n\t/**\n\t * Custom attributes to add to all spans and logs\n\t * Useful for tagging telemetry with environment, region, version, etc.\n\t *\n\t * @example\n\t * ```ts\n\t * customAttributes: {\n\t * environment: 'production',\n\t * region: 'us-east-1',\n\t * version: '1.2.3',\n\t * }\n\t * ```\n\t */\n\tcustomAttributes?: Record<string, string | number | boolean>;\n\n\t/**\n\t * Source map configuration for production error tracking\n\t * When enabled, error stack traces are mapped to original source files\n\t * instead of compiled/minified code\n\t *\n\t * @example\n\t * ```ts\n\t * sourcemaps: {\n\t * enabled: true, // Enable sourcemap resolution\n\t * }\n\t * ```\n\t */\n\tsourcemaps?: {\n\t\t/**\n\t\t * Enable sourcemap resolution\n\t\t * @default true in production, false in development\n\t\t */\n\t\tenabled?: boolean;\n\t};\n}\n\n/**\n * Redirect handler function that can dynamically determine destination\n * @param url - The original URL object\n * @returns The destination path/url or null to skip redirect\n */\ntype RedirectHandler = (url: URL) => string | null | Promise<string | null>;\n\n/**\n * Individual redirect rule\n */\ninterface RedirectRule {\n\t/** Enable or disable this redirect rule (default: true) */\n\tenabled?: boolean;\n\t/** Source path (string or regex pattern) */\n\tsource: string | RegExp;\n\t/** Destination path or handler function */\n\tdestination: string | RedirectHandler;\n\t/** HTTP status code (301 = permanent, 302 = temporary, 307 = preserve method, 308 = permanent preserve method) */\n\tstatus?: 301 | 302 | 307 | 308;\n\t/** Whether source is a regex pattern (auto-detected if source is RegExp) */\n\tregex?: boolean;\n}\n\ninterface AppOptions {\n\t// App component - must be string path in config (not ReactElement)\n\tsrc?: string;\n\n\t// Base URL for the application (e.g., 'https://example.com')\n\t// Used for canonical URLs, social meta tags, and other absolute URLs\n\tbaseUrl?: string;\n\n\t// SSR options\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\n\t// SEO options\n\t/** Enable automatic canonical URL generation (default: true when baseUrl is set) */\n\tautoCanonical?: boolean;\n\n\t// Build options\n\tminify?: boolean;\n\n\t// Compression (applies to both sync and streaming SSR)\n\tcompression?: boolean;\n\n\t// Cache-Control directive\n\tdirective?: string;\n\n\t// Debug mode - enables detailed performance logging\n\tdebug?: boolean;\n\n\t// Cache configuration (applies to SSR, data endpoints, etc.)\n\tmaxAge?: number;\n\n\t// Bundle caching options\n\tbundleMaxAge?: number;\n}\n\ninterface RerouteConfig {\n\tapp?: AppOptions;\n\tstatic?: StaticOptions;\n\tstreaming?: StreamingOptions;\n\tredirects?: RedirectRule[];\n\timage?: ImageOptions;\n\togImage?: OGImageOptions;\n\tsitemap?: SitemapOptions;\n\trss?: RSSOptions;\n\tmarkdown?: MarkdownOptions;\n\tsearch?: SearchOptions;\n\tllms?: LLMsOptions;\n\trobots?: RobotsOptions;\n\ttelemetry?: TelemetryOptions;\n}\n\nfunction defineConfig(config: RerouteConfig): RerouteConfig {\n\treturn config;\n}\n\nasync function loadConfig(cwd: string): Promise<RerouteConfig> {\n\t// Check for bundled config first (compiled binary support)\n\tconst bundledConfig = (globalThis as Record<string, unknown>)\n\t\t.__REROUTE_CONFIG__ as RerouteConfig | undefined;\n\tif (bundledConfig) {\n\t\treturn bundledConfig;\n\t}\n\n\t// Fallback to filesystem read (dev mode)\n\tconst configPath = `${cwd}/reroute.config.ts`;\n\tconst configFile = Bun.file(configPath);\n\n\tif (!(await configFile.exists())) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst mod = await import(\n\t\t\t`${pathToFileURL(configPath).href}?t=${Date.now()}`\n\t\t);\n\t\treturn (mod.default || mod) as RerouteConfig;\n\t} catch (error) {\n\t\tconsole.warn('[reroute] Failed to load reroute.config.ts:', error);\n\t\treturn {};\n\t}\n}\n\nexport {\n\tdefineConfig,\n\tloadConfig,\n\ttype AppOptions,\n\ttype ImageOptions,\n\ttype LLMsOptions,\n\ttype MarkdownOptions,\n\ttype OGImageOptions,\n\ttype OGImageFont,\n\ttype RedirectRule,\n\ttype RerouteConfig,\n\ttype RobotsOptions,\n\ttype RobotsPolicy,\n\ttype RSSOptions,\n\ttype SearchOptions,\n\ttype SitemapOptions,\n\ttype StaticOptions,\n\ttype StreamingOptions,\n\ttype TelemetryOptions,\n\ttype TelemetryProxyOptions,\n\ttype BrowserTelemetryOptions,\n};\n",
8
8
  "export * from './discovery';\nexport * from './metadata';\n",
9
9
  "import type { CacheEntry } from './types';\n\n/**\n * Simple in-memory cache for SSR data.\n * Thread-safe for single-process usage.\n */\nclass SSRDataCache {\n\tprivate cache: Map<string, CacheEntry<unknown>> = new Map();\n\tprivate static cleanupInterval: NodeJS.Timeout | null = null;\n\n\tconstructor() {\n\t\t// Run cleanup every 60 seconds to remove expired entries\n\t\tif (!SSRDataCache.cleanupInterval) {\n\t\t\tSSRDataCache.cleanupInterval = setInterval(() => {\n\t\t\t\tthis.cleanup();\n\t\t\t}, 60_000);\n\t\t}\n\t}\n\n\t/**\n\t * Get cached data if available and not expired\n\t */\n\tget<T>(key: string): T | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) return undefined;\n\n\t\tconst age = Date.now() - entry.timestamp;\n\t\tif (age > entry.maxAge) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn entry.data as T;\n\t}\n\n\t/**\n\t * Set data in cache with maxAge (in milliseconds)\n\t */\n\tset<T>(key: string, data: T, maxAge: number): void {\n\t\tif (maxAge <= 0) return;\n\n\t\tthis.cache.set(key, {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t\tmaxAge,\n\t\t});\n\t}\n\n\t/**\n\t * Check if key exists and is not expired\n\t */\n\thas(key: string): boolean {\n\t\treturn this.get(key) !== undefined;\n\t}\n\n\t/**\n\t * Clear all cached data\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Remove expired entries\n\t */\n\tprivate cleanup(): void {\n\t\tconst now = Date.now();\n\t\tfor (const [key, entry] of this.cache.entries()) {\n\t\t\tif (now - entry.timestamp > entry.maxAge) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get cache stats (useful for debugging)\n\t */\n\tstats(): { size: number; keys: string[] } {\n\t\treturn {\n\t\t\tsize: this.cache.size,\n\t\t\tkeys: Array.from(this.cache.keys()),\n\t\t};\n\t}\n\n\t/**\n\t * Cleanup interval on shutdown\n\t */\n\tdestroy(): void {\n\t\tif (SSRDataCache.cleanupInterval) {\n\t\t\tclearInterval(SSRDataCache.cleanupInterval);\n\t\t\tSSRDataCache.cleanupInterval = null;\n\t\t}\n\t\tthis.clear();\n\t}\n}\n\n/**\n * Simple LRU Cache implementation.\n * Used for caching responses and data across requests.\n */\nexport class LRUCache<K, V> {\n\tprivate cache: Map<K, V> = new Map();\n\tprivate maxSize: number;\n\n\tconstructor(maxSize = 100) {\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tconst value = this.cache.get(key);\n\t\tif (value !== undefined) {\n\t\t\t// Move to end (most recently used)\n\t\t\tthis.cache.delete(key);\n\t\t\tthis.cache.set(key, value);\n\t\t}\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\tthis.cache.delete(key);\n\n\t\tif (this.cache.size >= this.maxSize) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tthis.cache.delete(firstKey as K);\n\t\t}\n\n\t\tthis.cache.set(key, value);\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n}\n\n// Global singleton instances using globalThis for hot reload survival\nconst getGlobalCache = (): SSRDataCache => {\n\tconst g = globalThis as typeof globalThis & {\n\t\t__REROUTE_SSR_CACHE__?: SSRDataCache;\n\t};\n\n\tif (!g.__REROUTE_SSR_CACHE__) {\n\t\tg.__REROUTE_SSR_CACHE__ = new SSRDataCache();\n\t}\n\n\treturn g.__REROUTE_SSR_CACHE__;\n};\n\nconst getGlobalStatusCache = (): SSRDataCache => {\n\tconst g = globalThis as typeof globalThis & {\n\t\t__REROUTE_STATUS_CACHE__?: SSRDataCache;\n\t};\n\n\tif (!g.__REROUTE_STATUS_CACHE__) {\n\t\tg.__REROUTE_STATUS_CACHE__ = new SSRDataCache();\n\t}\n\n\treturn g.__REROUTE_STATUS_CACHE__;\n};\n\nconst ssrCache = getGlobalCache();\nconst statusCache = getGlobalStatusCache();\n\nexport { ssrCache, statusCache, SSRDataCache };\n",
10
10
  "import { dynamicImport } from './imports';\nimport { join } from './path';\nimport type { Doc } from './types';\n\n/**\n * Load content collections for SSR rendering\n */\nexport async function loadCollections(\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<Record<string, unknown[]>> {\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst mod = await dynamicImport(p, isWatchMode);\n\t\treturn (mod?.byCollection || {}) as Record<string, unknown[]>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\n/**\n * Set global collections for SSR\n */\nexport function setGlobalCollections(\n\tbyCollectionForSSR: Record<string, unknown[]>,\n): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_COLLECTIONS__ = byCollectionForSSR;\n\t} catch {\n\t\t// Ignore errors in restricted environments\n\t}\n}\n",
@@ -23,8 +23,8 @@
23
23
  "// Types\n\n// Core utilities\nexport * from './cache';\n// Content handling\nexport * from './collections';\n// HTTP utilities\nexport * from './compression';\n// SSR compute\nexport * from './compute';\nexport { computeSSRDataForPath } from './data';\n// HTML handling\nexport * from './html';\nexport * from './imports';\nexport * from './layouts';\nexport * from './metadata';\nexport * from './mime';\nexport * from './modules';\nexport * from './path';\nexport * from './preload';\n// Script generation\nexport * from './scripts';\nexport * from './seed';\n// Shared setup\nexport * from './setup';\nexport * from './styles';\nexport * from './template';\nexport * from './types';\n",
24
24
  "import type { Span } from '@opentelemetry/api';\nimport dedent from 'dedent';\nimport { cloneElement, type ReactElement } from 'react';\nimport { renderToString } from 'react-dom/server';\nimport {\n\tgetTraceContextForInjection,\n\twithSpan,\n\twithSpanSync,\n} from 'reroute-js/telemetry/server';\nimport { loadConfig, type OGImageOptions } from '../config';\nimport {\n\ttype Doc,\n\tduplicateQueryParamData,\n\tgenerateCollectionScripts,\n\tgenerateHydrationScripts,\n\tperformSSRSetup,\n\tsetGlobalSSRData,\n} from './lib';\nimport { applyIndexTemplate, loadIndexHtml } from './lib/html';\n\ntype SSRRenderOptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\tcachedCollections?: Record<string, unknown[]>;\n\tcachedTailwindCSS?: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\tminify?: boolean;\n\tmaxAge?: number;\n\tsearchParams?: URLSearchParams;\n\togConfig?: OGImageOptions;\n\tbaseUrl?: string;\n\tautoCanonical?: boolean;\n\tparentSpan?: Span | null;\n};\n\ntype SSRRenderResult = {\n\thtml: string;\n\tstatus: number;\n};\n\n/**\n * Render a React component to a complete HTML document for SSR.\n * Uses synchronous rendering (renderToString) for full HTML generation.\n */\nasync function renderSSRDocument(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tmaxAge = 0,\n\t\tsearchParams,\n\t\togConfig,\n\t} = options;\n\n\t// Perform shared SSR setup\n\tconst setup = await performSSRSetup(\n\t\t{\n\t\t\tpathname,\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tisWatchMode,\n\t\t\tparentSpan: options.parentSpan,\n\t\t\tbundleUrl,\n\t\t\tmaxAge,\n\t\t\tsearchParams,\n\t\t\togConfig,\n\t\t\tbaseUrl: options.baseUrl,\n\t\t\tautoCanonical: options.autoCanonical,\n\t\t\tcachedCollections: options.cachedCollections,\n\t\t\tcachedTailwindCSS: options.cachedTailwindCSS,\n\t\t},\n\t\tfalse, // not streaming\n\t);\n\n\t// Duplicate data for query param routes\n\tconst duplicatedData = duplicateQueryParamData(setup.ssrData);\n\tsetGlobalSSRData(duplicatedData);\n\n\t// Render React component to string\n\tconst appHtml = await withSpan('ssr.render.react', async (span) => {\n\t\tconst componentWithPathname = cloneElement<Doc>(rootComponent, {\n\t\t\tpathname,\n\t\t\tsearchParams,\n\t\t} as Doc);\n\t\tspan.setAttribute('reroute.pathname', pathname);\n\t\tconst html = renderToString(componentWithPathname);\n\t\tspan.setAttribute('reroute.html.final.size', html.length);\n\t\treturn html;\n\t});\n\n\t// Load base template\n\tconst baseTemplate = await withSpan('ssr.load.template', async (span) => {\n\t\tconst template = await loadIndexHtml(clientDir);\n\t\tspan.setAttribute('reroute.template.size', template.length);\n\t\treturn template;\n\t});\n\n\t// Generate collection scripts from accessed collections\n\tconst collectionScripts = generateCollectionScripts(setup.byCollectionForSSR);\n\n\t// Load config to get browser telemetry settings\n\tconst config = await loadConfig(cwd);\n\tconst browserTelemetryConfigRaw = config.telemetry?.browser as\n\t\t| Record<string, unknown>\n\t\t| undefined;\n\n\t// Serialize browser telemetry config (convert functions to strings for JSON)\n\tconst { serializeBrowserTelemetryConfig } = await import('./lib/serialize');\n\tconst browserTelemetryConfig = serializeBrowserTelemetryConfig(\n\t\tbrowserTelemetryConfigRaw,\n\t);\n\n\t// Extract trace context from parent span for distributed tracing\n\tconst traceContext = getTraceContextForInjection(options.parentSpan);\n\n\t// Generate all hydration scripts\n\tconst hydrationScript = await withSpan(\n\t\t'ssr.generate.scripts',\n\t\tasync (span) => {\n\t\t\tconst script = generateHydrationScripts(\n\t\t\t\tsetup.ssrData,\n\t\t\t\tisWatchMode,\n\t\t\t\tsetup.ssrError,\n\t\t\t\tcollectionScripts,\n\t\t\t\tsetup.preloadHydrationScript,\n\t\t\t\tbundleUrl,\n\t\t\t\tpathname,\n\t\t\t\tbrowserTelemetryConfig,\n\t\t\t\ttraceContext,\n\t\t\t);\n\t\t\tspan.setAttribute('reroute.scripts.size', script.length);\n\t\t\treturn script;\n\t\t},\n\t);\n\n\t// Determine final status (only override if value is set)\n\tlet statusOverride = setup.preloadStatusOverride;\n\tif (setup.statusContainer.value !== undefined) {\n\t\tstatusOverride = setup.statusContainer.value;\n\t}\n\tif (setup.metadataResult.statusOverride !== undefined) {\n\t\tstatusOverride = setup.metadataResult.statusOverride;\n\t}\n\n\t// Build combined head content\n\tconst extraHead = setup.bundlePreload + setup.preloadExtraHead;\n\tconst combinedHead = dedent(\n\t\t[\n\t\t\tdedent(head) || '',\n\t\t\tdedent(extraHead),\n\t\t\tdedent(setup.metadataResult.perPageHead),\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n'),\n\t);\n\n\t// Apply template with SSR content\n\tconst html = withSpanSync('ssr.apply.template', (span) => {\n\t\tconst result = applyIndexTemplate(baseTemplate, appHtml, {\n\t\t\thead: [setup.inlineStyleTag, combinedHead].filter(Boolean).join('\\n'),\n\t\t\thydrationScript,\n\t\t\tlang: setup.metadataResult.pageLang || lang,\n\t\t\tappId,\n\t\t});\n\t\tspan.setAttributes({\n\t\t\t'reroute.html.final.size': result.length,\n\t\t\t'reroute.html.original.size': appHtml.length,\n\t\t});\n\t\treturn result;\n\t});\n\n\treturn {\n\t\thtml,\n\t\tstatus: statusOverride || 200,\n\t};\n}\n\nexport { renderSSRDocument, type SSRRenderOptions, type SSRRenderResult };\n",
25
25
  "import { pathToFileURL } from 'node:url';\nimport type { ReactElement } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { LLMsOptions } from '../config';\nimport { join } from '../ssr/lib/path';\nimport type { Doc } from '../ssr/lib/types';\nimport { renderSSRDocument } from '../ssr/render';\nimport { extractTitle, htmlToMarkdown, stripHtmlTags } from './formatter';\n\n/**\n * Check if a route should be excluded from LLM features\n * Supports strings (substring match), RegExp, and custom functions\n */\nexport function shouldExcludeRoute(\n\tpathname: string,\n\texcludeRoutes?: (string | RegExp | ((pathname: string) => boolean))[],\n): boolean {\n\tif (!excludeRoutes || excludeRoutes.length === 0) {\n\t\treturn false;\n\t}\n\n\treturn Boolean(\n\t\texcludeRoutes.find((pattern) => {\n\t\t\tif (typeof pattern === 'string') {\n\t\t\t\t// Substring match for simplicity\n\t\t\t\treturn pathname.includes(pattern);\n\t\t\t}\n\t\t\tif (pattern instanceof RegExp) {\n\t\t\t\treturn pattern.test(pathname);\n\t\t\t}\n\t\t\tif (typeof pattern === 'function') {\n\t\t\t\treturn pattern(pathname);\n\t\t\t}\n\t\t\treturn false;\n\t\t}),\n\t);\n}\n\nasync function loadCollectionItem(\n\tcwd: string,\n\tpathname: string,\n\tisWatchMode: boolean,\n): Promise<{ item: Doc; collection: string } | null> {\n\tconst parts = pathname.split('/').filter(Boolean);\n\tif (parts.length < 2) return null;\n\n\tconst collection = parts[0];\n\tconst collectionFile = join(\n\t\tcwd,\n\t\t'.reroute',\n\t\t'collections',\n\t\t`${collection}.js`,\n\t);\n\tconst exists = await Bun.file(collectionFile).exists();\n\tif (!exists) return null;\n\n\tconst url = `${pathToFileURL(collectionFile).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\tconst mod = await import(url);\n\tconst items = mod.items || [];\n\n\tconst item = items.find((i: Doc) => i.href === pathname);\n\tif (!item) return null;\n\n\treturn { item, collection };\n}\n\nasync function findComponentPath(\n\tclientDir: string,\n\tcollection: string,\n\tslug: string,\n): Promise<string | null> {\n\tconst extensions = ['.mdx', '.md', '.tsx', '.jsx'];\n\n\tfor (const ext of extensions) {\n\t\tconst testPath = join(\n\t\t\tclientDir,\n\t\t\t'routes',\n\t\t\tcollection,\n\t\t\t'content',\n\t\t\t`${slug}${ext}`,\n\t\t);\n\t\tconst file = Bun.file(testPath);\n\t\tif (await file.exists()) {\n\t\t\treturn testPath;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction stripFrontmatterAndJsx(content: string, isMdx: boolean): string {\n\tlet rawContent = content.replace(/^---\\n[\\s\\S]*?\\n---\\n/, '');\n\n\tif (isMdx) {\n\t\trawContent = rawContent.replace(\n\t\t\t/^import\\s+.*?from\\s+['\"].*?['\"];?\\s*$/gm,\n\t\t\t'',\n\t\t);\n\t\trawContent = rawContent.replace(/<[A-Z][\\w]*[^>]*\\/>/g, '');\n\t\trawContent = rawContent.replace(\n\t\t\t/<[A-Z][\\w]*[^>]*>[\\s\\S]*?<\\/[A-Z][\\w]*>/g,\n\t\t\t'',\n\t\t);\n\t}\n\n\treturn rawContent.trim();\n}\n\nasync function extractMarkdownContent(\n\tcomponentPath: string,\n\tmeta: Record<string, unknown>,\n): Promise<{ title?: string; body: string; markdown: string }> {\n\tconst file = Bun.file(componentPath);\n\tlet rawContent = await file.text();\n\n\tconst isMdx = componentPath.endsWith('.mdx');\n\trawContent = stripFrontmatterAndJsx(rawContent, isMdx);\n\n\treturn {\n\t\ttitle: (meta.title as string) || extractTitle(rawContent),\n\t\tbody: stripHtmlTags(rawContent),\n\t\tmarkdown: rawContent,\n\t};\n}\n\nasync function extractComponentContent(\n\tcomponentPath: string,\n\tmeta: Record<string, unknown>,\n\tisWatchMode: boolean,\n): Promise<{ title?: string; body: string; markdown: string } | null> {\n\ttry {\n\t\tconst componentUrl = `${pathToFileURL(componentPath).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\t\tconst componentMod = await import(componentUrl);\n\n\t\tconst Component = componentMod.default;\n\t\tif (!Component || typeof Component !== 'function') return null;\n\n\t\tconst html = renderToStaticMarkup(Component({}));\n\n\t\treturn {\n\t\t\ttitle: (meta.title as string) || extractTitle(html),\n\t\t\tbody: stripHtmlTags(html),\n\t\t\tmarkdown: htmlToMarkdown(html),\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[reroute/llms] Failed to import component ${componentPath}:`,\n\t\t\terror,\n\t\t);\n\t\treturn null;\n\t}\n}\n\n/**\n * Extract content from a collection item (markdown/mdx)\n */\nasync function extractCollectionContent(\n\tcwd: string,\n\tclientDir: string,\n\tpathname: string,\n\tisWatchMode: boolean,\n\t_format: 'txt' | 'md',\n): Promise<{ title?: string; body: string; markdown: string } | null> {\n\ttry {\n\t\tconst collectionData = await loadCollectionItem(cwd, pathname, isWatchMode);\n\t\tif (!collectionData) return null;\n\n\t\tconst { item, collection } = collectionData;\n\t\tconst slug = item.slug || item.name;\n\t\tif (!slug) return null;\n\n\t\tconst componentPath = await findComponentPath(clientDir, collection, slug);\n\t\tif (!componentPath) return null;\n\n\t\tconst meta = item.meta || {};\n\n\t\tif (componentPath.endsWith('.md') || componentPath.endsWith('.mdx')) {\n\t\t\treturn await extractMarkdownContent(componentPath, meta);\n\t\t}\n\n\t\treturn await extractComponentContent(componentPath, meta, isWatchMode);\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[reroute/llms] Failed to extract collection content for ${pathname}:`,\n\t\t\terror,\n\t\t);\n\t\treturn null;\n\t}\n}\n\n/**\n * Extract content from an SSR route using full app rendering\n */\nasync function extractSSRContent(\n\tpathname: string,\n\trootComponent: ReactElement,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n\tbundleUrl: string,\n\t_format: 'txt' | 'md',\n): Promise<{ title?: string; body: string; markdown: string } | null> {\n\ttry {\n\t\t// Use the full SSR rendering pipeline to get the complete HTML\n\t\t// This includes all providers, context, and hooks - just like a real request\n\t\tconst { html } = await renderSSRDocument({\n\t\t\tpathname,\n\t\t\trootComponent,\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tisWatchMode,\n\t\t\tbundleUrl,\n\t\t\tminify: false,\n\t\t\tmaxAge: 0,\n\t\t});\n\n\t\t// Extract just the content from the rendered HTML\n\t\t// Remove script tags, styles, nav, footer, etc.\n\t\tlet contentHtml = html;\n\n\t\t// Extract the body content (inside the app div)\n\t\tconst appDivMatch = html.match(/<div id=\"[^\"]+\">(.+?)<\\/div>\\s*<script/s);\n\t\tif (appDivMatch) {\n\t\t\tcontentHtml = appDivMatch[1];\n\t\t}\n\n\t\t// Remove nav and footer elements (common layout noise)\n\t\tcontentHtml = contentHtml.replace(/<nav[\\s\\S]*?<\\/nav>/gi, '');\n\t\tcontentHtml = contentHtml.replace(/<footer[\\s\\S]*?<\\/footer>/gi, '');\n\t\tcontentHtml = contentHtml.replace(/<header[\\s\\S]*?<\\/header>/gi, '');\n\t\tcontentHtml = contentHtml.replace(/<aside[\\s\\S]*?<\\/aside>/gi, '');\n\n\t\treturn {\n\t\t\ttitle: extractTitle(html),\n\t\t\tbody: stripHtmlTags(contentHtml),\n\t\t\tmarkdown: htmlToMarkdown(contentHtml),\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[reroute/llms] Failed to extract SSR content for ${pathname}:`,\n\t\t\terror,\n\t\t);\n\t\treturn null;\n\t}\n}\n\n/**\n * Main content extraction function\n * Extracts clean, LLM-optimized content from any route type\n */\nexport async function extractContentForLLMs(options: {\n\tpathname: string;\n\trootComponent?: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl?: string;\n\tformat: 'txt' | 'md';\n\tllmsConfig?: LLMsOptions;\n}): Promise<string> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\tformat,\n\t\tllmsConfig,\n\t} = options;\n\n\t// Check if route should be excluded\n\tif (shouldExcludeRoute(pathname, llmsConfig?.excludeRoutes)) {\n\t\tthrow new Error('Route excluded from LLM features');\n\t}\n\n\t// Try collection content first (most common case for content sites)\n\tlet content = await extractCollectionContent(\n\t\tcwd,\n\t\tclientDir,\n\t\tpathname,\n\t\tisWatchMode,\n\t\tformat,\n\t);\n\n\t// Fall back to SSR route (uses full app rendering)\n\tif (!content && rootComponent && bundleUrl) {\n\t\tcontent = await extractSSRContent(\n\t\t\tpathname,\n\t\t\trootComponent,\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tisWatchMode,\n\t\t\tbundleUrl,\n\t\t\tformat,\n\t\t);\n\t}\n\n\t// If we still don't have content, throw\n\tif (!content) {\n\t\tthrow new Error('Content not found');\n\t}\n\n\t// Return based on format\n\tif (format === 'md') {\n\t\t// Return markdown with title as h1\n\t\tconst parts: string[] = [];\n\t\tif (content.title) {\n\t\t\tparts.push(`# ${content.title}`);\n\t\t\tparts.push('');\n\t\t}\n\t\tparts.push(content.markdown);\n\t\treturn parts.join('\\n');\n\t}\n\n\t// Return plain text\n\tconst parts: string[] = [];\n\tif (content.title) {\n\t\tparts.push(content.title);\n\t\tparts.push('');\n\t}\n\tparts.push(content.body);\n\treturn parts.join('\\n');\n}\n",
26
- "import type { ReactElement } from 'react';\nimport type { LLMsOptions } from '../config';\nimport { extractContentForLLMs, shouldExcludeRoute } from './extractor';\n\ntype RouteEntry = {\n\tpath: string;\n\tdate?: string;\n};\n\nfunction buildHeader(baseUrl: string, llmsConfig?: LLMsOptions): string[] {\n\tconst parts: string[] = [];\n\n\tif (llmsConfig?.siteName) {\n\t\tparts.push(`# ${llmsConfig.siteName}`);\n\t\tparts.push('');\n\t}\n\n\tif (llmsConfig?.siteDescription) {\n\t\tparts.push(llmsConfig.siteDescription);\n\t\tparts.push('');\n\t}\n\n\tif (parts.length > 0) {\n\t\tparts.push(`${baseUrl}/index.txt`);\n\t\tparts.push('');\n\t\tparts.push('---');\n\t\tparts.push('');\n\t}\n\n\treturn parts;\n}\n\nasync function discoverAllRoutes(\n\tcwd: string,\n\tclientDir: string,\n\tcollections: string[],\n\tisWatchMode: boolean,\n\tllmsConfig?: LLMsOptions,\n): Promise<RouteEntry[]> {\n\tconst {\n\t\tdiscoverStaticRoutes,\n\t\tdiscoverCollectionRoutes,\n\t\tdiscoverSSRDataRoutes,\n\t} = await import('./index-generator');\n\n\tconst staticRoutes = await discoverStaticRoutes(cwd, isWatchMode);\n\tconst collectionsMap = await discoverCollectionRoutes(\n\t\tcwd,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\tconst ssrDataRoutes = await discoverSSRDataRoutes(\n\t\tcwd,\n\t\tclientDir,\n\t\tstaticRoutes,\n\t\tisWatchMode,\n\t);\n\n\tconst allRoutes: RouteEntry[] = [];\n\n\tfor (const route of staticRoutes) {\n\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\tallRoutes.push({ path: route.path });\n\t\t}\n\t}\n\n\tfor (const [_collection, routes] of collectionsMap.entries()) {\n\t\tfor (const route of routes) {\n\t\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\t\tallRoutes.push({ path: route.path });\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const [_routePattern, routes] of ssrDataRoutes.entries()) {\n\t\tfor (const route of routes) {\n\t\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\t\tallRoutes.push({ path: route.path });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn allRoutes;\n}\n\nfunction formatContentBlock(\n\tcontent: string,\n\troutePath: string,\n\tbaseUrl: string,\n): string[] {\n\tconst parts: string[] = [];\n\tconst lines = content.split('\\n');\n\tconst title = lines[0] || 'Untitled';\n\tconst body = lines.slice(lines[1] === '' ? 2 : 1).join('\\n');\n\n\tconst urlPath = routePath === '/' ? '/index' : routePath;\n\tconst url = `${baseUrl}${urlPath}.txt`;\n\n\tparts.push(title);\n\tparts.push('');\n\tparts.push(url);\n\tparts.push('');\n\tif (body.trim()) {\n\t\tparts.push(body);\n\t\tparts.push('');\n\t}\n\tparts.push('---');\n\tparts.push('');\n\n\treturn parts;\n}\n\nasync function extractRouteContents(\n\troutes: RouteEntry[],\n\toptions: {\n\t\trootComponent?: ReactElement;\n\t\tcwd: string;\n\t\tclientDir: string;\n\t\tbaseUrl: string;\n\t\tisWatchMode: boolean;\n\t\tbundleUrl?: string;\n\t\tllmsConfig?: LLMsOptions;\n\t},\n): Promise<{ parts: string[]; itemCount: number; currentSize: number }> {\n\tconst parts: string[] = [];\n\tconst maxSize = options.llmsConfig?.maxSize || 50 * 1024 * 1024;\n\tlet itemCount = 0;\n\tlet currentSize = 0;\n\n\tfor (const route of routes) {\n\t\ttry {\n\t\t\tconst content = await extractContentForLLMs({\n\t\t\t\tpathname: route.path,\n\t\t\t\trootComponent: options.rootComponent,\n\t\t\t\tclientDir: options.clientDir,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tisWatchMode: options.isWatchMode,\n\t\t\t\tbundleUrl: options.bundleUrl,\n\t\t\t\tformat: 'txt',\n\t\t\t\tllmsConfig: options.llmsConfig,\n\t\t\t});\n\n\t\t\tconst contentSize = Buffer.byteLength(content, 'utf8');\n\t\t\tif (currentSize + contentSize > maxSize) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[reroute/llms] Reached size limit (${maxSize} bytes), stopping at ${itemCount} items`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst blockParts = formatContentBlock(\n\t\t\t\tcontent,\n\t\t\t\troute.path,\n\t\t\t\toptions.baseUrl,\n\t\t\t);\n\t\t\tparts.push(...blockParts);\n\n\t\t\titemCount++;\n\t\t\tcurrentSize += contentSize;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`[reroute/llms] Failed to extract content for ${route.path}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn { parts, itemCount, currentSize };\n}\n\nfunction buildFooter(parts: string[]): void {\n\tif (parts.length === 0) return;\n\n\t// Remove last separator\n\tif (parts[parts.length - 1] === '') parts.pop();\n\tif (parts[parts.length - 1] === '---') parts.pop();\n\tif (parts[parts.length - 1] === '') parts.pop();\n\n\tparts.push('---');\n\tparts.push('');\n\tparts.push(\n\t\t'Formats: .txt | .md | Accept: text/plain | Accept: text/markdown',\n\t);\n}\n\n/**\n * Generate /llms-full.txt - all site content in one file\n * Runtime-only generation with aggressive caching (7 days default)\n */\nexport async function generateLLMsFullContent(options: {\n\trootComponent?: ReactElement;\n\tcwd: string;\n\tclientDir: string;\n\tcollections: string[];\n\tbaseUrl: string;\n\tisWatchMode: boolean;\n\tbundleUrl?: string;\n\tllmsConfig?: LLMsOptions;\n}): Promise<{\n\tcontent: string;\n\tstats: { itemCount: number; byteSize: number };\n}> {\n\tconst { cwd, clientDir, collections, baseUrl, isWatchMode, llmsConfig } =\n\t\toptions;\n\n\tconst parts = buildHeader(baseUrl, llmsConfig);\n\n\tconst allRoutes = await discoverAllRoutes(\n\t\tcwd,\n\t\tclientDir,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\n\tconst maxItems = llmsConfig?.maxItems || 10000;\n\tconst routesToProcess = allRoutes.slice(0, maxItems);\n\n\tconst extracted = await extractRouteContents(routesToProcess, options);\n\tparts.push(...extracted.parts);\n\n\tbuildFooter(parts);\n\n\tconst fullContent = parts.join('\\n');\n\tconst byteSize = Buffer.byteLength(fullContent, 'utf8');\n\n\treturn {\n\t\tcontent: fullContent,\n\t\tstats: { itemCount: extracted.itemCount, byteSize },\n\t};\n}\n",
27
- "import { pathToFileURL } from 'node:url';\nimport type { LLMsOptions } from '../config';\nimport { join } from '../ssr/lib/path';\nimport type { Doc } from '../ssr/lib/types';\nimport { shouldExcludeRoute } from './extractor';\n\ntype RouteEntry = {\n\tpath: string;\n\tsection?: string;\n\ttitle?: string;\n};\n\n/**\n * Discover static routes from routes.ts\n */\nexport async function discoverStaticRoutes(\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<RouteEntry[]> {\n\tconst routes: RouteEntry[] = [];\n\n\ttry {\n\t\t// Check for bundled routes first (compiled binary support)\n\t\tlet routesList = (globalThis as Record<string, unknown>)\n\t\t\t.__REROUTE_ROUTES__ as Doc[] | undefined;\n\n\t\t// Fallback to dynamic import (dev mode)\n\t\tif (!routesList) {\n\t\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\t\tconst url = pathToFileURL(routesPath).href;\n\t\t\tconst mod = await import(\n\t\t\t\t`${url}${isWatchMode ? `?t=${Date.now()}` : ''}`\n\t\t\t);\n\t\t\troutesList = (mod as Doc)?.routes as Doc[] | undefined;\n\t\t}\n\t\tif (Array.isArray(routesList)) {\n\t\t\tfor (const route of routesList) {\n\t\t\t\tconst pattern = String(route?.pattern || '');\n\n\t\t\t\t// Skip error pages, layouts, and dynamic routes\n\t\t\t\tif (\n\t\t\t\t\tpattern.includes('[404]') ||\n\t\t\t\t\tpattern.includes('[layout]') ||\n\t\t\t\t\tpattern.includes('[skeleton]') ||\n\t\t\t\t\tpattern.includes(':')\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\troutes.push({\n\t\t\t\t\tpath: pattern,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error('[reroute/llms] Failed to discover routes for index:', error);\n\t}\n\n\treturn routes;\n}\n\nasync function loadCollectionModule(\n\tcwd: string,\n\tcollection: string,\n\tisWatchMode: boolean,\n): Promise<Doc[] | null> {\n\tconst collectionFile = join(\n\t\tcwd,\n\t\t'.reroute',\n\t\t'collections',\n\t\t`${collection}.js`,\n\t);\n\tconst exists = await Bun.file(collectionFile).exists();\n\n\tif (!exists) return null;\n\n\tconst url = `${pathToFileURL(collectionFile).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\tconst mod = await import(url);\n\treturn mod.items || [];\n}\n\nfunction createRouteEntriesFromItems(\n\titems: Doc[],\n\tcollection: string,\n): RouteEntry[] {\n\tconst routes: RouteEntry[] = [];\n\n\tfor (const item of items) {\n\t\tconst href = String(item.href || '');\n\t\tif (href) {\n\t\t\tconst title = item.meta?.title || item.meta?.name || item.name;\n\t\t\troutes.push({\n\t\t\t\tpath: href,\n\t\t\t\tsection: collection,\n\t\t\t\ttitle,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn routes;\n}\n\nfunction sortRoutesByDate(routes: RouteEntry[], items: Doc[]): void {\n\troutes.sort((a, b) => {\n\t\tconst aItem = items.find((i: Doc) => i.href === a.path);\n\t\tconst bItem = items.find((i: Doc) => i.href === b.path);\n\n\t\tconst aDate = aItem?.meta?.date;\n\t\tconst bDate = bItem?.meta?.date;\n\n\t\tif (aDate && bDate) {\n\t\t\treturn new Date(bDate).getTime() - new Date(aDate).getTime();\n\t\t}\n\n\t\treturn 0;\n\t});\n}\n\n/**\n * Discover collection content\n */\nexport async function discoverCollectionRoutes(\n\tcwd: string,\n\tcollections: string[],\n\tisWatchMode: boolean,\n\tllmsConfig?: LLMsOptions,\n): Promise<Map<string, RouteEntry[]>> {\n\tconst collectionsMap = new Map<string, RouteEntry[]>();\n\n\tfor (const collection of collections) {\n\t\tif (llmsConfig?.excludeCollections?.includes(collection)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst items = await loadCollectionModule(cwd, collection, isWatchMode);\n\t\t\tif (!items) continue;\n\n\t\t\tconst routes = createRouteEntriesFromItems(items, collection);\n\n\t\t\tif (routes.length > 0) {\n\t\t\t\tsortRoutesByDate(routes, items);\n\t\t\t\tcollectionsMap.set(collection, routes);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`[reroute/llms] Failed to discover collection ${collection}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn collectionsMap;\n}\n\nasync function loadRouteModule(\n\tclientDir: string,\n\troutePath: string,\n\tisWatchMode: boolean,\n): Promise<Doc | null> {\n\ttry {\n\t\tconst abs = join(clientDir, 'routes', routePath);\n\t\tconst modUrl = `${pathToFileURL(abs).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\t\treturn (await import(modUrl)) as Doc;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function callDataFunction(\n\tdataFn: (ctx: Doc) => unknown | Promise<unknown>,\n\troutePath: string,\n): Promise<unknown> {\n\tconst mockSet = { status: 200 };\n\treturn await dataFn({\n\t\tpathname: routePath,\n\t\tparams: {},\n\t\tset: mockSet,\n\t});\n}\n\nfunction extractIdentifier(item: Record<string, unknown>): string | undefined {\n\treturn (item.version || item.slug || item.id || item.name || item.key) as\n\t\t| string\n\t\t| undefined;\n}\n\nfunction createEntriesFromArray(array: Doc[], routePath: string): RouteEntry[] {\n\tconst entries: RouteEntry[] = [];\n\n\tfor (const item of array) {\n\t\tif (typeof item !== 'object' || item === null) continue;\n\n\t\tconst identifier = extractIdentifier(item);\n\t\tif (identifier) {\n\t\t\tentries.push({\n\t\t\t\tpath: `${routePath}/${identifier}`,\n\t\t\t\tsection: routePath.split('/').filter(Boolean)[0],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn entries;\n}\n\n/**\n * Discover SSR data routes (routes with ssr.data that return arrays)\n */\nexport async function discoverSSRDataRoutes(\n\t_cwd: string,\n\tclientDir: string,\n\tstaticRoutes: RouteEntry[],\n\tisWatchMode: boolean,\n): Promise<Map<string, RouteEntry[]>> {\n\tconst ssrDataRoutes = new Map<string, RouteEntry[]>();\n\n\tfor (const route of staticRoutes) {\n\t\tconst mod = await loadRouteModule(clientDir, route.path, isWatchMode);\n\t\tif (!mod) continue;\n\n\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t| undefined;\n\n\t\tif (typeof dataFn !== 'function') continue;\n\n\t\tconst result = await callDataFunction(dataFn, route.path);\n\t\tconst arrays = findArraysInData(result);\n\n\t\tfor (const array of arrays) {\n\t\t\tif (array.length === 0) continue;\n\n\t\t\tconst entries = createEntriesFromArray(array, route.path);\n\t\t\tif (entries.length > 0) {\n\t\t\t\tssrDataRoutes.set(route.path, entries);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ssrDataRoutes;\n}\n\n/**\n * Find arrays in data object (recursive)\n */\nfunction findArraysInData(obj: unknown): Doc[] {\n\tconst arrays: Doc[] = [];\n\n\tif (!obj || typeof obj !== 'object') {\n\t\treturn arrays;\n\t}\n\n\tfor (const value of Object.values(obj)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tarrays.push(value);\n\t\t} else if (value && typeof value === 'object') {\n\t\t\tarrays.push(...findArraysInData(value));\n\t\t}\n\t}\n\n\treturn arrays;\n}\n\nfunction addIndexHeader(parts: string[], llmsConfig?: LLMsOptions): void {\n\tif (llmsConfig?.siteName) {\n\t\tparts.push(`# ${llmsConfig.siteName}`);\n\t\tparts.push('');\n\t}\n\n\tif (llmsConfig?.siteDescription) {\n\t\tparts.push(llmsConfig.siteDescription);\n\t\tparts.push('');\n\t}\n}\n\nfunction groupStaticRoutes(\n\tstaticRoutes: RouteEntry[],\n\tllmsConfig?: LLMsOptions,\n): { sections: Map<string, RouteEntry[]>; rootRoutes: RouteEntry[] } {\n\tconst sections = new Map<string, RouteEntry[]>();\n\tconst rootRoutes: RouteEntry[] = [];\n\n\tfor (const route of staticRoutes) {\n\t\tif (shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (route.path === '/') {\n\t\t\trootRoutes.push(route);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst firstSegment = route.path.split('/').filter(Boolean)[0];\n\t\tif (!firstSegment) {\n\t\t\trootRoutes.push(route);\n\t\t} else {\n\t\t\tif (!sections.has(firstSegment)) {\n\t\t\t\tsections.set(firstSegment, []);\n\t\t\t}\n\t\t\tsections.get(firstSegment)?.push(route);\n\t\t}\n\t}\n\n\treturn { sections, rootRoutes };\n}\n\nfunction formatRouteUrl(routePath: string, baseUrl: string): string {\n\tconst urlPath = routePath === '/' ? '/index' : routePath;\n\treturn `${baseUrl}${urlPath}.txt`;\n}\n\nfunction getRouteTitle(route: RouteEntry): string {\n\treturn (\n\t\troute.title ||\n\t\t(route.path === '/' ? 'Home' : route.path.split('/').pop() || 'Page')\n\t);\n}\n\nfunction addRootRoutes(\n\tparts: string[],\n\trootRoutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n): void {\n\tif (isSingleCollection || rootRoutes.length === 0) return;\n\n\tfor (const route of rootRoutes) {\n\t\tconst title = getRouteTitle(route);\n\t\tconst url = formatRouteUrl(route.path, baseUrl);\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction addCollectionSection(\n\tparts: string[],\n\tcollection: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0) return;\n\n\tconst sectionName = collection.charAt(0).toUpperCase() + collection.slice(1);\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction shouldIncludeSection(\n\tsection: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n): boolean {\n\treturn !isSingleCollection || section === targetCollection;\n}\n\nfunction addSSRDataSection(\n\tparts: string[],\n\troutePattern: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tconst routeSection = routePattern.split('/').filter(Boolean)[0];\n\n\tif (\n\t\t!shouldIncludeSection(routeSection, isSingleCollection, targetCollection)\n\t) {\n\t\treturn;\n\t}\n\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0) return;\n\n\tconst sectionName =\n\t\trouteSection?.charAt(0).toUpperCase() + routeSection?.slice(1) || 'Content';\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction addStaticSection(\n\tparts: string[],\n\tsection: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n\tcollectionsMap: Map<string, RouteEntry[]>,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tif (!shouldIncludeSection(section, isSingleCollection, targetCollection)) {\n\t\treturn;\n\t}\n\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0 || collectionsMap.has(section)) return;\n\n\tconst sectionName = section.charAt(0).toUpperCase() + section.slice(1);\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\n/**\n * Generate /llms.txt index\n * Simple, token-efficient format: just URLs grouped by section\n */\nexport async function generateLLMsIndex(options: {\n\tcwd: string;\n\tclientDir: string;\n\tcollections: string[];\n\tbaseUrl: string;\n\tisWatchMode: boolean;\n\tllmsConfig?: LLMsOptions;\n}): Promise<string> {\n\tconst { cwd, clientDir, collections, baseUrl, isWatchMode, llmsConfig } =\n\t\toptions;\n\n\tconst parts: string[] = [];\n\taddIndexHeader(parts, llmsConfig);\n\n\tconst staticRoutes = await discoverStaticRoutes(cwd, isWatchMode);\n\tconst collectionsMap = await discoverCollectionRoutes(\n\t\tcwd,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\tconst ssrDataRoutes = await discoverSSRDataRoutes(\n\t\tcwd,\n\t\tclientDir,\n\t\tstaticRoutes,\n\t\tisWatchMode,\n\t);\n\n\tconst isSingleCollection = collections.length === 1;\n\tconst targetCollection = isSingleCollection ? collections[0] : null;\n\n\tconst { sections, rootRoutes } = groupStaticRoutes(staticRoutes, llmsConfig);\n\n\taddRootRoutes(parts, rootRoutes, baseUrl, isSingleCollection);\n\n\tfor (const [collection, routes] of collectionsMap.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddCollectionSection(parts, collection, routes, baseUrl, llmsConfig);\n\t\t}\n\t}\n\n\tfor (const [routePattern, routes] of ssrDataRoutes.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddSSRDataSection(\n\t\t\t\tparts,\n\t\t\t\troutePattern,\n\t\t\t\troutes,\n\t\t\t\tbaseUrl,\n\t\t\t\tisSingleCollection,\n\t\t\t\ttargetCollection,\n\t\t\t\tllmsConfig,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const [section, routes] of sections.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddStaticSection(\n\t\t\t\tparts,\n\t\t\t\tsection,\n\t\t\t\troutes,\n\t\t\t\tbaseUrl,\n\t\t\t\tisSingleCollection,\n\t\t\t\ttargetCollection,\n\t\t\t\tcollectionsMap,\n\t\t\t\tllmsConfig,\n\t\t\t);\n\t\t}\n\t}\n\n\tparts.push('---');\n\tparts.push('');\n\tparts.push(\n\t\t'Formats: .txt | .md | Accept: text/plain | Accept: text/markdown',\n\t);\n\n\treturn parts.join('\\n');\n}\n",
26
+ "import type { ReactElement } from 'react';\nimport type { LLMsOptions } from '../config';\nimport { extractContentForLLMs, shouldExcludeRoute } from './extractor';\n\ntype RouteEntry = {\n\tpath: string;\n\tdate?: string;\n};\n\nfunction buildHeader(baseUrl: string, llmsConfig?: LLMsOptions): string[] {\n\tconst parts: string[] = [];\n\n\tif (llmsConfig?.siteName) {\n\t\tparts.push(`# ${llmsConfig.siteName}`);\n\t\tparts.push('');\n\t}\n\n\tif (llmsConfig?.siteDescription) {\n\t\tparts.push(llmsConfig.siteDescription);\n\t\tparts.push('');\n\t}\n\n\tif (parts.length > 0) {\n\t\tparts.push(`${baseUrl}/index.txt`);\n\t\tparts.push('');\n\t\tparts.push('---');\n\t\tparts.push('');\n\t}\n\n\treturn parts;\n}\n\nasync function discoverAllRoutes(\n\tcwd: string,\n\tcollections: string[],\n\tisWatchMode: boolean,\n\tllmsConfig?: LLMsOptions,\n): Promise<RouteEntry[]> {\n\tconst {\n\t\tdiscoverStaticRoutes,\n\t\tdiscoverCollectionRoutes,\n\t\tdiscoverSSRDataRoutes,\n\t} = await import('./index-generator');\n\n\tconst staticRoutes = await discoverStaticRoutes(cwd, isWatchMode);\n\tconst collectionsMap = await discoverCollectionRoutes(\n\t\tcwd,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\tconst ssrDataRoutes = await discoverSSRDataRoutes(\n\t\tcwd,\n\t\tstaticRoutes,\n\t\tisWatchMode,\n\t);\n\n\tconst allRoutes: RouteEntry[] = [];\n\n\tfor (const route of staticRoutes) {\n\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\tallRoutes.push({ path: route.path });\n\t\t}\n\t}\n\n\tfor (const [_collection, routes] of collectionsMap.entries()) {\n\t\tfor (const route of routes) {\n\t\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\t\tallRoutes.push({ path: route.path });\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const [_routePattern, routes] of ssrDataRoutes.entries()) {\n\t\tfor (const route of routes) {\n\t\t\tif (!shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\t\tallRoutes.push({ path: route.path });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn allRoutes;\n}\n\nfunction formatContentBlock(\n\tcontent: string,\n\troutePath: string,\n\tbaseUrl: string,\n): string[] {\n\tconst parts: string[] = [];\n\tconst lines = content.split('\\n');\n\tconst title = lines[0] || 'Untitled';\n\tconst body = lines.slice(lines[1] === '' ? 2 : 1).join('\\n');\n\n\tconst urlPath = routePath === '/' ? '/index' : routePath;\n\tconst url = `${baseUrl}${urlPath}.txt`;\n\n\tparts.push(title);\n\tparts.push('');\n\tparts.push(url);\n\tparts.push('');\n\tif (body.trim()) {\n\t\tparts.push(body);\n\t\tparts.push('');\n\t}\n\tparts.push('---');\n\tparts.push('');\n\n\treturn parts;\n}\n\nasync function extractRouteContents(\n\troutes: RouteEntry[],\n\toptions: {\n\t\trootComponent?: ReactElement;\n\t\tcwd: string;\n\t\tclientDir: string;\n\t\tbaseUrl: string;\n\t\tisWatchMode: boolean;\n\t\tbundleUrl?: string;\n\t\tllmsConfig?: LLMsOptions;\n\t},\n): Promise<{ parts: string[]; itemCount: number; currentSize: number }> {\n\tconst parts: string[] = [];\n\tconst maxSize = options.llmsConfig?.maxSize || 50 * 1024 * 1024;\n\tlet itemCount = 0;\n\tlet currentSize = 0;\n\n\tfor (const route of routes) {\n\t\ttry {\n\t\t\tconst content = await extractContentForLLMs({\n\t\t\t\tpathname: route.path,\n\t\t\t\trootComponent: options.rootComponent,\n\t\t\t\tclientDir: options.clientDir,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tisWatchMode: options.isWatchMode,\n\t\t\t\tbundleUrl: options.bundleUrl,\n\t\t\t\tformat: 'txt',\n\t\t\t\tllmsConfig: options.llmsConfig,\n\t\t\t});\n\n\t\t\tconst contentSize = Buffer.byteLength(content, 'utf8');\n\t\t\tif (currentSize + contentSize > maxSize) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[reroute/llms] Reached size limit (${maxSize} bytes), stopping at ${itemCount} items`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst blockParts = formatContentBlock(\n\t\t\t\tcontent,\n\t\t\t\troute.path,\n\t\t\t\toptions.baseUrl,\n\t\t\t);\n\t\t\tparts.push(...blockParts);\n\n\t\t\titemCount++;\n\t\t\tcurrentSize += contentSize;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`[reroute/llms] Failed to extract content for ${route.path}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn { parts, itemCount, currentSize };\n}\n\nfunction buildFooter(parts: string[]): void {\n\tif (parts.length === 0) return;\n\n\t// Remove last separator\n\tif (parts[parts.length - 1] === '') parts.pop();\n\tif (parts[parts.length - 1] === '---') parts.pop();\n\tif (parts[parts.length - 1] === '') parts.pop();\n\n\tparts.push('---');\n\tparts.push('');\n\tparts.push(\n\t\t'Formats: .txt | .md | Accept: text/plain | Accept: text/markdown',\n\t);\n}\n\n/**\n * Generate /llms-full.txt - all site content in one file\n * Runtime-only generation with aggressive caching (7 days default)\n */\nexport async function generateLLMsFullContent(options: {\n\trootComponent?: ReactElement;\n\tcwd: string;\n\tclientDir: string;\n\tcollections: string[];\n\tbaseUrl: string;\n\tisWatchMode: boolean;\n\tbundleUrl?: string;\n\tllmsConfig?: LLMsOptions;\n}): Promise<{\n\tcontent: string;\n\tstats: { itemCount: number; byteSize: number };\n}> {\n\tconst { cwd, collections, baseUrl, isWatchMode, llmsConfig } = options;\n\n\tconst parts = buildHeader(baseUrl, llmsConfig);\n\n\tconst allRoutes = await discoverAllRoutes(\n\t\tcwd,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\n\tconst maxItems = llmsConfig?.maxItems || 10000;\n\tconst routesToProcess = allRoutes.slice(0, maxItems);\n\n\tconst extracted = await extractRouteContents(routesToProcess, options);\n\tparts.push(...extracted.parts);\n\n\tbuildFooter(parts);\n\n\tconst fullContent = parts.join('\\n');\n\tconst byteSize = Buffer.byteLength(fullContent, 'utf8');\n\n\treturn {\n\t\tcontent: fullContent,\n\t\tstats: { itemCount: extracted.itemCount, byteSize },\n\t};\n}\n",
27
+ "import { pathToFileURL } from 'node:url';\nimport type { LLMsOptions } from '../config';\nimport { join } from '../ssr/lib/path';\nimport type { Doc } from '../ssr/lib/types';\nimport { shouldExcludeRoute } from './extractor';\n\ntype RouteEntry = {\n\tpath: string;\n\tsection?: string;\n\ttitle?: string;\n};\n\n/**\n * Discover static routes from routes.ts\n */\nexport async function discoverStaticRoutes(\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<RouteEntry[]> {\n\tconst routes: RouteEntry[] = [];\n\n\ttry {\n\t\t// Check for bundled routes first (compiled binary support)\n\t\tlet routesList = (globalThis as Record<string, unknown>)\n\t\t\t.__REROUTE_ROUTES__ as Doc[] | undefined;\n\n\t\t// Fallback to dynamic import (dev mode)\n\t\tif (!routesList) {\n\t\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\t\tconst url = pathToFileURL(routesPath).href;\n\t\t\tconst mod = await import(\n\t\t\t\t`${url}${isWatchMode ? `?t=${Date.now()}` : ''}`\n\t\t\t);\n\t\t\troutesList = (mod as Doc)?.routes as Doc[] | undefined;\n\t\t}\n\t\tif (Array.isArray(routesList)) {\n\t\t\tfor (const route of routesList) {\n\t\t\t\tconst pattern = String(route?.pattern || '');\n\n\t\t\t\t// Skip error pages, layouts, and dynamic routes\n\t\t\t\tif (\n\t\t\t\t\tpattern.includes('[404]') ||\n\t\t\t\t\tpattern.includes('[layout]') ||\n\t\t\t\t\tpattern.includes('[skeleton]') ||\n\t\t\t\t\tpattern.includes(':')\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\troutes.push({\n\t\t\t\t\tpath: pattern,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error('[reroute/llms] Failed to discover routes for index:', error);\n\t}\n\n\treturn routes;\n}\n\nasync function loadCollectionModule(\n\tcwd: string,\n\tcollection: string,\n\tisWatchMode: boolean,\n): Promise<Doc[] | null> {\n\tconst collectionFile = join(\n\t\tcwd,\n\t\t'.reroute',\n\t\t'collections',\n\t\t`${collection}.js`,\n\t);\n\tconst exists = await Bun.file(collectionFile).exists();\n\n\tif (!exists) return null;\n\n\tconst url = `${pathToFileURL(collectionFile).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\tconst mod = await import(url);\n\treturn mod.items || [];\n}\n\nfunction createRouteEntriesFromItems(\n\titems: Doc[],\n\tcollection: string,\n): RouteEntry[] {\n\tconst routes: RouteEntry[] = [];\n\n\tfor (const item of items) {\n\t\tconst href = String(item.href || '');\n\t\tif (href) {\n\t\t\tconst title = item.meta?.title || item.meta?.name || item.name;\n\t\t\troutes.push({\n\t\t\t\tpath: href,\n\t\t\t\tsection: collection,\n\t\t\t\ttitle,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn routes;\n}\n\nfunction sortRoutesByDate(routes: RouteEntry[], items: Doc[]): void {\n\troutes.sort((a, b) => {\n\t\tconst aItem = items.find((i: Doc) => i.href === a.path);\n\t\tconst bItem = items.find((i: Doc) => i.href === b.path);\n\n\t\tconst aDate = aItem?.meta?.date;\n\t\tconst bDate = bItem?.meta?.date;\n\n\t\tif (aDate && bDate) {\n\t\t\treturn new Date(bDate).getTime() - new Date(aDate).getTime();\n\t\t}\n\n\t\treturn 0;\n\t});\n}\n\n/**\n * Discover collection content\n */\nexport async function discoverCollectionRoutes(\n\tcwd: string,\n\tcollections: string[],\n\tisWatchMode: boolean,\n\tllmsConfig?: LLMsOptions,\n): Promise<Map<string, RouteEntry[]>> {\n\tconst collectionsMap = new Map<string, RouteEntry[]>();\n\n\tfor (const collection of collections) {\n\t\tif (llmsConfig?.excludeCollections?.includes(collection)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst items = await loadCollectionModule(cwd, collection, isWatchMode);\n\t\t\tif (!items) continue;\n\n\t\t\tconst routes = createRouteEntriesFromItems(items, collection);\n\n\t\t\tif (routes.length > 0) {\n\t\t\t\tsortRoutesByDate(routes, items);\n\t\t\t\tcollectionsMap.set(collection, routes);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`[reroute/llms] Failed to discover collection ${collection}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn collectionsMap;\n}\n\nasync function loadRouteModule(\n\tcwd: string,\n\troutePath: string,\n\tisWatchMode: boolean,\n): Promise<Doc | null> {\n\ttry {\n\t\tconst abs = join(cwd, 'src', 'client', 'routes', routePath);\n\t\tconst modUrl = `${pathToFileURL(abs).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\t\treturn (await import(modUrl)) as Doc;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function callDataFunction(\n\tdataFn: (ctx: Doc) => unknown | Promise<unknown>,\n\troutePath: string,\n): Promise<unknown> {\n\tconst mockSet = { status: 200 };\n\treturn await dataFn({\n\t\tpathname: routePath,\n\t\tparams: {},\n\t\tset: mockSet,\n\t});\n}\n\nfunction extractIdentifier(item: Record<string, unknown>): string | undefined {\n\treturn (item.version || item.slug || item.id || item.name || item.key) as\n\t\t| string\n\t\t| undefined;\n}\n\nfunction createEntriesFromArray(array: Doc[], routePath: string): RouteEntry[] {\n\tconst entries: RouteEntry[] = [];\n\n\tfor (const item of array) {\n\t\tif (typeof item !== 'object' || item === null) continue;\n\n\t\tconst identifier = extractIdentifier(item);\n\t\tif (identifier) {\n\t\t\tentries.push({\n\t\t\t\tpath: `${routePath}/${identifier}`,\n\t\t\t\tsection: routePath.split('/').filter(Boolean)[0],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn entries;\n}\n\n/**\n * Discover SSR data routes (routes with ssr.data that return arrays)\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: discovering ssr data routes is complex\nexport async function discoverSSRDataRoutes(\n\tcwd: string,\n\tstaticRoutes: RouteEntry[],\n\tisWatchMode: boolean,\n): Promise<Map<string, RouteEntry[]>> {\n\tconst ssrDataRoutes = new Map<string, RouteEntry[]>();\n\n\t// Check for bundled routes first (compiled binary support)\n\tconst bundledRoutes = (globalThis as Record<string, unknown>)\n\t\t.__REROUTE_ROUTES__ as Doc[] | undefined;\n\n\tif (bundledRoutes && Array.isArray(bundledRoutes)) {\n\t\t// In production: use pre-loaded SSR data from bundled routes\n\t\t// Match static routes against bundled routes to get their ssr.data\n\t\tfor (const route of staticRoutes) {\n\t\t\t// Find the matching bundled route by path\n\t\t\tconst bundledRoute = bundledRoutes.find((r) => r?.path === route.path);\n\n\t\t\tif (!bundledRoute) continue;\n\n\t\t\tconst ssr = (bundledRoute as Doc)?.ssr as Doc | undefined;\n\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t| undefined;\n\n\t\t\tif (typeof dataFn !== 'function') continue;\n\n\t\t\tconst result = await callDataFunction(dataFn, route.path);\n\t\t\tconst arrays = findArraysInData(result);\n\n\t\t\tfor (const array of arrays) {\n\t\t\t\tif (array.length === 0) continue;\n\n\t\t\t\tconst entries = createEntriesFromArray(array, route.path);\n\t\t\t\tif (entries.length > 0) {\n\t\t\t\t\tssrDataRoutes.set(route.path, entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Dev mode: dynamically import route modules\n\t\tfor (const route of staticRoutes) {\n\t\t\tconst mod = await loadRouteModule(cwd, route.path, isWatchMode);\n\t\t\tif (!mod) continue;\n\n\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t| undefined;\n\n\t\t\tif (typeof dataFn !== 'function') continue;\n\n\t\t\tconst result = await callDataFunction(dataFn, route.path);\n\t\t\tconst arrays = findArraysInData(result);\n\n\t\t\tfor (const array of arrays) {\n\t\t\t\tif (array.length === 0) continue;\n\n\t\t\t\tconst entries = createEntriesFromArray(array, route.path);\n\t\t\t\tif (entries.length > 0) {\n\t\t\t\t\tssrDataRoutes.set(route.path, entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ssrDataRoutes;\n}\n\n/**\n * Find arrays in data object (recursive)\n */\nfunction findArraysInData(obj: unknown): Doc[] {\n\tconst arrays: Doc[] = [];\n\n\tif (!obj || typeof obj !== 'object') {\n\t\treturn arrays;\n\t}\n\n\tfor (const value of Object.values(obj)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tarrays.push(value);\n\t\t} else if (value && typeof value === 'object') {\n\t\t\tarrays.push(...findArraysInData(value));\n\t\t}\n\t}\n\n\treturn arrays;\n}\n\nfunction addIndexHeader(parts: string[], llmsConfig?: LLMsOptions): void {\n\tif (llmsConfig?.siteName) {\n\t\tparts.push(`# ${llmsConfig.siteName}`);\n\t\tparts.push('');\n\t}\n\n\tif (llmsConfig?.siteDescription) {\n\t\tparts.push(llmsConfig.siteDescription);\n\t\tparts.push('');\n\t}\n}\n\nfunction groupStaticRoutes(\n\tstaticRoutes: RouteEntry[],\n\tllmsConfig?: LLMsOptions,\n): { sections: Map<string, RouteEntry[]>; rootRoutes: RouteEntry[] } {\n\tconst sections = new Map<string, RouteEntry[]>();\n\tconst rootRoutes: RouteEntry[] = [];\n\n\tfor (const route of staticRoutes) {\n\t\tif (shouldExcludeRoute(route.path, llmsConfig?.excludeRoutes)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (route.path === '/') {\n\t\t\trootRoutes.push(route);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst firstSegment = route.path.split('/').filter(Boolean)[0];\n\t\tif (!firstSegment) {\n\t\t\trootRoutes.push(route);\n\t\t} else {\n\t\t\tif (!sections.has(firstSegment)) {\n\t\t\t\tsections.set(firstSegment, []);\n\t\t\t}\n\t\t\tsections.get(firstSegment)?.push(route);\n\t\t}\n\t}\n\n\treturn { sections, rootRoutes };\n}\n\nfunction formatRouteUrl(routePath: string, baseUrl: string): string {\n\tconst urlPath = routePath === '/' ? '/index' : routePath;\n\treturn `${baseUrl}${urlPath}.txt`;\n}\n\nfunction getRouteTitle(route: RouteEntry): string {\n\treturn (\n\t\troute.title ||\n\t\t(route.path === '/' ? 'Home' : route.path.split('/').pop() || 'Page')\n\t);\n}\n\nfunction addRootRoutes(\n\tparts: string[],\n\trootRoutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n): void {\n\tif (isSingleCollection || rootRoutes.length === 0) return;\n\n\tfor (const route of rootRoutes) {\n\t\tconst title = getRouteTitle(route);\n\t\tconst url = formatRouteUrl(route.path, baseUrl);\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction addCollectionSection(\n\tparts: string[],\n\tcollection: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0) return;\n\n\tconst sectionName = collection.charAt(0).toUpperCase() + collection.slice(1);\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction shouldIncludeSection(\n\tsection: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n): boolean {\n\treturn !isSingleCollection || section === targetCollection;\n}\n\nfunction addSSRDataSection(\n\tparts: string[],\n\troutePattern: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tconst routeSection = routePattern.split('/').filter(Boolean)[0];\n\n\tif (\n\t\t!shouldIncludeSection(routeSection, isSingleCollection, targetCollection)\n\t) {\n\t\treturn;\n\t}\n\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0) return;\n\n\tconst sectionName =\n\t\trouteSection?.charAt(0).toUpperCase() + routeSection?.slice(1) || 'Content';\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\nfunction addStaticSection(\n\tparts: string[],\n\tsection: string,\n\troutes: RouteEntry[],\n\tbaseUrl: string,\n\tisSingleCollection: boolean,\n\ttargetCollection: string | null,\n\tcollectionsMap: Map<string, RouteEntry[]>,\n\tllmsConfig?: LLMsOptions,\n): void {\n\tif (!shouldIncludeSection(section, isSingleCollection, targetCollection)) {\n\t\treturn;\n\t}\n\n\tconst filteredRoutes = routes.filter(\n\t\t(r) => !shouldExcludeRoute(r.path, llmsConfig?.excludeRoutes),\n\t);\n\n\tif (filteredRoutes.length === 0 || collectionsMap.has(section)) return;\n\n\tconst sectionName = section.charAt(0).toUpperCase() + section.slice(1);\n\tparts.push(`## ${sectionName}`);\n\tparts.push('');\n\n\tfor (const route of filteredRoutes) {\n\t\tconst title = route.title || route.path.split('/').pop() || 'Untitled';\n\t\tconst url = `${baseUrl}${route.path}.txt`;\n\t\tparts.push(`- [${title}](${url})`);\n\t}\n\tparts.push('');\n}\n\n/**\n * Generate /llms.txt index\n * Simple, token-efficient format: just URLs grouped by section\n */\nexport async function generateLLMsIndex(options: {\n\tcwd: string;\n\tcollections: string[];\n\tbaseUrl: string;\n\tisWatchMode: boolean;\n\tllmsConfig?: LLMsOptions;\n}): Promise<string> {\n\tconst { cwd, collections, baseUrl, isWatchMode, llmsConfig } = options;\n\n\tconst parts: string[] = [];\n\taddIndexHeader(parts, llmsConfig);\n\n\tconst staticRoutes = await discoverStaticRoutes(cwd, isWatchMode);\n\tconst collectionsMap = await discoverCollectionRoutes(\n\t\tcwd,\n\t\tcollections,\n\t\tisWatchMode,\n\t\tllmsConfig,\n\t);\n\tconst ssrDataRoutes = await discoverSSRDataRoutes(\n\t\tcwd,\n\t\tstaticRoutes,\n\t\tisWatchMode,\n\t);\n\n\tconst isSingleCollection = collections.length === 1;\n\tconst targetCollection = isSingleCollection ? collections[0] : null;\n\n\tconst { sections, rootRoutes } = groupStaticRoutes(staticRoutes, llmsConfig);\n\n\taddRootRoutes(parts, rootRoutes, baseUrl, isSingleCollection);\n\n\tfor (const [collection, routes] of collectionsMap.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddCollectionSection(parts, collection, routes, baseUrl, llmsConfig);\n\t\t}\n\t}\n\n\tfor (const [routePattern, routes] of ssrDataRoutes.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddSSRDataSection(\n\t\t\t\tparts,\n\t\t\t\troutePattern,\n\t\t\t\troutes,\n\t\t\t\tbaseUrl,\n\t\t\t\tisSingleCollection,\n\t\t\t\ttargetCollection,\n\t\t\t\tllmsConfig,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const [section, routes] of sections.entries()) {\n\t\tif (routes.length > 0) {\n\t\t\taddStaticSection(\n\t\t\t\tparts,\n\t\t\t\tsection,\n\t\t\t\troutes,\n\t\t\t\tbaseUrl,\n\t\t\t\tisSingleCollection,\n\t\t\t\ttargetCollection,\n\t\t\t\tcollectionsMap,\n\t\t\t\tllmsConfig,\n\t\t\t);\n\t\t}\n\t}\n\n\tparts.push('---');\n\tparts.push('');\n\tparts.push(\n\t\t'Formats: .txt | .md | Accept: text/plain | Accept: text/markdown',\n\t);\n\n\treturn parts.join('\\n');\n}\n",
28
28
  "/**\n * LLMs Feature - Native LLM-friendly content formats\n *\n * Provides:\n * - .txt and .md extensions for any route\n * - Accept header content negotiation (text/plain, text/markdown)\n * - /llms.txt index of all content\n * - /llms-full.txt bundle of all content\n *\n * All formats are token-efficient: minimal metadata, maximum useful content\n */\n\nexport { extractContentForLLMs, shouldExcludeRoute } from './extractor';\nexport {\n\textractTitle,\n\tformatAsMarkdown,\n\tformatAsText,\n\tgenerateLLMsFooter,\n\thtmlToMarkdown,\n\tstripHtmlTags,\n} from './formatter';\nexport { generateLLMsFullContent } from './full-generator';\nexport { generateLLMsIndex } from './index-generator';\n",
29
29
  "import type { ImageResponseOptions } from '@vercel/og';\nimport { createElement } from 'react';\nimport type { OGImageFont } from '../config';\nimport type { OGImageProps } from './types';\n\n// biome-ignore lint/suspicious/noExplicitAny: what we can do here?\ntype Any = any;\n/**\n * Render an OG image component to PNG using Satori and resvg\n */\n\nexport async function renderOGImageToPNG(\n\tComponent: Any,\n\tprops: OGImageProps,\n\toptions: {\n\t\twidth?: number;\n\t\theight?: number;\n\t\tfonts?: OGImageFont[];\n\t} = {},\n): Promise<Buffer> {\n\tconst width = options.width || 1200;\n\tconst height = options.height || 630;\n\n\ttry {\n\t\t// Dynamically import @vercel/og to avoid bundling it if not used\n\t\tconst { ImageResponse } = await import('@vercel/og');\n\n\t\t// Create React element from component\n\t\tconst element = createElement(Component, props);\n\n\t\t// Use ImageResponse to render the component\n\t\tconst imageResponse = new ImageResponse(element, {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfonts: options.fonts as ImageResponseOptions['fonts'],\n\t\t});\n\n\t\t// Convert Response to Buffer\n\t\tconst arrayBuffer = await imageResponse.arrayBuffer();\n\t\treturn Buffer.from(arrayBuffer);\n\t} catch (error) {\n\t\tconsole.error('[reroute] Failed to render OG image:', error);\n\t\tthrow new Error(\n\t\t\t`Failed to render OG image: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\n/**\n * Default OG image template\n * Renders a simple card with title and description\n */\nexport function DefaultOGTemplate({\n\tmeta,\n\tavatar,\n\tsiteName: siteNameProp,\n}: OGImageProps) {\n\tconst title = meta?.title || 'Untitled';\n\tconst description = meta?.description || '';\n\tconst siteName = siteNameProp || meta?.site_name || meta?.siteName || '';\n\n\treturn createElement(\n\t\t'div',\n\t\t{\n\t\t\tstyle: {\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\tpadding: '80px',\n\t\t\t\tfontFamily: 'system-ui, sans-serif',\n\t\t\t},\n\t\t},\n\t\tcreateElement(\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tstyle: {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tborder: '4px solid #000000',\n\t\t\t\t\tborderRadius: '24px',\n\t\t\t\t\tpadding: '64px',\n\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateElement(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\tgap: '24px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcreateElement(\n\t\t\t\t\t'h1',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tfontSize: '72px',\n\t\t\t\t\t\t\tfontWeight: 'bold',\n\t\t\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tcolor: '#000000',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ttitle,\n\t\t\t\t),\n\t\t\t\tdescription &&\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tfontSize: '32px',\n\t\t\t\t\t\t\t\tlineHeight: 1.5,\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tcolor: '#666666',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t),\n\t\t\t),\n\t\t\tcreateElement(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsiteName &&\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tfontSize: '28px',\n\t\t\t\t\t\t\t\tcolor: '#999999',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsiteName,\n\t\t\t\t\t),\n\t\t\t\tavatar &&\n\t\t\t\t\tcreateElement('img', {\n\t\t\t\t\t\tsrc: avatar,\n\t\t\t\t\t\twidth: 80,\n\t\t\t\t\t\theight: 80,\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\tobjectFit: 'cover',\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t!avatar &&\n\t\t\t\t\tcreateElement('div', {\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\twidth: '80px',\n\t\t\t\t\t\t\theight: '80px',\n\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\tbackgroundColor: '#6366f1',\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t);\n}\n",
30
30
  "export {\n\textractParamsFromPath,\n\tfindOGImageForPath,\n\tloadOGImageComponent,\n} from './discovery';\nexport { generateOGImageMetaTags } from './meta';\nexport { DefaultOGTemplate, renderOGImageToPNG } from './render';\nexport type { OGImageProps } from './types';\n",
@@ -40,7 +40,7 @@
40
40
  "export * from './context';\nexport * from './instrumentation';\nexport * from './plugin';\nexport * from './sourcemap';\n",
41
41
  "export * from './src/server';\n"
42
42
  ],
43
- "mappings": "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",
44
- "debugId": "BE6ED38C9D38E04364756E2164756E21",
43
+ "mappings": "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",
44
+ "debugId": "C18EEF6AFC318F4664756E2164756E21",
45
45
  "names": []
46
46
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.34.8
2
+ * reroute-js v0.35.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>