@sentry/tanstackstart-react 10.33.0 → 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.
- package/build/cjs/client/index.js +14 -7
- package/build/cjs/client/index.js.map +1 -1
- package/build/cjs/index.client.js +3 -1
- package/build/cjs/index.client.js.map +1 -1
- package/build/cjs/index.server.js +2 -0
- package/build/cjs/index.server.js.map +1 -1
- package/build/cjs/server/index.js +2 -0
- package/build/cjs/server/index.js.map +1 -1
- package/build/cjs/server/middleware.js +113 -0
- package/build/cjs/server/middleware.js.map +1 -0
- package/build/cjs/server/utils.js +17 -0
- package/build/cjs/server/utils.js.map +1 -1
- package/build/esm/client/index.js +10 -0
- package/build/esm/client/index.js.map +1 -1
- package/build/esm/index.client.js +2 -1
- package/build/esm/index.client.js.map +1 -1
- package/build/esm/index.server.js +1 -0
- package/build/esm/index.server.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/index.js +1 -0
- package/build/esm/server/index.js.map +1 -1
- package/build/esm/server/middleware.js +111 -0
- package/build/esm/server/middleware.js.map +1 -0
- package/build/esm/server/utils.js +17 -1
- package/build/esm/server/utils.js.map +1 -1
- package/build/types/client/index.d.ts +6 -0
- package/build/types/client/index.d.ts.map +1 -1
- package/build/types/common/index.d.ts +1 -1
- package/build/types/common/index.d.ts.map +1 -1
- package/build/types/common/types.d.ts +9 -0
- package/build/types/common/types.d.ts.map +1 -0
- package/build/types/index.client.d.ts.map +1 -1
- package/build/types/index.types.d.ts +1 -0
- package/build/types/index.types.d.ts.map +1 -1
- package/build/types/server/index.d.ts +1 -0
- package/build/types/server/index.d.ts.map +1 -1
- package/build/types/server/middleware.d.ts +22 -0
- package/build/types/server/middleware.d.ts.map +1 -0
- package/build/types/server/utils.d.ts +5 -0
- package/build/types/server/utils.d.ts.map +1 -1
- package/build/types-ts3.8/client/index.d.ts +6 -0
- package/build/types-ts3.8/common/index.d.ts +1 -1
- package/build/types-ts3.8/common/types.d.ts +9 -0
- package/build/types-ts3.8/index.types.d.ts +1 -0
- package/build/types-ts3.8/server/index.d.ts +1 -0
- package/build/types-ts3.8/server/middleware.d.ts +22 -0
- package/build/types-ts3.8/server/utils.d.ts +5 -0
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
|
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":"
|
|
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":"
|
|
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 +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":";;;;"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.
|
|
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":"
|
|
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
|
-
|
|
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":"
|
|
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,
|
|
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 @@
|
|
|
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;
|
|
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;
|
|
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
|
|
@@ -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.
|
|
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.
|
|
56
|
-
"@sentry/core": "10.
|
|
57
|
-
"@sentry/node": "10.
|
|
58
|
-
"@sentry/react": "10.
|
|
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",
|