autotel-tanstack 1.13.41 → 1.13.43

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.
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","names":[],"sources":["../../src/browser/context.ts"],"mappings":";;AAUA;;;;AAEU;AAMV;;;AAAA,KARY,eAAA,GACR,OAAA,GACA,MAAM;AAMiD;AAS3D;;AAT2D,iBAA3C,yBAAA,CAA0B,QAAiB,EAAP,OAAO;;;;iBAS3C,sBAAA,CACd,OAAA,EAAS,OAAA,EACT,GAAA,aACC,OAAO;;;AAAA;iBAQM,mBAAA,CACd,eAAA,GAAkB,eAAA,EAClB,GAAA,aACC,OAAO;;;;iBAQM,YAAA,IAAgB,aAAA,WAAwB,EAAA,QAAU,CAAA,GAAI,CAAC;;;;iBAQvD,gBAAA;AAhBN;AAQV;;AARU,iBAuBM,cAAA;;;;iBAOA,aAAA;;;;iBAOA,iBAAA;AArBhB;;;AAAA,iBA4BgB,gBAAA"}
1
+ {"version":3,"file":"context.d.ts","names":[],"sources":["../../src/browser/context.ts"],"mappings":";;AAUA;;;;AACkB;AAKlB;;;AAAA,KANY,eAAA,GACV,OAAA,GAAU,MAAM;AAKyC;AAS3D;;AAT2D,iBAA3C,yBAAA,CAA0B,QAAiB,EAAP,OAAO;;;;iBAS3C,sBAAA,CACd,OAAA,EAAS,OAAA,EACT,GAAA,aACC,OAAO;;;AAAA;iBAQM,mBAAA,CACd,eAAA,GAAkB,eAAA,EAClB,GAAA,aACC,OAAO;;;;iBAQM,YAAA,IAAgB,aAAA,WAAwB,EAAA,QAAU,CAAA,GAAI,CAAC;;;;iBAQvD,gBAAA;AAhBN;AAQV;;AARU,iBAuBM,cAAA;;;;iBAOA,aAAA;;;;iBAOA,iBAAA;AArBhB;;;AAAA,iBA4BgB,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../src/browser/context.ts"],"sourcesContent":["/**\n * Browser stub for context module\n *\n * In browser environments, context propagation is not needed.\n * These functions return empty/default values.\n */\n\n/**\n * Type representing values that can be used to initialize Headers\n */\nexport type HeadersInitType =\n | Headers\n | Record<string, string>\n | [string, string][];\n\n/**\n * Browser stub: Returns root context (no parent)\n */\nexport function extractContextFromRequest(_request: Request): unknown {\n void _request;\n // Return an empty context-like object\n return {};\n}\n\n/**\n * Browser stub: Returns headers unchanged\n */\nexport function injectContextToHeaders(\n headers: Headers,\n ctx?: unknown,\n): Headers {\n void ctx;\n return headers;\n}\n\n/**\n * Browser stub: Create headers with optional initial values\n */\nexport function createTracedHeaders(\n existingHeaders?: HeadersInitType,\n ctx?: unknown,\n): Headers {\n void ctx;\n return new Headers(existingHeaders);\n}\n\n/**\n * Browser stub: Run function and return result\n */\nexport function runInContext<T>(parentContext: unknown, fn: () => T): T {\n void parentContext;\n return fn();\n}\n\n/**\n * Browser stub: Returns empty context object\n */\nexport function getActiveContext(): unknown {\n return {};\n}\n\n/**\n * Browser stub: Returns empty string\n */\nexport function getTraceParent(): string {\n return '';\n}\n\n/**\n * Browser stub: Returns empty string\n */\nexport function getTraceState(): string {\n return '';\n}\n\n/**\n * Browser stub: Returns undefined\n */\nexport function getCurrentTraceId(): string | undefined {\n return undefined;\n}\n\n/**\n * Browser stub: Returns undefined\n */\nexport function getCurrentSpanId(): string | undefined {\n return undefined;\n}\n"],"mappings":";;;;AAkBA,SAAgB,0BAA0B,UAA4B;CAGpE,OAAO,CAAC;AACV;;;;AAKA,SAAgB,uBACd,SACA,KACS;CAET,OAAO;AACT;;;;AAKA,SAAgB,oBACd,iBACA,KACS;CAET,OAAO,IAAI,QAAQ,eAAe;AACpC;;;;AAKA,SAAgB,aAAgB,eAAwB,IAAgB;CAEtE,OAAO,GAAG;AACZ;;;;AAKA,SAAgB,mBAA4B;CAC1C,OAAO,CAAC;AACV;;;;AAKA,SAAgB,iBAAyB;CACvC,OAAO;AACT;;;;AAKA,SAAgB,gBAAwB;CACtC,OAAO;AACT;;;;AAKA,SAAgB,oBAAwC,CAExD;;;;AAKA,SAAgB,mBAAuC,CAEvD"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../src/browser/context.ts"],"sourcesContent":["/**\n * Browser stub for context module\n *\n * In browser environments, context propagation is not needed.\n * These functions return empty/default values.\n */\n\n/**\n * Type representing values that can be used to initialize Headers\n */\nexport type HeadersInitType =\n Headers | Record<string, string> | [string, string][];\n\n/**\n * Browser stub: Returns root context (no parent)\n */\nexport function extractContextFromRequest(_request: Request): unknown {\n void _request;\n // Return an empty context-like object\n return {};\n}\n\n/**\n * Browser stub: Returns headers unchanged\n */\nexport function injectContextToHeaders(\n headers: Headers,\n ctx?: unknown,\n): Headers {\n void ctx;\n return headers;\n}\n\n/**\n * Browser stub: Create headers with optional initial values\n */\nexport function createTracedHeaders(\n existingHeaders?: HeadersInitType,\n ctx?: unknown,\n): Headers {\n void ctx;\n return new Headers(existingHeaders);\n}\n\n/**\n * Browser stub: Run function and return result\n */\nexport function runInContext<T>(parentContext: unknown, fn: () => T): T {\n void parentContext;\n return fn();\n}\n\n/**\n * Browser stub: Returns empty context object\n */\nexport function getActiveContext(): unknown {\n return {};\n}\n\n/**\n * Browser stub: Returns empty string\n */\nexport function getTraceParent(): string {\n return '';\n}\n\n/**\n * Browser stub: Returns empty string\n */\nexport function getTraceState(): string {\n return '';\n}\n\n/**\n * Browser stub: Returns undefined\n */\nexport function getCurrentTraceId(): string | undefined {\n return undefined;\n}\n\n/**\n * Browser stub: Returns undefined\n */\nexport function getCurrentSpanId(): string | undefined {\n return undefined;\n}\n"],"mappings":";;;;AAgBA,SAAgB,0BAA0B,UAA4B;CAGpE,OAAO,CAAC;AACV;;;;AAKA,SAAgB,uBACd,SACA,KACS;CAET,OAAO;AACT;;;;AAKA,SAAgB,oBACd,iBACA,KACS;CAET,OAAO,IAAI,QAAQ,eAAe;AACpC;;;;AAKA,SAAgB,aAAgB,eAAwB,IAAgB;CAEtE,OAAO,GAAG;AACZ;;;;AAKA,SAAgB,mBAA4B;CAC1C,OAAO,CAAC;AACV;;;;AAKA,SAAgB,iBAAyB;CACvC,OAAO;AACT;;;;AAKA,SAAgB,gBAAwB;CACtC,OAAO;AACT;;;;AAKA,SAAgB,oBAAwC,CAExD;;;;AAKA,SAAgB,mBAAuC,CAEvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"mappings":";;;;;AAWA;;KAAY,eAAA,GACR,OAAA,GACA,MAAM;;AAAA;AAqBV;;;;;;;;AAAoE;AAuCpE;;;;;;;iBAvCgB,yBAAA,CAA0B,OAAA,EAAS,OAAA,GAAU,OAAO;;;;;;;AA0C1D;AA+BV;;;;;;;;;;;;iBAlCgB,sBAAA,CACd,OAAA,EAAS,OAAA,EACT,GAAA,GAAM,OAAA,GACL,OAAA;;AAkCO;AAuBV;;;;;;;;;;;;;;;AAAuE;AASvE;;iBAnCgB,mBAAA,CACd,eAAA,GAAkB,eAAA,EAClB,GAAA,GAAM,OAAA,GACL,OAAA;;AAgCwC;;;;;;;;;;;;;;;;;iBAT3B,YAAA,IAAgB,aAAA,EAAe,OAAA,EAAS,EAAA,QAAU,CAAA,GAAI,CAAA;;;;;;iBAStD,gBAAA,IAAoB,OAAO"}
1
+ {"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"mappings":";;;;;AAWA;;KAAY,eAAA,GACV,OAAA,GAAU,MAAM;;AAAA;AAoBlB;;;;;;;;AAAoE;AAuCpE;;;;;;;iBAvCgB,yBAAA,CAA0B,OAAA,EAAS,OAAA,GAAU,OAAO;;;;;;;AA0C1D;AA+BV;;;;;;;;;;;;iBAlCgB,sBAAA,CACd,OAAA,EAAS,OAAA,EACT,GAAA,GAAM,OAAA,GACL,OAAA;;AAkCO;AAuBV;;;;;;;;;;;;;;;AAAuE;AASvE;;iBAnCgB,mBAAA,CACd,eAAA,GAAkB,eAAA,EAClB,GAAA,GAAM,OAAA,GACL,OAAA;;AAgCwC;;;;;;;;;;;;;;;;;iBAT3B,YAAA,IAAgB,aAAA,EAAe,OAAA,EAAS,EAAA,QAAU,CAAA,GAAI,CAAA;;;;;;iBAStD,gBAAA,IAAoB,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../src/context.ts"],"sourcesContent":["import {\n context,\n propagation,\n type Context,\n ROOT_CONTEXT,\n} from '@opentelemetry/api';\n\n/**\n * Type representing values that can be used to initialize Headers\n * This is equivalent to the DOM's HeadersInit type but works in Node.js\n */\nexport type HeadersInitType =\n | Headers\n | Record<string, string>\n | [string, string][];\n\n/**\n * Extract OpenTelemetry context from HTTP request headers\n *\n * This function extracts W3C Trace Context (traceparent, tracestate)\n * and Baggage from request headers to enable distributed tracing.\n *\n * @param request - The incoming HTTP request\n * @returns OpenTelemetry context with extracted trace information\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * context.with(parentContext, async () => {\n * // Spans created here will be children of the extracted context\n * await trace('my-operation', async (ctx) => { ... });\n * });\n * ```\n */\nexport function extractContextFromRequest(request: Request): Context {\n const carrier: Record<string, string> = {};\n\n // Extract W3C Trace Context headers\n const traceparent = request.headers.get('traceparent');\n const tracestate = request.headers.get('tracestate');\n const baggage = request.headers.get('baggage');\n\n if (traceparent) carrier.traceparent = traceparent;\n if (tracestate) carrier.tracestate = tracestate;\n if (baggage) carrier.baggage = baggage;\n\n // Return ROOT_CONTEXT if no trace headers present\n if (Object.keys(carrier).length === 0) {\n return ROOT_CONTEXT;\n }\n\n return propagation.extract(context.active(), carrier);\n}\n\n/**\n * Inject OpenTelemetry context into HTTP headers\n *\n * This function injects W3C Trace Context (traceparent, tracestate)\n * and Baggage into headers for outgoing requests.\n *\n * @param headers - Headers object to inject context into\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns The headers object with injected trace context\n *\n * @example\n * ```typescript\n * const headers = new Headers();\n * injectContextToHeaders(headers);\n *\n * // Now use headers in outgoing fetch\n * await fetch('https://api.example.com', { headers });\n * ```\n */\nexport function injectContextToHeaders(\n headers: Headers,\n ctx?: Context,\n): Headers {\n const carrier: Record<string, string> = {};\n propagation.inject(ctx ?? context.active(), carrier);\n\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value);\n }\n\n return headers;\n}\n\n/**\n * Create a new Headers object with injected trace context\n *\n * Convenience function that creates a new Headers object\n * with the current trace context already injected.\n *\n * @param existingHeaders - Optional existing headers to include\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns New Headers object with trace context\n *\n * @example\n * ```typescript\n * const headers = createTracedHeaders({ 'Content-Type': 'application/json' });\n * await fetch('https://api.example.com', {\n * method: 'POST',\n * headers,\n * body: JSON.stringify(data),\n * });\n * ```\n */\nexport function createTracedHeaders(\n existingHeaders?: HeadersInitType,\n ctx?: Context,\n): Headers {\n const headers = new Headers(existingHeaders);\n return injectContextToHeaders(headers, ctx);\n}\n\n/**\n * Run a function within a specific OpenTelemetry context\n *\n * This is a convenience wrapper around context.with() that\n * provides better TypeScript inference.\n *\n * @param parentContext - The context to run within\n * @param fn - The function to execute\n * @returns The result of the function\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * const result = await runInContext(parentContext, async () => {\n * return await processRequest();\n * });\n * ```\n */\nexport function runInContext<T>(parentContext: Context, fn: () => T): T {\n return context.with(parentContext, fn);\n}\n\n/**\n * Get the current active context\n *\n * @returns The current active OpenTelemetry context\n */\nexport function getActiveContext(): Context {\n return context.active();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkCA,SAAgB,0BAA0B,SAA2B;CACnE,MAAM,UAAkC,CAAC;CAGzC,MAAM,cAAc,QAAQ,QAAQ,IAAI,aAAa;CACrD,MAAM,aAAa,QAAQ,QAAQ,IAAI,YAAY;CACnD,MAAM,UAAU,QAAQ,QAAQ,IAAI,SAAS;CAE7C,IAAI,aAAa,QAAQ,cAAc;CACvC,IAAI,YAAY,QAAQ,aAAa;CACrC,IAAI,SAAS,QAAQ,UAAU;CAG/B,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,OAAO;CAGT,OAAO,YAAY,QAAQ,QAAQ,OAAO,GAAG,OAAO;AACtD;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,uBACd,SACA,KACS;CACT,MAAM,UAAkC,CAAC;CACzC,YAAY,OAAO,OAAO,QAAQ,OAAO,GAAG,OAAO;CAEnD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,QAAQ,IAAI,KAAK,KAAK;CAGxB,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,oBACd,iBACA,KACS;CAET,OAAO,uBAAuB,IADV,QAAQ,eACQ,GAAG,GAAG;AAC5C;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,aAAgB,eAAwB,IAAgB;CACtE,OAAO,QAAQ,KAAK,eAAe,EAAE;AACvC;;;;;;AAOA,SAAgB,mBAA4B;CAC1C,OAAO,QAAQ,OAAO;AACxB"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../src/context.ts"],"sourcesContent":["import {\n context,\n propagation,\n type Context,\n ROOT_CONTEXT,\n} from '@opentelemetry/api';\n\n/**\n * Type representing values that can be used to initialize Headers\n * This is equivalent to the DOM's HeadersInit type but works in Node.js\n */\nexport type HeadersInitType =\n Headers | Record<string, string> | [string, string][];\n\n/**\n * Extract OpenTelemetry context from HTTP request headers\n *\n * This function extracts W3C Trace Context (traceparent, tracestate)\n * and Baggage from request headers to enable distributed tracing.\n *\n * @param request - The incoming HTTP request\n * @returns OpenTelemetry context with extracted trace information\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * context.with(parentContext, async () => {\n * // Spans created here will be children of the extracted context\n * await trace('my-operation', async (ctx) => { ... });\n * });\n * ```\n */\nexport function extractContextFromRequest(request: Request): Context {\n const carrier: Record<string, string> = {};\n\n // Extract W3C Trace Context headers\n const traceparent = request.headers.get('traceparent');\n const tracestate = request.headers.get('tracestate');\n const baggage = request.headers.get('baggage');\n\n if (traceparent) carrier.traceparent = traceparent;\n if (tracestate) carrier.tracestate = tracestate;\n if (baggage) carrier.baggage = baggage;\n\n // Return ROOT_CONTEXT if no trace headers present\n if (Object.keys(carrier).length === 0) {\n return ROOT_CONTEXT;\n }\n\n return propagation.extract(context.active(), carrier);\n}\n\n/**\n * Inject OpenTelemetry context into HTTP headers\n *\n * This function injects W3C Trace Context (traceparent, tracestate)\n * and Baggage into headers for outgoing requests.\n *\n * @param headers - Headers object to inject context into\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns The headers object with injected trace context\n *\n * @example\n * ```typescript\n * const headers = new Headers();\n * injectContextToHeaders(headers);\n *\n * // Now use headers in outgoing fetch\n * await fetch('https://api.example.com', { headers });\n * ```\n */\nexport function injectContextToHeaders(\n headers: Headers,\n ctx?: Context,\n): Headers {\n const carrier: Record<string, string> = {};\n propagation.inject(ctx ?? context.active(), carrier);\n\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value);\n }\n\n return headers;\n}\n\n/**\n * Create a new Headers object with injected trace context\n *\n * Convenience function that creates a new Headers object\n * with the current trace context already injected.\n *\n * @param existingHeaders - Optional existing headers to include\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns New Headers object with trace context\n *\n * @example\n * ```typescript\n * const headers = createTracedHeaders({ 'Content-Type': 'application/json' });\n * await fetch('https://api.example.com', {\n * method: 'POST',\n * headers,\n * body: JSON.stringify(data),\n * });\n * ```\n */\nexport function createTracedHeaders(\n existingHeaders?: HeadersInitType,\n ctx?: Context,\n): Headers {\n const headers = new Headers(existingHeaders);\n return injectContextToHeaders(headers, ctx);\n}\n\n/**\n * Run a function within a specific OpenTelemetry context\n *\n * This is a convenience wrapper around context.with() that\n * provides better TypeScript inference.\n *\n * @param parentContext - The context to run within\n * @param fn - The function to execute\n * @returns The result of the function\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * const result = await runInContext(parentContext, async () => {\n * return await processRequest();\n * });\n * ```\n */\nexport function runInContext<T>(parentContext: Context, fn: () => T): T {\n return context.with(parentContext, fn);\n}\n\n/**\n * Get the current active context\n *\n * @returns The current active OpenTelemetry context\n */\nexport function getActiveContext(): Context {\n return context.active();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,0BAA0B,SAA2B;CACnE,MAAM,UAAkC,CAAC;CAGzC,MAAM,cAAc,QAAQ,QAAQ,IAAI,aAAa;CACrD,MAAM,aAAa,QAAQ,QAAQ,IAAI,YAAY;CACnD,MAAM,UAAU,QAAQ,QAAQ,IAAI,SAAS;CAE7C,IAAI,aAAa,QAAQ,cAAc;CACvC,IAAI,YAAY,QAAQ,aAAa;CACrC,IAAI,SAAS,QAAQ,UAAU;CAG/B,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,OAAO;CAGT,OAAO,YAAY,QAAQ,QAAQ,OAAO,GAAG,OAAO;AACtD;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,uBACd,SACA,KACS;CACT,MAAM,UAAkC,CAAC;CACzC,YAAY,OAAO,OAAO,QAAQ,OAAO,GAAG,OAAO;CAEnD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,QAAQ,IAAI,KAAK,KAAK;CAGxB,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,oBACd,iBACA,KACS;CAET,OAAO,uBAAuB,IADV,QAAQ,eACQ,GAAG,GAAG;AAC5C;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,aAAgB,eAAwB,IAAgB;CACtE,OAAO,QAAQ,KAAK,eAAe,EAAE;AACvC;;;;;;AAOA,SAAgB,mBAA4B;CAC1C,OAAO,QAAQ,OAAO;AACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","names":["detect","ResourceDetectionConfig","config","DetectedResource","attributes","DetectedResourceAttributes","MaybePromise","AttributeValue","Record","DetectedResourceAttributeValue","T","Promise","schemaUrl","asyncAttributesPending","attributes","Attributes","schemaUrl","waitForAsyncAttributes","Promise","merge","Resource","other","getRawAttributes","RawResourceAttribute","Function","__wrapped","__unwrap","__original","name","version","schemaUrl","Exception","ex","time","HrTime","name","attributes","Attributes","droppedAttributesCount","name","kind","SpanKind","spanContext","SpanContext","parentSpanContext","startTime","HrTime","endTime","status","SpanStatus","attributes","Attributes","links","Link","events","TimedEvent","duration","ended","resource","Resource","instrumentationScope","InstrumentationScope","droppedAttributesCount","droppedEventsCount","droppedLinksCount"],"sources":["../../../node_modules/.pnpm/@opentelemetry+resources@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/types.d.ts","../../../node_modules/.pnpm/@opentelemetry+resources@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/Resource.d.ts","../../../node_modules/.pnpm/@opentelemetry+core@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts","../../../node_modules/.pnpm/@opentelemetry+sdk-trace@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/sdk-trace/build/src/TimedEvent.d.ts","../../../node_modules/.pnpm/@opentelemetry+sdk-trace@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/sdk-trace/build/src/export/ReadableSpan.d.ts","../src/testing.ts"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.ts","names":["detect","ResourceDetectionConfig","config","DetectedResource","attributes","DetectedResourceAttributes","MaybePromise","AttributeValue","Record","DetectedResourceAttributeValue","T","Promise","schemaUrl","asyncAttributesPending","attributes","Attributes","schemaUrl","waitForAsyncAttributes","Promise","merge","Resource","other","getRawAttributes","RawResourceAttribute","Function","__wrapped","__unwrap","__original","name","version","schemaUrl","Exception","ex","time","HrTime","name","attributes","Attributes","droppedAttributesCount","name","kind","SpanKind","spanContext","SpanContext","parentSpanContext","startTime","HrTime","endTime","status","SpanStatus","attributes","Attributes","links","Link","events","TimedEvent","duration","ended","resource","Resource","instrumentationScope","InstrumentationScope","droppedAttributesCount","droppedEventsCount","droppedLinksCount"],"sources":["../../../node_modules/.pnpm/@opentelemetry+resources@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/types.d.ts","../../../node_modules/.pnpm/@opentelemetry+resources@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/Resource.d.ts","../../../node_modules/.pnpm/@opentelemetry+core@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts","../../../node_modules/.pnpm/@opentelemetry+sdk-trace@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/sdk-trace/build/src/TimedEvent.d.ts","../../../node_modules/.pnpm/@opentelemetry+sdk-trace@2.9.0_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/sdk-trace/build/src/export/ReadableSpan.d.ts","../src/testing.ts"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":[],"sources":["../src/testing.ts"],"sourcesContent":["import { type ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { InMemorySpanExporter } from 'autotel/exporters';\nimport { SimpleSpanProcessor } from 'autotel/processors';\nimport { init } from 'autotel';\n\n/**\n * Test harness for TanStack instrumentation testing\n *\n * Provides utilities for testing TanStack Start applications\n * with autotel-tanstack instrumentation.\n */\nexport interface TestHarness {\n /**\n * The in-memory span exporter\n */\n exporter: {\n getFinishedSpans(): ReadableSpan[];\n reset(): void;\n };\n\n /**\n * Get all finished spans\n */\n getSpans(): ReadableSpan[];\n\n /**\n * Get spans by name (exact match or regex)\n */\n getSpansByName(name: string | RegExp): ReadableSpan[];\n\n /**\n * Get spans by TanStack type\n */\n getSpansByType(\n type: 'request' | 'serverFn' | 'loader' | 'beforeLoad',\n ): ReadableSpan[];\n\n /**\n * Reset collected spans\n */\n reset(): void;\n\n /**\n * Assert a span exists\n */\n assertSpanExists(name: string | RegExp): void;\n\n /**\n * Assert a span has a specific attribute\n */\n assertSpanHasAttribute(\n name: string | RegExp,\n attr: string,\n value?: unknown,\n ): void;\n\n /**\n * Assert a server function was traced\n */\n assertServerFnTraced(name: string): void;\n\n /**\n * Assert a loader was traced\n */\n assertLoaderTraced(routeId: string): void;\n\n /**\n * Assert a beforeLoad was traced\n */\n assertBeforeLoadTraced(routeId: string): void;\n\n /**\n * Assert an HTTP request was traced\n */\n assertRequestTraced(method: string, path: string): void;\n}\n\n/**\n * Create a test harness for TanStack instrumentation testing\n *\n * This sets up autotel with an in-memory exporter for testing.\n * Call this in your test setup to capture and assert on spans.\n *\n * @returns Test harness with assertion helpers\n *\n * @example\n * ```typescript\n * import { describe, it, beforeEach } from 'vitest';\n * import { createTestHarness } from 'autotel-tanstack/testing';\n *\n * describe('MyServerFunction', () => {\n * let harness: ReturnType<typeof createTestHarness>;\n *\n * beforeEach(() => {\n * harness = createTestHarness();\n * });\n *\n * afterEach(() => {\n * harness.reset();\n * });\n *\n * it('should trace the server function', async () => {\n * await myServerFunction({ id: '123' });\n *\n * harness.assertServerFnTraced('myServerFunction');\n * harness.assertSpanHasAttribute(\n * /tanstack\\.serverFn/,\n * 'tanstack.server_function.name',\n * 'myServerFunction'\n * );\n * });\n * });\n * ```\n */\nexport function createTestHarness(): TestHarness {\n const exporter = new InMemorySpanExporter();\n\n init({\n service: 'test',\n spanProcessors: [new SimpleSpanProcessor(exporter)],\n });\n\n function getSpans(): ReadableSpan[] {\n return exporter.getFinishedSpans() as ReadableSpan[];\n }\n\n function getSpansByName(name: string | RegExp): ReadableSpan[] {\n const spans = getSpans();\n if (typeof name === 'string') {\n return spans.filter((s) => s.name === name);\n }\n return spans.filter((s) => name.test(s.name));\n }\n\n function getSpansByType(\n type: 'request' | 'serverFn' | 'loader' | 'beforeLoad',\n ): ReadableSpan[] {\n return getSpans().filter((s) => s.attributes['tanstack.type'] === type);\n }\n\n function reset(): void {\n exporter.reset();\n }\n\n function assertSpanExists(name: string | RegExp): void {\n const spans = getSpansByName(name);\n if (spans.length === 0) {\n const allSpanNames = getSpans().map((s) => s.name);\n throw new Error(\n `Expected span \"${name}\" to exist. Found spans: ${JSON.stringify(allSpanNames)}`,\n );\n }\n }\n\n function assertSpanHasAttribute(\n name: string | RegExp,\n attr: string,\n value?: unknown,\n ): void {\n const spans = getSpansByName(name);\n if (spans.length === 0) {\n throw new Error(`Span \"${name}\" not found`);\n }\n\n const span = spans[0];\n const attrValue = span.attributes[attr];\n\n if (attrValue === undefined) {\n throw new Error(\n `Attribute \"${attr}\" not found on span \"${span.name}\". ` +\n `Available attributes: ${JSON.stringify(Object.keys(span.attributes))}`,\n );\n }\n\n if (value !== undefined && attrValue !== value) {\n throw new Error(\n `Expected attribute \"${attr}\" to be \"${value}\", got \"${attrValue}\"`,\n );\n }\n }\n\n function assertServerFnTraced(name: string): void {\n assertSpanExists(`tanstack.serverFn.${name}`);\n }\n\n function assertLoaderTraced(routeId: string): void {\n assertSpanExists(`tanstack.loader.${routeId}`);\n }\n\n function assertBeforeLoadTraced(routeId: string): void {\n assertSpanExists(`tanstack.beforeLoad.${routeId}`);\n }\n\n function assertRequestTraced(method: string, path: string): void {\n assertSpanExists(`${method} ${path}`);\n }\n\n return {\n exporter,\n getSpans,\n getSpansByName,\n getSpansByType,\n reset,\n assertSpanExists,\n assertSpanHasAttribute,\n assertServerFnTraced,\n assertLoaderTraced,\n assertBeforeLoadTraced,\n assertRequestTraced,\n };\n}\n\n/**\n * Mock request factory for testing\n *\n * Creates mock Request objects for testing middleware and handlers.\n *\n * @example\n * ```typescript\n * const request = createMockRequest('GET', '/api/users', {\n * headers: { 'x-request-id': 'test-123' },\n * });\n * ```\n */\nexport function createMockRequest(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: string;\n traceparent?: string;\n } = {},\n): Request {\n const headers = new Headers(options.headers);\n\n if (options.traceparent) {\n headers.set('traceparent', options.traceparent);\n }\n\n return new Request(`http://localhost${path}`, {\n method,\n headers,\n body: options.body,\n });\n}\n\n/**\n * Generate a valid W3C traceparent header for testing\n *\n * @param traceId - Optional 32-char hex trace ID\n * @param spanId - Optional 16-char hex span ID\n * @returns Valid traceparent header string\n *\n * @example\n * ```typescript\n * const traceparent = generateTraceparent();\n * const request = createMockRequest('GET', '/api/users', { traceparent });\n * ```\n */\nexport function generateTraceparent(traceId?: string, spanId?: string): string {\n const version = '00';\n const trace = traceId || generateHex(32);\n const span = spanId || generateHex(16);\n const flags = '01'; // Sampled\n\n return `${version}-${trace}-${span}-${flags}`;\n}\n\nfunction generateHex(length: number): string {\n const chars = '0123456789abcdef';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * 16)];\n }\n return result;\n}\n\n/**\n * Serialized span shape returned by the test-spans HTTP endpoint.\n * Mirrors the fields the Playwright side needs for assertions.\n *\n * Defined as a `type` (not `interface`) so it is assignable to\n * `Record<string, unknown>` in TypeScript 6+ strict mode.\n */\nexport type SerializedSpan = {\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n attributes?: Record<string, unknown>;\n status: { code: number; message?: string };\n durationMs: number;\n};\n\ninterface TestSpanExporter {\n getFinishedSpans(): Array<{\n name: string;\n spanContext(): { spanId: string; traceId: string };\n parentSpanContext?: { spanId: string };\n attributes: Record<string, unknown>;\n status: { code: number; message?: string };\n duration: [number, number];\n }>;\n reset(): void;\n}\n\nfunction getExporter(): TestSpanExporter | undefined {\n return (globalThis as Record<string, unknown>).__testSpanExporter as\n | TestSpanExporter\n | undefined;\n}\n\nfunction e2eGuard(): Response | null {\n if (process.env.E2E !== '1') {\n return Response.json(\n { error: 'test-spans endpoint only available in E2E mode' },\n { status: 404 },\n );\n }\n return null;\n}\n\nfunction exporterGuard(): Response | null {\n if (!getExporter()) {\n return Response.json(\n { error: 'in-memory span exporter not initialized' },\n { status: 500 },\n );\n }\n return null;\n}\n\n/**\n * Accepts either a raw `Request` (legacy) or a TanStack Router context\n * object containing `{ request: Request }` (Router 1.168+).\n */\ntype HandlerInput = Request | { request: Request };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateFileRoute = (path: string) => (options: any) => any;\n\n/**\n * Creates GET and DELETE handlers for a test-spans HTTP endpoint.\n *\n * Use in a TanStack Start route to expose in-memory spans for Playwright assertions.\n * Only works when E2E=1 (set in webServer command).\n *\n * Handlers accept either a raw `Request` or a TanStack Router context\n * object `{ request: Request }`, so they work with both Router < 1.168\n * and Router >= 1.168.\n *\n * @example\n * ```typescript\n * // src/routes/api/test-spans.ts\n * import { createFileRoute } from \"@tanstack/react-router\";\n * import { createTestSpansHandlers } from 'autotel-tanstack/testing';\n * const { GET, DELETE } = createTestSpansHandlers();\n * export const Route = createFileRoute('/api/test-spans')({\n * server: { handlers: { GET, DELETE } },\n * });\n * ```\n */\n/**\n * Creates a pre-built TanStack Start route for the test-spans endpoint.\n *\n * Reduces E2E boilerplate to three lines. The handlers accept both\n * `Request` and `{ request: Request }` so they work with any Router version.\n *\n * @param createFileRoute - Pass `createFileRoute` from `@tanstack/react-router`\n * @param path - Route path (default: `/api/test-spans`)\n *\n * @example\n * ```typescript\n * // src/routes/api/test-spans.ts\n * import { createFileRoute } from \"@tanstack/react-router\";\n * import { createTestSpansRoute } from \"autotel-tanstack/testing\";\n *\n * export const Route = createTestSpansRoute(createFileRoute);\n * ```\n */\nexport function createTestSpansRoute(\n createFileRoute: CreateFileRoute,\n path = '/api/test-spans',\n) {\n const { GET, DELETE } = createTestSpansHandlers();\n return createFileRoute(path)({\n server: {\n handlers: { GET, DELETE },\n },\n });\n}\n\nexport function createTestSpansHandlers(): {\n GET: (input: HandlerInput) => Response;\n DELETE: (input: HandlerInput) => Response;\n} {\n return {\n GET(_input: HandlerInput): Response {\n const guard = e2eGuard() ?? exporterGuard();\n if (guard) return guard;\n\n const spans: SerializedSpan[] = getExporter()!\n .getFinishedSpans()\n .map((span) => {\n const { spanId, traceId } = span.spanContext();\n const serialized: SerializedSpan = {\n name: span.name,\n spanId,\n traceId,\n attributes: span.attributes,\n status: span.status,\n durationMs: span.duration[0] * 1000 + span.duration[1] / 1_000_000,\n };\n if (span.parentSpanContext?.spanId) {\n serialized.parentSpanId = span.parentSpanContext.spanId;\n }\n return serialized;\n });\n\n return Response.json({ spans });\n },\n\n DELETE(_input: HandlerInput): Response {\n const guard = e2eGuard() ?? exporterGuard();\n if (guard) return guard;\n getExporter()!.reset();\n return Response.json({ ok: true });\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","names":[],"sources":["../src/testing.ts"],"sourcesContent":["import { type ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { InMemorySpanExporter } from 'autotel/exporters';\nimport { SimpleSpanProcessor } from 'autotel/processors';\nimport { init } from 'autotel';\n\n/**\n * Test harness for TanStack instrumentation testing\n *\n * Provides utilities for testing TanStack Start applications\n * with autotel-tanstack instrumentation.\n */\nexport interface TestHarness {\n /**\n * The in-memory span exporter\n */\n exporter: {\n getFinishedSpans(): ReadableSpan[];\n reset(): void;\n };\n\n /**\n * Get all finished spans\n */\n getSpans(): ReadableSpan[];\n\n /**\n * Get spans by name (exact match or regex)\n */\n getSpansByName(name: string | RegExp): ReadableSpan[];\n\n /**\n * Get spans by TanStack type\n */\n getSpansByType(\n type: 'request' | 'serverFn' | 'loader' | 'beforeLoad',\n ): ReadableSpan[];\n\n /**\n * Reset collected spans\n */\n reset(): void;\n\n /**\n * Assert a span exists\n */\n assertSpanExists(name: string | RegExp): void;\n\n /**\n * Assert a span has a specific attribute\n */\n assertSpanHasAttribute(\n name: string | RegExp,\n attr: string,\n value?: unknown,\n ): void;\n\n /**\n * Assert a server function was traced\n */\n assertServerFnTraced(name: string): void;\n\n /**\n * Assert a loader was traced\n */\n assertLoaderTraced(routeId: string): void;\n\n /**\n * Assert a beforeLoad was traced\n */\n assertBeforeLoadTraced(routeId: string): void;\n\n /**\n * Assert an HTTP request was traced\n */\n assertRequestTraced(method: string, path: string): void;\n}\n\n/**\n * Create a test harness for TanStack instrumentation testing\n *\n * This sets up autotel with an in-memory exporter for testing.\n * Call this in your test setup to capture and assert on spans.\n *\n * @returns Test harness with assertion helpers\n *\n * @example\n * ```typescript\n * import { describe, it, beforeEach } from 'vitest';\n * import { createTestHarness } from 'autotel-tanstack/testing';\n *\n * describe('MyServerFunction', () => {\n * let harness: ReturnType<typeof createTestHarness>;\n *\n * beforeEach(() => {\n * harness = createTestHarness();\n * });\n *\n * afterEach(() => {\n * harness.reset();\n * });\n *\n * it('should trace the server function', async () => {\n * await myServerFunction({ id: '123' });\n *\n * harness.assertServerFnTraced('myServerFunction');\n * harness.assertSpanHasAttribute(\n * /tanstack\\.serverFn/,\n * 'tanstack.server_function.name',\n * 'myServerFunction'\n * );\n * });\n * });\n * ```\n */\nexport function createTestHarness(): TestHarness {\n const exporter = new InMemorySpanExporter();\n\n init({\n service: 'test',\n spanProcessors: [new SimpleSpanProcessor(exporter)],\n });\n\n function getSpans(): ReadableSpan[] {\n return exporter.getFinishedSpans() as ReadableSpan[];\n }\n\n function getSpansByName(name: string | RegExp): ReadableSpan[] {\n const spans = getSpans();\n if (typeof name === 'string') {\n return spans.filter((s) => s.name === name);\n }\n return spans.filter((s) => name.test(s.name));\n }\n\n function getSpansByType(\n type: 'request' | 'serverFn' | 'loader' | 'beforeLoad',\n ): ReadableSpan[] {\n return getSpans().filter((s) => s.attributes['tanstack.type'] === type);\n }\n\n function reset(): void {\n exporter.reset();\n }\n\n function assertSpanExists(name: string | RegExp): void {\n const spans = getSpansByName(name);\n if (spans.length === 0) {\n const allSpanNames = getSpans().map((s) => s.name);\n throw new Error(\n `Expected span \"${name}\" to exist. Found spans: ${JSON.stringify(allSpanNames)}`,\n );\n }\n }\n\n function assertSpanHasAttribute(\n name: string | RegExp,\n attr: string,\n value?: unknown,\n ): void {\n const spans = getSpansByName(name);\n if (spans.length === 0) {\n throw new Error(`Span \"${name}\" not found`);\n }\n\n const span = spans[0];\n const attrValue = span.attributes[attr];\n\n if (attrValue === undefined) {\n throw new Error(\n `Attribute \"${attr}\" not found on span \"${span.name}\". ` +\n `Available attributes: ${JSON.stringify(Object.keys(span.attributes))}`,\n );\n }\n\n if (value !== undefined && attrValue !== value) {\n throw new Error(\n `Expected attribute \"${attr}\" to be \"${value}\", got \"${attrValue}\"`,\n );\n }\n }\n\n function assertServerFnTraced(name: string): void {\n assertSpanExists(`tanstack.serverFn.${name}`);\n }\n\n function assertLoaderTraced(routeId: string): void {\n assertSpanExists(`tanstack.loader.${routeId}`);\n }\n\n function assertBeforeLoadTraced(routeId: string): void {\n assertSpanExists(`tanstack.beforeLoad.${routeId}`);\n }\n\n function assertRequestTraced(method: string, path: string): void {\n assertSpanExists(`${method} ${path}`);\n }\n\n return {\n exporter,\n getSpans,\n getSpansByName,\n getSpansByType,\n reset,\n assertSpanExists,\n assertSpanHasAttribute,\n assertServerFnTraced,\n assertLoaderTraced,\n assertBeforeLoadTraced,\n assertRequestTraced,\n };\n}\n\n/**\n * Mock request factory for testing\n *\n * Creates mock Request objects for testing middleware and handlers.\n *\n * @example\n * ```typescript\n * const request = createMockRequest('GET', '/api/users', {\n * headers: { 'x-request-id': 'test-123' },\n * });\n * ```\n */\nexport function createMockRequest(\n method: string,\n path: string,\n options: {\n headers?: Record<string, string>;\n body?: string;\n traceparent?: string;\n } = {},\n): Request {\n const headers = new Headers(options.headers);\n\n if (options.traceparent) {\n headers.set('traceparent', options.traceparent);\n }\n\n return new Request(`http://localhost${path}`, {\n method,\n headers,\n body: options.body,\n });\n}\n\n/**\n * Generate a valid W3C traceparent header for testing\n *\n * @param traceId - Optional 32-char hex trace ID\n * @param spanId - Optional 16-char hex span ID\n * @returns Valid traceparent header string\n *\n * @example\n * ```typescript\n * const traceparent = generateTraceparent();\n * const request = createMockRequest('GET', '/api/users', { traceparent });\n * ```\n */\nexport function generateTraceparent(traceId?: string, spanId?: string): string {\n const version = '00';\n const trace = traceId || generateHex(32);\n const span = spanId || generateHex(16);\n const flags = '01'; // Sampled\n\n return `${version}-${trace}-${span}-${flags}`;\n}\n\nfunction generateHex(length: number): string {\n const chars = '0123456789abcdef';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * 16)];\n }\n return result;\n}\n\n/**\n * Serialized span shape returned by the test-spans HTTP endpoint.\n * Mirrors the fields the Playwright side needs for assertions.\n *\n * Defined as a `type` (not `interface`) so it is assignable to\n * `Record<string, unknown>` in TypeScript 6+ strict mode.\n */\nexport type SerializedSpan = {\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n attributes?: Record<string, unknown>;\n status: { code: number; message?: string };\n durationMs: number;\n};\n\ninterface TestSpanExporter {\n getFinishedSpans(): Array<{\n name: string;\n spanContext(): { spanId: string; traceId: string };\n parentSpanContext?: { spanId: string };\n attributes: Record<string, unknown>;\n status: { code: number; message?: string };\n duration: [number, number];\n }>;\n reset(): void;\n}\n\nfunction getExporter(): TestSpanExporter | undefined {\n return (globalThis as Record<string, unknown>).__testSpanExporter as\n TestSpanExporter | undefined;\n}\n\nfunction e2eGuard(): Response | null {\n if (process.env.E2E !== '1') {\n return Response.json(\n { error: 'test-spans endpoint only available in E2E mode' },\n { status: 404 },\n );\n }\n return null;\n}\n\nfunction exporterGuard(): Response | null {\n if (!getExporter()) {\n return Response.json(\n { error: 'in-memory span exporter not initialized' },\n { status: 500 },\n );\n }\n return null;\n}\n\n/**\n * Accepts either a raw `Request` (legacy) or a TanStack Router context\n * object containing `{ request: Request }` (Router 1.168+).\n */\ntype HandlerInput = Request | { request: Request };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateFileRoute = (path: string) => (options: any) => any;\n\n/**\n * Creates GET and DELETE handlers for a test-spans HTTP endpoint.\n *\n * Use in a TanStack Start route to expose in-memory spans for Playwright assertions.\n * Only works when E2E=1 (set in webServer command).\n *\n * Handlers accept either a raw `Request` or a TanStack Router context\n * object `{ request: Request }`, so they work with both Router < 1.168\n * and Router >= 1.168.\n *\n * @example\n * ```typescript\n * // src/routes/api/test-spans.ts\n * import { createFileRoute } from \"@tanstack/react-router\";\n * import { createTestSpansHandlers } from 'autotel-tanstack/testing';\n * const { GET, DELETE } = createTestSpansHandlers();\n * export const Route = createFileRoute('/api/test-spans')({\n * server: { handlers: { GET, DELETE } },\n * });\n * ```\n */\n/**\n * Creates a pre-built TanStack Start route for the test-spans endpoint.\n *\n * Reduces E2E boilerplate to three lines. The handlers accept both\n * `Request` and `{ request: Request }` so they work with any Router version.\n *\n * @param createFileRoute - Pass `createFileRoute` from `@tanstack/react-router`\n * @param path - Route path (default: `/api/test-spans`)\n *\n * @example\n * ```typescript\n * // src/routes/api/test-spans.ts\n * import { createFileRoute } from \"@tanstack/react-router\";\n * import { createTestSpansRoute } from \"autotel-tanstack/testing\";\n *\n * export const Route = createTestSpansRoute(createFileRoute);\n * ```\n */\nexport function createTestSpansRoute(\n createFileRoute: CreateFileRoute,\n path = '/api/test-spans',\n) {\n const { GET, DELETE } = createTestSpansHandlers();\n return createFileRoute(path)({\n server: {\n handlers: { GET, DELETE },\n },\n });\n}\n\nexport function createTestSpansHandlers(): {\n GET: (input: HandlerInput) => Response;\n DELETE: (input: HandlerInput) => Response;\n} {\n return {\n GET(_input: HandlerInput): Response {\n const guard = e2eGuard() ?? exporterGuard();\n if (guard) return guard;\n\n const spans: SerializedSpan[] = getExporter()!\n .getFinishedSpans()\n .map((span) => {\n const { spanId, traceId } = span.spanContext();\n const serialized: SerializedSpan = {\n name: span.name,\n spanId,\n traceId,\n attributes: span.attributes,\n status: span.status,\n durationMs: span.duration[0] * 1000 + span.duration[1] / 1_000_000,\n };\n if (span.parentSpanContext?.spanId) {\n serialized.parentSpanId = span.parentSpanContext.spanId;\n }\n return serialized;\n });\n\n return Response.json({ spans });\n },\n\n DELETE(_input: HandlerInput): Response {\n const guard = e2eGuard() ?? exporterGuard();\n if (guard) return guard;\n getExporter()!.reset();\n return Response.json({ ok: true });\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-tanstack",
3
- "version": "1.13.41",
3
+ "version": "1.13.43",
4
4
  "description": "OpenTelemetry instrumentation for TanStack Start - automatic tracing for server functions, middleware, and route loaders",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -119,8 +119,8 @@
119
119
  "license": "Apache-2.0",
120
120
  "dependencies": {
121
121
  "@opentelemetry/api": "^1.9.1",
122
- "autotel": "4.2.5",
123
- "autotel-adapters": "0.3.18",
122
+ "autotel": "4.3.0",
123
+ "autotel-adapters": "1.0.0",
124
124
  "autotel-edge": "3.17.2"
125
125
  },
126
126
  "peerDependencies": {