reroute-js 0.22.3 → 0.22.5

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 (172) hide show
  1. package/cli/bin.d.ts +1 -1
  2. package/cli/bin.js +6 -6
  3. package/cli/bin.js.map +1 -1
  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 +2 -2
  35. package/core/index.js.map +1 -1
  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 +1 -1
  39. package/core/src/content/discovery.d.ts +1 -1
  40. package/core/src/content/index.d.ts +1 -1
  41. package/core/src/content/metadata.d.ts +1 -1
  42. package/core/src/index.d.ts +1 -1
  43. package/core/src/llms/extractor.d.ts +1 -1
  44. package/core/src/llms/formatter.d.ts +1 -1
  45. package/core/src/llms/full-generator.d.ts +1 -1
  46. package/core/src/llms/index-generator.d.ts +1 -1
  47. package/core/src/llms/index.d.ts +1 -1
  48. package/core/src/og/discovery.d.ts +1 -1
  49. package/core/src/og/index.d.ts +1 -1
  50. package/core/src/og/meta.d.ts +1 -1
  51. package/core/src/og/render.d.ts +1 -1
  52. package/core/src/og/types.d.ts +1 -1
  53. package/core/src/robots/discovery.d.ts +1 -1
  54. package/core/src/robots/generator.d.ts +1 -1
  55. package/core/src/robots/index.d.ts +1 -1
  56. package/core/src/robots/policies.d.ts +1 -1
  57. package/core/src/rss/discovery.d.ts +1 -1
  58. package/core/src/rss/generator.d.ts +1 -1
  59. package/core/src/rss/index.d.ts +1 -1
  60. package/core/src/sitemap/discovery.d.ts +1 -1
  61. package/core/src/sitemap/generator.d.ts +1 -1
  62. package/core/src/sitemap/index.d.ts +1 -1
  63. package/core/src/ssr/index.d.ts +1 -1
  64. package/core/src/ssr/lib/cache.d.ts +1 -1
  65. package/core/src/ssr/lib/collections.d.ts +1 -1
  66. package/core/src/ssr/lib/compression.d.ts +1 -1
  67. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  68. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  69. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  70. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  71. package/core/src/ssr/lib/data.d.ts +1 -1
  72. package/core/src/ssr/lib/html.d.ts +1 -1
  73. package/core/src/ssr/lib/imports.d.ts +1 -1
  74. package/core/src/ssr/lib/index.d.ts +1 -1
  75. package/core/src/ssr/lib/layouts.d.ts +1 -1
  76. package/core/src/ssr/lib/metadata.d.ts +1 -1
  77. package/core/src/ssr/lib/mime.d.ts +1 -1
  78. package/core/src/ssr/lib/modules.d.ts +1 -1
  79. package/core/src/ssr/lib/path.d.ts +1 -1
  80. package/core/src/ssr/lib/preload.d.ts +1 -1
  81. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  82. package/core/src/ssr/lib/scripts/data.d.ts +1 -1
  83. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  84. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  85. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  86. package/core/src/ssr/lib/seed.d.ts +1 -1
  87. package/core/src/ssr/lib/setup.d.ts +1 -1
  88. package/core/src/ssr/lib/styles.d.ts +1 -1
  89. package/core/src/ssr/lib/template.d.ts +1 -1
  90. package/core/src/ssr/lib/types.d.ts +1 -1
  91. package/core/src/ssr/render.d.ts +1 -1
  92. package/core/src/ssr/stream.d.ts +1 -1
  93. package/elysia/index.d.ts +1 -1
  94. package/elysia/index.js +2 -2
  95. package/elysia/index.js.map +1 -1
  96. package/elysia/src/index.d.ts +1 -1
  97. package/elysia/src/libs/assets.d.ts +1 -1
  98. package/elysia/src/libs/cache.d.ts +1 -1
  99. package/elysia/src/libs/caching.d.ts +1 -1
  100. package/elysia/src/libs/http.d.ts +1 -1
  101. package/elysia/src/libs/image.d.ts +1 -1
  102. package/elysia/src/libs/index.d.ts +1 -1
  103. package/elysia/src/libs/llms.d.ts +1 -1
  104. package/elysia/src/libs/response.d.ts +1 -1
  105. package/elysia/src/libs/serving.d.ts +1 -1
  106. package/elysia/src/plugin.d.ts +1 -1
  107. package/elysia/src/routes/artifacts.d.ts +1 -1
  108. package/elysia/src/routes/content.d.ts +1 -1
  109. package/elysia/src/routes/image.d.ts +1 -1
  110. package/elysia/src/routes/index.d.ts +1 -1
  111. package/elysia/src/routes/internal.d.ts +1 -1
  112. package/elysia/src/routes/llms.d.ts +1 -1
  113. package/elysia/src/routes/og.d.ts +1 -1
  114. package/elysia/src/routes/redirects.d.ts +1 -1
  115. package/elysia/src/routes/robots.d.ts +1 -1
  116. package/elysia/src/routes/rss.d.ts +1 -1
  117. package/elysia/src/routes/search.d.ts +1 -1
  118. package/elysia/src/routes/sitemap.d.ts +1 -1
  119. package/elysia/src/routes/ssr.d.ts +1 -1
  120. package/elysia/src/routes/static.d.ts +1 -1
  121. package/elysia/src/types.d.ts +1 -1
  122. package/package.json +1 -1
  123. package/react/index.d.ts +1 -1
  124. package/react/index.js +2 -2
  125. package/react/index.js.map +1 -1
  126. package/react/src/components/ClientOnly.d.ts +1 -1
  127. package/react/src/components/ContentRoute.d.ts +1 -1
  128. package/react/src/components/Image.d.ts +1 -1
  129. package/react/src/components/LazyRoute.d.ts +1 -1
  130. package/react/src/components/Link.d.ts +1 -1
  131. package/react/src/components/Markdown.d.ts +1 -1
  132. package/react/src/components/Outlet.d.ts +1 -1
  133. package/react/src/components/index.d.ts +1 -1
  134. package/react/src/hooks/index.d.ts +1 -1
  135. package/react/src/hooks/useContent.d.ts +1 -1
  136. package/react/src/hooks/useData.d.ts +1 -1
  137. package/react/src/hooks/useFeed.d.ts +1 -1
  138. package/react/src/hooks/useLayoutData.d.ts +1 -1
  139. package/react/src/hooks/useLlms.d.ts +1 -1
  140. package/react/src/hooks/useNavigate.d.ts +1 -1
  141. package/react/src/hooks/useParams.d.ts +1 -1
  142. package/react/src/hooks/useRouter.d.ts +1 -1
  143. package/react/src/hooks/useSearch.d.ts +1 -1
  144. package/react/src/hooks/useSearchParams.d.ts +1 -1
  145. package/react/src/hooks/useToc.d.ts +1 -1
  146. package/react/src/index.d.ts +1 -1
  147. package/react/src/lib/collection.d.ts +1 -1
  148. package/react/src/lib/content.d.ts +1 -1
  149. package/react/src/lib/head.d.ts +1 -1
  150. package/react/src/lib/index.d.ts +1 -1
  151. package/react/src/lib/lazy-route.d.ts +1 -1
  152. package/react/src/lib/route-loader.d.ts +1 -1
  153. package/react/src/providers/ContentProvider.d.ts +1 -1
  154. package/react/src/providers/RerouteProvider.d.ts +1 -1
  155. package/react/src/providers/RouterProvider.d.ts +1 -1
  156. package/react/src/providers/index.d.ts +1 -1
  157. package/react/src/types/any.d.ts +1 -1
  158. package/react/src/types/index.d.ts +1 -1
  159. package/react/src/types/router.d.ts +1 -1
  160. package/telemetry/browser.d.ts +1 -1
  161. package/telemetry/browser.js +27 -5
  162. package/telemetry/browser.js.map +5 -4
  163. package/telemetry/index.d.ts +1 -1
  164. package/telemetry/index.js +2 -2
  165. package/telemetry/index.js.map +1 -1
  166. package/telemetry/react.d.ts +1 -1
  167. package/telemetry/react.js +373 -27
  168. package/telemetry/react.js.map +5 -4
  169. package/telemetry/src/browser/index.d.ts +1 -1
  170. package/telemetry/src/browser/react.d.ts +1 -1
  171. package/telemetry/src/browser/react.d.ts.map +1 -1
  172. package/telemetry/src/server/index.d.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.22.3
2
+ * reroute-js v0.22.5
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -23,6 +23,16 @@ var __toESM = (mod, isNodeMode, target) => {
23
23
  });
24
24
  return to;
25
25
  };
26
+ var __export = (target, all) => {
27
+ for (var name in all)
28
+ __defProp(target, name, {
29
+ get: all[name],
30
+ enumerable: true,
31
+ configurable: true,
32
+ set: (newValue) => all[name] = () => newValue
33
+ });
34
+ };
35
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
26
36
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
27
37
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
28
38
  }) : x)(function(x) {
@@ -31,6 +41,335 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
31
41
  throw Error('Dynamic require of "' + x + '" is not supported');
32
42
  });
33
43
 
44
+ // packages/telemetry/src/browser/index.ts
45
+ var exports_browser = {};
46
+ __export(exports_browser, {
47
+ trackEvent: () => trackEvent,
48
+ trackError: () => trackError,
49
+ shutdownTelemetry: () => shutdownTelemetry,
50
+ initBrowserTelemetry: () => initBrowserTelemetry,
51
+ createSpan: () => createSpan
52
+ });
53
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
54
+ import { getWebAutoInstrumentations } from "@opentelemetry/auto-instrumentations-web";
55
+ import { ZoneContextManager } from "@opentelemetry/context-zone";
56
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
57
+ import { registerInstrumentations } from "@opentelemetry/instrumentation";
58
+ import { resourceFromAttributes } from "@opentelemetry/resources";
59
+ import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
60
+ import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
61
+ import {
62
+ ATTR_SERVICE_NAME,
63
+ ATTR_SERVICE_VERSION
64
+ } from "@opentelemetry/semantic-conventions";
65
+ function initBrowserTelemetry(options = {}) {
66
+ if (IS_SERVER || isInitialized) {
67
+ return;
68
+ }
69
+ try {
70
+ const env = typeof import.meta !== "undefined" ? import.meta.env : undefined;
71
+ const SERVICE_NAME = options.serviceName || "reroute-app-browser";
72
+ const SERVICE_VERSION = options.serviceVersion || "1.0.0";
73
+ const OTLP_ENDPOINT = options.otlpEndpoint || "/api/telemetry";
74
+ const IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;
75
+ const ENABLE_WEB_VITALS = options.enableWebVitals ?? true;
76
+ const ENABLE_CONSOLE_CAPTURE = options.enableConsoleCapture ?? IS_PRODUCTION;
77
+ console.log(`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
78
+ const headers = {};
79
+ const apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;
80
+ if (apiKey) {
81
+ headers.Authorization = `Bearer ${apiKey}`;
82
+ }
83
+ const exporter = new OTLPTraceExporter({
84
+ url: `${OTLP_ENDPOINT}/v1/traces`,
85
+ headers: Object.keys(headers).length > 0 ? headers : undefined
86
+ });
87
+ const resource = resourceFromAttributes({
88
+ [ATTR_SERVICE_NAME]: SERVICE_NAME,
89
+ [ATTR_SERVICE_VERSION]: SERVICE_VERSION,
90
+ "deployment.environment": IS_PRODUCTION ? "production" : "development",
91
+ "browser.user_agent": navigator.userAgent,
92
+ "browser.language": navigator.language,
93
+ "browser.platform": navigator.platform,
94
+ "screen.width": window.screen.width,
95
+ "screen.height": window.screen.height
96
+ });
97
+ const spanProcessor = new BatchSpanProcessor(exporter, {
98
+ maxQueueSize: 100,
99
+ maxExportBatchSize: 10,
100
+ scheduledDelayMillis: 500
101
+ });
102
+ tracerProvider = new WebTracerProvider({
103
+ resource,
104
+ spanProcessors: [spanProcessor]
105
+ });
106
+ tracerProvider.register({
107
+ contextManager: new ZoneContextManager
108
+ });
109
+ registerInstrumentations({
110
+ instrumentations: [
111
+ getWebAutoInstrumentations({
112
+ "@opentelemetry/instrumentation-document-load": {
113
+ enabled: true
114
+ },
115
+ "@opentelemetry/instrumentation-user-interaction": {
116
+ enabled: true,
117
+ eventNames: ["click", "submit"]
118
+ },
119
+ "@opentelemetry/instrumentation-fetch": {
120
+ enabled: true,
121
+ propagateTraceHeaderCorsUrls: [/.*/],
122
+ clearTimingResources: true
123
+ },
124
+ "@opentelemetry/instrumentation-xml-http-request": {
125
+ enabled: true,
126
+ propagateTraceHeaderCorsUrls: [/.*/],
127
+ clearTimingResources: true
128
+ }
129
+ })
130
+ ]
131
+ });
132
+ setupErrorHandlers();
133
+ if (ENABLE_WEB_VITALS) {
134
+ setupWebVitals();
135
+ }
136
+ if (ENABLE_CONSOLE_CAPTURE) {
137
+ setupConsoleCapture();
138
+ }
139
+ setupVisibilityTracking();
140
+ isInitialized = true;
141
+ console.log("[browser-telemetry] Initialized successfully");
142
+ } catch (error) {
143
+ console.error("[browser-telemetry] Failed to initialize:", error);
144
+ }
145
+ }
146
+ function setupErrorHandlers() {
147
+ const tracer = trace.getTracer("error-handler");
148
+ window.addEventListener("error", (event) => {
149
+ try {
150
+ const span = tracer.startSpan("browser.error.uncaught", {
151
+ startTime: Date.now()
152
+ });
153
+ const stackTrace = event.error?.stack || "";
154
+ span.setStatus({
155
+ code: SpanStatusCode.ERROR,
156
+ message: event.message
157
+ });
158
+ span.setAttributes({
159
+ error: true,
160
+ "error.type": event.error?.name || "UncaughtError",
161
+ "error.message": event.message,
162
+ "error.stack": stackTrace,
163
+ "error.filename": event.filename || "",
164
+ "error.lineno": event.lineno || 0,
165
+ "error.colno": event.colno || 0,
166
+ "browser.url": window.location.href,
167
+ "browser.pathname": window.location.pathname,
168
+ "browser.user_agent": navigator.userAgent,
169
+ "browser.timestamp": new Date().toISOString()
170
+ });
171
+ if (event.error) {
172
+ span.recordException(event.error);
173
+ span.addEvent("exception", {
174
+ "exception.type": event.error.name,
175
+ "exception.message": event.error.message,
176
+ "exception.stacktrace": stackTrace,
177
+ "exception.escaped": "false"
178
+ });
179
+ }
180
+ span.end();
181
+ } catch (telemetryError) {
182
+ console.error("[browser-telemetry] Error tracking failed:", telemetryError);
183
+ }
184
+ console.error("[browser-telemetry] Uncaught error:", event.error || event.message);
185
+ });
186
+ window.addEventListener("unhandledrejection", (event) => {
187
+ try {
188
+ const span = tracer.startSpan("browser.error.unhandled_rejection", {
189
+ startTime: Date.now()
190
+ });
191
+ const isError = event.reason instanceof Error;
192
+ const errorMessage = isError ? event.reason.message : String(event.reason);
193
+ const errorStack = isError ? event.reason.stack || "" : "";
194
+ const errorType = isError ? event.reason.name : "UnhandledRejection";
195
+ span.setStatus({
196
+ code: SpanStatusCode.ERROR,
197
+ message: errorMessage
198
+ });
199
+ span.setAttributes({
200
+ error: true,
201
+ "error.type": errorType,
202
+ "error.message": errorMessage,
203
+ "error.stack": errorStack,
204
+ "browser.url": window.location.href,
205
+ "browser.pathname": window.location.pathname,
206
+ "browser.user_agent": navigator.userAgent,
207
+ "browser.timestamp": new Date().toISOString()
208
+ });
209
+ if (isError) {
210
+ span.recordException(event.reason);
211
+ span.addEvent("exception", {
212
+ "exception.type": event.reason.name,
213
+ "exception.message": event.reason.message,
214
+ "exception.stacktrace": errorStack,
215
+ "exception.escaped": "false"
216
+ });
217
+ }
218
+ span.end();
219
+ } catch (telemetryError) {
220
+ console.error("[browser-telemetry] Rejection tracking failed:", telemetryError);
221
+ }
222
+ console.error("[browser-telemetry] Unhandled rejection:", event.reason);
223
+ });
224
+ }
225
+ async function setupWebVitals() {
226
+ try {
227
+ const { onLCP, onCLS, onTTFB, onINP } = await import("web-vitals");
228
+ const tracer = trace.getTracer("web-vitals");
229
+ const sendToAnalytics = (metric) => {
230
+ try {
231
+ const span = tracer.startSpan(`web_vitals.${metric.name}`, {
232
+ startTime: Date.now() - metric.value
233
+ });
234
+ span.setAttributes({
235
+ "metric.name": metric.name,
236
+ "metric.value": metric.value,
237
+ "metric.rating": metric.rating,
238
+ "metric.delta": metric.delta,
239
+ "metric.id": metric.id,
240
+ "browser.url": window.location.href,
241
+ "browser.pathname": window.location.pathname
242
+ });
243
+ span.end();
244
+ } catch (error) {
245
+ console.error("[browser-telemetry] Web Vitals tracking failed:", error);
246
+ }
247
+ };
248
+ onLCP(sendToAnalytics);
249
+ onCLS(sendToAnalytics);
250
+ onTTFB(sendToAnalytics);
251
+ onINP(sendToAnalytics);
252
+ console.log("[browser-telemetry] Web Vitals tracking enabled");
253
+ } catch (error) {
254
+ console.warn("[browser-telemetry] Web Vitals not available:", error);
255
+ }
256
+ }
257
+ function setupConsoleCapture() {
258
+ const tracer = trace.getTracer("console");
259
+ const originalError = console.error;
260
+ console.error = (...args) => {
261
+ try {
262
+ const span = tracer.startSpan("browser.console.error");
263
+ span.setAttributes({
264
+ "log.level": "error",
265
+ "log.message": args.map(String).join(" "),
266
+ "browser.url": window.location.href,
267
+ "browser.timestamp": new Date().toISOString()
268
+ });
269
+ span.end();
270
+ } catch {}
271
+ originalError.apply(console, args);
272
+ };
273
+ }
274
+ function setupVisibilityTracking() {
275
+ const tracer = trace.getTracer("visibility");
276
+ document.addEventListener("visibilitychange", () => {
277
+ try {
278
+ const span = tracer.startSpan("browser.visibility_change");
279
+ span.setAttributes({
280
+ "visibility.state": document.visibilityState,
281
+ "browser.url": window.location.href,
282
+ "browser.timestamp": new Date().toISOString()
283
+ });
284
+ span.end();
285
+ } catch {}
286
+ });
287
+ }
288
+ function createSpan(name, attributes = {}) {
289
+ if (IS_SERVER || !isInitialized) {
290
+ return {
291
+ setAttributes: () => {},
292
+ setStatus: () => {},
293
+ recordException: () => {},
294
+ end: () => {}
295
+ };
296
+ }
297
+ try {
298
+ const tracer = trace.getTracer("custom");
299
+ const span = tracer.startSpan(name);
300
+ span.setAttributes({
301
+ ...attributes,
302
+ "browser.url": window.location.href,
303
+ "browser.pathname": window.location.pathname
304
+ });
305
+ return span;
306
+ } catch (error) {
307
+ console.error("[browser-telemetry] Failed to create span:", error);
308
+ return {
309
+ setAttributes: () => {},
310
+ setStatus: () => {},
311
+ recordException: () => {},
312
+ end: () => {}
313
+ };
314
+ }
315
+ }
316
+ function trackEvent(eventName, attributes = {}) {
317
+ if (IS_SERVER || !isInitialized) {
318
+ return;
319
+ }
320
+ try {
321
+ const span = createSpan(`custom.${eventName}`, attributes);
322
+ span.end();
323
+ } catch (error) {
324
+ console.error("[browser-telemetry] Failed to track event:", error);
325
+ }
326
+ }
327
+ function trackError(error, context = {}) {
328
+ if (IS_SERVER || !isInitialized) {
329
+ return;
330
+ }
331
+ try {
332
+ const tracer = trace.getTracer("error-handler");
333
+ const span = tracer.startSpan("browser.error.tracked");
334
+ const stackTrace = error.stack || "";
335
+ span.setStatus({
336
+ code: SpanStatusCode.ERROR,
337
+ message: error.message
338
+ });
339
+ span.setAttributes({
340
+ error: true,
341
+ "error.type": error.name,
342
+ "error.message": error.message,
343
+ "error.stack": stackTrace,
344
+ ...context,
345
+ "browser.url": window.location.href,
346
+ "browser.pathname": window.location.pathname,
347
+ "browser.timestamp": new Date().toISOString()
348
+ });
349
+ span.recordException(error);
350
+ span.addEvent("exception", {
351
+ "exception.type": error.name,
352
+ "exception.message": error.message,
353
+ "exception.stacktrace": stackTrace,
354
+ "exception.escaped": "false"
355
+ });
356
+ span.end();
357
+ } catch (telemetryError) {
358
+ console.error("[browser-telemetry] Failed to track error:", telemetryError);
359
+ }
360
+ }
361
+ async function shutdownTelemetry() {
362
+ if (tracerProvider) {
363
+ await tracerProvider.shutdown();
364
+ isInitialized = false;
365
+ console.log("[browser-telemetry] Shut down successfully");
366
+ }
367
+ }
368
+ var IS_SERVER, isInitialized = false, tracerProvider = null;
369
+ var init_browser = __esm(() => {
370
+ IS_SERVER = typeof window === "undefined";
371
+ });
372
+
34
373
  // packages/telemetry/src/browser/react.tsx
35
374
  import {
36
375
  createContext,
@@ -41,24 +380,33 @@ import {
41
380
  useState
42
381
  } from "react";
43
382
  import { jsx } from "react/jsx-runtime";
44
- var IS_SERVER = typeof window === "undefined";
383
+ var IS_SERVER2 = typeof window === "undefined";
45
384
  var telemetryModule = null;
46
385
  var loadTelemetry = async () => {
47
- if (IS_SERVER) {
48
- return null;
386
+ if (IS_SERVER2 || telemetryModule) {
387
+ return telemetryModule;
49
388
  }
50
- if (!telemetryModule) {
51
- try {
52
- const modulePath = "./index";
53
- telemetryModule = await import(modulePath);
54
- } catch (error) {
55
- console.warn("[TelemetryProvider] Failed to load telemetry module:", error);
56
- return null;
57
- }
389
+ try {
390
+ const module = await Promise.resolve().then(() => (init_browser(), exports_browser));
391
+ telemetryModule = module;
392
+ return telemetryModule;
393
+ } catch (error) {
394
+ console.warn("[TelemetryProvider] Failed to load telemetry module:", error);
395
+ return null;
58
396
  }
59
- return telemetryModule;
60
397
  };
61
398
  var TelemetryContext = createContext(null);
399
+ var noopSpan = {
400
+ setAttributes: () => {},
401
+ setStatus: () => {},
402
+ recordException: () => {},
403
+ end: () => {}
404
+ };
405
+ var noopContext = {
406
+ createCustomSpan: () => noopSpan,
407
+ trackCustomEvent: () => {},
408
+ trackCustomError: () => {}
409
+ };
62
410
  function TelemetryProvider({
63
411
  children,
64
412
  serviceName,
@@ -88,13 +436,15 @@ function TelemetryProvider({
88
436
  enableConsoleCapture
89
437
  ]);
90
438
  useEffect(() => {
439
+ if (IS_SERVER2)
440
+ return;
91
441
  setIsMounted(true);
92
442
  }, []);
93
443
  useEffect(() => {
94
- if (IS_SERVER || !isMounted || typeof window === "undefined")
444
+ if (IS_SERVER2 || !isMounted)
95
445
  return;
96
446
  loadTelemetry().then((module) => {
97
- if (module) {
447
+ if (module?.initBrowserTelemetry) {
98
448
  module.initBrowserTelemetry(opts);
99
449
  console.debug("[TelemetryProvider] Browser telemetry initialized");
100
450
  }
@@ -106,12 +456,7 @@ function TelemetryProvider({
106
456
  if (telemetryModule) {
107
457
  return telemetryModule.createSpan(name, attributes);
108
458
  }
109
- return {
110
- setAttributes: () => {},
111
- setStatus: () => {},
112
- recordException: () => {},
113
- end: () => {}
114
- };
459
+ return noopSpan;
115
460
  }, []);
116
461
  const trackCustomEvent = useCallback((eventName, attributes) => {
117
462
  if (telemetryModule) {
@@ -123,12 +468,13 @@ function TelemetryProvider({
123
468
  telemetryModule.trackError(error, context);
124
469
  }
125
470
  }, []);
471
+ const contextValue = IS_SERVER2 ? noopContext : {
472
+ createCustomSpan,
473
+ trackCustomEvent,
474
+ trackCustomError
475
+ };
126
476
  return /* @__PURE__ */ jsx(TelemetryContext.Provider, {
127
- value: {
128
- createCustomSpan,
129
- trackCustomEvent,
130
- trackCustomError
131
- },
477
+ value: contextValue,
132
478
  children
133
479
  });
134
480
  }
@@ -144,4 +490,4 @@ export {
144
490
  TelemetryProvider
145
491
  };
146
492
 
147
- //# debugId=7DA9E83A0B0665E164756E2164756E21
493
+ //# debugId=DC79F3C9CFD9854C64756E2164756E21
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../packages/telemetry/src/browser/react.tsx"],
3
+ "sources": ["../../packages/telemetry/src/browser/index.ts", "../../packages/telemetry/src/browser/react.tsx"],
4
4
  "sourcesContent": [
5
- "import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\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\n// Only define these in browser context to prevent SSR bundling issues\n// biome-ignore lint/suspicious/noExplicitAny: That's fine\nlet telemetryModule: any = null;\n\nconst loadTelemetry = async () => {\n\t// Never execute on server\n\tif (IS_SERVER) {\n\t\treturn null;\n\t}\n\n\tif (!telemetryModule) {\n\t\ttry {\n\t\t\t// Use string concatenation to prevent bundler from resolving this during SSR\n\t\t\tconst modulePath = './index';\n\t\t\ttelemetryModule = await import(/* @vite-ignore */ modulePath);\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t'[TelemetryProvider] Failed to load telemetry module:',\n\t\t\t\terror,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn telemetryModule;\n};\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\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\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// Only run in browser - use state to ensure client-only execution\n\tconst [isMounted, setIsMounted] = useState(false);\n\n\tconst opts = useMemo(\n\t\t() => ({\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t}),\n\t\t[\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\t// Triple guard: check IS_SERVER, isMounted, and window\n\t\tif (IS_SERVER || !isMounted || typeof window === 'undefined') return;\n\n\t\tloadTelemetry()\n\t\t\t.then((module) => {\n\t\t\t\tif (module) {\n\t\t\t\t\tmodule.initBrowserTelemetry(opts);\n\t\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t});\n\t}, [opts, isMounted]);\n\n\tconst createCustomSpan = useCallback(\n\t\t(name: string, attributes?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\treturn telemetryModule.createSpan(name, attributes);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsetAttributes: () => {},\n\t\t\t\tsetStatus: () => {},\n\t\t\t\trecordException: () => {},\n\t\t\t\tend: () => {},\n\t\t\t};\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomEvent = useCallback(\n\t\t(\n\t\t\teventName: string,\n\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackEvent(eventName, attributes);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomError = useCallback(\n\t\t(error: Error, context?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackError(error, context);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<TelemetryContext.Provider\n\t\t\tvalue={{\n\t\t\t\tcreateCustomSpan,\n\t\t\t\ttrackCustomEvent,\n\t\t\t\ttrackCustomError,\n\t\t\t}}\n\t\t>\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 { SpanStatusCode, trace } from '@opentelemetry/api';\nimport { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web';\nimport { ZoneContextManager } from '@opentelemetry/context-zone';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport {\n\tATTR_SERVICE_NAME,\n\tATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\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: WebTracerProvider | null = 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 function initBrowserTelemetry(options: BrowserTelemetryOptions = {}) {\n\tif (IS_SERVER || isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\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: true,\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\n\t\tsetupErrorHandlers();\n\n\t\t// Setup Web Vitals\n\t\tif (ENABLE_WEB_VITALS) {\n\t\t\tsetupWebVitals();\n\t\t}\n\n\t\t// Setup console capture (production only)\n\t\tif (ENABLE_CONSOLE_CAPTURE) {\n\t\t\tsetupConsoleCapture();\n\t\t}\n\n\t\t// Track page visibility\n\t\tsetupVisibilityTracking();\n\n\t\tisInitialized = true;\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// Don't throw - telemetry should never break the app\n\t}\n}\n\nfunction setupErrorHandlers() {\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 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\nfunction setupConsoleCapture() {\n\tconst tracer = trace.getTracer('console');\n\tconst originalError = console.error;\n\n\tconsole.error = (...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\nfunction setupVisibilityTracking() {\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\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 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
+ "import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\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\n// Lazy-load browser telemetry module only when actually needed (client-side)\n// biome-ignore lint/suspicious/noExplicitAny: Dynamic import type\nlet telemetryModule: any = null;\n\nconst loadTelemetry = async () => {\n\tif (IS_SERVER || telemetryModule) {\n\t\treturn telemetryModule;\n\t}\n\n\ttry {\n\t\t// Dynamic import that stays dynamic (not resolved during bundling)\n\t\t// Use relative path since we're in the same package\n\t\tconst module = await import('./index');\n\t\ttelemetryModule = module;\n\t\treturn telemetryModule;\n\t} catch (error) {\n\t\tconsole.warn('[TelemetryProvider] Failed to load telemetry module:', error);\n\t\treturn null;\n\t}\n};\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\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\n\n// No-op implementations for SSR\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n\trecordException: () => {},\n\tend: () => {},\n};\n\nconst noopContext = {\n\tcreateCustomSpan: () => noopSpan,\n\ttrackCustomEvent: () => {},\n\ttrackCustomError: () => {},\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// Always call hooks unconditionally (required by Rules of Hooks)\n\tconst [isMounted, setIsMounted] = useState(false);\n\n\tconst opts = useMemo(\n\t\t() => ({\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t}),\n\t\t[\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\t// Skip on server\n\t\tif (IS_SERVER) return;\n\t\tsetIsMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\t// Skip on server or before mount\n\t\tif (IS_SERVER || !isMounted) return;\n\n\t\tloadTelemetry()\n\t\t\t.then((module) => {\n\t\t\t\tif (module?.initBrowserTelemetry) {\n\t\t\t\t\tmodule.initBrowserTelemetry(opts);\n\t\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t});\n\t}, [opts, isMounted]);\n\n\tconst createCustomSpan = useCallback(\n\t\t(name: string, attributes?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\treturn telemetryModule.createSpan(name, attributes);\n\t\t\t}\n\t\t\treturn noopSpan;\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomEvent = useCallback(\n\t\t(\n\t\t\teventName: string,\n\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackEvent(eventName, attributes);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomError = useCallback(\n\t\t(error: Error, context?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackError(error, context);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\t// Handle SSR case after all hooks are called\n\tconst contextValue = IS_SERVER\n\t\t? noopContext\n\t\t: {\n\t\t\t\tcreateCustomSpan,\n\t\t\t\ttrackCustomEvent,\n\t\t\t\ttrackCustomError,\n\t\t\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
7
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA,IAAM,YAAY,OAAO,WAAW;AAIpC,IAAI,kBAAuB;AAE3B,IAAM,gBAAgB,YAAY;AAAA,EAEjC,IAAI,WAAW;AAAA,IACd,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,CAAC,iBAAiB;AAAA,IACrB,IAAI;AAAA,MAEH,MAAM,aAAa;AAAA,MACnB,kBAAkB,MAAgC;AAAA,MACjD,OAAO,OAAO;AAAA,MACf,QAAQ,KACP,wDACA,KACD;AAAA,MACA,OAAO;AAAA;AAAA,EAET;AAAA,EACA,OAAO;AAAA;AAuBR,IAAM,mBAAmB,cAA2C,IAAI;AAEjE,SAAS,iBAAiB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACqD;AAAA,EAErD,OAAO,WAAW,gBAAgB,SAAS,KAAK;AAAA,EAEhD,MAAM,OAAO,QACZ,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,UAAU,MAAM;AAAA,IACf,aAAa,IAAI;AAAA,KACf,CAAC,CAAC;AAAA,EAEL,UAAU,MAAM;AAAA,IAEf,IAAI,aAAa,CAAC,aAAa,OAAO,WAAW;AAAA,MAAa;AAAA,IAE9D,cAAc,EACZ,KAAK,CAAC,WAAW;AAAA,MACjB,IAAI,QAAQ;AAAA,QACX,OAAO,qBAAqB,IAAI;AAAA,QAChC,QAAQ,MAAM,mDAAmD;AAAA,MAClE;AAAA,KACA,EACA,MAAM,CAAC,UAAU;AAAA,MACjB,QAAQ,MAAM,iDAAiD,KAAK;AAAA,KACpE;AAAA,KACA,CAAC,MAAM,SAAS,CAAC;AAAA,EAEpB,MAAM,mBAAmB,YACxB,CAAC,MAAc,eAA2D;AAAA,IACzE,IAAI,iBAAiB;AAAA,MACpB,OAAO,gBAAgB,WAAW,MAAM,UAAU;AAAA,IACnD;AAAA,IACA,OAAO;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,WAAW,MAAM;AAAA,MACjB,iBAAiB,MAAM;AAAA,MACvB,KAAK,MAAM;AAAA,IACZ;AAAA,KAED,CAAC,CACF;AAAA,EAEA,MAAM,mBAAmB,YACxB,CACC,WACA,eACI;AAAA,IACJ,IAAI,iBAAiB;AAAA,MACpB,gBAAgB,WAAW,WAAW,UAAU;AAAA,IACjD;AAAA,KAED,CAAC,CACF;AAAA,EAEA,MAAM,mBAAmB,YACxB,CAAC,OAAc,YAAwD;AAAA,IACtE,IAAI,iBAAiB;AAAA,MACpB,gBAAgB,WAAW,OAAO,OAAO;AAAA,IAC1C;AAAA,KAED,CAAC,CACF;AAAA,EAEA,uBACC,IAQE,iBAAiB,UARnB;AAAA,IACC,OAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IALD;AAAA,GAQE;AAAA;AAIG,SAAS,YAAY,GAAG;AAAA,EAC9B,MAAM,UAAU,WAAW,gBAAgB;AAAA,EAC3C,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAAA,EACA,OAAO;AAAA;",
8
- "debugId": "7DA9E83A0B0665E164756E2164756E21",
8
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAqEO,SAAS,oBAAoB,CAAC,UAAmC,CAAC,GAAG;AAAA,EAC3E,IAAI,aAAa,eAAe;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,MACL,OAAO,gBAAgB,cAAc,YAAY,MAAM;AAAA,IAExD,MAAM,eAAe,QAAQ,eAAe;AAAA,IAC5C,MAAM,kBAAkB,QAAQ,kBAAkB;AAAA,IAClD,MAAM,gBAAgB,QAAQ,gBAAgB;AAAA,IAC9C,MAAM,gBAAgB,QAAQ,gBAAgB,KAAK,QAAQ;AAAA,IAC3D,MAAM,oBAAoB,QAAQ,mBAAmB;AAAA,IACrD,MAAM,yBACL,QAAQ,wBAAwB;AAAA,IAEjC,QAAQ,IACP,mDAAmD,eACpD;AAAA,IAGA,MAAM,UAAkC,CAAC;AAAA,IACzC,MAAM,SAAS,QAAQ,UAAU,KAAK;AAAA,IACtC,IAAI,QAAQ;AAAA,MACX,QAAQ,gBAAgB,UAAU;AAAA,IACnC;AAAA,IAEA,MAAM,WAAW,IAAI,kBAAkB;AAAA,MACtC,KAAK,GAAG;AAAA,MACR,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA,IACtD,CAAC;AAAA,IAGD,MAAM,WAAW,uBAAuB;AAAA,OACtC,oBAAoB;AAAA,OACpB,uBAAuB;AAAA,MACxB,0BAA0B,gBAAgB,eAAe;AAAA,MACzD,sBAAsB,UAAU;AAAA,MAChC,oBAAoB,UAAU;AAAA,MAC9B,oBAAoB,UAAU;AAAA,MAC9B,gBAAgB,OAAO,OAAO;AAAA,MAC9B,iBAAiB,OAAO,OAAO;AAAA,IAChC,CAAC;AAAA,IAGD,MAAM,gBAAgB,IAAI,mBAAmB,UAAU;AAAA,MACtD,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,sBAAsB;AAAA,IACvB,CAAC;AAAA,IAGD,iBAAiB,IAAI,kBAAkB;AAAA,MACtC;AAAA,MACA,gBAAgB,CAAC,aAAa;AAAA,IAC/B,CAAC;AAAA,IAED,eAAe,SAAS;AAAA,MACvB,gBAAgB,IAAI;AAAA,IACrB,CAAC;AAAA,IAGD,yBAAyB;AAAA,MACxB,kBAAkB;AAAA,QACjB,2BAA2B;AAAA,UAC1B,gDAAgD;AAAA,YAC/C,SAAS;AAAA,UACV;AAAA,UACA,mDAAmD;AAAA,YAClD,SAAS;AAAA,YACT,YAAY,CAAC,SAAS,QAAQ;AAAA,UAC/B;AAAA,UACA,wCAAwC;AAAA,YACvC,SAAS;AAAA,YACT,8BAA8B,CAAC,IAAI;AAAA,YACnC,sBAAsB;AAAA,UACvB;AAAA,UACA,mDAAmD;AAAA,YAClD,SAAS;AAAA,YACT,8BAA8B,CAAC,IAAI;AAAA,YACnC,sBAAsB;AAAA,UACvB;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAAA,IAGD,mBAAmB;AAAA,IAGnB,IAAI,mBAAmB;AAAA,MACtB,eAAe;AAAA,IAChB;AAAA,IAGA,IAAI,wBAAwB;AAAA,MAC3B,oBAAoB;AAAA,IACrB;AAAA,IAGA,wBAAwB;AAAA,IAExB,gBAAgB;AAAA,IAChB,QAAQ,IAAI,8CAA8C;AAAA,IACzD,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,6CAA6C,KAAK;AAAA;AAAA;AAKlE,SAAS,kBAAkB,GAAG;AAAA,EAC7B,MAAM,SAAS,MAAM,UAAU,eAAe;AAAA,EAE9C,OAAO,iBAAiB,SAAS,CAAC,UAAU;AAAA,IAC3C,IAAI;AAAA,MACH,MAAM,OAAO,OAAO,UAAU,0BAA0B;AAAA,QACvD,WAAW,KAAK,IAAI;AAAA,MACrB,CAAC;AAAA,MAED,MAAM,aAAa,MAAM,OAAO,SAAS;AAAA,MAEzC,KAAK,UAAU;AAAA,QACd,MAAM,eAAe;AAAA,QACrB,SAAS,MAAM;AAAA,MAChB,CAAC;AAAA,MAED,KAAK,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,cAAc,MAAM,OAAO,QAAQ;AAAA,QACnC,iBAAiB,MAAM;AAAA,QACvB,eAAe;AAAA,QACf,kBAAkB,MAAM,YAAY;AAAA,QACpC,gBAAgB,MAAM,UAAU;AAAA,QAChC,eAAe,MAAM,SAAS;AAAA,QAC9B,eAAe,OAAO,SAAS;AAAA,QAC/B,oBAAoB,OAAO,SAAS;AAAA,QACpC,sBAAsB,UAAU;AAAA,QAChC,qBAAqB,IAAI,KAAK,EAAE,YAAY;AAAA,MAC7C,CAAC;AAAA,MAED,IAAI,MAAM,OAAO;AAAA,QAChB,KAAK,gBAAgB,MAAM,KAAK;AAAA,QAChC,KAAK,SAAS,aAAa;AAAA,UAC1B,kBAAkB,MAAM,MAAM;AAAA,UAC9B,qBAAqB,MAAM,MAAM;AAAA,UACjC,wBAAwB;AAAA,UACxB,qBAAqB;AAAA,QACtB,CAAC;AAAA,MACF;AAAA,MAEA,KAAK,IAAI;AAAA,MACR,OAAO,gBAAgB;AAAA,MAExB,QAAQ,MACP,8CACA,cACD;AAAA;AAAA,IAED,QAAQ,MACP,uCACA,MAAM,SAAS,MAAM,OACtB;AAAA,GACA;AAAA,EAED,OAAO,iBAAiB,sBAAsB,CAAC,UAAU;AAAA,IACxD,IAAI;AAAA,MACH,MAAM,OAAO,OAAO,UAAU,qCAAqC;AAAA,QAClE,WAAW,KAAK,IAAI;AAAA,MACrB,CAAC;AAAA,MAED,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,MAAM,eAAe,UAClB,MAAM,OAAO,UACb,OAAO,MAAM,MAAM;AAAA,MACtB,MAAM,aAAa,UAAU,MAAM,OAAO,SAAS,KAAK;AAAA,MACxD,MAAM,YAAY,UAAU,MAAM,OAAO,OAAO;AAAA,MAEhD,KAAK,UAAU;AAAA,QACd,MAAM,eAAe;AAAA,QACrB,SAAS;AAAA,MACV,CAAC;AAAA,MAED,KAAK,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,eAAe;AAAA,QACf,eAAe,OAAO,SAAS;AAAA,QAC/B,oBAAoB,OAAO,SAAS;AAAA,QACpC,sBAAsB,UAAU;AAAA,QAChC,qBAAqB,IAAI,KAAK,EAAE,YAAY;AAAA,MAC7C,CAAC;AAAA,MAED,IAAI,SAAS;AAAA,QACZ,KAAK,gBAAgB,MAAM,MAAM;AAAA,QACjC,KAAK,SAAS,aAAa;AAAA,UAC1B,kBAAkB,MAAM,OAAO;AAAA,UAC/B,qBAAqB,MAAM,OAAO;AAAA,UAClC,wBAAwB;AAAA,UACxB,qBAAqB;AAAA,QACtB,CAAC;AAAA,MACF;AAAA,MAEA,KAAK,IAAI;AAAA,MACR,OAAO,gBAAgB;AAAA,MAExB,QAAQ,MACP,kDACA,cACD;AAAA;AAAA,IAED,QAAQ,MAAM,4CAA4C,MAAM,MAAM;AAAA,GACtE;AAAA;AAGF,eAAe,cAAc,GAAG;AAAA,EAC/B,IAAI;AAAA,IACH,QAAQ,OAAO,OAAO,QAAQ,UAAU,MAAa;AAAA,IACrD,MAAM,SAAS,MAAM,UAAU,YAAY;AAAA,IAE3C,MAAM,kBAAkB,CAAC,WAMnB;AAAA,MACL,IAAI;AAAA,QACH,MAAM,OAAO,OAAO,UAAU,cAAc,OAAO,QAAQ;AAAA,UAC1D,WAAW,KAAK,IAAI,IAAI,OAAO;AAAA,QAChC,CAAC;AAAA,QAED,KAAK,cAAc;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,gBAAgB,OAAO;AAAA,UACvB,iBAAiB,OAAO;AAAA,UACxB,gBAAgB,OAAO;AAAA,UACvB,aAAa,OAAO;AAAA,UACpB,eAAe,OAAO,SAAS;AAAA,UAC/B,oBAAoB,OAAO,SAAS;AAAA,QACrC,CAAC;AAAA,QAED,KAAK,IAAI;AAAA,QACR,OAAO,OAAO;AAAA,QACf,QAAQ,MAAM,mDAAmD,KAAK;AAAA;AAAA;AAAA,IAIxE,MAAM,eAAe;AAAA,IACrB,MAAM,eAAe;AAAA,IACrB,OAAO,eAAe;AAAA,IACtB,MAAM,eAAe;AAAA,IAErB,QAAQ,IAAI,iDAAiD;AAAA,IAC5D,OAAO,OAAO;AAAA,IACf,QAAQ,KAAK,iDAAiD,KAAK;AAAA;AAAA;AAIrE,SAAS,mBAAmB,GAAG;AAAA,EAC9B,MAAM,SAAS,MAAM,UAAU,SAAS;AAAA,EACxC,MAAM,gBAAgB,QAAQ;AAAA,EAE9B,QAAQ,QAAQ,IAAI,SAAoB;AAAA,IACvC,IAAI;AAAA,MACH,MAAM,OAAO,OAAO,UAAU,uBAAuB;AAAA,MAErD,KAAK,cAAc;AAAA,QAClB,aAAa;AAAA,QACb,eAAe,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,QACxC,eAAe,OAAO,SAAS;AAAA,QAC/B,qBAAqB,IAAI,KAAK,EAAE,YAAY;AAAA,MAC7C,CAAC;AAAA,MAED,KAAK,IAAI;AAAA,MACR,MAAM;AAAA,IAGR,cAAc,MAAM,SAAS,IAAI;AAAA;AAAA;AAInC,SAAS,uBAAuB,GAAG;AAAA,EAClC,MAAM,SAAS,MAAM,UAAU,YAAY;AAAA,EAE3C,SAAS,iBAAiB,oBAAoB,MAAM;AAAA,IACnD,IAAI;AAAA,MACH,MAAM,OAAO,OAAO,UAAU,2BAA2B;AAAA,MAEzD,KAAK,cAAc;AAAA,QAClB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,OAAO,SAAS;AAAA,QAC/B,qBAAqB,IAAI,KAAK,EAAE,YAAY;AAAA,MAC7C,CAAC;AAAA,MAED,KAAK,IAAI;AAAA,MACR,MAAM;AAAA,GAGR;AAAA;AAaK,SAAS,UAAU,CACzB,MACA,aAAwD,CAAC,GACxD;AAAA,EACD,IAAI,aAAa,CAAC,eAAe;AAAA,IAChC,OAAO;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,WAAW,MAAM;AAAA,MACjB,iBAAiB,MAAM;AAAA,MACvB,KAAK,MAAM;AAAA,IACZ;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,SAAS,MAAM,UAAU,QAAQ;AAAA,IACvC,MAAM,OAAO,OAAO,UAAU,IAAI;AAAA,IAElC,KAAK,cAAc;AAAA,SACf;AAAA,MACH,eAAe,OAAO,SAAS;AAAA,MAC/B,oBAAoB,OAAO,SAAS;AAAA,IACrC,CAAC;AAAA,IAED,OAAO;AAAA,IACN,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,8CAA8C,KAAK;AAAA,IACjE,OAAO;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,WAAW,MAAM;AAAA,MACjB,iBAAiB,MAAM;AAAA,MACvB,KAAK,MAAM;AAAA,IACZ;AAAA;AAAA;AAYK,SAAS,UAAU,CACzB,WACA,aAAwD,CAAC,GACxD;AAAA,EACD,IAAI,aAAa,CAAC,eAAe;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,OAAO,WAAW,UAAU,aAAa,UAAU;AAAA,IACzD,KAAK,IAAI;AAAA,IACR,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,8CAA8C,KAAK;AAAA;AAAA;AAgB5D,SAAS,UAAU,CACzB,OACA,UAAqD,CAAC,GACrD;AAAA,EACD,IAAI,aAAa,CAAC,eAAe;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,SAAS,MAAM,UAAU,eAAe;AAAA,IAC9C,MAAM,OAAO,OAAO,UAAU,uBAAuB;AAAA,IAErD,MAAM,aAAa,MAAM,SAAS;AAAA,IAElC,KAAK,UAAU;AAAA,MACd,MAAM,eAAe;AAAA,MACrB,SAAS,MAAM;AAAA,IAChB,CAAC;AAAA,IAED,KAAK,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,cAAc,MAAM;AAAA,MACpB,iBAAiB,MAAM;AAAA,MACvB,eAAe;AAAA,SACZ;AAAA,MACH,eAAe,OAAO,SAAS;AAAA,MAC/B,oBAAoB,OAAO,SAAS;AAAA,MACpC,qBAAqB,IAAI,KAAK,EAAE,YAAY;AAAA,IAC7C,CAAC;AAAA,IAED,KAAK,gBAAgB,KAAK;AAAA,IAE1B,KAAK,SAAS,aAAa;AAAA,MAC1B,kBAAkB,MAAM;AAAA,MACxB,qBAAqB,MAAM;AAAA,MAC3B,wBAAwB;AAAA,MACxB,qBAAqB;AAAA,IACtB,CAAC;AAAA,IAED,KAAK,IAAI;AAAA,IACR,OAAO,gBAAgB;AAAA,IACxB,QAAQ,MAAM,8CAA8C,cAAc;AAAA;AAAA;AAO5E,eAAsB,iBAAiB,GAAG;AAAA,EACzC,IAAI,gBAAgB;AAAA,IACnB,MAAM,eAAe,SAAS;AAAA,IAC9B,gBAAgB;AAAA,IAChB,QAAQ,IAAI,4CAA4C;AAAA,EACzD;AAAA;AAAA,IA1cK,WAEF,gBAAgB,OAChB,iBAA2C;AAAA;AAAA,EAHzC,YAAY,OAAO,WAAW;AAAA;;;ACxDpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA,IAAM,aAAY,OAAO,WAAW;AAIpC,IAAI,kBAAuB;AAE3B,IAAM,gBAAgB,YAAY;AAAA,EACjC,IAAI,cAAa,iBAAiB;AAAA,IACjC,OAAO;AAAA,EACR;AAAA,EAEA,IAAI;AAAA,IAGH,MAAM,SAAS;AAAA,IACf,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACN,OAAO,OAAO;AAAA,IACf,QAAQ,KAAK,wDAAwD,KAAK;AAAA,IAC1E,OAAO;AAAA;AAAA;AAwBT,IAAM,mBAAmB,cAA2C,IAAI;AAGxE,IAAM,WAAW;AAAA,EAChB,eAAe,MAAM;AAAA,EACrB,WAAW,MAAM;AAAA,EACjB,iBAAiB,MAAM;AAAA,EACvB,KAAK,MAAM;AACZ;AAEA,IAAM,cAAc;AAAA,EACnB,kBAAkB,MAAM;AAAA,EACxB,kBAAkB,MAAM;AAAA,EACxB,kBAAkB,MAAM;AACzB;AAEO,SAAS,iBAAiB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACqD;AAAA,EAErD,OAAO,WAAW,gBAAgB,SAAS,KAAK;AAAA,EAEhD,MAAM,OAAO,QACZ,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,UAAU,MAAM;AAAA,IAEf,IAAI;AAAA,MAAW;AAAA,IACf,aAAa,IAAI;AAAA,KACf,CAAC,CAAC;AAAA,EAEL,UAAU,MAAM;AAAA,IAEf,IAAI,cAAa,CAAC;AAAA,MAAW;AAAA,IAE7B,cAAc,EACZ,KAAK,CAAC,WAAW;AAAA,MACjB,IAAI,QAAQ,sBAAsB;AAAA,QACjC,OAAO,qBAAqB,IAAI;AAAA,QAChC,QAAQ,MAAM,mDAAmD;AAAA,MAClE;AAAA,KACA,EACA,MAAM,CAAC,UAAU;AAAA,MACjB,QAAQ,MAAM,iDAAiD,KAAK;AAAA,KACpE;AAAA,KACA,CAAC,MAAM,SAAS,CAAC;AAAA,EAEpB,MAAM,mBAAmB,YACxB,CAAC,MAAc,eAA2D;AAAA,IACzE,IAAI,iBAAiB;AAAA,MACpB,OAAO,gBAAgB,WAAW,MAAM,UAAU;AAAA,IACnD;AAAA,IACA,OAAO;AAAA,KAER,CAAC,CACF;AAAA,EAEA,MAAM,mBAAmB,YACxB,CACC,WACA,eACI;AAAA,IACJ,IAAI,iBAAiB;AAAA,MACpB,gBAAgB,WAAW,WAAW,UAAU;AAAA,IACjD;AAAA,KAED,CAAC,CACF;AAAA,EAEA,MAAM,mBAAmB,YACxB,CAAC,OAAc,YAAwD;AAAA,IACtE,IAAI,iBAAiB;AAAA,MACpB,gBAAgB,WAAW,OAAO,OAAO;AAAA,IAC1C;AAAA,KAED,CAAC,CACF;AAAA,EAGA,MAAM,eAAe,aAClB,cACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EAEF,uBACC,IAEE,iBAAiB,UAFnB;AAAA,IAA2B,OAAO;AAAA,IAAlC;AAAA,GAEE;AAAA;AAIG,SAAS,YAAY,GAAG;AAAA,EAC9B,MAAM,UAAU,WAAW,gBAAgB;AAAA,EAC3C,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAAA,EACA,OAAO;AAAA;",
9
+ "debugId": "DC79F3C9CFD9854C64756E2164756E21",
9
10
  "names": []
10
11
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.22.3
2
+ * reroute-js v0.22.5
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.22.3
2
+ * reroute-js v0.22.5
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AA8BD,UAAU,oBAAoB;IAC7B,gBAAgB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD;QACJ,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;QAC1E,SAAS,EAAE,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAChE,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACxC,GAAG,EAAE,MAAM,IAAI,CAAC;KAChB,CAAC;IACF,gBAAgB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD,IAAI,CAAC;IACV,gBAAgB,EAAE,CACjB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAC/C,IAAI,CAAC;CACV;AAID,wBAAgB,iBAAiB,CAAC,EACjC,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,oBAAoB,GACpB,EAAE,uBAAuB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CA4FnD;AAED,wBAAgB,YAAY,yBAM3B"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAyBD,UAAU,oBAAoB;IAC7B,gBAAgB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD;QACJ,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;QAC1E,SAAS,EAAE,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAChE,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACxC,GAAG,EAAE,MAAM,IAAI,CAAC;KAChB,CAAC;IACF,gBAAgB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD,IAAI,CAAC;IACV,gBAAgB,EAAE,CACjB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAC/C,IAAI,CAAC;CACV;AAkBD,wBAAgB,iBAAiB,CAAC,EACjC,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,oBAAoB,GACpB,EAAE,uBAAuB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CA4FnD;AAED,wBAAgB,YAAY,yBAM3B"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.22.3
2
+ * reroute-js v0.22.5
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>