autotel-tanstack 1.13.30 → 1.13.31

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 (150) hide show
  1. package/dist/auto.d.ts +8 -35
  2. package/dist/auto.d.ts.map +1 -0
  3. package/dist/auto.js +41 -22
  4. package/dist/auto.js.map +1 -1
  5. package/dist/browser/context.d.ts +50 -0
  6. package/dist/browser/context.d.ts.map +1 -0
  7. package/dist/browser/context.js +54 -2
  8. package/dist/browser/context.js.map +1 -1
  9. package/dist/browser/debug-headers.d.ts +10 -0
  10. package/dist/browser/debug-headers.d.ts.map +1 -0
  11. package/dist/browser/debug-headers.js +12 -2
  12. package/dist/browser/debug-headers.js.map +1 -1
  13. package/dist/browser/error-reporting.d.ts +39 -0
  14. package/dist/browser/error-reporting.d.ts.map +1 -0
  15. package/dist/browser/error-reporting.js +35 -2
  16. package/dist/browser/error-reporting.js.map +1 -1
  17. package/dist/browser/handlers.d.ts +14 -0
  18. package/dist/browser/handlers.d.ts.map +1 -0
  19. package/dist/browser/handlers.js +10 -2
  20. package/dist/browser/handlers.js.map +1 -1
  21. package/dist/browser/index.d.ts +11 -0
  22. package/dist/browser/index.js +12 -12
  23. package/dist/browser/loaders.d.ts +31 -0
  24. package/dist/browser/loaders.d.ts.map +1 -0
  25. package/dist/browser/loaders.js +29 -2
  26. package/dist/browser/loaders.js.map +1 -1
  27. package/dist/browser/metrics.d.ts +56 -0
  28. package/dist/browser/metrics.d.ts.map +1 -0
  29. package/dist/browser/metrics.js +48 -2
  30. package/dist/browser/metrics.js.map +1 -1
  31. package/dist/browser/middleware.d.ts +42 -0
  32. package/dist/browser/middleware.d.ts.map +1 -0
  33. package/dist/browser/middleware.js +36 -2
  34. package/dist/browser/middleware.js.map +1 -1
  35. package/dist/browser/server-functions.d.ts +14 -0
  36. package/dist/browser/server-functions.d.ts.map +1 -0
  37. package/dist/browser/server-functions.js +16 -2
  38. package/dist/browser/server-functions.js.map +1 -1
  39. package/dist/browser/testing.d.ts +85 -0
  40. package/dist/browser/testing.d.ts.map +1 -0
  41. package/dist/browser/testing.js +43 -2
  42. package/dist/browser/testing.js.map +1 -1
  43. package/dist/browser/types.d.ts +2 -0
  44. package/dist/browser/types.js +37 -2
  45. package/dist/browser/types.js.map +1 -1
  46. package/dist/context.d.ts +5 -3
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/context.js +112 -3
  49. package/dist/context.js.map +1 -1
  50. package/dist/debug-headers.d.ts +14 -14
  51. package/dist/debug-headers.d.ts.map +1 -0
  52. package/dist/debug-headers.js +62 -4
  53. package/dist/debug-headers.js.map +1 -1
  54. package/dist/env-BpFWNnpL.js +30 -0
  55. package/dist/env-BpFWNnpL.js.map +1 -0
  56. package/dist/error-reporting.d.ts +37 -37
  57. package/dist/error-reporting.d.ts.map +1 -0
  58. package/dist/error-reporting.js +154 -3
  59. package/dist/error-reporting.js.map +1 -1
  60. package/dist/handlers.d.ts +5 -4
  61. package/dist/handlers.d.ts.map +1 -0
  62. package/dist/handlers.js +192 -6
  63. package/dist/handlers.js.map +1 -1
  64. package/dist/index.d.ts +15 -16
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +14 -16
  67. package/dist/instrument-DS7YCE1R.d.ts +10 -0
  68. package/dist/instrument-DS7YCE1R.d.ts.map +1 -0
  69. package/dist/instrument-DdLlMfRi.js +80 -0
  70. package/dist/instrument-DdLlMfRi.js.map +1 -0
  71. package/dist/loaders-DrVVY25K.d.ts +2402 -0
  72. package/dist/loaders-DrVVY25K.d.ts.map +1 -0
  73. package/dist/loaders.d.ts +2 -116
  74. package/dist/loaders.js +234 -5
  75. package/dist/loaders.js.map +1 -1
  76. package/dist/metrics.d.ts +39 -39
  77. package/dist/metrics.d.ts.map +1 -0
  78. package/dist/metrics.js +144 -3
  79. package/dist/metrics.js.map +1 -1
  80. package/dist/middleware.d.ts +16 -15
  81. package/dist/middleware.d.ts.map +1 -0
  82. package/dist/middleware.js +290 -7
  83. package/dist/middleware.js.map +1 -1
  84. package/dist/route-filter-dLg-j3jR.js +33 -0
  85. package/dist/route-filter-dLg-j3jR.js.map +1 -0
  86. package/dist/server-functions.d.ts +4 -3
  87. package/dist/server-functions.d.ts.map +1 -0
  88. package/dist/server-functions.js +133 -5
  89. package/dist/server-functions.js.map +1 -1
  90. package/dist/testing.d.ts +164 -65
  91. package/dist/testing.d.ts.map +1 -0
  92. package/dist/testing.js +212 -147
  93. package/dist/testing.js.map +1 -1
  94. package/dist/types-BJ7FyVoX.d.ts +87 -0
  95. package/dist/types-BJ7FyVoX.d.ts.map +1 -0
  96. package/dist/types-BrccP0yX.js +38 -0
  97. package/dist/types-BrccP0yX.js.map +1 -0
  98. package/dist/types-pQgmQa4j.d.ts +154 -0
  99. package/dist/types-pQgmQa4j.d.ts.map +1 -0
  100. package/package.json +7 -7
  101. package/dist/browser/index.js.map +0 -1
  102. package/dist/chunk-7OXOAS64.js +0 -41
  103. package/dist/chunk-7OXOAS64.js.map +0 -1
  104. package/dist/chunk-A7WMQ2BC.js +0 -25
  105. package/dist/chunk-A7WMQ2BC.js.map +0 -1
  106. package/dist/chunk-CCME55EK.js +0 -28
  107. package/dist/chunk-CCME55EK.js.map +0 -1
  108. package/dist/chunk-CSFIPJC2.js +0 -11
  109. package/dist/chunk-CSFIPJC2.js.map +0 -1
  110. package/dist/chunk-DTZCOB4W.js +0 -32
  111. package/dist/chunk-DTZCOB4W.js.map +0 -1
  112. package/dist/chunk-EFSKEYDJ.js +0 -20
  113. package/dist/chunk-EFSKEYDJ.js.map +0 -1
  114. package/dist/chunk-EGRHWZRV.js +0 -3
  115. package/dist/chunk-EGRHWZRV.js.map +0 -1
  116. package/dist/chunk-ESU66L3L.js +0 -92
  117. package/dist/chunk-ESU66L3L.js.map +0 -1
  118. package/dist/chunk-EUYFVNYE.js +0 -16
  119. package/dist/chunk-EUYFVNYE.js.map +0 -1
  120. package/dist/chunk-FFQ4FJKE.js +0 -185
  121. package/dist/chunk-FFQ4FJKE.js.map +0 -1
  122. package/dist/chunk-G526TOMY.js +0 -96
  123. package/dist/chunk-G526TOMY.js.map +0 -1
  124. package/dist/chunk-I4LX3LOG.js +0 -35
  125. package/dist/chunk-I4LX3LOG.js.map +0 -1
  126. package/dist/chunk-JXO7H6KO.js +0 -10
  127. package/dist/chunk-JXO7H6KO.js.map +0 -1
  128. package/dist/chunk-KPXGFKPU.js +0 -193
  129. package/dist/chunk-KPXGFKPU.js.map +0 -1
  130. package/dist/chunk-LRA2UVVS.js +0 -210
  131. package/dist/chunk-LRA2UVVS.js.map +0 -1
  132. package/dist/chunk-MFYOV2SF.js +0 -32
  133. package/dist/chunk-MFYOV2SF.js.map +0 -1
  134. package/dist/chunk-MNP65ZX7.js +0 -21
  135. package/dist/chunk-MNP65ZX7.js.map +0 -1
  136. package/dist/chunk-NTY64BKS.js +0 -38
  137. package/dist/chunk-NTY64BKS.js.map +0 -1
  138. package/dist/chunk-UMEJU65Q.js +0 -34
  139. package/dist/chunk-UMEJU65Q.js.map +0 -1
  140. package/dist/chunk-UTPW3QRT.js +0 -52
  141. package/dist/chunk-UTPW3QRT.js.map +0 -1
  142. package/dist/chunk-V3RO5N2M.js +0 -8
  143. package/dist/chunk-V3RO5N2M.js.map +0 -1
  144. package/dist/chunk-XXBHZR3M.js +0 -99
  145. package/dist/chunk-XXBHZR3M.js.map +0 -1
  146. package/dist/chunk-YQYYPJCK.js +0 -37
  147. package/dist/chunk-YQYYPJCK.js.map +0 -1
  148. package/dist/index.js.map +0 -1
  149. package/dist/instrument-DRR7VL63.d.ts +0 -46
  150. package/dist/types-m5OjZJ-4.d.ts +0 -152
@@ -0,0 +1,154 @@
1
+ import { Attributes } from "@opentelemetry/api";
2
+
3
+ //#region src/types.d.ts
4
+ /**
5
+ * Configuration options for TanStack Start instrumentation
6
+ */
7
+ interface TanStackInstrumentationConfig {
8
+ /**
9
+ * Service name for spans
10
+ * @default process.env.OTEL_SERVICE_NAME || 'tanstack-start'
11
+ */
12
+ service?: string;
13
+ /**
14
+ * Whether to capture function arguments as span attributes
15
+ * Warning: May contain PII, review before enabling in production
16
+ * @default true
17
+ */
18
+ captureArgs?: boolean;
19
+ /**
20
+ * Whether to capture function results as span attributes
21
+ * Warning: May contain PII, disable in production
22
+ * @default false
23
+ */
24
+ captureResults?: boolean;
25
+ /**
26
+ * Whether to capture errors and record exceptions
27
+ * @default true
28
+ */
29
+ captureErrors?: boolean;
30
+ /**
31
+ * HTTP headers to capture as span attributes
32
+ * @default ['x-request-id']
33
+ */
34
+ captureHeaders?: string[];
35
+ /**
36
+ * URL paths to exclude from tracing (glob patterns)
37
+ * @default []
38
+ */
39
+ excludePaths?: (string | RegExp)[];
40
+ /**
41
+ * Sampling strategy
42
+ * - 'always': Sample all requests (100%)
43
+ * - 'adaptive': Use autotel's adaptive sampling (errors + slow = 100%, baseline 10%)
44
+ * - 'never': Disable sampling (for testing/debugging)
45
+ * @default 'adaptive'
46
+ */
47
+ sampling?: 'always' | 'adaptive' | 'never';
48
+ /**
49
+ * Custom function to extract additional span attributes
50
+ */
51
+ customAttributes?: (context: {
52
+ type: 'request' | 'serverFn' | 'loader' | 'beforeLoad' | 'middleware';
53
+ name: string;
54
+ request?: Request;
55
+ args?: unknown;
56
+ result?: unknown;
57
+ }) => Attributes;
58
+ }
59
+ /**
60
+ * Configuration specific to tracing middleware
61
+ */
62
+ interface TracingMiddlewareConfig extends TanStackInstrumentationConfig {
63
+ /**
64
+ * Type of middleware
65
+ * - 'request': For global request middleware (routes, SSR)
66
+ * - 'function': For server function middleware
67
+ * @default 'request'
68
+ */
69
+ type?: 'request' | 'function';
70
+ }
71
+ /**
72
+ * Configuration for server function tracing
73
+ */
74
+ interface TraceServerFnConfig {
75
+ /**
76
+ * Explicit name for the span
77
+ * If not provided, will attempt to infer from function name
78
+ */
79
+ name?: string;
80
+ /**
81
+ * Whether to capture function arguments
82
+ * @default true
83
+ */
84
+ captureArgs?: boolean;
85
+ /**
86
+ * Whether to capture function results
87
+ * @default false
88
+ */
89
+ captureResults?: boolean;
90
+ }
91
+ /**
92
+ * Configuration for loader tracing
93
+ */
94
+ interface TraceLoaderConfig {
95
+ /**
96
+ * Explicit name for the span
97
+ * If not provided, will use route ID
98
+ */
99
+ name?: string;
100
+ /**
101
+ * Whether to capture route params
102
+ * @default true
103
+ */
104
+ captureParams?: boolean;
105
+ /**
106
+ * Whether to capture loader result
107
+ * @default false
108
+ */
109
+ captureResult?: boolean;
110
+ }
111
+ /**
112
+ * Configuration for handler wrapper
113
+ */
114
+ interface WrapStartHandlerConfig extends TanStackInstrumentationConfig {
115
+ /**
116
+ * OTLP endpoint URL
117
+ * @default process.env.OTEL_EXPORTER_OTLP_ENDPOINT
118
+ */
119
+ endpoint?: string;
120
+ /**
121
+ * OTLP headers (e.g., for authentication)
122
+ * @default parsed from process.env.OTEL_EXPORTER_OTLP_HEADERS
123
+ */
124
+ headers?: Record<string, string>;
125
+ }
126
+ /**
127
+ * Default configuration values
128
+ */
129
+ declare const DEFAULT_CONFIG: Required<Omit<TanStackInstrumentationConfig, 'customAttributes' | 'service'>>;
130
+ /**
131
+ * Span attribute keys following OpenTelemetry semantic conventions
132
+ */
133
+ declare const SPAN_ATTRIBUTES: {
134
+ readonly HTTP_REQUEST_METHOD: "http.request.method";
135
+ readonly HTTP_RESPONSE_STATUS_CODE: "http.response.status_code";
136
+ readonly URL_PATH: "url.path";
137
+ readonly URL_QUERY: "url.query";
138
+ readonly URL_FULL: "url.full";
139
+ readonly RPC_SYSTEM: "rpc.system";
140
+ readonly RPC_METHOD: "rpc.method";
141
+ readonly TANSTACK_TYPE: "tanstack.type";
142
+ readonly TANSTACK_SERVER_FN_NAME: "tanstack.server_function.name";
143
+ readonly TANSTACK_SERVER_FN_METHOD: "tanstack.server_function.method";
144
+ readonly TANSTACK_SERVER_FN_ARGS: "tanstack.server_function.args";
145
+ readonly TANSTACK_SERVER_FN_RESULT: "tanstack.server_function.result";
146
+ readonly TANSTACK_LOADER_ROUTE_ID: "tanstack.loader.route_id";
147
+ readonly TANSTACK_LOADER_TYPE: "tanstack.loader.type";
148
+ readonly TANSTACK_LOADER_PARAMS: "tanstack.loader.params";
149
+ readonly TANSTACK_MIDDLEWARE_NAME: "tanstack.middleware.name";
150
+ readonly TANSTACK_REQUEST_DURATION_MS: "tanstack.request.duration_ms";
151
+ };
152
+ //#endregion
153
+ export { TraceServerFnConfig as a, TraceLoaderConfig as i, SPAN_ATTRIBUTES as n, TracingMiddlewareConfig as o, TanStackInstrumentationConfig as r, WrapStartHandlerConfig as s, DEFAULT_CONFIG as t };
154
+ //# sourceMappingURL=types-pQgmQa4j.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-pQgmQa4j.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;AAKA;UAAiB,6BAAA;;;;;EAKf,OAAA;EAoDgB;;;;;EA7ChB,WAAA;EAyBA;;;;;EAlBA,cAAA;EAmCE;;;;EA7BF,aAAA;EAgCM;;AAAU;AAMlB;EAhCE,cAAA;;;AAuCI;AAMN;EAvCE,YAAA,aAAyB,MAAA;;;;;;;AAwDX;EA/Cd,QAAA;EAqDgC;;;EAhDhC,gBAAA,IAAoB,OAAA;IAClB,IAAA;IACA,IAAA;IACA,OAAA,GAAU,OAAA;IACV,IAAA;IACA,MAAA;EAAA,MACI,UAAA;AAAA;;;;UAMS,uBAAA,SAAgC,6BAA6B;EAsElE;;AAAM;AAMlB;;;EArEE,IAAI;AAAA;;;;UAMW,mBAAA;EAgEf;;;AAAkC;EA3DlC,IAAA;EA+FQ;;;;EAzFR,WAAA;;;;;EAMA,cAAA;AAAA;;;;UAMe,iBAAA;;;;;EAKf,IAAA;;;;;EAMA,aAAA;;;;;EAMA,aAAA;AAAA;;;;UAMe,sBAAA,SAA+B,6BAA6B;;;;;EAK3E,QAAA;;;;;EAMA,OAAA,GAAU,MAAA;AAAA;;;;cAMC,cAAA,EAAgB,QAAA,CAC3B,IAAA,CAAK,6BAAA;;;;cAaM,eAAA;EAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-tanstack",
3
- "version": "1.13.30",
3
+ "version": "1.13.31",
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",
@@ -120,9 +120,9 @@
120
120
  "license": "MIT",
121
121
  "dependencies": {
122
122
  "@opentelemetry/api": "^1.9.1",
123
- "autotel": "3.6.0",
124
- "autotel-adapters": "0.3.8",
125
- "autotel-edge": "3.16.14"
123
+ "autotel": "3.7.0",
124
+ "autotel-adapters": "0.3.9",
125
+ "autotel-edge": "3.16.15"
126
126
  },
127
127
  "peerDependencies": {
128
128
  "@tanstack/react-start": "^1.168.25",
@@ -141,7 +141,7 @@
141
141
  "@tanstack/react-router": "^1.170.15",
142
142
  "@types/node": "^25.9.2",
143
143
  "rimraf": "^6.1.3",
144
- "tsup": "^8.5.1",
144
+ "tsdown": "^0.22.2",
145
145
  "typescript": "^6.0.3",
146
146
  "vitest": "^4.1.8",
147
147
  "vitest-mock-extended": "^4.0.0"
@@ -156,8 +156,8 @@
156
156
  },
157
157
  "homepage": "https://github.com/jagreehal/autotel/tree/main/packages/autotel-tanstack#readme",
158
158
  "scripts": {
159
- "build": "tsup",
160
- "dev": "tsup --watch",
159
+ "build": "tsdown",
160
+ "dev": "tsdown --watch",
161
161
  "lint": "eslint src/**/*.ts",
162
162
  "lint:fix": "eslint src/**/*.ts --fix",
163
163
  "format": "prettier --write .",
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1,41 +0,0 @@
1
- import { isInitialized, init } from 'autotel';
2
- import { InMemorySpanExporter } from 'autotel/exporters';
3
- import { SimpleSpanProcessor } from 'autotel/processors';
4
-
5
- // src/instrument.ts
6
- var DEFAULT_SERVICE = "tanstack-start";
7
- function resolveDebug(explicit, endpoint) {
8
- if (explicit !== void 0) return explicit;
9
- const env = process.env.AUTOTEL_DEBUG;
10
- if (env === "pretty") return "pretty";
11
- if (env === "true" || env === "1") return true;
12
- if (env === "false" || env === "0") return false;
13
- if (!endpoint && process.env.NODE_ENV === "development") return "pretty";
14
- return false;
15
- }
16
- function instrument(options = {}) {
17
- if (isInitialized()) return;
18
- const service = options.service ?? process.env.OTEL_SERVICE_NAME ?? DEFAULT_SERVICE;
19
- if (process.env.E2E === "1") {
20
- const exporter = new InMemorySpanExporter();
21
- globalThis.__testSpanExporter = exporter;
22
- init({
23
- service,
24
- subscribers: options.subscribers,
25
- spanProcessors: [
26
- new SimpleSpanProcessor(exporter),
27
- ...options.spanProcessors ?? []
28
- ]
29
- });
30
- return;
31
- }
32
- init({
33
- ...options,
34
- service,
35
- debug: resolveDebug(options.debug, options.endpoint)
36
- });
37
- }
38
-
39
- export { instrument };
40
- //# sourceMappingURL=chunk-7OXOAS64.js.map
41
- //# sourceMappingURL=chunk-7OXOAS64.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/instrument.ts"],"names":[],"mappings":";;;;;AAgDA,IAAM,eAAA,GAAkB,gBAAA;AAOxB,SAAS,YAAA,CACP,UACA,QAAA,EACoB;AACpB,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,aAAA;AACxB,EAAA,IAAI,GAAA,KAAQ,UAAU,OAAO,QAAA;AAC7B,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,GAAA,EAAK,OAAO,IAAA;AAC1C,EAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,GAAA,EAAK,OAAO,KAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,eAAe,OAAO,QAAA;AAChE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAS;AAGhE,EAAA,IAAI,eAAc,EAAG;AAErB,EAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,eAAA;AAEtD,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,KAAQ,GAAA,EAAK;AAE3B,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,EAAqB;AAC1C,IAAC,WAAuC,kBAAA,GAAqB,QAAA;AAC7D,IAAA,IAAA,CAAK;AAAA,MACH,OAAA;AAAA,MACA,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,cAAA,EAAgB;AAAA,QACd,IAAI,oBAAoB,QAAQ,CAAA;AAAA,QAChC,GAAI,OAAA,CAAQ,cAAA,IAAkB;AAAC;AACjC,KACD,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IAAA,CAAK;AAAA,IACH,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAQ;AAAA,GACpD,CAAA;AACH","file":"chunk-7OXOAS64.js","sourcesContent":["/**\n * Configurable tracing setup for TanStack Start.\n *\n * `instrument(options)` is a thin wrapper over autotel's `init` that adds the\n * TanStack defaults so apps don't hand-roll them:\n *\n * - service name defaults to `OTEL_SERVICE_NAME` or `'tanstack-start'`;\n * - `debug` resolves from `AUTOTEL_DEBUG` (`pretty` in dev when no endpoint set);\n * - when `E2E=1`, spans are captured by an `InMemorySpanExporter` exposed as\n * `globalThis.__testSpanExporter` (for span assertions) instead of shipping\n * over OTLP;\n * - it's idempotent — a second call is a no-op.\n *\n * Everything else — `endpoint`, `headers`, `subscribers`, `logs`,\n * `canonicalLogLines`, extra `spanProcessors`, … — passes straight through to\n * `init`, and the standard `OTEL_*` env vars are resolved by autotel core, so\n * apps never re-parse them.\n *\n * The zero-config `autotel-tanstack/auto` side-effect module is just\n * `instrument()` with no options.\n *\n * @example\n * ```ts\n * import { instrument } from 'autotel-tanstack';\n * import { PostHogSubscriber } from 'autotel-subscribers';\n *\n * instrument({\n * subscribers: process.env.POSTHOG_KEY\n * ? [new PostHogSubscriber({ apiKey: process.env.POSTHOG_KEY })]\n * : [],\n * logs: true,\n * canonicalLogLines: { enabled: true, rootSpansOnly: true },\n * });\n * ```\n *\n * @module\n */\n\nimport { init, isInitialized, type AutotelConfig } from 'autotel';\nimport { InMemorySpanExporter } from 'autotel/exporters';\nimport { SimpleSpanProcessor } from 'autotel/processors';\n\n// `service` is optional here — instrument() defaults it to OTEL_SERVICE_NAME or\n// 'tanstack-start'. Everything else matches autotel's init config.\nexport type InstrumentOptions = Omit<AutotelConfig, 'service'> & {\n service?: string;\n};\n\nconst DEFAULT_SERVICE = 'tanstack-start';\n\n/**\n * Resolve span-debug output: an explicit option wins; otherwise `AUTOTEL_DEBUG`\n * (`pretty` | `true`/`1` | `false`/`0`); otherwise pretty-print in development\n * when there's no OTLP endpoint, so spans are visible immediately.\n */\nfunction resolveDebug(\n explicit: AutotelConfig['debug'],\n endpoint: string | undefined,\n): boolean | 'pretty' {\n if (explicit !== undefined) return explicit;\n const env = process.env.AUTOTEL_DEBUG;\n if (env === 'pretty') return 'pretty';\n if (env === 'true' || env === '1') return true;\n if (env === 'false' || env === '0') return false;\n if (!endpoint && process.env.NODE_ENV === 'development') return 'pretty';\n return false;\n}\n\nexport function instrument(options: InstrumentOptions = {}): void {\n // Idempotent: tolerate the instrumentation module being evaluated more than\n // once (HMR, multiple entry points) without re-initializing.\n if (isInitialized()) return;\n\n const service =\n options.service ?? process.env.OTEL_SERVICE_NAME ?? DEFAULT_SERVICE;\n\n if (process.env.E2E === '1') {\n // Capture spans in memory for test assertions; skip OTLP/logs entirely.\n const exporter = new InMemorySpanExporter();\n (globalThis as Record<string, unknown>).__testSpanExporter = exporter;\n init({\n service,\n subscribers: options.subscribers,\n spanProcessors: [\n new SimpleSpanProcessor(exporter),\n ...(options.spanProcessors ?? []),\n ],\n });\n return;\n }\n\n init({\n ...options,\n service,\n debug: resolveDebug(options.debug, options.endpoint),\n });\n}\n"]}
@@ -1,25 +0,0 @@
1
- // src/browser/middleware.ts
2
- function createTracingMiddleware(config) {
3
- return async function noopMiddleware(opts) {
4
- return opts.next();
5
- };
6
- }
7
- function tracingMiddleware(config) {
8
- return async function noopMiddleware(opts) {
9
- return opts.next();
10
- };
11
- }
12
- function functionTracingMiddleware(config) {
13
- return async function noopMiddleware(opts) {
14
- return opts.next();
15
- };
16
- }
17
- function createTracingServerHandler(config) {
18
- return async function noopHandler(opts) {
19
- return opts.next();
20
- };
21
- }
22
-
23
- export { createTracingMiddleware, createTracingServerHandler, functionTracingMiddleware, tracingMiddleware };
24
- //# sourceMappingURL=chunk-A7WMQ2BC.js.map
25
- //# sourceMappingURL=chunk-A7WMQ2BC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browser/middleware.ts"],"names":[],"mappings":";AA6BO,SAAS,wBACd,MAAA,EAC6B;AAE7B,EAAA,OAAO,eAAe,eAAe,IAAA,EAAM;AACzC,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB,CAAA;AACF;AAKO,SAAS,kBACd,MAAA,EAC6B;AAE7B,EAAA,OAAO,eAAe,eAAe,IAAA,EAAM;AACzC,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB,CAAA;AACF;AAKO,SAAS,0BACd,MAAA,EAC6B;AAE7B,EAAA,OAAO,eAAe,eAAe,IAAA,EAAM;AACzC,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB,CAAA;AACF;AAKO,SAAS,2BACd,MAAA,EAKsB;AAEtB,EAAA,OAAO,eAAe,YAAY,IAAA,EAAM;AACtC,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB,CAAA;AACF","file":"chunk-A7WMQ2BC.js","sourcesContent":["/**\n * Browser stub for middleware module\n *\n * In browser environments, these functions return pass-through middleware\n * that just calls next() without any tracing overhead.\n */\n\nimport type { TracingMiddlewareConfig } from './types';\n\n/**\n * Generic middleware handler type\n */\nexport interface MiddlewareHandler<TContext = unknown> {\n (opts: {\n next: (ctx?: Partial<TContext>) => Promise<TContext>;\n context: TContext;\n request?: Request;\n pathname?: string;\n data?: unknown;\n method?: string;\n filename?: string;\n functionId?: string;\n signal?: AbortSignal;\n }): Promise<TContext>;\n}\n\n/**\n * Browser stub: Returns pass-through middleware\n */\nexport function createTracingMiddleware<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): MiddlewareHandler<TContext> {\n void config;\n return async function noopMiddleware(opts) {\n return opts.next();\n };\n}\n\n/**\n * Browser stub: Returns pass-through middleware\n */\nexport function tracingMiddleware<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): MiddlewareHandler<TContext> {\n void config;\n return async function noopMiddleware(opts) {\n return opts.next();\n };\n}\n\n/**\n * Browser stub: Returns pass-through middleware\n */\nexport function functionTracingMiddleware<TContext = unknown>(\n config?: Omit<TracingMiddlewareConfig, 'type'>,\n): MiddlewareHandler<TContext> {\n void config;\n return async function noopMiddleware(opts) {\n return opts.next();\n };\n}\n\n/**\n * Browser stub: Returns pass-through handler for createMiddleware().server()\n */\nexport function createTracingServerHandler<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): (opts: {\n next: (ctx?: Partial<TContext>) => Promise<TContext>;\n context: TContext;\n request?: Request;\n}) => Promise<TContext> {\n void config;\n return async function noopHandler(opts) {\n return opts.next();\n };\n}\n"]}
@@ -1,28 +0,0 @@
1
- import { shouldInstrumentPath } from 'autotel-edge';
2
-
3
- // src/route-filter.ts
4
- function isExcludedPath(pathname, excludePaths) {
5
- for (const pattern of excludePaths) {
6
- if (pattern instanceof RegExp) {
7
- if (pattern.test(pathname)) return true;
8
- continue;
9
- }
10
- if (pattern.includes("*") || pattern.includes("?")) {
11
- if (!shouldInstrumentPath(pathname, {
12
- include: void 0,
13
- exclude: [pattern]
14
- })) {
15
- return true;
16
- }
17
- continue;
18
- }
19
- if (pathname === pattern || pathname.startsWith(pattern)) {
20
- return true;
21
- }
22
- }
23
- return false;
24
- }
25
-
26
- export { isExcludedPath };
27
- //# sourceMappingURL=chunk-CCME55EK.js.map
28
- //# sourceMappingURL=chunk-CCME55EK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/route-filter.ts"],"names":[],"mappings":";;;AAWO,SAAS,cAAA,CACd,UACA,YAAA,EACS;AACT,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,MAAA,IACE,CAAC,qBAAqB,QAAA,EAAU;AAAA,QAC9B,OAAA,EAAS,MAAA;AAAA,QACT,OAAA,EAAS,CAAC,OAAO;AAAA,OAClB,CAAA,EACD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,KAAa,OAAA,IAAW,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACxD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"chunk-CCME55EK.js","sourcesContent":["import { shouldInstrumentPath } from 'autotel-edge';\n\n/**\n * TanStack historically supported:\n * - glob strings (`/api/internal/*`)\n * - regex values\n * - plain-string prefix matching (`/health` matches `/healthz`)\n *\n * This helper keeps those semantics while delegating glob matching to\n * autotel-edge's shared middleware toolkit.\n */\nexport function isExcludedPath(\n pathname: string,\n excludePaths: Array<string | RegExp>,\n): boolean {\n for (const pattern of excludePaths) {\n if (pattern instanceof RegExp) {\n if (pattern.test(pathname)) return true;\n continue;\n }\n\n if (pattern.includes('*') || pattern.includes('?')) {\n if (\n !shouldInstrumentPath(pathname, {\n include: undefined,\n exclude: [pattern],\n })\n ) {\n return true;\n }\n continue;\n }\n\n if (pathname === pattern || pathname.startsWith(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n"]}
@@ -1,11 +0,0 @@
1
- // src/browser/server-functions.ts
2
- function traceServerFn(serverFn, config) {
3
- return serverFn;
4
- }
5
- function createTracedServerFnFactory(createServerFnOriginal, defaultConfig) {
6
- return createServerFnOriginal;
7
- }
8
-
9
- export { createTracedServerFnFactory, traceServerFn };
10
- //# sourceMappingURL=chunk-CSFIPJC2.js.map
11
- //# sourceMappingURL=chunk-CSFIPJC2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browser/server-functions.ts"],"names":[],"mappings":";AAYO,SAAS,aAAA,CAEd,UAAa,MAAA,EAAiC;AAE9C,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,2BAAA,CAGd,wBACA,aAAA,EACiB;AAEjB,EAAA,OAAO,sBAAA;AACT","file":"chunk-CSFIPJC2.js","sourcesContent":["/**\n * Browser stub for server-functions module\n *\n * In browser environments, these functions are no-ops that just return\n * the original functions without any tracing overhead.\n */\n\nimport type { TraceServerFnConfig } from './types';\n\n/**\n * Browser stub: Returns the server function unchanged\n */\nexport function traceServerFn<\n T extends (...args: unknown[]) => Promise<unknown>,\n>(serverFn: T, config?: TraceServerFnConfig): T {\n void config;\n return serverFn;\n}\n\n/**\n * Browser stub: Returns the createServerFn unchanged\n */\nexport function createTracedServerFnFactory<\n TCreateServerFn extends (...args: unknown[]) => unknown,\n>(\n createServerFnOriginal: TCreateServerFn,\n defaultConfig?: Omit<TraceServerFnConfig, 'name'>,\n): TCreateServerFn {\n void defaultConfig;\n return createServerFnOriginal;\n}\n"]}
@@ -1,32 +0,0 @@
1
- // src/browser/context.ts
2
- function extractContextFromRequest(_request) {
3
- return {};
4
- }
5
- function injectContextToHeaders(headers, ctx) {
6
- return headers;
7
- }
8
- function createTracedHeaders(existingHeaders, ctx) {
9
- return new Headers(existingHeaders);
10
- }
11
- function runInContext(parentContext, fn) {
12
- return fn();
13
- }
14
- function getActiveContext() {
15
- return {};
16
- }
17
- function getTraceParent() {
18
- return "";
19
- }
20
- function getTraceState() {
21
- return "";
22
- }
23
- function getCurrentTraceId() {
24
- return void 0;
25
- }
26
- function getCurrentSpanId() {
27
- return void 0;
28
- }
29
-
30
- export { createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext };
31
- //# sourceMappingURL=chunk-DTZCOB4W.js.map
32
- //# sourceMappingURL=chunk-DTZCOB4W.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browser/context.ts"],"names":[],"mappings":";AAkBO,SAAS,0BAA0B,QAAA,EAA4B;AAGpE,EAAA,OAAO,EAAC;AACV;AAKO,SAAS,sBAAA,CACd,SACA,GAAA,EACS;AAET,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,mBAAA,CACd,iBACA,GAAA,EACS;AAET,EAAA,OAAO,IAAI,QAAQ,eAAe,CAAA;AACpC;AAKO,SAAS,YAAA,CAAgB,eAAwB,EAAA,EAAgB;AAEtE,EAAA,OAAO,EAAA,EAAG;AACZ;AAKO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,EAAC;AACV;AAKO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,iBAAA,GAAwC;AACtD,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,gBAAA,GAAuC;AACrD,EAAA,OAAO,MAAA;AACT","file":"chunk-DTZCOB4W.js","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"]}
@@ -1,20 +0,0 @@
1
- // src/browser/error-reporting.ts
2
- function reportError(error, context) {
3
- }
4
- function getRecentErrors(limit) {
5
- return [];
6
- }
7
- function clearErrors() {
8
- }
9
- function createErrorReportingHandler() {
10
- return () => {
11
- return Response.json({ errors: [], count: 0 });
12
- };
13
- }
14
- function withErrorReporting(fn, context) {
15
- return fn;
16
- }
17
-
18
- export { clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting };
19
- //# sourceMappingURL=chunk-EFSKEYDJ.js.map
20
- //# sourceMappingURL=chunk-EFSKEYDJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browser/error-reporting.ts"],"names":[],"mappings":";AAoBO,SAAS,WAAA,CACd,OACA,OAAA,EACM;AAIR;AAKO,SAAS,gBAAgB,KAAA,EAA8B;AAE5D,EAAA,OAAO,EAAC;AACV;AAKO,SAAS,WAAA,GAAoB;AAEpC;AAKO,SAAS,2BAAA,GAA8C;AAC5D,EAAA,OAAO,MAAM;AACX,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,EAAC,EAAG,KAAA,EAAO,GAAG,CAAA;AAAA,EAC/C,CAAA;AACF;AAMO,SAAS,kBAAA,CACd,IACA,OAAA,EACG;AAEH,EAAA,OAAO,EAAA;AACT","file":"chunk-EFSKEYDJ.js","sourcesContent":["/**\n * Browser stub for error-reporting module\n *\n * Error reporting/collection only happens on the server.\n * In browser, these are no-op functions.\n */\n\n/**\n * Error entry structure (stub)\n */\nexport interface ErrorEntry {\n timestamp: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n}\n\n/**\n * Browser stub: No-op\n */\nexport function reportError(\n error: Error,\n context?: Record<string, unknown>,\n): void {\n void error;\n void context;\n // No-op in browser\n}\n\n/**\n * Browser stub: Returns empty array\n */\nexport function getRecentErrors(limit?: number): ErrorEntry[] {\n void limit;\n return [];\n}\n\n/**\n * Browser stub: No-op\n */\nexport function clearErrors(): void {\n // No-op in browser\n}\n\n/**\n * Browser stub: Returns JSON Response with empty errors\n */\nexport function createErrorReportingHandler(): () => Response {\n return () => {\n return Response.json({ errors: [], count: 0 });\n };\n}\n\n/**\n * Browser stub: Returns function unchanged\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Intentional for type passthrough\nexport function withErrorReporting<T extends (...args: any[]) => any>(\n fn: T,\n context?: Record<string, unknown>,\n): T {\n void context;\n return fn;\n}\n"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=chunk-EGRHWZRV.js.map
3
- //# sourceMappingURL=chunk-EGRHWZRV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-EGRHWZRV.js"}
@@ -1,92 +0,0 @@
1
- import { isServerSide } from './chunk-EUYFVNYE.js';
2
- import { SPAN_ATTRIBUTES } from './chunk-I4LX3LOG.js';
3
- import { SpanStatusCode } from '@opentelemetry/api';
4
- import { trace } from 'autotel';
5
-
6
- function traceServerFn(serverFn, config = {}) {
7
- const fnName = config.name || serverFn.name || "serverFn";
8
- const captureArgs = config.captureArgs ?? true;
9
- const captureResults = config.captureResults ?? false;
10
- return new Proxy(serverFn, {
11
- apply(target, thisArg, argArray) {
12
- if (!isServerSide()) {
13
- return target.apply(thisArg, argArray);
14
- }
15
- return trace(`tanstack.serverFn.${fnName}`, async (ctx) => {
16
- ctx.setAttributes({
17
- [SPAN_ATTRIBUTES.RPC_SYSTEM]: "tanstack-start",
18
- [SPAN_ATTRIBUTES.RPC_METHOD]: fnName,
19
- [SPAN_ATTRIBUTES.TANSTACK_TYPE]: "serverFn",
20
- [SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_NAME]: fnName
21
- });
22
- if (captureArgs && argArray.length > 0) {
23
- const args = argArray[0];
24
- if (args !== void 0) {
25
- try {
26
- ctx.setAttribute(
27
- SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS,
28
- JSON.stringify(args)
29
- );
30
- } catch {
31
- ctx.setAttribute(
32
- SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS,
33
- "[non-serializable]"
34
- );
35
- }
36
- }
37
- }
38
- try {
39
- const result = await Reflect.apply(target, thisArg, argArray);
40
- if (captureResults && result !== void 0) {
41
- try {
42
- ctx.setAttribute(
43
- SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,
44
- JSON.stringify(result)
45
- );
46
- } catch {
47
- ctx.setAttribute(
48
- SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,
49
- "[non-serializable]"
50
- );
51
- }
52
- }
53
- ctx.setStatus({ code: SpanStatusCode.OK });
54
- return result;
55
- } catch (error) {
56
- if ("recordError" in ctx && typeof ctx.recordError === "function") {
57
- ctx.recordError(error);
58
- } else if ("recordException" in ctx && typeof ctx.recordException === "function") {
59
- ctx.recordException(error);
60
- }
61
- throw error;
62
- }
63
- });
64
- },
65
- get(target, prop, receiver) {
66
- return Reflect.get(target, prop, receiver);
67
- }
68
- });
69
- }
70
- function createTracedServerFnFactory(createServerFnOriginal, defaultConfig = {}) {
71
- return new Proxy(createServerFnOriginal, {
72
- apply(target, thisArg, argArray) {
73
- const result = Reflect.apply(target, thisArg, argArray);
74
- if (result && typeof result === "object" && "handler" in result && typeof result.handler === "function") {
75
- const originalHandler = result.handler.bind(result);
76
- result.handler = function tracedHandler(handlerFn) {
77
- const wrappedHandler = originalHandler(handlerFn);
78
- const fnName = handlerFn?.name || "serverFn";
79
- return traceServerFn(wrappedHandler, {
80
- ...defaultConfig,
81
- name: fnName
82
- });
83
- };
84
- }
85
- return result;
86
- }
87
- });
88
- }
89
-
90
- export { createTracedServerFnFactory, traceServerFn };
91
- //# sourceMappingURL=chunk-ESU66L3L.js.map
92
- //# sourceMappingURL=chunk-ESU66L3L.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server-functions.ts"],"names":[],"mappings":"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","file":"chunk-ESU66L3L.js","sourcesContent":["import { SpanStatusCode } from '@opentelemetry/api';\nimport { trace, type TraceContext } from 'autotel';\nimport { isServerSide } from './env';\nimport { type TraceServerFnConfig, SPAN_ATTRIBUTES } from './types';\n\n/**\n * Wrap a TanStack server function with OpenTelemetry tracing\n *\n * This function wraps a server function to automatically create spans\n * for each invocation. It captures function name, arguments (optionally),\n * results (optionally), and errors.\n *\n * @param serverFn - The server function to wrap\n * @param config - Configuration options\n * @returns Wrapped server function with tracing\n *\n * @example\n * ```typescript\n * import { createServerFn } from '@tanstack/react-start';\n * import { traceServerFn } from 'autotel-tanstack/server-functions';\n *\n * const getUserBase = createServerFn({ method: 'GET' })\n * .handler(async ({ data: id }) => {\n * return await db.users.findUnique({ where: { id } });\n * });\n *\n * export const getUser = traceServerFn(getUserBase, { name: 'getUser' });\n * ```\n *\n * @example\n * ```typescript\n * // With argument and result capture (careful with PII!)\n * export const createUser = traceServerFn(\n * createServerFn({ method: 'POST' })\n * .handler(async ({ data }) => {\n * return await db.users.create({ data });\n * }),\n * {\n * name: 'createUser',\n * captureArgs: true,\n * captureResults: false, // Don't capture for PII reasons\n * }\n * );\n * ```\n */\nexport function traceServerFn<T extends (...args: any[]) => any>(\n serverFn: T,\n config: TraceServerFnConfig = {},\n): T {\n const fnName = config.name || serverFn.name || 'serverFn';\n const captureArgs = config.captureArgs ?? true;\n const captureResults = config.captureResults ?? false;\n\n return new Proxy(serverFn, {\n apply(target, thisArg, argArray) {\n // If we're in the browser, just call the function without tracing\n // Server functions should never run in the browser, but this prevents\n // autotel (which uses Node.js APIs) from being executed if it somehow does\n if (!isServerSide()) {\n return target.apply(thisArg, argArray);\n }\n\n return trace(`tanstack.serverFn.${fnName}`, async (ctx: TraceContext) => {\n ctx.setAttributes({\n [SPAN_ATTRIBUTES.RPC_SYSTEM]: 'tanstack-start',\n [SPAN_ATTRIBUTES.RPC_METHOD]: fnName,\n [SPAN_ATTRIBUTES.TANSTACK_TYPE]: 'serverFn',\n [SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_NAME]: fnName,\n });\n\n // Capture arguments if configured\n if (captureArgs && argArray.length > 0) {\n const args = argArray[0];\n if (args !== undefined) {\n try {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS,\n JSON.stringify(args),\n );\n } catch {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS,\n '[non-serializable]',\n );\n }\n }\n }\n\n try {\n const result = await Reflect.apply(target, thisArg, argArray);\n\n // Capture result if configured\n if (captureResults && result !== undefined) {\n try {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,\n JSON.stringify(result),\n );\n } catch {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,\n '[non-serializable]',\n );\n }\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n if ('recordError' in ctx && typeof ctx.recordError === 'function') {\n ctx.recordError(error);\n } else if (\n 'recordException' in ctx &&\n typeof ctx.recordException === 'function'\n ) {\n ctx.recordException(error);\n }\n throw error;\n }\n });\n },\n\n get(target, prop, receiver) {\n return Reflect.get(target, prop, receiver);\n },\n }) as T;\n}\n\n/**\n * Create a traced version of createServerFn\n *\n * This higher-order function wraps TanStack's createServerFn to automatically\n * add tracing to all created server functions.\n *\n * @param createServerFnOriginal - The original createServerFn from TanStack\n * @param defaultConfig - Default configuration for all server functions\n * @returns Wrapped createServerFn that produces traced server functions\n *\n * @example\n * ```typescript\n * import { createServerFn as originalCreateServerFn } from '@tanstack/react-start';\n * import { createTracedServerFnFactory } from 'autotel-tanstack/server-functions';\n *\n * export const createServerFn = createTracedServerFnFactory(originalCreateServerFn);\n *\n * // Now all server functions created with createServerFn are automatically traced\n * export const getUser = createServerFn({ method: 'GET' })\n * .handler(async ({ data: id }) => {\n * return await db.users.findUnique({ where: { id } });\n * });\n * ```\n */\nexport function createTracedServerFnFactory<\n TCreateServerFn extends (...args: any[]) => any,\n>(\n createServerFnOriginal: TCreateServerFn,\n defaultConfig: Omit<TraceServerFnConfig, 'name'> = {},\n): TCreateServerFn {\n return new Proxy(createServerFnOriginal, {\n apply(target, thisArg, argArray) {\n const result = Reflect.apply(target, thisArg, argArray);\n\n // If the result has a .handler method, wrap it\n if (\n result &&\n typeof result === 'object' &&\n 'handler' in result &&\n typeof result.handler === 'function'\n ) {\n const originalHandler = result.handler.bind(result);\n\n result.handler = function tracedHandler(handlerFn: unknown) {\n const wrappedHandler = originalHandler(handlerFn as never);\n\n // Try to infer function name from the handler\n const fnName = (handlerFn as { name?: string })?.name || 'serverFn';\n\n return traceServerFn(wrappedHandler, {\n ...defaultConfig,\n name: fnName,\n });\n };\n }\n\n return result;\n },\n }) as TCreateServerFn;\n}\n"]}
@@ -1,16 +0,0 @@
1
- // src/env.ts
2
- function isBrowser() {
3
- return typeof globalThis !== "undefined" && // @ts-expect-error - window may not exist in Node.js, that's the point
4
- typeof globalThis.window !== "undefined" && // @ts-expect-error - document may not exist in Node.js, that's the point
5
- typeof globalThis.document !== "undefined";
6
- }
7
- function isNode() {
8
- return typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined";
9
- }
10
- function isServerSide() {
11
- return isNode() && !isBrowser();
12
- }
13
-
14
- export { isBrowser, isNode, isServerSide };
15
- //# sourceMappingURL=chunk-EUYFVNYE.js.map
16
- //# sourceMappingURL=chunk-EUYFVNYE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/env.ts"],"names":[],"mappings":";AASO,SAAS,SAAA,GAAqB;AACnC,EAAA,OACE,OAAO,UAAA,KAAe,WAAA;AAAA,EAEtB,OAAO,WAAW,MAAA,KAAW,WAAA;AAAA,EAE7B,OAAO,WAAW,QAAA,KAAa,WAAA;AAEnC;AAKO,SAAS,MAAA,GAAkB;AAChC,EAAA,OACE,OAAO,OAAA,KAAY,WAAA,IACnB,OAAO,OAAA,CAAQ,aAAa,WAAA,IAC5B,OAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,KAAS,WAAA;AAErC;AAOO,SAAS,YAAA,GAAwB;AAGtC,EAAA,OAAO,MAAA,EAAO,IAAK,CAAC,SAAA,EAAU;AAChC","file":"chunk-EUYFVNYE.js","sourcesContent":["/**\n * Environment detection utilities\n * Prevents server-only code from running in the browser\n */\n\n/**\n * Check if we're running in a browser environment\n * Uses typeof checks to avoid TypeScript DOM type requirements\n */\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== 'undefined' &&\n // @ts-expect-error - window may not exist in Node.js, that's the point\n typeof globalThis.window !== 'undefined' &&\n // @ts-expect-error - document may not exist in Node.js, that's the point\n typeof globalThis.document !== 'undefined'\n );\n}\n\n/**\n * Check if we're running in a Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== 'undefined' &&\n typeof process.versions !== 'undefined' &&\n typeof process.versions.node !== 'undefined'\n );\n}\n\n/**\n * Check if we're in a server-side context\n * In TanStack Start, middleware runs on the server, but router config\n * might be evaluated on both sides during SSR\n */\nexport function isServerSide(): boolean {\n // In TanStack Start, if we're in a request handler context, we're on the server\n // Check for Node.js environment (server) and not browser\n return isNode() && !isBrowser();\n}\n\n/**\n * Safely check if a module is available (for optional dependencies)\n */\nexport function isModuleAvailable(moduleName: string): boolean {\n try {\n // This will only work in Node.js, not browser\n if (typeof require !== 'undefined') {\n require.resolve(moduleName);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n"]}