autotel-tanstack 1.1.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 (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +294 -0
  3. package/dist/auto.d.ts +44 -0
  4. package/dist/auto.js +47 -0
  5. package/dist/auto.js.map +1 -0
  6. package/dist/browser/context.d.ts +48 -0
  7. package/dist/browser/context.js +3 -0
  8. package/dist/browser/context.js.map +1 -0
  9. package/dist/browser/debug-headers.d.ts +16 -0
  10. package/dist/browser/debug-headers.js +3 -0
  11. package/dist/browser/debug-headers.js.map +1 -0
  12. package/dist/browser/error-reporting.d.ts +37 -0
  13. package/dist/browser/error-reporting.js +3 -0
  14. package/dist/browser/error-reporting.js.map +1 -0
  15. package/dist/browser/handlers.d.ts +19 -0
  16. package/dist/browser/handlers.js +3 -0
  17. package/dist/browser/handlers.js.map +1 -0
  18. package/dist/browser/index.d.ts +10 -0
  19. package/dist/browser/index.js +12 -0
  20. package/dist/browser/index.js.map +1 -0
  21. package/dist/browser/loaders.d.ts +36 -0
  22. package/dist/browser/loaders.js +3 -0
  23. package/dist/browser/loaders.js.map +1 -0
  24. package/dist/browser/metrics.d.ts +54 -0
  25. package/dist/browser/metrics.js +3 -0
  26. package/dist/browser/metrics.js.map +1 -0
  27. package/dist/browser/middleware.d.ts +39 -0
  28. package/dist/browser/middleware.js +3 -0
  29. package/dist/browser/middleware.js.map +1 -0
  30. package/dist/browser/server-functions.d.ts +19 -0
  31. package/dist/browser/server-functions.js +3 -0
  32. package/dist/browser/server-functions.js.map +1 -0
  33. package/dist/browser/testing.d.ts +45 -0
  34. package/dist/browser/testing.js +3 -0
  35. package/dist/browser/testing.js.map +1 -0
  36. package/dist/browser/types.d.ts +85 -0
  37. package/dist/browser/types.js +3 -0
  38. package/dist/browser/types.js.map +1 -0
  39. package/dist/chunk-4C7T5ZIM.js +20 -0
  40. package/dist/chunk-4C7T5ZIM.js.map +1 -0
  41. package/dist/chunk-CSFIPJC2.js +11 -0
  42. package/dist/chunk-CSFIPJC2.js.map +1 -0
  43. package/dist/chunk-DTZCOB4W.js +32 -0
  44. package/dist/chunk-DTZCOB4W.js.map +1 -0
  45. package/dist/chunk-EGRHWZRV.js +3 -0
  46. package/dist/chunk-EGRHWZRV.js.map +1 -0
  47. package/dist/chunk-EUYFVNYE.js +16 -0
  48. package/dist/chunk-EUYFVNYE.js.map +1 -0
  49. package/dist/chunk-HIQYW2HB.js +20 -0
  50. package/dist/chunk-HIQYW2HB.js.map +1 -0
  51. package/dist/chunk-HKM7LMO6.js +129 -0
  52. package/dist/chunk-HKM7LMO6.js.map +1 -0
  53. package/dist/chunk-I4LX3LOG.js +35 -0
  54. package/dist/chunk-I4LX3LOG.js.map +1 -0
  55. package/dist/chunk-JSI6QG7M.js +96 -0
  56. package/dist/chunk-JSI6QG7M.js.map +1 -0
  57. package/dist/chunk-JXO7H6KO.js +10 -0
  58. package/dist/chunk-JXO7H6KO.js.map +1 -0
  59. package/dist/chunk-MFYOV2SF.js +32 -0
  60. package/dist/chunk-MFYOV2SF.js.map +1 -0
  61. package/dist/chunk-MNP65ZX7.js +21 -0
  62. package/dist/chunk-MNP65ZX7.js.map +1 -0
  63. package/dist/chunk-NTY64BKS.js +38 -0
  64. package/dist/chunk-NTY64BKS.js.map +1 -0
  65. package/dist/chunk-OLBHLVLE.js +220 -0
  66. package/dist/chunk-OLBHLVLE.js.map +1 -0
  67. package/dist/chunk-TNOQTZ3N.js +92 -0
  68. package/dist/chunk-TNOQTZ3N.js.map +1 -0
  69. package/dist/chunk-UMEJU65Q.js +34 -0
  70. package/dist/chunk-UMEJU65Q.js.map +1 -0
  71. package/dist/chunk-UTPW3QRT.js +52 -0
  72. package/dist/chunk-UTPW3QRT.js.map +1 -0
  73. package/dist/chunk-V3RO5N2M.js +8 -0
  74. package/dist/chunk-V3RO5N2M.js.map +1 -0
  75. package/dist/chunk-XXBHZR3M.js +99 -0
  76. package/dist/chunk-XXBHZR3M.js.map +1 -0
  77. package/dist/chunk-Z3MJ3GZ6.js +18 -0
  78. package/dist/chunk-Z3MJ3GZ6.js.map +1 -0
  79. package/dist/chunk-Z5D2V4DU.js +216 -0
  80. package/dist/chunk-Z5D2V4DU.js.map +1 -0
  81. package/dist/context.d.ts +94 -0
  82. package/dist/context.js +4 -0
  83. package/dist/context.js.map +1 -0
  84. package/dist/debug-headers.d.ts +43 -0
  85. package/dist/debug-headers.js +5 -0
  86. package/dist/debug-headers.js.map +1 -0
  87. package/dist/error-reporting.d.ts +118 -0
  88. package/dist/error-reporting.js +4 -0
  89. package/dist/error-reporting.js.map +1 -0
  90. package/dist/handlers.d.ts +70 -0
  91. package/dist/handlers.js +6 -0
  92. package/dist/handlers.js.map +1 -0
  93. package/dist/index.d.ts +34 -0
  94. package/dist/index.js +14 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/loaders.d.ts +124 -0
  97. package/dist/loaders.js +6 -0
  98. package/dist/loaders.js.map +1 -0
  99. package/dist/metrics.d.ts +113 -0
  100. package/dist/metrics.js +4 -0
  101. package/dist/metrics.js.map +1 -0
  102. package/dist/middleware.d.ts +104 -0
  103. package/dist/middleware.js +7 -0
  104. package/dist/middleware.js.map +1 -0
  105. package/dist/server-functions.d.ts +71 -0
  106. package/dist/server-functions.js +6 -0
  107. package/dist/server-functions.js.map +1 -0
  108. package/dist/testing.d.ts +128 -0
  109. package/dist/testing.js +110 -0
  110. package/dist/testing.js.map +1 -0
  111. package/dist/types-C37KSxMN.d.ts +152 -0
  112. package/package.json +166 -0
  113. package/src/auto.ts +86 -0
  114. package/src/browser/context.ts +88 -0
  115. package/src/browser/debug-headers.ts +19 -0
  116. package/src/browser/error-reporting.ts +63 -0
  117. package/src/browser/handlers.ts +23 -0
  118. package/src/browser/index.ts +65 -0
  119. package/src/browser/loaders.ts +62 -0
  120. package/src/browser/metrics.ts +86 -0
  121. package/src/browser/middleware.ts +61 -0
  122. package/src/browser/server-functions.ts +31 -0
  123. package/src/browser/testing.ts +67 -0
  124. package/src/browser/types.ts +100 -0
  125. package/src/context.test.ts +90 -0
  126. package/src/context.ts +145 -0
  127. package/src/debug-headers.ts +109 -0
  128. package/src/env.ts +56 -0
  129. package/src/error-reporting.ts +204 -0
  130. package/src/handlers.ts +339 -0
  131. package/src/index.ts +92 -0
  132. package/src/loaders.test.ts +123 -0
  133. package/src/loaders.ts +267 -0
  134. package/src/metrics.ts +183 -0
  135. package/src/middleware.test.ts +191 -0
  136. package/src/middleware.ts +400 -0
  137. package/src/server-functions.test.ts +86 -0
  138. package/src/server-functions.ts +184 -0
  139. package/src/testing.test.ts +72 -0
  140. package/src/testing.ts +276 -0
  141. package/src/types.test.ts +46 -0
  142. package/src/types.ts +182 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Jag Reehal 2025
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,294 @@
1
+ # autotel-tanstack
2
+
3
+ OpenTelemetry instrumentation for TanStack Start applications. Automatic tracing for server functions, middleware, and route loaders.
4
+
5
+ ## Features
6
+
7
+ - **Zero-Config Option** - Just import `autotel-tanstack/auto` and you're done
8
+ - **Framework-Aligned API** - Uses TanStack's middleware patterns
9
+ - **Full Coverage** - Server functions, loaders, beforeLoad, HTTP requests
10
+ - **Tree-Shakeable** - Only bundle what you use
11
+ - **Type-Safe** - Full TypeScript support
12
+ - **Vendor-Agnostic** - Works with any OTLP-compatible backend (Honeycomb, Datadog, Jaeger, etc.)
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install autotel-tanstack autotel
18
+ # or
19
+ pnpm add autotel-tanstack autotel
20
+ # or
21
+ yarn add autotel-tanstack autotel
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ### Option 1: Zero-Config (Recommended)
27
+
28
+ ```typescript
29
+ // app/start.ts (React) or app/start.ts (Solid)
30
+ import 'autotel-tanstack/auto';
31
+ import { createStart } from '@tanstack/react-start';
32
+
33
+ // Set env vars: OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT
34
+ export const startInstance = createStart(() => ({}));
35
+ ```
36
+
37
+ ### Option 2: Middleware-Based
38
+
39
+ ```typescript
40
+ // app/start.ts
41
+ import { createStart } from '@tanstack/react-start';
42
+ import { tracingMiddleware } from 'autotel-tanstack/middleware';
43
+ import { init } from 'autotel';
44
+
45
+ // Initialize autotel
46
+ init({
47
+ service: 'my-app',
48
+ endpoint: 'https://api.honeycomb.io',
49
+ headers: { 'x-honeycomb-team': process.env.HONEYCOMB_API_KEY },
50
+ });
51
+
52
+ export const startInstance = createStart(() => ({
53
+ requestMiddleware: [tracingMiddleware()],
54
+ }));
55
+ ```
56
+
57
+ ### Option 3: Handler Wrapper (Full Control)
58
+
59
+ ```typescript
60
+ // server.ts
61
+ import {
62
+ createStartHandler,
63
+ defaultStreamHandler,
64
+ } from '@tanstack/react-start/server';
65
+ import { wrapStartHandler } from 'autotel-tanstack/handlers';
66
+
67
+ export default wrapStartHandler({
68
+ service: 'my-app',
69
+ endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
70
+ headers: { 'x-honeycomb-team': process.env.HONEYCOMB_API_KEY },
71
+ })(createStartHandler(defaultStreamHandler));
72
+ ```
73
+
74
+ ## Usage
75
+
76
+ ### Tracing Server Functions
77
+
78
+ ```typescript
79
+ import { createServerFn } from '@tanstack/react-start';
80
+ import { functionTracingMiddleware } from 'autotel-tanstack/middleware';
81
+
82
+ // Using middleware (recommended)
83
+ export const getUser = createServerFn({ method: 'GET' })
84
+ .middleware([functionTracingMiddleware()])
85
+ .handler(async ({ data: id }) => {
86
+ return await db.users.findUnique({ where: { id } });
87
+ });
88
+
89
+ // Or using explicit wrapper
90
+ import { traceServerFn } from 'autotel-tanstack/server-functions';
91
+
92
+ const getUserBase = createServerFn({ method: 'GET' }).handler(
93
+ async ({ data: id }) => {
94
+ return await db.users.findUnique({ where: { id } });
95
+ },
96
+ );
97
+
98
+ export const getUser = traceServerFn(getUserBase, { name: 'getUser' });
99
+ ```
100
+
101
+ ### Tracing Route Loaders
102
+
103
+ ```typescript
104
+ import { createFileRoute } from '@tanstack/react-router';
105
+ import { traceLoader, traceBeforeLoad } from 'autotel-tanstack/loaders';
106
+
107
+ export const Route = createFileRoute('/users/$userId')({
108
+ beforeLoad: traceBeforeLoad(async ({ context }) => {
109
+ if (!context.auth.isAuthenticated) {
110
+ throw redirect({ to: '/login' });
111
+ }
112
+ }),
113
+ loader: traceLoader(async ({ params }) => {
114
+ return await getUser(params.userId);
115
+ }),
116
+ });
117
+ ```
118
+
119
+ ### Using createTracedRoute Helper
120
+
121
+ ```typescript
122
+ import { createFileRoute } from '@tanstack/react-router';
123
+ import { createTracedRoute } from 'autotel-tanstack/loaders';
124
+
125
+ const traced = createTracedRoute('/users/$userId');
126
+
127
+ export const Route = createFileRoute('/users/$userId')({
128
+ beforeLoad: traced.beforeLoad(async ({ context }) => {
129
+ // Auth check
130
+ }),
131
+ loader: traced.loader(async ({ params }) => {
132
+ return await getUser(params.userId);
133
+ }),
134
+ });
135
+ ```
136
+
137
+ ## Configuration
138
+
139
+ ### Middleware Configuration
140
+
141
+ ```typescript
142
+ import { createTracingMiddleware } from 'autotel-tanstack/middleware';
143
+
144
+ const middleware = createTracingMiddleware({
145
+ // Type: 'request' for global middleware, 'function' for server functions
146
+ type: 'request',
147
+
148
+ // Headers to capture as span attributes
149
+ captureHeaders: ['x-request-id', 'user-agent'],
150
+
151
+ // Whether to capture function arguments (default: true)
152
+ captureArgs: true,
153
+
154
+ // Whether to capture function results (default: false - PII concern)
155
+ captureResults: false,
156
+
157
+ // Paths to exclude from tracing
158
+ excludePaths: ['/health', '/metrics', '/api/internal/*'],
159
+
160
+ // Sampling strategy: 'always' | 'adaptive' | 'never'
161
+ sampling: 'adaptive',
162
+
163
+ // Custom attributes function
164
+ customAttributes: ({ type, name, request }) => ({
165
+ 'custom.attribute': 'value',
166
+ }),
167
+ });
168
+ ```
169
+
170
+ ### Handler Configuration
171
+
172
+ ```typescript
173
+ import { wrapStartHandler } from 'autotel-tanstack/handlers';
174
+
175
+ const handler = wrapStartHandler({
176
+ // Service name (default: OTEL_SERVICE_NAME or 'tanstack-start')
177
+ service: 'my-app',
178
+
179
+ // OTLP endpoint (default: OTEL_EXPORTER_OTLP_ENDPOINT)
180
+ endpoint: 'https://api.honeycomb.io',
181
+
182
+ // OTLP headers (default: parsed from OTEL_EXPORTER_OTLP_HEADERS)
183
+ headers: { 'x-honeycomb-team': 'YOUR_API_KEY' },
184
+
185
+ // All middleware config options also available
186
+ captureHeaders: ['x-request-id'],
187
+ excludePaths: ['/health'],
188
+ });
189
+ ```
190
+
191
+ ## Environment Variables
192
+
193
+ | Variable | Description | Example |
194
+ | ----------------------------- | ---------------------------------- | --------------------------- |
195
+ | `OTEL_SERVICE_NAME` | Service name for spans | `my-app` |
196
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector URL | `https://api.honeycomb.io` |
197
+ | `OTEL_EXPORTER_OTLP_HEADERS` | Auth headers (key=value,key=value) | `x-honeycomb-team=YOUR_KEY` |
198
+ | `AUTOTEL_DEBUG` | Enable debug logging | `true` |
199
+
200
+ ## Span Attributes
201
+
202
+ ### HTTP Request Spans
203
+
204
+ - `http.request.method` - GET, POST, etc.
205
+ - `url.path` - Request path
206
+ - `url.query` - Query string
207
+ - `http.response.status_code` - Response status
208
+ - `tanstack.request.duration_ms` - Request duration
209
+
210
+ ### Server Function Spans
211
+
212
+ - `rpc.system` - "tanstack-start"
213
+ - `rpc.method` - Function name
214
+ - `tanstack.server_function.name` - Function name
215
+ - `tanstack.server_function.method` - HTTP method
216
+ - `tanstack.server_function.args` - Serialized arguments (if enabled)
217
+
218
+ ### Loader Spans
219
+
220
+ - `tanstack.loader.route_id` - Route identifier
221
+ - `tanstack.loader.type` - "loader" or "beforeLoad"
222
+ - `tanstack.loader.params` - Route params (if enabled)
223
+
224
+ ## Testing
225
+
226
+ ```typescript
227
+ import { describe, it, beforeEach, afterEach } from 'vitest';
228
+ import { createTestHarness } from 'autotel-tanstack/testing';
229
+
230
+ describe('MyServerFunction', () => {
231
+ let harness: ReturnType<typeof createTestHarness>;
232
+
233
+ beforeEach(() => {
234
+ harness = createTestHarness();
235
+ });
236
+
237
+ afterEach(() => {
238
+ harness.reset();
239
+ });
240
+
241
+ it('should trace the server function', async () => {
242
+ await myServerFunction({ id: '123' });
243
+
244
+ harness.assertServerFnTraced('myServerFunction');
245
+ harness.assertSpanHasAttribute(
246
+ /tanstack\.serverFn/,
247
+ 'tanstack.server_function.name',
248
+ 'myServerFunction',
249
+ );
250
+ });
251
+ });
252
+ ```
253
+
254
+ ### Mock Utilities
255
+
256
+ ```typescript
257
+ import {
258
+ createMockRequest,
259
+ generateTraceparent,
260
+ } from 'autotel-tanstack/testing';
261
+
262
+ // Create mock request
263
+ const request = createMockRequest('GET', '/api/users', {
264
+ headers: { 'x-request-id': 'test-123' },
265
+ traceparent: generateTraceparent(),
266
+ });
267
+ ```
268
+
269
+ ## Context Propagation
270
+
271
+ For distributed tracing across services:
272
+
273
+ ```typescript
274
+ import {
275
+ createTracedHeaders,
276
+ extractContextFromRequest,
277
+ } from 'autotel-tanstack/context';
278
+
279
+ // Outgoing requests - inject trace context
280
+ const headers = createTracedHeaders({ 'Content-Type': 'application/json' });
281
+ await fetch('https://api.example.com', { headers, method: 'POST', body });
282
+
283
+ // Incoming requests - extract parent context
284
+ const parentContext = extractContextFromRequest(request);
285
+ ```
286
+
287
+ ## Supported Frameworks
288
+
289
+ - **@tanstack/react-start** ^1.139.14
290
+ - **@tanstack/solid-start** ^1.139.14
291
+
292
+ ## License
293
+
294
+ MIT
package/dist/auto.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ export { functionTracingMiddleware, tracingMiddleware } from './middleware.js';
2
+ export { traceServerFn } from './server-functions.js';
3
+ export { traceBeforeLoad, traceLoader } from './loaders.js';
4
+ import './types-C37KSxMN.js';
5
+ import '@opentelemetry/api';
6
+
7
+ /**
8
+ * Zero-config auto-instrumentation for TanStack Start
9
+ *
10
+ * Import this module to automatically instrument TanStack Start applications
11
+ * with OpenTelemetry tracing. Configuration is read from environment variables.
12
+ *
13
+ * Environment Variables:
14
+ * - OTEL_SERVICE_NAME: Service name (default: 'tanstack-start')
15
+ * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector URL
16
+ * - OTEL_EXPORTER_OTLP_HEADERS: Authentication headers (key=value,key=value)
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // app/start.ts
21
+ * import 'autotel-tanstack/auto';
22
+ * import { createStart } from '@tanstack/react-start';
23
+ *
24
+ * // Tracing is automatically configured!
25
+ * export const startInstance = createStart(() => ({}));
26
+ * ```
27
+ *
28
+ * @module
29
+ */
30
+
31
+ /**
32
+ * Check if auto-instrumentation is active
33
+ */
34
+ declare function isAutoInstrumentationActive(): boolean;
35
+ /**
36
+ * Get the configured service name
37
+ */
38
+ declare function getServiceName(): string;
39
+ /**
40
+ * Get the configured endpoint
41
+ */
42
+ declare function getEndpoint(): string | undefined;
43
+
44
+ export { getEndpoint, getServiceName, isAutoInstrumentationActive };
package/dist/auto.js ADDED
@@ -0,0 +1,47 @@
1
+ export { functionTracingMiddleware, tracingMiddleware } from './chunk-OLBHLVLE.js';
2
+ export { traceServerFn } from './chunk-TNOQTZ3N.js';
3
+ export { traceBeforeLoad, traceLoader } from './chunk-HKM7LMO6.js';
4
+ import './chunk-EUYFVNYE.js';
5
+ import './chunk-I4LX3LOG.js';
6
+ import './chunk-NTY64BKS.js';
7
+ import './chunk-EGRHWZRV.js';
8
+ import { init } from 'autotel';
9
+
10
+ var service = process.env.OTEL_SERVICE_NAME || "tanstack-start";
11
+ var endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
12
+ var headers;
13
+ if (process.env.OTEL_EXPORTER_OTLP_HEADERS) {
14
+ headers = {};
15
+ const pairs = process.env.OTEL_EXPORTER_OTLP_HEADERS.split(",");
16
+ for (const pair of pairs) {
17
+ const [key, value] = pair.split("=");
18
+ if (key && value) {
19
+ headers[key.trim()] = value.trim();
20
+ }
21
+ }
22
+ }
23
+ init({
24
+ service,
25
+ endpoint,
26
+ headers
27
+ });
28
+ if (process.env.NODE_ENV === "development" || process.env.AUTOTEL_DEBUG) {
29
+ console.log("[autotel-tanstack] Auto-initialized with:", {
30
+ service,
31
+ endpoint: endpoint || "(not configured)",
32
+ hasHeaders: !!headers
33
+ });
34
+ }
35
+ function isAutoInstrumentationActive() {
36
+ return true;
37
+ }
38
+ function getServiceName() {
39
+ return service;
40
+ }
41
+ function getEndpoint() {
42
+ return endpoint;
43
+ }
44
+
45
+ export { getEndpoint, getServiceName, isAutoInstrumentationActive };
46
+ //# sourceMappingURL=auto.js.map
47
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto.ts"],"names":[],"mappings":";;;;;;;;;AA2BA,IAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,gBAAA;AAGjD,IAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,2BAAA;AAG7B,IAAI,OAAA;AACJ,IAAI,OAAA,CAAQ,IAAI,0BAAA,EAA4B;AAC1C,EAAA,OAAA,GAAU,EAAC;AACX,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,0BAAA,CAA2B,MAAM,GAAG,CAAA;AAC9D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAAA,IACnC;AAAA,EACF;AACF;AAGA,IAAA,CAAK;AAAA,EACH,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,IAAiB,OAAA,CAAQ,IAAI,aAAA,EAAe;AACvE,EAAA,OAAA,CAAQ,IAAI,2CAAA,EAA6C;AAAA,IACvD,OAAA;AAAA,IACA,UAAU,QAAA,IAAY,kBAAA;AAAA,IACtB,UAAA,EAAY,CAAC,CAAC;AAAA,GACf,CAAA;AACH;AAUO,SAAS,2BAAA,GAAuC;AACrD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,WAAA,GAAkC;AAChD,EAAA,OAAO,QAAA;AACT","file":"auto.js","sourcesContent":["/**\n * Zero-config auto-instrumentation for TanStack Start\n *\n * Import this module to automatically instrument TanStack Start applications\n * with OpenTelemetry tracing. Configuration is read from environment variables.\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (default: 'tanstack-start')\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector URL\n * - OTEL_EXPORTER_OTLP_HEADERS: Authentication headers (key=value,key=value)\n *\n * @example\n * ```typescript\n * // app/start.ts\n * import 'autotel-tanstack/auto';\n * import { createStart } from '@tanstack/react-start';\n *\n * // Tracing is automatically configured!\n * export const startInstance = createStart(() => ({}));\n * ```\n *\n * @module\n */\n\nimport { init } from 'autotel';\n\n// Parse service name\nconst service = process.env.OTEL_SERVICE_NAME || 'tanstack-start';\n\n// Parse endpoint\nconst endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n\n// Parse headers\nlet headers: Record<string, string> | undefined;\nif (process.env.OTEL_EXPORTER_OTLP_HEADERS) {\n headers = {};\n const pairs = process.env.OTEL_EXPORTER_OTLP_HEADERS.split(',');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key && value) {\n headers[key.trim()] = value.trim();\n }\n }\n}\n\n// Initialize autotel\ninit({\n service,\n endpoint,\n headers,\n});\n\n// Log initialization (only in development)\nif (process.env.NODE_ENV === 'development' || process.env.AUTOTEL_DEBUG) {\n console.log('[autotel-tanstack] Auto-initialized with:', {\n service,\n endpoint: endpoint || '(not configured)',\n hasHeaders: !!headers,\n });\n}\n\n// Re-export middleware for convenience\nexport { tracingMiddleware, functionTracingMiddleware } from './middleware';\nexport { traceServerFn } from './server-functions';\nexport { traceLoader, traceBeforeLoad } from './loaders';\n\n/**\n * Check if auto-instrumentation is active\n */\nexport function isAutoInstrumentationActive(): boolean {\n return true;\n}\n\n/**\n * Get the configured service name\n */\nexport function getServiceName(): string {\n return service;\n}\n\n/**\n * Get the configured endpoint\n */\nexport function getEndpoint(): string | undefined {\n return endpoint;\n}\n"]}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Browser stub for context module
3
+ *
4
+ * In browser environments, context propagation is not needed.
5
+ * These functions return empty/default values.
6
+ */
7
+ /**
8
+ * Type representing values that can be used to initialize Headers
9
+ */
10
+ type HeadersInitType = Headers | Record<string, string> | [string, string][];
11
+ /**
12
+ * Browser stub: Returns root context (no parent)
13
+ */
14
+ declare function extractContextFromRequest(_request: Request): unknown;
15
+ /**
16
+ * Browser stub: Returns headers unchanged
17
+ */
18
+ declare function injectContextToHeaders(headers: Headers, ctx?: unknown): Headers;
19
+ /**
20
+ * Browser stub: Create headers with optional initial values
21
+ */
22
+ declare function createTracedHeaders(existingHeaders?: HeadersInitType, ctx?: unknown): Headers;
23
+ /**
24
+ * Browser stub: Run function and return result
25
+ */
26
+ declare function runInContext<T>(parentContext: unknown, fn: () => T): T;
27
+ /**
28
+ * Browser stub: Returns empty context object
29
+ */
30
+ declare function getActiveContext(): unknown;
31
+ /**
32
+ * Browser stub: Returns empty string
33
+ */
34
+ declare function getTraceParent(): string;
35
+ /**
36
+ * Browser stub: Returns empty string
37
+ */
38
+ declare function getTraceState(): string;
39
+ /**
40
+ * Browser stub: Returns undefined
41
+ */
42
+ declare function getCurrentTraceId(): string | undefined;
43
+ /**
44
+ * Browser stub: Returns undefined
45
+ */
46
+ declare function getCurrentSpanId(): string | undefined;
47
+
48
+ export { type HeadersInitType, createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext };
@@ -0,0 +1,3 @@
1
+ export { createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from '../chunk-DTZCOB4W.js';
2
+ //# sourceMappingURL=context.js.map
3
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"context.js"}
@@ -0,0 +1,16 @@
1
+ import { MiddlewareHandler } from './middleware.js';
2
+ import './types.js';
3
+
4
+ /**
5
+ * Browser stub for debug-headers module
6
+ *
7
+ * Debug headers are server-side only.
8
+ * In browser, this returns pass-through middleware.
9
+ */
10
+
11
+ /**
12
+ * Browser stub: Returns pass-through middleware
13
+ */
14
+ declare function debugHeadersMiddleware<TContext = unknown>(): MiddlewareHandler<TContext>;
15
+
16
+ export { debugHeadersMiddleware };
@@ -0,0 +1,3 @@
1
+ export { debugHeadersMiddleware } from '../chunk-JXO7H6KO.js';
2
+ //# sourceMappingURL=debug-headers.js.map
3
+ //# sourceMappingURL=debug-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"debug-headers.js"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Browser stub for error-reporting module
3
+ *
4
+ * Error reporting/collection only happens on the server.
5
+ * In browser, these are no-op functions.
6
+ */
7
+ /**
8
+ * Error entry structure (stub)
9
+ */
10
+ interface ErrorEntry {
11
+ timestamp: string;
12
+ message: string;
13
+ stack?: string;
14
+ context?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Browser stub: No-op
18
+ */
19
+ declare function reportError(error: Error, context?: Record<string, unknown>): void;
20
+ /**
21
+ * Browser stub: Returns empty array
22
+ */
23
+ declare function getRecentErrors(limit?: number): ErrorEntry[];
24
+ /**
25
+ * Browser stub: No-op
26
+ */
27
+ declare function clearErrors(): void;
28
+ /**
29
+ * Browser stub: Returns JSON Response with empty errors
30
+ */
31
+ declare function createErrorReportingHandler(): () => Response;
32
+ /**
33
+ * Browser stub: Returns function unchanged
34
+ */
35
+ declare function withErrorReporting<T extends (...args: unknown[]) => unknown>(fn: T, context?: Record<string, unknown>): T;
36
+
37
+ export { type ErrorEntry, clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting };
@@ -0,0 +1,3 @@
1
+ export { clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting } from '../chunk-HIQYW2HB.js';
2
+ //# sourceMappingURL=error-reporting.js.map
3
+ //# sourceMappingURL=error-reporting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"error-reporting.js"}
@@ -0,0 +1,19 @@
1
+ import { WrapStartHandlerConfig } from './types.js';
2
+
3
+ /**
4
+ * Browser stub for handlers module
5
+ *
6
+ * Handler wrapping only applies on the server side.
7
+ * In browser, we just return the handler unchanged.
8
+ */
9
+
10
+ /**
11
+ * Handler type
12
+ */
13
+ type StartHandler<T = unknown> = (request: Request) => Promise<T>;
14
+ /**
15
+ * Browser stub: Returns the handler unchanged
16
+ */
17
+ declare function wrapStartHandler<T>(config?: WrapStartHandlerConfig): (handler: StartHandler<T>) => StartHandler<T>;
18
+
19
+ export { type StartHandler, wrapStartHandler };
@@ -0,0 +1,3 @@
1
+ export { wrapStartHandler } from '../chunk-V3RO5N2M.js';
2
+ //# sourceMappingURL=handlers.js.map
3
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"handlers.js"}
@@ -0,0 +1,10 @@
1
+ export { Attributes, DEFAULT_CONFIG, SPAN_ATTRIBUTES, TanStackInstrumentationConfig, TraceLoaderConfig, TraceServerFnConfig, TracingMiddlewareConfig, WrapStartHandlerConfig } from './types.js';
2
+ export { createTracedRoute, traceBeforeLoad, traceLoader } from './loaders.js';
3
+ export { createTracedServerFnFactory, traceServerFn } from './server-functions.js';
4
+ export { MiddlewareHandler, createTracingMiddleware, functionTracingMiddleware, tracingMiddleware } from './middleware.js';
5
+ export { HeadersInitType, createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from './context.js';
6
+ export { StartHandler, wrapStartHandler } from './handlers.js';
7
+ export { MetricsData, createMetricsHandler, getMetrics, metricsCollector, recordError, recordTiming, resetMetrics } from './metrics.js';
8
+ export { ErrorEntry, clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting } from './error-reporting.js';
9
+ export { debugHeadersMiddleware } from './debug-headers.js';
10
+ export { TestCollector, TestSpan, assertSpanCreated, assertSpanHasAttribute, createTestCollector } from './testing.js';
@@ -0,0 +1,12 @@
1
+ export { createMetricsHandler, getMetrics, metricsCollector, recordError, recordTiming, resetMetrics } from '../chunk-UMEJU65Q.js';
2
+ export { clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting } from '../chunk-HIQYW2HB.js';
3
+ export { DEFAULT_CONFIG, SPAN_ATTRIBUTES } from '../chunk-MFYOV2SF.js';
4
+ export { createTracingMiddleware, functionTracingMiddleware, tracingMiddleware } from '../chunk-4C7T5ZIM.js';
5
+ export { createTracedServerFnFactory, traceServerFn } from '../chunk-CSFIPJC2.js';
6
+ export { createTracedRoute, traceBeforeLoad, traceLoader } from '../chunk-MNP65ZX7.js';
7
+ export { createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from '../chunk-DTZCOB4W.js';
8
+ export { wrapStartHandler } from '../chunk-V3RO5N2M.js';
9
+ export { assertSpanCreated, assertSpanHasAttribute, createTestCollector } from '../chunk-Z3MJ3GZ6.js';
10
+ export { debugHeadersMiddleware } from '../chunk-JXO7H6KO.js';
11
+ //# sourceMappingURL=index.js.map
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,36 @@
1
+ import { TraceLoaderConfig } from './types.js';
2
+
3
+ /**
4
+ * Browser stub for loaders module
5
+ *
6
+ * In browser environments, these functions are no-ops that just call the
7
+ * original functions without any tracing overhead.
8
+ */
9
+
10
+ /**
11
+ * Loader context type (compatible with TanStack router loader context)
12
+ */
13
+ interface LoaderContext {
14
+ params?: Record<string, string>;
15
+ route?: {
16
+ id?: string;
17
+ };
18
+ [key: string]: unknown;
19
+ }
20
+ /**
21
+ * Browser stub: Returns the loader function unchanged
22
+ */
23
+ declare function traceLoader<T extends (context: LoaderContext) => Promise<unknown>>(loaderFn: T, config?: TraceLoaderConfig): T;
24
+ /**
25
+ * Browser stub: Returns the beforeLoad function unchanged
26
+ */
27
+ declare function traceBeforeLoad<T extends (context: LoaderContext) => Promise<unknown>>(beforeLoadFn: T, config?: TraceLoaderConfig): T;
28
+ /**
29
+ * Browser stub: Returns object with pass-through wrappers
30
+ */
31
+ declare function createTracedRoute(routeId: string, config?: Omit<TraceLoaderConfig, 'name'>): {
32
+ loader<T extends (context: LoaderContext) => Promise<unknown>>(loaderFn: T): T;
33
+ beforeLoad<T extends (context: LoaderContext) => Promise<unknown>>(beforeLoadFn: T): T;
34
+ };
35
+
36
+ export { createTracedRoute, traceBeforeLoad, traceLoader };
@@ -0,0 +1,3 @@
1
+ export { createTracedRoute, traceBeforeLoad, traceLoader } from '../chunk-MNP65ZX7.js';
2
+ //# sourceMappingURL=loaders.js.map
3
+ //# sourceMappingURL=loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"loaders.js"}