reroute-js 0.25.3 → 0.26.1

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 (197) hide show
  1. package/README.md +153 -53
  2. package/cli/bin.d.ts +1 -1
  3. package/cli/bin.js +446 -150
  4. package/cli/bin.js.map +13 -9
  5. package/cli/index.d.ts +1 -1
  6. package/cli/index.js +4 -4
  7. package/cli/index.js.map +1 -1
  8. package/cli/src/cli.d.ts +1 -1
  9. package/cli/src/commands/analyze.d.ts +1 -1
  10. package/cli/src/commands/build.d.ts +1 -1
  11. package/cli/src/commands/dev.d.ts +1 -1
  12. package/cli/src/commands/gen.d.ts +1 -1
  13. package/cli/src/commands/gen.d.ts.map +1 -1
  14. package/cli/src/commands/index.d.ts +1 -1
  15. package/cli/src/commands/init.d.ts +1 -1
  16. package/cli/src/commands/lib/assets.d.ts +1 -1
  17. package/cli/src/commands/lib/bundler.d.ts +1 -1
  18. package/cli/src/commands/lib/command.d.ts +1 -1
  19. package/cli/src/commands/lib/env.d.ts +1 -1
  20. package/cli/src/commands/lib/index.d.ts +1 -1
  21. package/cli/src/commands/lib/log.d.ts +1 -1
  22. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  23. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  24. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  25. package/cli/src/commands/lib/production.d.ts +1 -1
  26. package/cli/src/commands/lib/server.d.ts +1 -1
  27. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  28. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  29. package/cli/src/commands/lib/tailwind.d.ts +1 -1
  30. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  31. package/cli/src/commands/lib/version.d.ts +1 -1
  32. package/cli/src/commands/og.d.ts +1 -1
  33. package/cli/src/commands/start.d.ts +1 -1
  34. package/cli/src/index.d.ts +1 -1
  35. package/core/index.d.ts +1 -1
  36. package/core/index.js +912 -589
  37. package/core/index.js.map +22 -14
  38. package/core/src/bundler/hash.d.ts +1 -1
  39. package/core/src/bundler/index.d.ts +1 -1
  40. package/core/src/config.d.ts +243 -2
  41. package/core/src/config.d.ts.map +1 -1
  42. package/core/src/content/discovery.d.ts +1 -1
  43. package/core/src/content/index.d.ts +1 -1
  44. package/core/src/content/metadata.d.ts +1 -1
  45. package/core/src/index.d.ts +1 -1
  46. package/core/src/llms/extractor.d.ts +1 -1
  47. package/core/src/llms/formatter.d.ts +1 -1
  48. package/core/src/llms/full-generator.d.ts +1 -1
  49. package/core/src/llms/index-generator.d.ts +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/generator.d.ts +1 -1
  58. package/core/src/robots/index.d.ts +1 -1
  59. package/core/src/robots/policies.d.ts +1 -1
  60. package/core/src/rss/discovery.d.ts +1 -1
  61. package/core/src/rss/generator.d.ts +1 -1
  62. package/core/src/rss/index.d.ts +1 -1
  63. package/core/src/sitemap/discovery.d.ts +1 -1
  64. package/core/src/sitemap/generator.d.ts +1 -1
  65. package/core/src/sitemap/index.d.ts +1 -1
  66. package/core/src/ssr/index.d.ts +1 -1
  67. package/core/src/ssr/lib/cache.d.ts +1 -1
  68. package/core/src/ssr/lib/collections.d.ts +1 -1
  69. package/core/src/ssr/lib/compression.d.ts +1 -1
  70. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  71. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  72. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  73. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  74. package/core/src/ssr/lib/data.d.ts +1 -1
  75. package/core/src/ssr/lib/html.d.ts +1 -1
  76. package/core/src/ssr/lib/imports.d.ts +1 -1
  77. package/core/src/ssr/lib/index.d.ts +1 -1
  78. package/core/src/ssr/lib/layouts.d.ts +1 -1
  79. package/core/src/ssr/lib/metadata.d.ts +1 -1
  80. package/core/src/ssr/lib/mime.d.ts +1 -1
  81. package/core/src/ssr/lib/modules.d.ts +1 -1
  82. package/core/src/ssr/lib/path.d.ts +1 -1
  83. package/core/src/ssr/lib/preload.d.ts +1 -1
  84. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  85. package/core/src/ssr/lib/scripts/data.d.ts +2 -2
  86. package/core/src/ssr/lib/scripts/data.d.ts.map +1 -1
  87. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  88. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  89. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  90. package/core/src/ssr/lib/seed.d.ts +1 -1
  91. package/core/src/ssr/lib/setup.d.ts +4 -2
  92. package/core/src/ssr/lib/setup.d.ts.map +1 -1
  93. package/core/src/ssr/lib/styles.d.ts +1 -1
  94. package/core/src/ssr/lib/template.d.ts +1 -1
  95. package/core/src/ssr/lib/types.d.ts +1 -1
  96. package/core/src/ssr/render.d.ts +4 -2
  97. package/core/src/ssr/render.d.ts.map +1 -1
  98. package/core/src/ssr/stream.d.ts +4 -2
  99. package/core/src/ssr/stream.d.ts.map +1 -1
  100. package/elysia/index.d.ts +1 -1
  101. package/elysia/index.js +715 -468
  102. package/elysia/index.js.map +15 -11
  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/routes/artifacts.d.ts +1 -1
  115. package/elysia/src/routes/content.d.ts +1 -1
  116. package/elysia/src/routes/content.d.ts.map +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/og.d.ts +1 -1
  122. package/elysia/src/routes/redirects.d.ts +1 -1
  123. package/elysia/src/routes/robots.d.ts +1 -1
  124. package/elysia/src/routes/rss.d.ts +1 -1
  125. package/elysia/src/routes/search.d.ts +1 -1
  126. package/elysia/src/routes/sitemap.d.ts +1 -1
  127. package/elysia/src/routes/ssr.d.ts +1 -1
  128. package/elysia/src/routes/ssr.d.ts.map +1 -1
  129. package/elysia/src/routes/static.d.ts +1 -1
  130. package/elysia/src/routes/static.d.ts.map +1 -1
  131. package/elysia/src/types.d.ts +1 -1
  132. package/package.json +4 -15
  133. package/react/index.d.ts +1 -1
  134. package/react/index.js +2 -2
  135. package/react/index.js.map +1 -1
  136. package/react/src/components/ClientOnly.d.ts +1 -1
  137. package/react/src/components/ContentRoute.d.ts +1 -1
  138. package/react/src/components/Image.d.ts +1 -1
  139. package/react/src/components/LazyRoute.d.ts +1 -1
  140. package/react/src/components/Link.d.ts +1 -1
  141. package/react/src/components/Markdown.d.ts +1 -1
  142. package/react/src/components/Outlet.d.ts +1 -1
  143. package/react/src/components/index.d.ts +1 -1
  144. package/react/src/hooks/index.d.ts +1 -1
  145. package/react/src/hooks/useContent.d.ts +1 -1
  146. package/react/src/hooks/useData.d.ts +1 -1
  147. package/react/src/hooks/useFeed.d.ts +1 -1
  148. package/react/src/hooks/useLayoutData.d.ts +1 -1
  149. package/react/src/hooks/useLlms.d.ts +1 -1
  150. package/react/src/hooks/useNavigate.d.ts +1 -1
  151. package/react/src/hooks/useParams.d.ts +1 -1
  152. package/react/src/hooks/useRouter.d.ts +1 -1
  153. package/react/src/hooks/useSearch.d.ts +1 -1
  154. package/react/src/hooks/useSearchParams.d.ts +1 -1
  155. package/react/src/hooks/useToc.d.ts +1 -1
  156. package/react/src/index.d.ts +1 -1
  157. package/react/src/lib/collection.d.ts +1 -1
  158. package/react/src/lib/content.d.ts +1 -1
  159. package/react/src/lib/head.d.ts +1 -1
  160. package/react/src/lib/index.d.ts +1 -1
  161. package/react/src/lib/lazy-route.d.ts +1 -1
  162. package/react/src/lib/route-loader.d.ts +1 -1
  163. package/react/src/providers/ContentProvider.d.ts +1 -1
  164. package/react/src/providers/RerouteProvider.d.ts +1 -1
  165. package/react/src/providers/RouterProvider.d.ts +1 -1
  166. package/react/src/providers/index.d.ts +1 -1
  167. package/react/src/types/any.d.ts +1 -1
  168. package/react/src/types/index.d.ts +1 -1
  169. package/react/src/types/router.d.ts +1 -1
  170. package/telemetry/react.d.ts +2 -2
  171. package/telemetry/react.d.ts.map +1 -1
  172. package/telemetry/react.js +164 -183
  173. package/telemetry/react.js.map +7 -6
  174. package/telemetry/{index.d.ts → server.d.ts} +2 -2
  175. package/telemetry/server.d.ts.map +1 -0
  176. package/telemetry/server.js +1134 -0
  177. package/telemetry/server.js.map +44 -0
  178. package/telemetry/src/{browser/react.d.ts → react/api.d.ts} +4 -12
  179. package/telemetry/src/react/api.d.ts.map +1 -0
  180. package/telemetry/{browser.d.ts → src/react/index.d.ts} +4 -3
  181. package/telemetry/src/react/index.d.ts.map +1 -0
  182. package/telemetry/src/{browser/index.d.ts → react/telemetry.d.ts} +13 -13
  183. package/telemetry/src/react/telemetry.d.ts.map +1 -0
  184. package/telemetry/src/server/index.d.ts +3 -101
  185. package/telemetry/src/server/index.d.ts.map +1 -1
  186. package/telemetry/src/server/instrumentation.d.ts +62 -0
  187. package/telemetry/src/server/instrumentation.d.ts.map +1 -0
  188. package/telemetry/src/server/plugin.d.ts +72 -0
  189. package/telemetry/src/server/plugin.d.ts.map +1 -0
  190. package/telemetry/browser.d.ts.map +0 -1
  191. package/telemetry/browser.js +0 -383
  192. package/telemetry/browser.js.map +0 -10
  193. package/telemetry/index.d.ts.map +0 -1
  194. package/telemetry/index.js +0 -525
  195. package/telemetry/index.js.map +0 -10
  196. package/telemetry/src/browser/index.d.ts.map +0 -1
  197. package/telemetry/src/browser/react.d.ts.map +0 -1
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../packages/telemetry/src/browser/index.ts", "../../packages/telemetry/browser.ts", "../../packages/telemetry/src/browser/react.tsx"],
3
+ "sources": ["../../packages/telemetry/src/react/api.tsx", "../../packages/telemetry/src/react/telemetry.ts", "../../packages/telemetry/src/react/index.ts", "../../packages/telemetry/react.ts"],
4
4
  "sourcesContent": [
5
- "/** biome-ignore-all lint/suspicious/noExplicitAny: That's fine */\nexport interface BrowserTelemetryOptions {\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 '/api/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 * Whether running in production\n\t * @default import.meta.env.PROD\n\t */\n\tisProduction?: boolean;\n\n\t/**\n\t * Enable Web Vitals tracking (LCP, CLS, TTFB, INP)\n\t * @default true\n\t */\n\tenableWebVitals?: boolean;\n\n\t/**\n\t * Enable console.error capture (recommended for production only)\n\t * @default isProduction\n\t */\n\tenableConsoleCapture?: boolean;\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\nlet isInitialized = false;\nlet tracerProvider: any = null;\n\n/**\n * Initialize browser telemetry\n * Call this once when your app starts (usually in a React provider)\n *\n * @example\n * ```typescript\n * import { initBrowserTelemetry } from 'reroute-js/telemetry/browser';\n *\n * initBrowserTelemetry({\n * serviceName: 'My App Browser',\n * otlpEndpoint: '/api/telemetry', // Same-origin proxy\n * isProduction: true,\n * });\n * ```\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Initialization requires multiple setup steps\nexport async function initBrowserTelemetry(\n\toptions: BrowserTelemetryOptions = {},\n) {\n\tif (IS_SERVER || isInitialized) {\n\t\treturn;\n\t}\n\n\t// Mark as initialized immediately to prevent race conditions\n\tisInitialized = true;\n\n\ttry {\n\t\t// Lazy load OpenTelemetry modules to prevent SSR execution\n\t\tconst [\n\t\t\t{ getWebAutoInstrumentations },\n\t\t\t{ ZoneContextManager },\n\t\t\t{ OTLPTraceExporter },\n\t\t\t{ registerInstrumentations },\n\t\t\t{ resourceFromAttributes },\n\t\t\t{ BatchSpanProcessor },\n\t\t\t{ WebTracerProvider },\n\t\t\t{ ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION },\n\t\t] = await Promise.all([\n\t\t\timport('@opentelemetry/auto-instrumentations-web'),\n\t\t\timport('@opentelemetry/context-zone'),\n\t\t\timport('@opentelemetry/exporter-trace-otlp-http'),\n\t\t\timport('@opentelemetry/instrumentation'),\n\t\t\timport('@opentelemetry/resources'),\n\t\t\timport('@opentelemetry/sdk-trace-base'),\n\t\t\timport('@opentelemetry/sdk-trace-web'),\n\t\t\timport('@opentelemetry/semantic-conventions'),\n\t\t]);\n\n\t\tconst env =\n\t\t\ttypeof import.meta !== 'undefined' ? import.meta.env : undefined;\n\n\t\tconst SERVICE_NAME = options.serviceName || 'reroute-app-browser';\n\t\tconst SERVICE_VERSION = options.serviceVersion || '1.0.0';\n\t\tconst OTLP_ENDPOINT = options.otlpEndpoint || '/api/telemetry';\n\t\tconst IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;\n\t\tconst ENABLE_WEB_VITALS = options.enableWebVitals ?? true;\n\t\tconst ENABLE_CONSOLE_CAPTURE =\n\t\t\toptions.enableConsoleCapture ?? IS_PRODUCTION;\n\n\t\tconsole.log(\n\t\t\t`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`,\n\t\t);\n\n\t\t// Configure OTLP exporter\n\t\tconst headers: Record<string, string> = {};\n\t\tconst apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;\n\t\tif (apiKey) {\n\t\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t\t}\n\n\t\tconst exporter = new OTLPTraceExporter({\n\t\t\turl: `${OTLP_ENDPOINT}/v1/traces`,\n\t\t\theaders: Object.keys(headers).length > 0 ? headers : undefined,\n\t\t});\n\n\t\t// Create resource\n\t\tconst resource = resourceFromAttributes({\n\t\t\t[ATTR_SERVICE_NAME]: SERVICE_NAME,\n\t\t\t[ATTR_SERVICE_VERSION]: SERVICE_VERSION,\n\t\t\t'deployment.environment': IS_PRODUCTION ? 'production' : 'development',\n\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t'browser.language': navigator.language,\n\t\t\t'browser.platform': navigator.platform,\n\t\t\t'screen.width': window.screen.width,\n\t\t\t'screen.height': window.screen.height,\n\t\t});\n\n\t\t// Create span processor\n\t\tconst spanProcessor = new BatchSpanProcessor(exporter, {\n\t\t\tmaxQueueSize: 100,\n\t\t\tmaxExportBatchSize: 10,\n\t\t\tscheduledDelayMillis: 500,\n\t\t});\n\n\t\t// Create tracer provider\n\t\ttracerProvider = new WebTracerProvider({\n\t\t\tresource,\n\t\t\tspanProcessors: [spanProcessor],\n\t\t});\n\n\t\ttracerProvider.register({\n\t\t\tcontextManager: new ZoneContextManager(),\n\t\t});\n\n\t\t// Auto-instrument browser APIs\n\t\tregisterInstrumentations({\n\t\t\tinstrumentations: [\n\t\t\t\tgetWebAutoInstrumentations({\n\t\t\t\t\t'@opentelemetry/instrumentation-document-load': {\n\t\t\t\t\t\tenabled: false, // Disabled - creates too many resource spans on first page load. Use web vitals instead.\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-user-interaction': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teventNames: ['click', 'submit'],\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-fetch': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-xml-http-request': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\n\t\t// Setup error handlers (async but don't await - let them set up in background)\n\t\tsetupErrorHandlers().catch((err) =>\n\t\t\tconsole.error('[browser-telemetry] Error handler setup failed:', err),\n\t\t);\n\n\t\t// Setup Web Vitals (async but don't await)\n\t\tif (ENABLE_WEB_VITALS) {\n\t\t\tsetupWebVitals().catch((err) =>\n\t\t\t\tconsole.error('[browser-telemetry] Web Vitals setup failed:', err),\n\t\t\t);\n\t\t}\n\n\t\t// Setup navigation timing (async but don't await)\n\t\t// Too spammy rn - maybe in the future behind a flag\n\t\t// setupNavigationTiming().catch((err) =>\n\t\t// \tconsole.error('[browser-telemetry] Navigation timing setup failed:', err),\n\t\t// );\n\n\t\t// Setup console capture (async but don't await)\n\t\tif (ENABLE_CONSOLE_CAPTURE) {\n\t\t\tsetupConsoleCapture().catch((err) =>\n\t\t\t\tconsole.error('[browser-telemetry] Console capture setup failed:', err),\n\t\t\t);\n\t\t}\n\n\t\t// Track page visibility (async but don't await)\n\t\tsetupVisibilityTracking().catch((err) =>\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Visibility tracking setup failed:',\n\t\t\t\terr,\n\t\t\t),\n\t\t);\n\n\t\tconsole.log('[browser-telemetry] Initialized successfully');\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to initialize:', error);\n\t\t// Reset flag on error so it can retry\n\t\tisInitialized = false;\n\t\t// Don't throw - telemetry should never break the app\n\t}\n}\n\nasync function setupErrorHandlers() {\n\tconst { trace, SpanStatusCode } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('error-handler');\n\n\twindow.addEventListener('error', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.uncaught', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst stackTrace = event.error?.stack || '';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: event.message,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': event.error?.name || 'UncaughtError',\n\t\t\t\t'error.message': event.message,\n\t\t\t\t'error.stack': stackTrace,\n\t\t\t\t'error.filename': event.filename || '',\n\t\t\t\t'error.lineno': event.lineno || 0,\n\t\t\t\t'error.colno': event.colno || 0,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (event.error) {\n\t\t\t\tspan.recordException(event.error);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.error.name,\n\t\t\t\t\t'exception.message': event.error.message,\n\t\t\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Error tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t\tconsole.error(\n\t\t\t'[browser-telemetry] Uncaught error:',\n\t\t\tevent.error || event.message,\n\t\t);\n\t});\n\n\twindow.addEventListener('unhandledrejection', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.unhandled_rejection', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst isError = event.reason instanceof Error;\n\t\t\tconst errorMessage = isError\n\t\t\t\t? event.reason.message\n\t\t\t\t: String(event.reason);\n\t\t\tconst errorStack = isError ? event.reason.stack || '' : '';\n\t\t\tconst errorType = isError ? event.reason.name : 'UnhandledRejection';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessage,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': errorType,\n\t\t\t\t'error.message': errorMessage,\n\t\t\t\t'error.stack': errorStack,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (isError) {\n\t\t\t\tspan.recordException(event.reason);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.reason.name,\n\t\t\t\t\t'exception.message': event.reason.message,\n\t\t\t\t\t'exception.stacktrace': errorStack,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Rejection tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t\tconsole.error('[browser-telemetry] Unhandled rejection:', event.reason);\n\t});\n}\n\nasync function setupWebVitals() {\n\ttry {\n\t\tconst { onLCP, onCLS, onTTFB, onINP } = await import('web-vitals');\n\t\tconst { trace } = await import('@opentelemetry/api');\n\t\tconst tracer = trace.getTracer('web-vitals');\n\n\t\tconst sendToAnalytics = (metric: {\n\t\t\tname: string;\n\t\t\tvalue: number;\n\t\t\trating: string;\n\t\t\tdelta: number;\n\t\t\tid: string;\n\t\t}) => {\n\t\t\ttry {\n\t\t\t\tconst span = tracer.startSpan(`web_vitals.${metric.name}`, {\n\t\t\t\t\tstartTime: Date.now() - metric.value,\n\t\t\t\t});\n\n\t\t\t\tspan.setAttributes({\n\t\t\t\t\t'metric.name': metric.name,\n\t\t\t\t\t'metric.value': metric.value,\n\t\t\t\t\t'metric.rating': metric.rating,\n\t\t\t\t\t'metric.delta': metric.delta,\n\t\t\t\t\t'metric.id': metric.id,\n\t\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t});\n\n\t\t\t\tspan.end();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[browser-telemetry] Web Vitals tracking failed:', error);\n\t\t\t}\n\t\t};\n\n\t\tonLCP(sendToAnalytics);\n\t\tonCLS(sendToAnalytics);\n\t\tonTTFB(sendToAnalytics);\n\t\tonINP(sendToAnalytics);\n\n\t\tconsole.log('[browser-telemetry] Web Vitals tracking enabled');\n\t} catch (error) {\n\t\tconsole.warn('[browser-telemetry] Web Vitals not available:', error);\n\t}\n}\n\n// async function _setupNavigationTiming() {\n// \ttry {\n// \t\tconst { trace } = await import('@opentelemetry/api');\n// \t\tconst tracer = trace.getTracer('navigation');\n\n// \t\t// Wait for page to fully load\n// \t\tif (document.readyState === 'complete') {\n// \t\t\ttrackNavigationTiming(tracer);\n// \t\t} else {\n// \t\t\twindow.addEventListener('load', () => {\n// \t\t\t\t// Small delay to ensure navigation timing is available\n// \t\t\t\tsetTimeout(() => trackNavigationTiming(tracer), 0);\n// \t\t\t});\n// \t\t}\n\n// \t\tconsole.log('[browser-telemetry] Navigation timing tracking enabled');\n// \t} catch (error) {\n// \t\tconsole.warn('[browser-telemetry] Navigation timing not available:', error);\n// \t}\n// }\n\n// function trackNavigationTiming(tracer: any) {\n// \ttry {\n// \t\tconst navigationEntries = performance.getEntriesByType(\n// \t\t\t'navigation',\n// \t\t) as PerformanceNavigationTiming[];\n\n// \t\tif (!navigationEntries || navigationEntries.length === 0) {\n// \t\t\treturn;\n// \t\t}\n\n// \t\tconst nav = navigationEntries[0];\n// \t\tconst span = tracer.startSpan('page.navigation', {\n// \t\t\tstartTime: nav.fetchStart,\n// \t\t});\n\n// \t\tspan.setAttributes({\n// \t\t\t'navigation.type': nav.type,\n// \t\t\t'navigation.redirect_count': nav.redirectCount,\n// \t\t\t// DNS lookup\n// \t\t\t'navigation.dns_duration': nav.domainLookupEnd - nav.domainLookupStart,\n// \t\t\t// TCP connection\n// \t\t\t'navigation.tcp_duration': nav.connectEnd - nav.connectStart,\n// \t\t\t// Request + Response\n// \t\t\t'navigation.request_duration': nav.responseStart - nav.requestStart,\n// \t\t\t'navigation.response_duration': nav.responseEnd - nav.responseStart,\n// \t\t\t// DOM processing\n// \t\t\t'navigation.dom_interactive': nav.domInteractive - nav.fetchStart,\n// \t\t\t'navigation.dom_content_loaded':\n// \t\t\t\tnav.domContentLoadedEventEnd - nav.fetchStart,\n// \t\t\t'navigation.dom_complete': nav.domComplete - nav.fetchStart,\n// \t\t\t// Total load\n// \t\t\t'navigation.load_complete': nav.loadEventEnd - nav.fetchStart,\n// \t\t\t'navigation.duration': nav.duration,\n// \t\t\t// Transfer size\n// \t\t\t'navigation.transfer_size': nav.transferSize,\n// \t\t\t'navigation.encoded_body_size': nav.encodedBodySize,\n// \t\t\t'navigation.decoded_body_size': nav.decodedBodySize,\n// \t\t\t// Context\n// \t\t\t'browser.url': window.location.href,\n// \t\t\t'browser.pathname': window.location.pathname,\n// \t\t});\n\n// \t\tspan.end(nav.loadEventEnd);\n// \t} catch (error) {\n// \t\tconsole.error(\n// \t\t\t'[browser-telemetry] Navigation timing tracking failed:',\n// \t\t\terror,\n// \t\t);\n// \t}\n// }\n\nasync function setupConsoleCapture() {\n\tconst { trace } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('console');\n\n\t// Store reference to current console.error (which might be a test spy)\n\tconst originalError = console.error;\n\n\t// Don't override if it's already been captured (e.g., in tests)\n\tif ((originalError as any).__telemetry_captured__) {\n\t\treturn;\n\t}\n\n\tconst wrappedError = (...args: unknown[]) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.console.error');\n\n\t\t\tspan.setAttributes({\n\t\t\t\t'log.level': 'error',\n\t\t\t\t'log.message': args.map(String).join(' '),\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tspan.end();\n\t\t} catch {\n\t\t\t// Silently fail - don't break console.error\n\t\t}\n\t\toriginalError.apply(console, args);\n\t};\n\n\t// Mark as captured\n\t(wrappedError as any).__telemetry_captured__ = true;\n\tconsole.error = wrappedError;\n}\n\nasync function setupVisibilityTracking() {\n\tconst { trace } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('visibility');\n\n\tdocument.addEventListener('visibilitychange', () => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.visibility_change');\n\n\t\t\tspan.setAttributes({\n\t\t\t\t'visibility.state': document.visibilityState,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tspan.end();\n\t\t} catch {\n\t\t\t// Silently fail - don't break visibility tracking\n\t\t}\n\t});\n}\n\n/**\n * Create a custom span for tracking user interactions\n *\n * @example\n * ```typescript\n * const span = createSpan('user.button_click', { button: 'download' });\n * // ... do something\n * span.end();\n * ```\n */\nexport function createSpan(\n\tname: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n\n\ttry {\n\t\t// Use globalThis cache to avoid repeated imports\n\t\tconst trace =\n\t\t\t(globalThis as any).__OTEL_TRACE__ || require('@opentelemetry/api').trace;\n\t\tif (!(globalThis as any).__OTEL_TRACE__) {\n\t\t\t(globalThis as any).__OTEL_TRACE__ = trace;\n\t\t}\n\t\tconst tracer = trace.getTracer('custom');\n\t\tconst span = tracer.startSpan(name);\n\n\t\tspan.setAttributes({\n\t\t\t...attributes,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t});\n\n\t\treturn span;\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to create span:', error);\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n}\n\n/**\n * Track a custom event\n *\n * @example\n * ```typescript\n * trackEvent('download_click', { platform: 'mac' });\n * ```\n */\nexport function trackEvent(\n\teventName: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst span = createSpan(`custom.${eventName}`, attributes);\n\t\tspan.end();\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to track event:', error);\n\t}\n}\n\n/**\n * Track an error with context\n *\n * @example\n * ```typescript\n * try {\n * // ... something\n * } catch (error) {\n * trackError(error, { action: 'checkout', step: 'payment' });\n * }\n * ```\n */\nexport function trackError(\n\terror: Error,\n\tcontext: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst { trace, SpanStatusCode } = require('@opentelemetry/api');\n\t\tconst tracer = trace.getTracer('error-handler');\n\t\tconst span = tracer.startSpan('browser.error.tracked');\n\n\t\tconst stackTrace = error.stack || '';\n\n\t\tspan.setStatus({\n\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\tmessage: error.message,\n\t\t});\n\n\t\tspan.setAttributes({\n\t\t\terror: true,\n\t\t\t'error.type': error.name,\n\t\t\t'error.message': error.message,\n\t\t\t'error.stack': stackTrace,\n\t\t\t...context,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t});\n\n\t\tspan.recordException(error);\n\n\t\tspan.addEvent('exception', {\n\t\t\t'exception.type': error.name,\n\t\t\t'exception.message': error.message,\n\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t'exception.escaped': 'false',\n\t\t});\n\n\t\tspan.end();\n\t} catch (telemetryError) {\n\t\tconsole.error('[browser-telemetry] Failed to track error:', telemetryError);\n\t}\n}\n\n/**\n * Gracefully shutdown telemetry\n */\nexport async function shutdownTelemetry() {\n\tif (tracerProvider) {\n\t\tawait tracerProvider.shutdown();\n\t\tisInitialized = false;\n\t\tconsole.log('[browser-telemetry] Shut down successfully');\n\t}\n}\n",
6
- "export * from './src/browser';\n",
7
- "import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\n\n// Inline type definition to avoid importing from ./index during SSR bundling\nexport interface BrowserTelemetryOptions {\n\tserviceName?: string;\n\tserviceVersion?: string;\n\totlpEndpoint?: string;\n\tapiKey?: string;\n\tisProduction?: boolean;\n\tenableWebVitals?: boolean;\n\tenableConsoleCapture?: boolean;\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\ninterface TelemetryContextType {\n\tcreateCustomSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackCustomEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackCustomError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\n// No-op implementations for SSR\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n\trecordException: () => {},\n\tend: () => {},\n};\n\nconst noopContext: TelemetryContextType = {\n\tcreateCustomSpan: () => noopSpan,\n\ttrackCustomEvent: () => {},\n\ttrackCustomError: () => {},\n};\n\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\n\n// Type for the telemetry API module\ninterface TelemetryAPI {\n\tinitBrowserTelemetry: (options: BrowserTelemetryOptions) => void;\n\tcreateSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\nexport function TelemetryProvider({\n\tchildren,\n\tserviceName,\n\tserviceVersion,\n\totlpEndpoint,\n\tapiKey,\n\tisProduction,\n\tenableWebVitals,\n\tenableConsoleCapture,\n}: BrowserTelemetryOptions & { children: ReactNode }) {\n\t// All hooks must be called unconditionally (before any early returns)\n\tconst [telemetryReady, setTelemetryReady] = useState(false);\n\tconst [telemetryAPI, setTelemetryAPI] = useState<TelemetryAPI | null>(null);\n\tconst hasInitialized = useRef(false);\n\n\tuseEffect(() => {\n\t\t// Skip initialization on server\n\t\tif (IS_SERVER) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent multiple initializations - only run once per component instance\n\t\tif (hasInitialized.current) {\n\t\t\treturn;\n\t\t}\n\n\t\thasInitialized.current = true;\n\n\t\t// Only load and initialize in browser\n\t\t// Use package path instead of relative path to prevent bundling\n\t\timport('reroute-js/telemetry/browser')\n\t\t\t.then((module) => {\n\t\t\t\tmodule.initBrowserTelemetry({\n\t\t\t\t\tserviceName,\n\t\t\t\t\tserviceVersion,\n\t\t\t\t\totlpEndpoint,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tisProduction,\n\t\t\t\t\tenableWebVitals,\n\t\t\t\t\tenableConsoleCapture,\n\t\t\t\t});\n\t\t\t\tsetTelemetryAPI(module as TelemetryAPI);\n\t\t\t\tsetTelemetryReady(true);\n\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.warn('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t\thasInitialized.current = false; // Reset on error so it can retry\n\t\t\t});\n\t}, [\n\t\tserviceName,\n\t\tserviceVersion,\n\t\totlpEndpoint,\n\t\tapiKey,\n\t\tisProduction,\n\t\tenableWebVitals,\n\t\tenableConsoleCapture,\n\t]);\n\n\tconst contextValue: TelemetryContextType = useMemo(\n\t\t() => ({\n\t\t\tcreateCustomSpan: (\n\t\t\t\tname: string,\n\t\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\treturn telemetryAPI.createSpan(name, attributes);\n\t\t\t\t}\n\t\t\t\treturn noopSpan;\n\t\t\t},\n\t\t\ttrackCustomEvent: (\n\t\t\t\teventName: string,\n\t\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\ttelemetryAPI.trackEvent(eventName, attributes);\n\t\t\t\t}\n\t\t\t},\n\t\t\ttrackCustomError: (\n\t\t\t\terror: Error,\n\t\t\t\tcontext?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\ttelemetryAPI.trackError(error, context);\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t\t[telemetryReady, telemetryAPI],\n\t);\n\n\t// Early return after all hooks have been called\n\t// This prevents browser.js from being imported during server-side rendering\n\tif (IS_SERVER) {\n\t\treturn (\n\t\t\t<TelemetryContext.Provider value={noopContext}>\n\t\t\t\t{children}\n\t\t\t</TelemetryContext.Provider>\n\t\t);\n\t}\n\n\treturn (\n\t\t<TelemetryContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t</TelemetryContext.Provider>\n\t);\n}\n\nexport function useTelemetry() {\n\tconst context = useContext(TelemetryContext);\n\tif (!context) {\n\t\tthrow new Error('useTelemetry must be used within a TelemetryProvider');\n\t}\n\treturn context;\n}\n"
5
+ "import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport type { BrowserTelemetryOptions } from './telemetry';\n\n/**\n * Get browser telemetry config from global (injected during SSR)\n * Falls back to default values if not available\n */\nfunction getBrowserTelemetryConfig(): BrowserTelemetryOptions {\n\tif (typeof window !== 'undefined') {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Global config injection\n\t\tconst globalConfig = (window as any).__REROUTE_TELEMETRY_BROWSER__ as\n\t\t\t| BrowserTelemetryOptions\n\t\t\t| undefined;\n\t\tif (globalConfig) {\n\t\t\treturn globalConfig;\n\t\t}\n\t}\n\treturn {};\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\ninterface TelemetryContextType {\n\tcreateCustomSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackCustomEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackCustomError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\n// No-op implementations for SSR\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n\trecordException: () => {},\n\tend: () => {},\n};\n\nconst noopContext: TelemetryContextType = {\n\tcreateCustomSpan: () => noopSpan,\n\ttrackCustomEvent: () => {},\n\ttrackCustomError: () => {},\n};\n\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\n\n// Type for the telemetry API module\ninterface TelemetryAPI {\n\tinitBrowserTelemetry: (options: BrowserTelemetryOptions) => void;\n\tcreateSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\nexport function TelemetryProvider({\n\tchildren,\n\tenabled,\n\tserviceName,\n\tserviceVersion,\n\totlpEndpoint,\n\tapiKey,\n\tenvironment,\n\tenableConsoleCapture,\n}: BrowserTelemetryOptions & { children: ReactNode }) {\n\t// All hooks must be called unconditionally (before any early returns)\n\tconst [telemetryReady, setTelemetryReady] = useState(false);\n\tconst [telemetryAPI, setTelemetryAPI] = useState<TelemetryAPI | null>(null);\n\tconst hasInitialized = useRef(false);\n\n\t// Merge config from global with props (props take precedence)\n\tconst globalConfig = useMemo(() => getBrowserTelemetryConfig(), []);\n\tconst mergedConfig = useMemo(\n\t\t() => ({\n\t\t\tenabled: enabled ?? globalConfig.enabled ?? false,\n\t\t\tserviceName:\n\t\t\t\tserviceName ?? globalConfig.serviceName ?? 'reroute-app-browser',\n\t\t\tserviceVersion: serviceVersion ?? globalConfig.serviceVersion ?? '1.0.0',\n\t\t\totlpEndpoint:\n\t\t\t\totlpEndpoint ?? globalConfig.otlpEndpoint ?? '/api/telemetry',\n\t\t\tapiKey: apiKey ?? globalConfig.apiKey,\n\t\t\tenvironment: environment ?? globalConfig.environment ?? 'development',\n\t\t\tenableConsoleCapture:\n\t\t\t\tenableConsoleCapture ?? globalConfig.enableConsoleCapture ?? true,\n\t\t}),\n\t\t[\n\t\t\tenabled,\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tenvironment,\n\t\t\tenableConsoleCapture,\n\t\t\tglobalConfig,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\t// Skip initialization on server\n\t\tif (IS_SERVER) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip if browser telemetry is disabled\n\t\tif (!mergedConfig.enabled) {\n\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry disabled');\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent multiple initializations - only run once per component instance\n\t\tif (hasInitialized.current) {\n\t\t\treturn;\n\t\t}\n\n\t\thasInitialized.current = true;\n\n\t\t// Only load and initialize in browser\n\t\t// Use package path instead of relative path to prevent bundling\n\t\timport('reroute-js/telemetry/react')\n\t\t\t.then((module) => {\n\t\t\t\tmodule.initBrowserTelemetry(mergedConfig);\n\t\t\t\tsetTelemetryAPI(module as TelemetryAPI);\n\t\t\t\tsetTelemetryReady(true);\n\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.warn('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t\thasInitialized.current = false; // Reset on error so it can retry\n\t\t\t});\n\t}, [mergedConfig]);\n\n\tconst contextValue: TelemetryContextType = useMemo(\n\t\t() => ({\n\t\t\tcreateCustomSpan: (\n\t\t\t\tname: string,\n\t\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\treturn telemetryAPI.createSpan(name, attributes);\n\t\t\t\t}\n\t\t\t\treturn noopSpan;\n\t\t\t},\n\t\t\ttrackCustomEvent: (\n\t\t\t\teventName: string,\n\t\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\ttelemetryAPI.trackEvent(eventName, attributes);\n\t\t\t\t}\n\t\t\t},\n\t\t\ttrackCustomError: (\n\t\t\t\terror: Error,\n\t\t\t\tcontext?: Record<string, string | number | boolean>,\n\t\t\t) => {\n\t\t\t\tif (telemetryReady && telemetryAPI) {\n\t\t\t\t\ttelemetryAPI.trackError(error, context);\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t\t[telemetryReady, telemetryAPI],\n\t);\n\n\t// Early return after all hooks have been called\n\t// This prevents browser.js from being imported during server-side rendering\n\tif (IS_SERVER) {\n\t\treturn (\n\t\t\t<TelemetryContext.Provider value={noopContext}>\n\t\t\t\t{children}\n\t\t\t</TelemetryContext.Provider>\n\t\t);\n\t}\n\n\treturn (\n\t\t<TelemetryContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t</TelemetryContext.Provider>\n\t);\n}\n\nexport function useTelemetry() {\n\tconst context = useContext(TelemetryContext);\n\tif (!context) {\n\t\tthrow new Error('useTelemetry must be used within a TelemetryProvider');\n\t}\n\treturn context;\n}\n",
6
+ "/** biome-ignore-all lint/suspicious/noExplicitAny: That's fine */\nexport interface 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 '/api/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\nconst IS_SERVER = typeof window === 'undefined';\n\nlet isInitialized = false;\nlet tracerProvider: any = null;\n\n/**\n * Initialize browser telemetry\n * Call this once when your app starts (usually in a React provider)\n *\n * @example\n * ```typescript\n * import { initBrowserTelemetry } from 'reroute-js/telemetry/react';\n *\n * initBrowserTelemetry({\n * serviceName: 'My App Browser',\n * otlpEndpoint: '/api/telemetry', // Same-origin proxy\n * environment: 'production',\n * });\n * ```\n */\nexport async function initBrowserTelemetry(\n\toptions: BrowserTelemetryOptions = {},\n) {\n\tif (IS_SERVER || isInitialized) {\n\t\treturn;\n\t}\n\n\t// Mark as initialized immediately to prevent race conditions\n\tisInitialized = true;\n\n\ttry {\n\t\t// Lazy load OpenTelemetry modules to prevent SSR execution\n\t\tconst [\n\t\t\t{ getWebAutoInstrumentations },\n\t\t\t{ ZoneContextManager },\n\t\t\t{ OTLPTraceExporter },\n\t\t\t{ registerInstrumentations },\n\t\t\t{ resourceFromAttributes },\n\t\t\t{ BatchSpanProcessor },\n\t\t\t{ WebTracerProvider },\n\t\t\t{ ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION },\n\t\t] = await Promise.all([\n\t\t\timport('@opentelemetry/auto-instrumentations-web'),\n\t\t\timport('@opentelemetry/context-zone'),\n\t\t\timport('@opentelemetry/exporter-trace-otlp-http'),\n\t\t\timport('@opentelemetry/instrumentation'),\n\t\t\timport('@opentelemetry/resources'),\n\t\t\timport('@opentelemetry/sdk-trace-base'),\n\t\t\timport('@opentelemetry/sdk-trace-web'),\n\t\t\timport('@opentelemetry/semantic-conventions'),\n\t\t]);\n\n\t\tconst env =\n\t\t\ttypeof import.meta !== 'undefined' ? import.meta.env : undefined;\n\n\t\tconst SERVICE_NAME = options.serviceName || 'reroute-app-browser';\n\t\tconst SERVICE_VERSION = options.serviceVersion || '1.0.0';\n\t\tconst OTLP_ENDPOINT = options.otlpEndpoint || '/api/telemetry';\n\t\tconst ENVIRONMENT = options.environment || env?.MODE || 'development';\n\t\tconst ENABLE_CONSOLE_CAPTURE = options.enableConsoleCapture ?? true;\n\n\t\tconsole.log(\n\t\t\t`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`,\n\t\t);\n\n\t\t// Configure OTLP exporter\n\t\tconst headers: Record<string, string> = {};\n\t\tconst apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;\n\t\tif (apiKey) {\n\t\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t\t}\n\n\t\tconst exporter = new OTLPTraceExporter({\n\t\t\turl: `${OTLP_ENDPOINT}/v1/traces`,\n\t\t\theaders: Object.keys(headers).length > 0 ? headers : undefined,\n\t\t});\n\n\t\t// Create resource\n\t\tconst resource = resourceFromAttributes({\n\t\t\t[ATTR_SERVICE_NAME]: SERVICE_NAME,\n\t\t\t[ATTR_SERVICE_VERSION]: SERVICE_VERSION,\n\t\t\t'deployment.environment': ENVIRONMENT,\n\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t'browser.language': navigator.language,\n\t\t\t'browser.platform': navigator.platform,\n\t\t\t'screen.width': window.screen.width,\n\t\t\t'screen.height': window.screen.height,\n\t\t});\n\n\t\t// Create span processor\n\t\tconst spanProcessor = new BatchSpanProcessor(exporter, {\n\t\t\tmaxQueueSize: 100,\n\t\t\tmaxExportBatchSize: 10,\n\t\t\tscheduledDelayMillis: 500,\n\t\t});\n\n\t\t// Create tracer provider\n\t\ttracerProvider = new WebTracerProvider({\n\t\t\tresource,\n\t\t\tspanProcessors: [spanProcessor],\n\t\t});\n\n\t\ttracerProvider.register({\n\t\t\tcontextManager: new ZoneContextManager(),\n\t\t});\n\n\t\t// Auto-instrument browser APIs (minimal - only fetch/xhr for distributed tracing)\n\t\tregisterInstrumentations({\n\t\t\tinstrumentations: [\n\t\t\t\tgetWebAutoInstrumentations({\n\t\t\t\t\t'@opentelemetry/instrumentation-document-load': {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-user-interaction': {\n\t\t\t\t\t\tenabled: false, // Disabled - too noisy, clicks should be tracked manually if needed\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-fetch': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-xml-http-request': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\n\t\t// Setup error handlers (async but don't await - let them set up in background)\n\t\tsetupErrorHandlers().catch((err) =>\n\t\t\tconsole.error('[browser-telemetry] Error handler setup failed:', err),\n\t\t);\n\n\t\t// Setup console capture (async but don't await)\n\t\tif (ENABLE_CONSOLE_CAPTURE) {\n\t\t\tsetupConsoleCapture().catch((err) =>\n\t\t\t\tconsole.error('[browser-telemetry] Console capture setup failed:', err),\n\t\t\t);\n\t\t}\n\n\t\tconsole.log('[browser-telemetry] Initialized successfully');\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to initialize:', error);\n\t\t// Reset flag on error so it can retry\n\t\tisInitialized = false;\n\t\t// Don't throw - telemetry should never break the app\n\t}\n}\n\nasync function setupErrorHandlers() {\n\tconst { trace, SpanStatusCode } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('error-handler');\n\n\twindow.addEventListener('error', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.uncaught', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst stackTrace = event.error?.stack || '';\n\t\t\tconst errorMessage =\n\t\t\t\tevent.message || event.error?.message || 'Unknown error';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessage,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': event.error?.name || 'UncaughtError',\n\t\t\t\t'error.message': errorMessage,\n\t\t\t\t'error.stack': stackTrace,\n\t\t\t\t// Include source location info for better debugging\n\t\t\t\t'error.filename': event.filename || '',\n\t\t\t\t'error.lineno': event.lineno || 0,\n\t\t\t\t'error.colno': event.colno || 0,\n\t\t\t\t// Browser context\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (event.error) {\n\t\t\t\tspan.recordException(event.error);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.error.name,\n\t\t\t\t\t'exception.message': event.error.message,\n\t\t\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\n\t\t\t// Log to console for development visibility\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Uncaught error:',\n\t\t\t\tevent.error || event.message,\n\t\t\t);\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Error tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t});\n\n\twindow.addEventListener('unhandledrejection', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.unhandled_rejection', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst isError = event.reason instanceof Error;\n\t\t\tconst errorMessage = isError\n\t\t\t\t? event.reason.message\n\t\t\t\t: String(event.reason);\n\t\t\tconst errorStack = isError ? event.reason.stack || '' : '';\n\t\t\tconst errorType = isError ? event.reason.name : 'UnhandledRejection';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessage,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': errorType,\n\t\t\t\t'error.message': errorMessage,\n\t\t\t\t'error.stack': errorStack,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (isError) {\n\t\t\t\tspan.recordException(event.reason);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.reason.name,\n\t\t\t\t\t'exception.message': event.reason.message,\n\t\t\t\t\t'exception.stacktrace': errorStack,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Rejection tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t\tconsole.error('[browser-telemetry] Unhandled rejection:', event.reason);\n\t});\n}\n\n// async function _setupNavigationTiming() {\n// \ttry {\n// \t\tconst { trace } = await import('@opentelemetry/api');\n// \t\tconst tracer = trace.getTracer('navigation');\n\n// \t\t// Wait for page to fully load\n// \t\tif (document.readyState === 'complete') {\n// \t\t\ttrackNavigationTiming(tracer);\n// \t\t} else {\n// \t\t\twindow.addEventListener('load', () => {\n// \t\t\t\t// Small delay to ensure navigation timing is available\n// \t\t\t\tsetTimeout(() => trackNavigationTiming(tracer), 0);\n// \t\t\t});\n// \t\t}\n\n// \t\tconsole.log('[browser-telemetry] Navigation timing tracking enabled');\n// \t} catch (error) {\n// \t\tconsole.warn('[browser-telemetry] Navigation timing not available:', error);\n// \t}\n// }\n\n// function trackNavigationTiming(tracer: any) {\n// \ttry {\n// \t\tconst navigationEntries = performance.getEntriesByType(\n// \t\t\t'navigation',\n// \t\t) as PerformanceNavigationTiming[];\n\n// \t\tif (!navigationEntries || navigationEntries.length === 0) {\n// \t\t\treturn;\n// \t\t}\n\n// \t\tconst nav = navigationEntries[0];\n// \t\tconst span = tracer.startSpan('page.navigation', {\n// \t\t\tstartTime: nav.fetchStart,\n// \t\t});\n\n// \t\tspan.setAttributes({\n// \t\t\t'navigation.type': nav.type,\n// \t\t\t'navigation.redirect_count': nav.redirectCount,\n// \t\t\t// DNS lookup\n// \t\t\t'navigation.dns_duration': nav.domainLookupEnd - nav.domainLookupStart,\n// \t\t\t// TCP connection\n// \t\t\t'navigation.tcp_duration': nav.connectEnd - nav.connectStart,\n// \t\t\t// Request + Response\n// \t\t\t'navigation.request_duration': nav.responseStart - nav.requestStart,\n// \t\t\t'navigation.response_duration': nav.responseEnd - nav.responseStart,\n// \t\t\t// DOM processing\n// \t\t\t'navigation.dom_interactive': nav.domInteractive - nav.fetchStart,\n// \t\t\t'navigation.dom_content_loaded':\n// \t\t\t\tnav.domContentLoadedEventEnd - nav.fetchStart,\n// \t\t\t'navigation.dom_complete': nav.domComplete - nav.fetchStart,\n// \t\t\t// Total load\n// \t\t\t'navigation.load_complete': nav.loadEventEnd - nav.fetchStart,\n// \t\t\t'navigation.duration': nav.duration,\n// \t\t\t// Transfer size\n// \t\t\t'navigation.transfer_size': nav.transferSize,\n// \t\t\t'navigation.encoded_body_size': nav.encodedBodySize,\n// \t\t\t'navigation.decoded_body_size': nav.decodedBodySize,\n// \t\t\t// Context\n// \t\t\t'browser.url': window.location.href,\n// \t\t\t'browser.pathname': window.location.pathname,\n// \t\t});\n\n// \t\tspan.end(nav.loadEventEnd);\n// \t} catch (error) {\n// \t\tconsole.error(\n// \t\t\t'[browser-telemetry] Navigation timing tracking failed:',\n// \t\t\terror,\n// \t\t);\n// \t}\n// }\n\nasync function setupConsoleCapture() {\n\tconst { trace } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('console');\n\n\t// Store reference to current console.error (which might be a test spy)\n\tconst originalError = console.error;\n\n\t// Don't override if it's already been captured (e.g., in tests)\n\tif ((originalError as any).__telemetry_captured__) {\n\t\treturn;\n\t}\n\n\tconst wrappedError = (...args: unknown[]) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.console.error');\n\n\t\t\tspan.setAttributes({\n\t\t\t\t'log.level': 'error',\n\t\t\t\t'log.message': args.map(String).join(' '),\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tspan.end();\n\t\t} catch {\n\t\t\t// Silently fail - don't break console.error\n\t\t}\n\t\toriginalError.apply(console, args);\n\t};\n\n\t// Mark as captured\n\t(wrappedError as any).__telemetry_captured__ = true;\n\tconsole.error = wrappedError;\n}\n\n/**\n * Create a custom span for tracking user interactions\n *\n * @example\n * ```typescript\n * const span = createSpan('user.button_click', { button: 'download' });\n * // ... do something\n * span.end();\n * ```\n */\nexport function createSpan(\n\tname: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n\n\ttry {\n\t\t// Use globalThis cache to avoid repeated imports\n\t\tconst trace =\n\t\t\t(globalThis as any).__OTEL_TRACE__ || require('@opentelemetry/api').trace;\n\t\tif (!(globalThis as any).__OTEL_TRACE__) {\n\t\t\t(globalThis as any).__OTEL_TRACE__ = trace;\n\t\t}\n\t\tconst tracer = trace.getTracer('custom');\n\t\tconst span = tracer.startSpan(name);\n\n\t\tspan.setAttributes({\n\t\t\t...attributes,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t});\n\n\t\treturn span;\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to create span:', error);\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n}\n\n/**\n * Track a custom event\n *\n * @example\n * ```typescript\n * trackEvent('download_click', { platform: 'mac' });\n * ```\n */\nexport function trackEvent(\n\teventName: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst span = createSpan(`custom.${eventName}`, attributes);\n\t\tspan.end();\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to track event:', error);\n\t}\n}\n\n/**\n * Track an error with context\n *\n * @example\n * ```typescript\n * try {\n * // ... something\n * } catch (error) {\n * trackError(error, { action: 'checkout', step: 'payment' });\n * }\n * ```\n */\nexport function trackError(\n\terror: Error,\n\tcontext: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst { trace, SpanStatusCode } = require('@opentelemetry/api');\n\t\tconst tracer = trace.getTracer('error-handler');\n\t\tconst span = tracer.startSpan('browser.error.tracked');\n\n\t\tconst stackTrace = error.stack || '';\n\n\t\tspan.setStatus({\n\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\tmessage: error.message,\n\t\t});\n\n\t\tspan.setAttributes({\n\t\t\terror: true,\n\t\t\t'error.type': error.name,\n\t\t\t'error.message': error.message,\n\t\t\t'error.stack': stackTrace,\n\t\t\t...context,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t});\n\n\t\tspan.recordException(error);\n\n\t\tspan.addEvent('exception', {\n\t\t\t'exception.type': error.name,\n\t\t\t'exception.message': error.message,\n\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t'exception.escaped': 'false',\n\t\t});\n\n\t\tspan.end();\n\t} catch (telemetryError) {\n\t\tconsole.error('[browser-telemetry] Failed to track error:', telemetryError);\n\t}\n}\n\n/**\n * Gracefully shutdown telemetry\n */\nexport async function shutdownTelemetry() {\n\tif (tracerProvider) {\n\t\tawait tracerProvider.shutdown();\n\t\tisInitialized = false;\n\t\tconsole.log('[browser-telemetry] Shut down successfully');\n\t}\n}\n",
7
+ "export * from './api';\nexport * from './telemetry';\n",
8
+ "export * from './src/react';\n"
8
9
  ],
9
- "mappings": "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",
10
- "debugId": "C843EFC48F27753D64756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "E831C84DE6E18F0364756E2164756E21",
11
12
  "names": []
12
13
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.25.3
2
+ * reroute-js v0.26.1
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -8,4 +8,4 @@
8
8
  * Built with Bun <3
9
9
  */
10
10
  export * from './src/server';
11
- //# sourceMappingURL=index.d.ts.map
11
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../packages/telemetry/server.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}