@sentry/tanstackstart-react 10.32.1 → 10.34.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 (48) hide show
  1. package/build/cjs/client/index.js +14 -7
  2. package/build/cjs/client/index.js.map +1 -1
  3. package/build/cjs/index.client.js +3 -1
  4. package/build/cjs/index.client.js.map +1 -1
  5. package/build/cjs/index.server.js +2 -0
  6. package/build/cjs/index.server.js.map +1 -1
  7. package/build/cjs/server/index.js +2 -0
  8. package/build/cjs/server/index.js.map +1 -1
  9. package/build/cjs/server/middleware.js +113 -0
  10. package/build/cjs/server/middleware.js.map +1 -0
  11. package/build/cjs/server/utils.js +17 -0
  12. package/build/cjs/server/utils.js.map +1 -1
  13. package/build/esm/client/index.js +10 -0
  14. package/build/esm/client/index.js.map +1 -1
  15. package/build/esm/index.client.js +2 -1
  16. package/build/esm/index.client.js.map +1 -1
  17. package/build/esm/index.server.js +1 -0
  18. package/build/esm/index.server.js.map +1 -1
  19. package/build/esm/package.json +1 -1
  20. package/build/esm/server/index.js +1 -0
  21. package/build/esm/server/index.js.map +1 -1
  22. package/build/esm/server/middleware.js +111 -0
  23. package/build/esm/server/middleware.js.map +1 -0
  24. package/build/esm/server/utils.js +17 -1
  25. package/build/esm/server/utils.js.map +1 -1
  26. package/build/types/client/index.d.ts +6 -0
  27. package/build/types/client/index.d.ts.map +1 -1
  28. package/build/types/common/index.d.ts +1 -1
  29. package/build/types/common/index.d.ts.map +1 -1
  30. package/build/types/common/types.d.ts +9 -0
  31. package/build/types/common/types.d.ts.map +1 -0
  32. package/build/types/index.client.d.ts.map +1 -1
  33. package/build/types/index.types.d.ts +1 -0
  34. package/build/types/index.types.d.ts.map +1 -1
  35. package/build/types/server/index.d.ts +1 -0
  36. package/build/types/server/index.d.ts.map +1 -1
  37. package/build/types/server/middleware.d.ts +22 -0
  38. package/build/types/server/middleware.d.ts.map +1 -0
  39. package/build/types/server/utils.d.ts +5 -0
  40. package/build/types/server/utils.d.ts.map +1 -1
  41. package/build/types-ts3.8/client/index.d.ts +6 -0
  42. package/build/types-ts3.8/common/index.d.ts +1 -1
  43. package/build/types-ts3.8/common/types.d.ts +9 -0
  44. package/build/types-ts3.8/index.types.d.ts +1 -0
  45. package/build/types-ts3.8/server/index.d.ts +1 -0
  46. package/build/types-ts3.8/server/middleware.d.ts +22 -0
  47. package/build/types-ts3.8/server/utils.d.ts +5 -0
  48. package/package.json +5 -5
@@ -3,17 +3,24 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  const react = require('@sentry/react');
4
4
  const sdk = require('./sdk.js');
5
5
 
6
-
6
+ /**
7
+ * No-op stub for client-side builds.
8
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
9
+ */
10
+ function wrapMiddlewaresWithSentry(middlewares) {
11
+ return Object.values(middlewares);
12
+ }
7
13
 
8
14
  exports.init = sdk.init;
15
+ exports.wrapMiddlewaresWithSentry = wrapMiddlewaresWithSentry;
9
16
  Object.prototype.hasOwnProperty.call(react, '__proto__') &&
10
- !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&
11
- Object.defineProperty(exports, '__proto__', {
12
- enumerable: true,
13
- value: react['__proto__']
14
- });
17
+ !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&
18
+ Object.defineProperty(exports, '__proto__', {
19
+ enumerable: true,
20
+ value: react['__proto__']
21
+ });
15
22
 
16
23
  Object.keys(react).forEach(k => {
17
- if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = react[k];
24
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = react[k];
18
25
  });
19
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nimport type { TanStackMiddlewareBase } from '../common/types';\n\nexport * from '@sentry/react';\n\nexport { init } from './sdk';\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent build errors.\n */\nexport function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[] {\n return Object.values(middlewares);\n}\n"],"names":[],"mappings":";;;;;AASA;AACA;AACA;AACA;AACO,SAAS,yBAAyB,CAAmC,WAAW,EAA0B;AACjH,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;AACnC;;;;;;;;;;;;;;;"}
@@ -1,10 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const react = require('@sentry/react');
3
+ const index = require('./client/index.js');
4
4
  const sdk = require('./client/sdk.js');
5
+ const react = require('@sentry/react');
5
6
 
6
7
 
7
8
 
9
+ exports.wrapMiddlewaresWithSentry = index.wrapMiddlewaresWithSentry;
8
10
  exports.init = sdk.init;
9
11
  Object.prototype.hasOwnProperty.call(react, '__proto__') &&
10
12
  !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  const index = require('./server/index.js');
4
4
  const sdk = require('./server/sdk.js');
5
5
  const wrapFetchWithSentry = require('./server/wrapFetchWithSentry.js');
6
+ const middleware = require('./server/middleware.js');
6
7
  const node = require('@sentry/node');
7
8
 
8
9
 
@@ -11,6 +12,7 @@ exports.ErrorBoundary = index.ErrorBoundary;
11
12
  exports.withErrorBoundary = index.withErrorBoundary;
12
13
  exports.init = sdk.init;
13
14
  exports.wrapFetchWithSentry = wrapFetchWithSentry.wrapFetchWithSentry;
15
+ exports.wrapMiddlewaresWithSentry = middleware.wrapMiddlewaresWithSentry;
14
16
  Object.prototype.hasOwnProperty.call(node, '__proto__') &&
15
17
  !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&
16
18
  Object.defineProperty(exports, '__proto__', {
@@ -1 +1 @@
1
- {"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  const node = require('@sentry/node');
4
4
  const sdk = require('./sdk.js');
5
5
  const wrapFetchWithSentry = require('./wrapFetchWithSentry.js');
6
+ const middleware = require('./middleware.js');
6
7
 
7
8
  // import/export got a false positive, and affects most of our index barrel files
8
9
  // can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703
@@ -37,6 +38,7 @@ function withErrorBoundary(
37
38
 
38
39
  exports.init = sdk.init;
39
40
  exports.wrapFetchWithSentry = wrapFetchWithSentry.wrapFetchWithSentry;
41
+ exports.wrapMiddlewaresWithSentry = middleware.wrapMiddlewaresWithSentry;
40
42
  exports.ErrorBoundary = ErrorBoundary;
41
43
  exports.withErrorBoundary = withErrorBoundary;
42
44
  Object.prototype.hasOwnProperty.call(node, '__proto__') &&
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\n\n/**\n * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors\n * so they should simply be a passthrough.\n */\nexport const ErrorBoundary = (props: React.PropsWithChildren<unknown>): React.ReactNode => {\n if (!props.children) {\n return null;\n }\n\n if (typeof props.children === 'function') {\n return (props.children as () => React.ReactNode)();\n }\n\n return props.children;\n};\n\n/**\n * A passthrough error boundary wrapper for the server that doesn't depend on any react. Error boundaries don't catch\n * SSR errors so they should simply be a passthrough.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n): React.FC<P> {\n return WrappedComponent as React.FC<P>;\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACO,MAAM,aAAA,GAAgB,CAAC,KAAK,KAAwD;AAC3F,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACvB,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,IAAI,OAAO,KAAK,CAAC,QAAA,KAAa,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,QAAA,IAAoC;AACtD,EAAE;;AAEF,EAAE,OAAO,KAAK,CAAC,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB;AACjC,EAAE,gBAAgB;AAClB,EAAe;AACf,EAAE,OAAO,gBAAA;AACT;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\nexport { wrapMiddlewaresWithSentry } from './middleware';\n\n/**\n * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors\n * so they should simply be a passthrough.\n */\nexport const ErrorBoundary = (props: React.PropsWithChildren<unknown>): React.ReactNode => {\n if (!props.children) {\n return null;\n }\n\n if (typeof props.children === 'function') {\n return (props.children as () => React.ReactNode)();\n }\n\n return props.children;\n};\n\n/**\n * A passthrough error boundary wrapper for the server that doesn't depend on any react. Error boundaries don't catch\n * SSR errors so they should simply be a passthrough.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n): React.FC<P> {\n return WrappedComponent as React.FC<P>;\n}\n"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACO,MAAM,aAAA,GAAgB,CAAC,KAAK,KAAwD;AAC3F,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACvB,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,IAAI,OAAO,KAAK,CAAC,QAAA,KAAa,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,QAAA,IAAoC;AACtD,EAAE;;AAEF,EAAE,OAAO,KAAK,CAAC,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB;AACjC,EAAE,gBAAgB;AAClB,EAAe;AACf,EAAE,OAAO,gBAAA;AACT;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,113 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const core = require('@sentry/core');
4
+ const node = require('@sentry/node');
5
+ const utils = require('./utils.js');
6
+
7
+ const SENTRY_WRAPPED = '__SENTRY_WRAPPED__';
8
+
9
+ /**
10
+ * Creates a proxy for the next function that ends the current span and restores the parent span.
11
+ * This ensures that subsequent middleware spans are children of the root span, not nested children.
12
+ */
13
+ function getNextProxy(
14
+ next,
15
+ span,
16
+ prevSpan,
17
+ nextState,
18
+ ) {
19
+ return new Proxy(next, {
20
+ apply: (originalNext, thisArgNext, argsNext) => {
21
+ nextState.called = true;
22
+ span.end();
23
+
24
+ if (prevSpan) {
25
+ return node.withActiveSpan(prevSpan, () => {
26
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
27
+ });
28
+ }
29
+
30
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
31
+ },
32
+ });
33
+ }
34
+
35
+ /**
36
+ * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.
37
+ */
38
+ function wrapMiddlewareWithSentry(
39
+ middleware,
40
+ options,
41
+ ) {
42
+ if ((middleware )[SENTRY_WRAPPED]) {
43
+ // already instrumented
44
+ return middleware;
45
+ }
46
+
47
+ // instrument server middleware
48
+ if (middleware.options?.server) {
49
+ middleware.options.server = new Proxy(middleware.options.server, {
50
+ apply: (originalServer, thisArgServer, argsServer) => {
51
+ const prevSpan = node.getActiveSpan();
52
+
53
+ return node.startSpanManual(utils.getMiddlewareSpanOptions(options.name), async (span) => {
54
+ const nextState = { called: false };
55
+
56
+ // The server function receives { next, context, request } as first argument
57
+ // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.
58
+ const middlewareArgs = argsServer[0] ;
59
+ if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {
60
+ middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);
61
+ }
62
+
63
+ try {
64
+ const result = await originalServer.apply(thisArgServer, argsServer);
65
+
66
+ // End span here if next() wasn't called, else we already ended it in next()
67
+ if (!nextState.called) {
68
+ span.end();
69
+ }
70
+
71
+ return result;
72
+ } catch (e) {
73
+ span.end();
74
+ throw e;
75
+ }
76
+ });
77
+ },
78
+ });
79
+
80
+ // mark as instrumented
81
+ core.addNonEnumerableProperty(middleware , SENTRY_WRAPPED, true);
82
+ }
83
+
84
+ return middleware;
85
+ }
86
+
87
+ /**
88
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
89
+ * Object keys are used as span names to avoid users having to specify this manually.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
94
+ *
95
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
96
+ * authMiddleware,
97
+ * loggingMiddleware,
98
+ * });
99
+ *
100
+ * createServerFn().middleware(wrappedMiddlewares)
101
+ * ```
102
+ *
103
+ * @param middlewares - An object containing middlewares
104
+ * @returns An array of wrapped middlewares
105
+ */
106
+ function wrapMiddlewaresWithSentry(middlewares) {
107
+ return Object.entries(middlewares).map(([name, middleware]) => {
108
+ return wrapMiddlewareWithSentry(middleware, { name });
109
+ });
110
+ }
111
+
112
+ exports.wrapMiddlewaresWithSentry = wrapMiddlewaresWithSentry;
113
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sources":["../../../src/server/middleware.ts"],"sourcesContent":["import { addNonEnumerableProperty } from '@sentry/core';\nimport type { Span } from '@sentry/node';\nimport { getActiveSpan, startSpanManual, withActiveSpan } from '@sentry/node';\nimport type { MiddlewareWrapperOptions, TanStackMiddlewareBase } from '../common/types';\nimport { getMiddlewareSpanOptions } from './utils';\n\nconst SENTRY_WRAPPED = '__SENTRY_WRAPPED__';\n\n/**\n * Creates a proxy for the next function that ends the current span and restores the parent span.\n * This ensures that subsequent middleware spans are children of the root span, not nested children.\n */\nfunction getNextProxy<T extends (...args: unknown[]) => unknown>(\n next: T,\n span: Span,\n prevSpan: Span | undefined,\n nextState: { called: boolean },\n): T {\n return new Proxy(next, {\n apply: (originalNext, thisArgNext, argsNext) => {\n nextState.called = true;\n span.end();\n\n if (prevSpan) {\n return withActiveSpan(prevSpan, () => {\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n });\n }\n\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n },\n });\n}\n\n/**\n * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.\n */\nfunction wrapMiddlewareWithSentry<T extends TanStackMiddlewareBase>(\n middleware: T,\n options: MiddlewareWrapperOptions,\n): T {\n if ((middleware as TanStackMiddlewareBase & { [SENTRY_WRAPPED]?: boolean })[SENTRY_WRAPPED]) {\n // already instrumented\n return middleware;\n }\n\n // instrument server middleware\n if (middleware.options?.server) {\n middleware.options.server = new Proxy(middleware.options.server, {\n apply: (originalServer, thisArgServer, argsServer) => {\n const prevSpan = getActiveSpan();\n\n return startSpanManual(getMiddlewareSpanOptions(options.name), async (span: Span) => {\n const nextState = { called: false };\n\n // The server function receives { next, context, request } as first argument\n // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.\n const middlewareArgs = argsServer[0] as { next?: (...args: unknown[]) => unknown } | undefined;\n if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {\n middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);\n }\n\n try {\n const result = await originalServer.apply(thisArgServer, argsServer);\n\n // End span here if next() wasn't called, else we already ended it in next()\n if (!nextState.called) {\n span.end();\n }\n\n return result;\n } catch (e) {\n span.end();\n throw e;\n }\n });\n },\n });\n\n // mark as instrumented\n addNonEnumerableProperty(middleware as unknown as Record<string, unknown>, SENTRY_WRAPPED, true);\n }\n\n return middleware;\n}\n\n/**\n * Wraps multiple TanStack Start middlewares with Sentry instrumentation.\n * Object keys are used as span names to avoid users having to specify this manually.\n *\n * @example\n * ```ts\n * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';\n *\n * const wrappedMiddlewares = wrapMiddlewaresWithSentry({\n * authMiddleware,\n * loggingMiddleware,\n * });\n *\n * createServerFn().middleware(wrappedMiddlewares)\n * ```\n *\n * @param middlewares - An object containing middlewares\n * @returns An array of wrapped middlewares\n */\nexport function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[] {\n return Object.entries(middlewares).map(([name, middleware]) => {\n return wrapMiddlewareWithSentry(middleware, { name });\n });\n}\n"],"names":["withActiveSpan","getActiveSpan","startSpanManual","getMiddlewareSpanOptions","addNonEnumerableProperty"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const node = require('@sentry/node');
4
+
3
5
  /**
4
6
  * Extracts the SHA-256 hash from a server function pathname.
5
7
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -13,5 +15,20 @@ function extractServerFunctionSha256(pathname) {
13
15
  return serverFnMatch?.[1] ?? 'unknown';
14
16
  }
15
17
 
18
+ /**
19
+ * Returns span options for TanStack Start middleware spans.
20
+ */
21
+ function getMiddlewareSpanOptions(name) {
22
+ return {
23
+ op: 'middleware.tanstackstart',
24
+ name,
25
+ attributes: {
26
+ [node.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',
27
+ [node.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',
28
+ },
29
+ };
30
+ }
31
+
16
32
  exports.extractServerFunctionSha256 = extractServerFunctionSha256;
33
+ exports.getMiddlewareSpanOptions = getMiddlewareSpanOptions;
17
34
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n op: 'middleware.tanstackstart',\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',\n },\n };\n}\n"],"names":["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP"],"mappings":";;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;AAEA;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,IAAI,EAA4B;AACzE,EAAE,OAAO;AACT,IAAI,EAAE,EAAE,0BAA0B;AAClC,IAAI,IAAI;AACR,IAAI,UAAU,EAAE;AAChB,MAAM,CAACA,qCAAgC,GAAG,iCAAiC;AAC3E,MAAM,CAACC,iCAA4B,GAAG,0BAA0B;AAChE,KAAK;AACL,GAAG;AACH;;;;;"}
@@ -1,3 +1,13 @@
1
1
  export * from '@sentry/react';
2
2
  export { init } from './sdk.js';
3
+
4
+ /**
5
+ * No-op stub for client-side builds.
6
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
7
+ */
8
+ function wrapMiddlewaresWithSentry(middlewares) {
9
+ return Object.values(middlewares);
10
+ }
11
+
12
+ export { wrapMiddlewaresWithSentry };
3
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nimport type { TanStackMiddlewareBase } from '../common/types';\n\nexport * from '@sentry/react';\n\nexport { init } from './sdk';\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent build errors.\n */\nexport function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[] {\n return Object.values(middlewares);\n}\n"],"names":[],"mappings":";;;AASA;AACA;AACA;AACA;AACO,SAAS,yBAAyB,CAAmC,WAAW,EAA0B;AACjH,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;AACnC;;;;"}
@@ -1,3 +1,4 @@
1
- export * from '@sentry/react';
1
+ export { wrapMiddlewaresWithSentry } from './client/index.js';
2
2
  export { init } from './client/sdk.js';
3
+ export * from '@sentry/react';
3
4
  //# sourceMappingURL=index.client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,5 +1,6 @@
1
1
  export { ErrorBoundary, withErrorBoundary } from './server/index.js';
2
2
  export { init } from './server/sdk.js';
3
3
  export { wrapFetchWithSentry } from './server/wrapFetchWithSentry.js';
4
+ export { wrapMiddlewaresWithSentry } from './server/middleware.js';
4
5
  export * from '@sentry/node';
5
6
  //# sourceMappingURL=index.server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1 +1 @@
1
- {"type":"module","version":"10.32.1","sideEffects":false}
1
+ {"type":"module","version":"10.34.0","sideEffects":false}
@@ -1,6 +1,7 @@
1
1
  export * from '@sentry/node';
2
2
  export { init } from './sdk.js';
3
3
  export { wrapFetchWithSentry } from './wrapFetchWithSentry.js';
4
+ export { wrapMiddlewaresWithSentry } from './middleware.js';
4
5
 
5
6
  // import/export got a false positive, and affects most of our index barrel files
6
7
  // can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\n\n/**\n * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors\n * so they should simply be a passthrough.\n */\nexport const ErrorBoundary = (props: React.PropsWithChildren<unknown>): React.ReactNode => {\n if (!props.children) {\n return null;\n }\n\n if (typeof props.children === 'function') {\n return (props.children as () => React.ReactNode)();\n }\n\n return props.children;\n};\n\n/**\n * A passthrough error boundary wrapper for the server that doesn't depend on any react. Error boundaries don't catch\n * SSR errors so they should simply be a passthrough.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n): React.FC<P> {\n return WrappedComponent as React.FC<P>;\n}\n"],"names":[],"mappings":";;;;AAAA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACO,MAAM,aAAA,GAAgB,CAAC,KAAK,KAAwD;AAC3F,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACvB,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,IAAI,OAAO,KAAK,CAAC,QAAA,KAAa,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,QAAA,IAAoC;AACtD,EAAE;;AAEF,EAAE,OAAO,KAAK,CAAC,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB;AACjC,EAAE,gBAAgB;AAClB,EAAe;AACf,EAAE,OAAO,gBAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/server/index.ts"],"sourcesContent":["// import/export got a false positive, and affects most of our index barrel files\n// can be removed once following issue is fixed: https://github.com/import-js/eslint-plugin-import/issues/703\n/* eslint-disable import/export */\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\nexport { wrapMiddlewaresWithSentry } from './middleware';\n\n/**\n * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors\n * so they should simply be a passthrough.\n */\nexport const ErrorBoundary = (props: React.PropsWithChildren<unknown>): React.ReactNode => {\n if (!props.children) {\n return null;\n }\n\n if (typeof props.children === 'function') {\n return (props.children as () => React.ReactNode)();\n }\n\n return props.children;\n};\n\n/**\n * A passthrough error boundary wrapper for the server that doesn't depend on any react. Error boundaries don't catch\n * SSR errors so they should simply be a passthrough.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n): React.FC<P> {\n return WrappedComponent as React.FC<P>;\n}\n"],"names":[],"mappings":";;;;;AAAA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACO,MAAM,aAAA,GAAgB,CAAC,KAAK,KAAwD;AAC3F,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACvB,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,IAAI,OAAO,KAAK,CAAC,QAAA,KAAa,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,QAAA,IAAoC;AACtD,EAAE;;AAEF,EAAE,OAAO,KAAK,CAAC,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB;AACjC,EAAE,gBAAgB;AAClB,EAAe;AACf,EAAE,OAAO,gBAAA;AACT;;;;"}
@@ -0,0 +1,111 @@
1
+ import { addNonEnumerableProperty } from '@sentry/core';
2
+ import { getActiveSpan, startSpanManual, withActiveSpan } from '@sentry/node';
3
+ import { getMiddlewareSpanOptions } from './utils.js';
4
+
5
+ const SENTRY_WRAPPED = '__SENTRY_WRAPPED__';
6
+
7
+ /**
8
+ * Creates a proxy for the next function that ends the current span and restores the parent span.
9
+ * This ensures that subsequent middleware spans are children of the root span, not nested children.
10
+ */
11
+ function getNextProxy(
12
+ next,
13
+ span,
14
+ prevSpan,
15
+ nextState,
16
+ ) {
17
+ return new Proxy(next, {
18
+ apply: (originalNext, thisArgNext, argsNext) => {
19
+ nextState.called = true;
20
+ span.end();
21
+
22
+ if (prevSpan) {
23
+ return withActiveSpan(prevSpan, () => {
24
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
25
+ });
26
+ }
27
+
28
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
29
+ },
30
+ });
31
+ }
32
+
33
+ /**
34
+ * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.
35
+ */
36
+ function wrapMiddlewareWithSentry(
37
+ middleware,
38
+ options,
39
+ ) {
40
+ if ((middleware )[SENTRY_WRAPPED]) {
41
+ // already instrumented
42
+ return middleware;
43
+ }
44
+
45
+ // instrument server middleware
46
+ if (middleware.options?.server) {
47
+ middleware.options.server = new Proxy(middleware.options.server, {
48
+ apply: (originalServer, thisArgServer, argsServer) => {
49
+ const prevSpan = getActiveSpan();
50
+
51
+ return startSpanManual(getMiddlewareSpanOptions(options.name), async (span) => {
52
+ const nextState = { called: false };
53
+
54
+ // The server function receives { next, context, request } as first argument
55
+ // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.
56
+ const middlewareArgs = argsServer[0] ;
57
+ if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {
58
+ middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);
59
+ }
60
+
61
+ try {
62
+ const result = await originalServer.apply(thisArgServer, argsServer);
63
+
64
+ // End span here if next() wasn't called, else we already ended it in next()
65
+ if (!nextState.called) {
66
+ span.end();
67
+ }
68
+
69
+ return result;
70
+ } catch (e) {
71
+ span.end();
72
+ throw e;
73
+ }
74
+ });
75
+ },
76
+ });
77
+
78
+ // mark as instrumented
79
+ addNonEnumerableProperty(middleware , SENTRY_WRAPPED, true);
80
+ }
81
+
82
+ return middleware;
83
+ }
84
+
85
+ /**
86
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
87
+ * Object keys are used as span names to avoid users having to specify this manually.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
92
+ *
93
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
94
+ * authMiddleware,
95
+ * loggingMiddleware,
96
+ * });
97
+ *
98
+ * createServerFn().middleware(wrappedMiddlewares)
99
+ * ```
100
+ *
101
+ * @param middlewares - An object containing middlewares
102
+ * @returns An array of wrapped middlewares
103
+ */
104
+ function wrapMiddlewaresWithSentry(middlewares) {
105
+ return Object.entries(middlewares).map(([name, middleware]) => {
106
+ return wrapMiddlewareWithSentry(middleware, { name });
107
+ });
108
+ }
109
+
110
+ export { wrapMiddlewaresWithSentry };
111
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sources":["../../../src/server/middleware.ts"],"sourcesContent":["import { addNonEnumerableProperty } from '@sentry/core';\nimport type { Span } from '@sentry/node';\nimport { getActiveSpan, startSpanManual, withActiveSpan } from '@sentry/node';\nimport type { MiddlewareWrapperOptions, TanStackMiddlewareBase } from '../common/types';\nimport { getMiddlewareSpanOptions } from './utils';\n\nconst SENTRY_WRAPPED = '__SENTRY_WRAPPED__';\n\n/**\n * Creates a proxy for the next function that ends the current span and restores the parent span.\n * This ensures that subsequent middleware spans are children of the root span, not nested children.\n */\nfunction getNextProxy<T extends (...args: unknown[]) => unknown>(\n next: T,\n span: Span,\n prevSpan: Span | undefined,\n nextState: { called: boolean },\n): T {\n return new Proxy(next, {\n apply: (originalNext, thisArgNext, argsNext) => {\n nextState.called = true;\n span.end();\n\n if (prevSpan) {\n return withActiveSpan(prevSpan, () => {\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n });\n }\n\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n },\n });\n}\n\n/**\n * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.\n */\nfunction wrapMiddlewareWithSentry<T extends TanStackMiddlewareBase>(\n middleware: T,\n options: MiddlewareWrapperOptions,\n): T {\n if ((middleware as TanStackMiddlewareBase & { [SENTRY_WRAPPED]?: boolean })[SENTRY_WRAPPED]) {\n // already instrumented\n return middleware;\n }\n\n // instrument server middleware\n if (middleware.options?.server) {\n middleware.options.server = new Proxy(middleware.options.server, {\n apply: (originalServer, thisArgServer, argsServer) => {\n const prevSpan = getActiveSpan();\n\n return startSpanManual(getMiddlewareSpanOptions(options.name), async (span: Span) => {\n const nextState = { called: false };\n\n // The server function receives { next, context, request } as first argument\n // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.\n const middlewareArgs = argsServer[0] as { next?: (...args: unknown[]) => unknown } | undefined;\n if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {\n middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);\n }\n\n try {\n const result = await originalServer.apply(thisArgServer, argsServer);\n\n // End span here if next() wasn't called, else we already ended it in next()\n if (!nextState.called) {\n span.end();\n }\n\n return result;\n } catch (e) {\n span.end();\n throw e;\n }\n });\n },\n });\n\n // mark as instrumented\n addNonEnumerableProperty(middleware as unknown as Record<string, unknown>, SENTRY_WRAPPED, true);\n }\n\n return middleware;\n}\n\n/**\n * Wraps multiple TanStack Start middlewares with Sentry instrumentation.\n * Object keys are used as span names to avoid users having to specify this manually.\n *\n * @example\n * ```ts\n * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';\n *\n * const wrappedMiddlewares = wrapMiddlewaresWithSentry({\n * authMiddleware,\n * loggingMiddleware,\n * });\n *\n * createServerFn().middleware(wrappedMiddlewares)\n * ```\n *\n * @param middlewares - An object containing middlewares\n * @returns An array of wrapped middlewares\n */\nexport function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[] {\n return Object.entries(middlewares).map(([name, middleware]) => {\n return wrapMiddlewareWithSentry(middleware, { name });\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';
2
+
1
3
  /**
2
4
  * Extracts the SHA-256 hash from a server function pathname.
3
5
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -11,5 +13,19 @@ function extractServerFunctionSha256(pathname) {
11
13
  return serverFnMatch?.[1] ?? 'unknown';
12
14
  }
13
15
 
14
- export { extractServerFunctionSha256 };
16
+ /**
17
+ * Returns span options for TanStack Start middleware spans.
18
+ */
19
+ function getMiddlewareSpanOptions(name) {
20
+ return {
21
+ op: 'middleware.tanstackstart',
22
+ name,
23
+ attributes: {
24
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',
25
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',
26
+ },
27
+ };
28
+ }
29
+
30
+ export { extractServerFunctionSha256, getMiddlewareSpanOptions };
15
31
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n op: 'middleware.tanstackstart',\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',\n },\n };\n}\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;AAEA;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,IAAI,EAA4B;AACzE,EAAE,OAAO;AACT,IAAI,EAAE,EAAE,0BAA0B;AAClC,IAAI,IAAI;AACR,IAAI,UAAU,EAAE;AAChB,MAAM,CAAC,gCAAgC,GAAG,iCAAiC;AAC3E,MAAM,CAAC,4BAA4B,GAAG,0BAA0B;AAChE,KAAK;AACL,GAAG;AACH;;;;"}
@@ -1,3 +1,9 @@
1
+ import type { TanStackMiddlewareBase } from '../common/types';
1
2
  export * from '@sentry/react';
2
3
  export { init } from './sdk';
4
+ /**
5
+ * No-op stub for client-side builds.
6
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
7
+ */
8
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAGA,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAE/G"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ export type { TanStackMiddlewareBase, MiddlewareWrapperOptions } from './types';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type TanStackMiddlewareBase = {
2
+ options?: {
3
+ server?: (...args: unknown[]) => unknown;
4
+ };
5
+ };
6
+ export type MiddlewareWrapperOptions = {
7
+ name: string;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AAGzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -21,4 +21,5 @@ export declare const openFeatureIntegration: typeof clientSdk.openFeatureIntegra
21
21
  export declare const OpenFeatureIntegrationHook: typeof clientSdk.OpenFeatureIntegrationHook;
22
22
  export declare const statsigIntegration: typeof clientSdk.statsigIntegration;
23
23
  export declare const unleashIntegration: typeof clientSdk.unleashIntegration;
24
+ export declare const wrapMiddlewaresWithSentry: typeof serverSdk.wrapMiddlewaresWithSentry;
24
25
  //# sourceMappingURL=index.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAE3C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AAEzB,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AAEvF,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,SAAS,CAAC,aAAa,CAAC;AACnE,MAAM,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,SAAS,CAAC,iBAAiB,CAAC;AAE3E,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAE/E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAE3C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AAEzB,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AAEvF,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,SAAS,CAAC,aAAa,CAAC;AACnE,MAAM,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,SAAS,CAAC,iBAAiB,CAAC;AAE3E,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAE/E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAE7E,MAAM,CAAC,OAAO,CAAC,MAAM,yBAAyB,EAAE,OAAO,SAAS,CAAC,yBAAyB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from '@sentry/node';
2
2
  export { init } from './sdk';
3
3
  export { wrapFetchWithSentry } from './wrapFetchWithSentry';
4
+ export { wrapMiddlewaresWithSentry } from './middleware';
4
5
  /**
5
6
  * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors
6
7
  * so they should simply be a passthrough.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,SAU7E,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GACvC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAEb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,SAU7E,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GACvC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAEb"}
@@ -0,0 +1,22 @@
1
+ import type { TanStackMiddlewareBase } from '../common/types';
2
+ /**
3
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
4
+ * Object keys are used as span names to avoid users having to specify this manually.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
9
+ *
10
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
11
+ * authMiddleware,
12
+ * loggingMiddleware,
13
+ * });
14
+ *
15
+ * createServerFn().middleware(wrappedMiddlewares)
16
+ * ```
17
+ *
18
+ * @param middlewares - An object containing middlewares
19
+ * @returns An array of wrapped middlewares
20
+ */
21
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
22
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/server/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA4B,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAmFxF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAI/G"}
@@ -1,3 +1,4 @@
1
+ import type { StartSpanOptions } from '@sentry/core';
1
2
  /**
2
3
  * Extracts the SHA-256 hash from a server function pathname.
3
4
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -7,4 +8,8 @@
7
8
  * @returns the sha256 of the server function
8
9
  */
9
10
  export declare function extractServerFunctionSha256(pathname: string): string;
11
+ /**
12
+ * Returns span options for TanStack Start middleware spans.
13
+ */
14
+ export declare function getMiddlewareSpanOptions(name: string): StartSpanOptions;
10
15
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CASvE"}
@@ -1,3 +1,9 @@
1
+ import { TanStackMiddlewareBase } from '../common/types';
1
2
  export * from '@sentry/react';
2
3
  export { init } from './sdk';
4
+ /**
5
+ * No-op stub for client-side builds.
6
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
7
+ */
8
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export {};
1
+ export { TanStackMiddlewareBase, MiddlewareWrapperOptions } from './types';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ export type TanStackMiddlewareBase = {
2
+ options?: {
3
+ server?: (...args: unknown[]) => unknown;
4
+ };
5
+ };
6
+ export type MiddlewareWrapperOptions = {
7
+ name: string;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map
@@ -21,4 +21,5 @@ export declare const openFeatureIntegration: typeof clientSdk.openFeatureIntegra
21
21
  export declare const OpenFeatureIntegrationHook: typeof clientSdk.OpenFeatureIntegrationHook;
22
22
  export declare const statsigIntegration: typeof clientSdk.statsigIntegration;
23
23
  export declare const unleashIntegration: typeof clientSdk.unleashIntegration;
24
+ export declare const wrapMiddlewaresWithSentry: typeof serverSdk.wrapMiddlewaresWithSentry;
24
25
  //# sourceMappingURL=index.types.d.ts.map
@@ -1,6 +1,7 @@
1
1
  export * from '@sentry/node';
2
2
  export { init } from './sdk';
3
3
  export { wrapFetchWithSentry } from './wrapFetchWithSentry';
4
+ export { wrapMiddlewaresWithSentry } from './middleware';
4
5
  /**
5
6
  * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors
6
7
  * so they should simply be a passthrough.
@@ -0,0 +1,22 @@
1
+ import { TanStackMiddlewareBase } from '../common/types';
2
+ /**
3
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
4
+ * Object keys are used as span names to avoid users having to specify this manually.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
9
+ *
10
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
11
+ * authMiddleware,
12
+ * loggingMiddleware,
13
+ * });
14
+ *
15
+ * createServerFn().middleware(wrappedMiddlewares)
16
+ * ```
17
+ *
18
+ * @param middlewares - An object containing middlewares
19
+ * @returns An array of wrapped middlewares
20
+ */
21
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
22
+ //# sourceMappingURL=middleware.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { StartSpanOptions } from '@sentry/core';
1
2
  /**
2
3
  * Extracts the SHA-256 hash from a server function pathname.
3
4
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -7,4 +8,8 @@
7
8
  * @returns the sha256 of the server function
8
9
  */
9
10
  export declare function extractServerFunctionSha256(pathname: string): string;
11
+ /**
12
+ * Returns span options for TanStack Start middleware spans.
13
+ */
14
+ export declare function getMiddlewareSpanOptions(name: string): StartSpanOptions;
10
15
  //# sourceMappingURL=utils.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/tanstackstart-react",
3
- "version": "10.32.1",
3
+ "version": "10.34.0",
4
4
  "description": "Official Sentry SDK for TanStack Start React",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/tanstackstart-react",
@@ -52,10 +52,10 @@
52
52
  "dependencies": {
53
53
  "@opentelemetry/api": "^1.9.0",
54
54
  "@opentelemetry/semantic-conventions": "^1.37.0",
55
- "@sentry-internal/browser-utils": "10.32.1",
56
- "@sentry/core": "10.32.1",
57
- "@sentry/node": "10.32.1",
58
- "@sentry/react": "10.32.1"
55
+ "@sentry-internal/browser-utils": "10.34.0",
56
+ "@sentry/core": "10.34.0",
57
+ "@sentry/node": "10.34.0",
58
+ "@sentry/react": "10.34.0"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "run-p build:transpile build:types",