reroute-js 0.25.3 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +150 -52
  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 +2 -9
  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,383 +0,0 @@
1
- /**
2
- * reroute-js v0.25.3
3
- *
4
- * @license MIT
5
- * @copyright 2025 stewones <hi@stewan.io>
6
- * @see https://github.com/stewones/reroute
7
- *
8
- * Built with Bun <3
9
- */
10
- var __create = Object.create;
11
- var __getProtoOf = Object.getPrototypeOf;
12
- var __defProp = Object.defineProperty;
13
- var __getOwnPropNames = Object.getOwnPropertyNames;
14
- var __hasOwnProp = Object.prototype.hasOwnProperty;
15
- var __toESM = (mod, isNodeMode, target) => {
16
- target = mod != null ? __create(__getProtoOf(mod)) : {};
17
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
18
- for (let key of __getOwnPropNames(mod))
19
- if (!__hasOwnProp.call(to, key))
20
- __defProp(to, key, {
21
- get: () => mod[key],
22
- enumerable: true
23
- });
24
- return to;
25
- };
26
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
27
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
28
- }) : x)(function(x) {
29
- if (typeof require !== "undefined")
30
- return require.apply(this, arguments);
31
- throw Error('Dynamic require of "' + x + '" is not supported');
32
- });
33
-
34
- // packages/telemetry/src/browser/index.ts
35
- var IS_SERVER = typeof window === "undefined";
36
- var isInitialized = false;
37
- var tracerProvider = null;
38
- async function initBrowserTelemetry(options = {}) {
39
- if (IS_SERVER || isInitialized) {
40
- return;
41
- }
42
- isInitialized = true;
43
- try {
44
- const [
45
- { getWebAutoInstrumentations },
46
- { ZoneContextManager },
47
- { OTLPTraceExporter },
48
- { registerInstrumentations },
49
- { resourceFromAttributes },
50
- { BatchSpanProcessor },
51
- { WebTracerProvider },
52
- { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION }
53
- ] = await Promise.all([
54
- import("@opentelemetry/auto-instrumentations-web"),
55
- import("@opentelemetry/context-zone"),
56
- import("@opentelemetry/exporter-trace-otlp-http"),
57
- import("@opentelemetry/instrumentation"),
58
- import("@opentelemetry/resources"),
59
- import("@opentelemetry/sdk-trace-base"),
60
- import("@opentelemetry/sdk-trace-web"),
61
- import("@opentelemetry/semantic-conventions")
62
- ]);
63
- const env = typeof import.meta !== "undefined" ? import.meta.env : undefined;
64
- const SERVICE_NAME = options.serviceName || "reroute-app-browser";
65
- const SERVICE_VERSION = options.serviceVersion || "1.0.0";
66
- const OTLP_ENDPOINT = options.otlpEndpoint || "/api/telemetry";
67
- const IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;
68
- const ENABLE_WEB_VITALS = options.enableWebVitals ?? true;
69
- const ENABLE_CONSOLE_CAPTURE = options.enableConsoleCapture ?? IS_PRODUCTION;
70
- console.log(`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
71
- const headers = {};
72
- const apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;
73
- if (apiKey) {
74
- headers.Authorization = `Bearer ${apiKey}`;
75
- }
76
- const exporter = new OTLPTraceExporter({
77
- url: `${OTLP_ENDPOINT}/v1/traces`,
78
- headers: Object.keys(headers).length > 0 ? headers : undefined
79
- });
80
- const resource = resourceFromAttributes({
81
- [ATTR_SERVICE_NAME]: SERVICE_NAME,
82
- [ATTR_SERVICE_VERSION]: SERVICE_VERSION,
83
- "deployment.environment": IS_PRODUCTION ? "production" : "development",
84
- "browser.user_agent": navigator.userAgent,
85
- "browser.language": navigator.language,
86
- "browser.platform": navigator.platform,
87
- "screen.width": window.screen.width,
88
- "screen.height": window.screen.height
89
- });
90
- const spanProcessor = new BatchSpanProcessor(exporter, {
91
- maxQueueSize: 100,
92
- maxExportBatchSize: 10,
93
- scheduledDelayMillis: 500
94
- });
95
- tracerProvider = new WebTracerProvider({
96
- resource,
97
- spanProcessors: [spanProcessor]
98
- });
99
- tracerProvider.register({
100
- contextManager: new ZoneContextManager
101
- });
102
- registerInstrumentations({
103
- instrumentations: [
104
- getWebAutoInstrumentations({
105
- "@opentelemetry/instrumentation-document-load": {
106
- enabled: false
107
- },
108
- "@opentelemetry/instrumentation-user-interaction": {
109
- enabled: true,
110
- eventNames: ["click", "submit"]
111
- },
112
- "@opentelemetry/instrumentation-fetch": {
113
- enabled: true,
114
- propagateTraceHeaderCorsUrls: [/.*/],
115
- clearTimingResources: true
116
- },
117
- "@opentelemetry/instrumentation-xml-http-request": {
118
- enabled: true,
119
- propagateTraceHeaderCorsUrls: [/.*/],
120
- clearTimingResources: true
121
- }
122
- })
123
- ]
124
- });
125
- setupErrorHandlers().catch((err) => console.error("[browser-telemetry] Error handler setup failed:", err));
126
- if (ENABLE_WEB_VITALS) {
127
- setupWebVitals().catch((err) => console.error("[browser-telemetry] Web Vitals setup failed:", err));
128
- }
129
- if (ENABLE_CONSOLE_CAPTURE) {
130
- setupConsoleCapture().catch((err) => console.error("[browser-telemetry] Console capture setup failed:", err));
131
- }
132
- setupVisibilityTracking().catch((err) => console.error("[browser-telemetry] Visibility tracking setup failed:", err));
133
- console.log("[browser-telemetry] Initialized successfully");
134
- } catch (error) {
135
- console.error("[browser-telemetry] Failed to initialize:", error);
136
- isInitialized = false;
137
- }
138
- }
139
- async function setupErrorHandlers() {
140
- const { trace, SpanStatusCode } = await import("@opentelemetry/api");
141
- const tracer = trace.getTracer("error-handler");
142
- window.addEventListener("error", (event) => {
143
- try {
144
- const span = tracer.startSpan("browser.error.uncaught", {
145
- startTime: Date.now()
146
- });
147
- const stackTrace = event.error?.stack || "";
148
- span.setStatus({
149
- code: SpanStatusCode.ERROR,
150
- message: event.message
151
- });
152
- span.setAttributes({
153
- error: true,
154
- "error.type": event.error?.name || "UncaughtError",
155
- "error.message": event.message,
156
- "error.stack": stackTrace,
157
- "error.filename": event.filename || "",
158
- "error.lineno": event.lineno || 0,
159
- "error.colno": event.colno || 0,
160
- "browser.url": window.location.href,
161
- "browser.pathname": window.location.pathname,
162
- "browser.user_agent": navigator.userAgent,
163
- "browser.timestamp": new Date().toISOString()
164
- });
165
- if (event.error) {
166
- span.recordException(event.error);
167
- span.addEvent("exception", {
168
- "exception.type": event.error.name,
169
- "exception.message": event.error.message,
170
- "exception.stacktrace": stackTrace,
171
- "exception.escaped": "false"
172
- });
173
- }
174
- span.end();
175
- } catch (telemetryError) {
176
- console.error("[browser-telemetry] Error tracking failed:", telemetryError);
177
- }
178
- console.error("[browser-telemetry] Uncaught error:", event.error || event.message);
179
- });
180
- window.addEventListener("unhandledrejection", (event) => {
181
- try {
182
- const span = tracer.startSpan("browser.error.unhandled_rejection", {
183
- startTime: Date.now()
184
- });
185
- const isError = event.reason instanceof Error;
186
- const errorMessage = isError ? event.reason.message : String(event.reason);
187
- const errorStack = isError ? event.reason.stack || "" : "";
188
- const errorType = isError ? event.reason.name : "UnhandledRejection";
189
- span.setStatus({
190
- code: SpanStatusCode.ERROR,
191
- message: errorMessage
192
- });
193
- span.setAttributes({
194
- error: true,
195
- "error.type": errorType,
196
- "error.message": errorMessage,
197
- "error.stack": errorStack,
198
- "browser.url": window.location.href,
199
- "browser.pathname": window.location.pathname,
200
- "browser.user_agent": navigator.userAgent,
201
- "browser.timestamp": new Date().toISOString()
202
- });
203
- if (isError) {
204
- span.recordException(event.reason);
205
- span.addEvent("exception", {
206
- "exception.type": event.reason.name,
207
- "exception.message": event.reason.message,
208
- "exception.stacktrace": errorStack,
209
- "exception.escaped": "false"
210
- });
211
- }
212
- span.end();
213
- } catch (telemetryError) {
214
- console.error("[browser-telemetry] Rejection tracking failed:", telemetryError);
215
- }
216
- console.error("[browser-telemetry] Unhandled rejection:", event.reason);
217
- });
218
- }
219
- async function setupWebVitals() {
220
- try {
221
- const { onLCP, onCLS, onTTFB, onINP } = await import("web-vitals");
222
- const { trace } = await import("@opentelemetry/api");
223
- const tracer = trace.getTracer("web-vitals");
224
- const sendToAnalytics = (metric) => {
225
- try {
226
- const span = tracer.startSpan(`web_vitals.${metric.name}`, {
227
- startTime: Date.now() - metric.value
228
- });
229
- span.setAttributes({
230
- "metric.name": metric.name,
231
- "metric.value": metric.value,
232
- "metric.rating": metric.rating,
233
- "metric.delta": metric.delta,
234
- "metric.id": metric.id,
235
- "browser.url": window.location.href,
236
- "browser.pathname": window.location.pathname
237
- });
238
- span.end();
239
- } catch (error) {
240
- console.error("[browser-telemetry] Web Vitals tracking failed:", error);
241
- }
242
- };
243
- onLCP(sendToAnalytics);
244
- onCLS(sendToAnalytics);
245
- onTTFB(sendToAnalytics);
246
- onINP(sendToAnalytics);
247
- console.log("[browser-telemetry] Web Vitals tracking enabled");
248
- } catch (error) {
249
- console.warn("[browser-telemetry] Web Vitals not available:", error);
250
- }
251
- }
252
- async function setupConsoleCapture() {
253
- const { trace } = await import("@opentelemetry/api");
254
- const tracer = trace.getTracer("console");
255
- const originalError = console.error;
256
- if (originalError.__telemetry_captured__) {
257
- return;
258
- }
259
- const wrappedError = (...args) => {
260
- try {
261
- const span = tracer.startSpan("browser.console.error");
262
- span.setAttributes({
263
- "log.level": "error",
264
- "log.message": args.map(String).join(" "),
265
- "browser.url": window.location.href,
266
- "browser.timestamp": new Date().toISOString()
267
- });
268
- span.end();
269
- } catch {}
270
- originalError.apply(console, args);
271
- };
272
- wrappedError.__telemetry_captured__ = true;
273
- console.error = wrappedError;
274
- }
275
- async function setupVisibilityTracking() {
276
- const { trace } = await import("@opentelemetry/api");
277
- const tracer = trace.getTracer("visibility");
278
- document.addEventListener("visibilitychange", () => {
279
- try {
280
- const span = tracer.startSpan("browser.visibility_change");
281
- span.setAttributes({
282
- "visibility.state": document.visibilityState,
283
- "browser.url": window.location.href,
284
- "browser.timestamp": new Date().toISOString()
285
- });
286
- span.end();
287
- } catch {}
288
- });
289
- }
290
- function createSpan(name, attributes = {}) {
291
- if (IS_SERVER || !isInitialized) {
292
- return {
293
- setAttributes: () => {},
294
- setStatus: () => {},
295
- recordException: () => {},
296
- end: () => {}
297
- };
298
- }
299
- try {
300
- const trace = globalThis.__OTEL_TRACE__ || __require("@opentelemetry/api").trace;
301
- if (!globalThis.__OTEL_TRACE__) {
302
- globalThis.__OTEL_TRACE__ = trace;
303
- }
304
- const tracer = trace.getTracer("custom");
305
- const span = tracer.startSpan(name);
306
- span.setAttributes({
307
- ...attributes,
308
- "browser.url": window.location.href,
309
- "browser.pathname": window.location.pathname
310
- });
311
- return span;
312
- } catch (error) {
313
- console.error("[browser-telemetry] Failed to create span:", error);
314
- return {
315
- setAttributes: () => {},
316
- setStatus: () => {},
317
- recordException: () => {},
318
- end: () => {}
319
- };
320
- }
321
- }
322
- function trackEvent(eventName, attributes = {}) {
323
- if (IS_SERVER || !isInitialized) {
324
- return;
325
- }
326
- try {
327
- const span = createSpan(`custom.${eventName}`, attributes);
328
- span.end();
329
- } catch (error) {
330
- console.error("[browser-telemetry] Failed to track event:", error);
331
- }
332
- }
333
- function trackError(error, context = {}) {
334
- if (IS_SERVER || !isInitialized) {
335
- return;
336
- }
337
- try {
338
- const { trace, SpanStatusCode } = __require("@opentelemetry/api");
339
- const tracer = trace.getTracer("error-handler");
340
- const span = tracer.startSpan("browser.error.tracked");
341
- const stackTrace = error.stack || "";
342
- span.setStatus({
343
- code: SpanStatusCode.ERROR,
344
- message: error.message
345
- });
346
- span.setAttributes({
347
- error: true,
348
- "error.type": error.name,
349
- "error.message": error.message,
350
- "error.stack": stackTrace,
351
- ...context,
352
- "browser.url": window.location.href,
353
- "browser.pathname": window.location.pathname,
354
- "browser.timestamp": new Date().toISOString()
355
- });
356
- span.recordException(error);
357
- span.addEvent("exception", {
358
- "exception.type": error.name,
359
- "exception.message": error.message,
360
- "exception.stacktrace": stackTrace,
361
- "exception.escaped": "false"
362
- });
363
- span.end();
364
- } catch (telemetryError) {
365
- console.error("[browser-telemetry] Failed to track error:", telemetryError);
366
- }
367
- }
368
- async function shutdownTelemetry() {
369
- if (tracerProvider) {
370
- await tracerProvider.shutdown();
371
- isInitialized = false;
372
- console.log("[browser-telemetry] Shut down successfully");
373
- }
374
- }
375
- export {
376
- trackEvent,
377
- trackError,
378
- shutdownTelemetry,
379
- initBrowserTelemetry,
380
- createSpan
381
- };
382
-
383
- //# debugId=A3864129C9A35B4664756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../packages/telemetry/src/browser/index.ts"],
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
- ],
7
- "mappings": "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",
8
- "debugId": "A3864129C9A35B4664756E2164756E21",
9
- "names": []
10
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}