@sentry/tanstackstart-react 10.53.1 → 10.55.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/README.md +3 -2
- package/build/cjs/client/index.js +5 -26
- package/build/cjs/client/index.js.map +1 -1
- package/build/cjs/client/sdk.js +12 -9
- package/build/cjs/client/sdk.js.map +1 -1
- package/build/cjs/client/tunnelRoute.js +2 -13
- package/build/cjs/client/tunnelRoute.js.map +1 -1
- package/build/cjs/index.server.js +1 -0
- package/build/cjs/index.server.js.map +1 -1
- package/build/cjs/server/globalMiddleware.js +38 -22
- package/build/cjs/server/globalMiddleware.js.map +1 -1
- package/build/cjs/server/index.js +16 -29
- package/build/cjs/server/index.js.map +1 -1
- package/build/cjs/server/middleware.js +10 -66
- package/build/cjs/server/middleware.js.map +1 -1
- package/build/cjs/server/routeParametrization.js +47 -0
- package/build/cjs/server/routeParametrization.js.map +1 -0
- package/build/cjs/server/sdk.js +9 -7
- package/build/cjs/server/sdk.js.map +1 -1
- package/build/cjs/server/tunnelRoute.js +11 -31
- package/build/cjs/server/tunnelRoute.js.map +1 -1
- package/build/cjs/server/utils.js +4 -21
- package/build/cjs/server/utils.js.map +1 -1
- package/build/cjs/server/wrapFetchWithSentry.js +88 -44
- package/build/cjs/server/wrapFetchWithSentry.js.map +1 -1
- package/build/cjs/vite/autoInstrumentMiddleware.js +15 -97
- package/build/cjs/vite/autoInstrumentMiddleware.js.map +1 -1
- package/build/cjs/vite/routePatterns.js +60 -0
- package/build/cjs/vite/routePatterns.js.map +1 -0
- package/build/cjs/vite/sentryTanstackStart.js +8 -44
- package/build/cjs/vite/sentryTanstackStart.js.map +1 -1
- package/build/cjs/vite/sourceMaps.js +34 -75
- package/build/cjs/vite/sourceMaps.js.map +1 -1
- package/build/cjs/vite/tunnelRoute.js +30 -63
- package/build/cjs/vite/tunnelRoute.js.map +1 -1
- package/build/esm/client/index.js +5 -26
- package/build/esm/client/index.js.map +1 -1
- package/build/esm/client/sdk.js +12 -9
- package/build/esm/client/sdk.js.map +1 -1
- package/build/esm/client/tunnelRoute.js +2 -13
- package/build/esm/client/tunnelRoute.js.map +1 -1
- package/build/esm/index.server.js +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/globalMiddleware.js +39 -23
- package/build/esm/server/globalMiddleware.js.map +1 -1
- package/build/esm/server/index.js +16 -30
- package/build/esm/server/index.js.map +1 -1
- package/build/esm/server/middleware.js +10 -66
- package/build/esm/server/middleware.js.map +1 -1
- package/build/esm/server/routeParametrization.js +44 -0
- package/build/esm/server/routeParametrization.js.map +1 -0
- package/build/esm/server/sdk.js +9 -7
- package/build/esm/server/sdk.js.map +1 -1
- package/build/esm/server/tunnelRoute.js +11 -31
- package/build/esm/server/tunnelRoute.js.map +1 -1
- package/build/esm/server/utils.js +5 -21
- package/build/esm/server/utils.js.map +1 -1
- package/build/esm/server/wrapFetchWithSentry.js +90 -46
- package/build/esm/server/wrapFetchWithSentry.js.map +1 -1
- package/build/esm/vite/autoInstrumentMiddleware.js +15 -97
- package/build/esm/vite/autoInstrumentMiddleware.js.map +1 -1
- package/build/esm/vite/routePatterns.js +57 -0
- package/build/esm/vite/routePatterns.js.map +1 -0
- package/build/esm/vite/sentryTanstackStart.js +8 -44
- package/build/esm/vite/sentryTanstackStart.js.map +1 -1
- package/build/esm/vite/sourceMaps.js +34 -75
- package/build/esm/vite/sourceMaps.js.map +1 -1
- package/build/esm/vite/tunnelRoute.js +30 -63
- package/build/esm/vite/tunnelRoute.js.map +1 -1
- package/build/types/client/sdk.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/globalMiddleware.d.ts.map +1 -1
- package/build/types/server/index.d.ts +5 -0
- package/build/types/server/index.d.ts.map +1 -1
- package/build/types/server/routeParametrization.d.ts +12 -0
- package/build/types/server/routeParametrization.d.ts.map +1 -0
- package/build/types/server/sdk.d.ts.map +1 -1
- package/build/types/server/utils.d.ts +0 -9
- package/build/types/server/utils.d.ts.map +1 -1
- package/build/types/server/wrapFetchWithSentry.d.ts.map +1 -1
- package/build/types/vite/routePatterns.d.ts +18 -0
- package/build/types/vite/routePatterns.d.ts.map +1 -0
- package/build/types/vite/sentryTanstackStart.d.ts +17 -0
- package/build/types/vite/sentryTanstackStart.d.ts.map +1 -1
- package/build/types/vite/sourceMaps.d.ts +4 -4
- package/build/types/vite/sourceMaps.d.ts.map +1 -1
- package/build/types-ts3.8/index.types.d.ts +1 -0
- package/build/types-ts3.8/server/index.d.ts +5 -0
- package/build/types-ts3.8/server/routeParametrization.d.ts +12 -0
- package/build/types-ts3.8/server/utils.d.ts +0 -9
- package/build/types-ts3.8/vite/routePatterns.d.ts +18 -0
- package/build/types-ts3.8/vite/sentryTanstackStart.d.ts +17 -0
- package/build/types-ts3.8/vite/sourceMaps.d.ts +4 -4
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
</a>
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
|
-
# Official Sentry SDK for TanStack Start React (
|
|
7
|
+
# Official Sentry SDK for TanStack Start React (Beta)
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@sentry/tanstackstart-react)
|
|
10
10
|
[](https://www.npmjs.com/package/@sentry/tanstackstart-react)
|
|
11
11
|
[](https://www.npmjs.com/package/@sentry/tanstackstart-react)
|
|
12
12
|
|
|
13
|
-
>
|
|
13
|
+
> This SDK is currently in **BETA**. Beta features are still in progress and may have bugs. Please reach out on
|
|
14
|
+
> [GitHub](https://github.com/getsentry/sentry-javascript/issues/new/choose) if you have any feedback or concerns.
|
|
14
15
|
|
|
15
16
|
> See the [Official Sentry TanStack Start SDK Docs](https://docs.sentry.io/platforms/javascript/guides/tanstackstart-react/) to get started.
|
|
16
17
|
|
|
@@ -3,37 +3,16 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3
3
|
const react = require('@sentry/react');
|
|
4
4
|
const sdk = require('./sdk.js');
|
|
5
5
|
|
|
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
6
|
function wrapMiddlewaresWithSentry(middlewares) {
|
|
11
7
|
return Object.values(middlewares);
|
|
12
8
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* The actual implementation is server-only, but this stub is needed to prevent rendering errors.
|
|
17
|
-
*/
|
|
18
|
-
const sentryGlobalRequestMiddleware = { '~types': undefined, options: {} };
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* No-op stub for client-side builds.
|
|
22
|
-
* The actual implementation is server-only, but this stub is needed to prevent rendering errors.
|
|
23
|
-
*/
|
|
24
|
-
const sentryGlobalFunctionMiddleware = { '~types': undefined, options: {} };
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* No-op stub for client-side builds.
|
|
28
|
-
* The actual implementation is server-only, but this stub is needed to prevent rendering errors.
|
|
29
|
-
*/
|
|
30
|
-
function createSentryTunnelRoute(_options)
|
|
31
|
-
|
|
32
|
-
{
|
|
9
|
+
const sentryGlobalRequestMiddleware = { "~types": void 0, options: {} };
|
|
10
|
+
const sentryGlobalFunctionMiddleware = { "~types": void 0, options: {} };
|
|
11
|
+
function createSentryTunnelRoute(_options) {
|
|
33
12
|
return {
|
|
34
13
|
handlers: {
|
|
35
|
-
POST: async () => new Response(null, { status: 500 })
|
|
36
|
-
}
|
|
14
|
+
POST: async () => new Response(null, { status: 500 })
|
|
15
|
+
}
|
|
37
16
|
};
|
|
38
17
|
}
|
|
39
18
|
|
|
@@ -1 +1 @@
|
|
|
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';\nimport type { CreateSentryTunnelRouteOptions } from '../server/tunnelRoute';\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\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport const sentryGlobalRequestMiddleware: TanStackMiddlewareBase = { '~types': undefined, options: {} };\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport const sentryGlobalFunctionMiddleware: TanStackMiddlewareBase = { '~types': undefined, options: {} };\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport function createSentryTunnelRoute(_options: CreateSentryTunnelRouteOptions): {\n handlers: {\n POST: () => Promise<Response>;\n };\n} {\n return {\n handlers: {\n POST: async () => new Response(null, { status: 500 }),\n },\n };\n}\n"],"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';\nimport type { CreateSentryTunnelRouteOptions } from '../server/tunnelRoute';\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\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport const sentryGlobalRequestMiddleware: TanStackMiddlewareBase = { '~types': undefined, options: {} };\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport const sentryGlobalFunctionMiddleware: TanStackMiddlewareBase = { '~types': undefined, options: {} };\n\n/**\n * No-op stub for client-side builds.\n * The actual implementation is server-only, but this stub is needed to prevent rendering errors.\n */\nexport function createSentryTunnelRoute(_options: CreateSentryTunnelRouteOptions): {\n handlers: {\n POST: () => Promise<Response>;\n };\n} {\n return {\n handlers: {\n POST: async () => new Response(null, { status: 500 }),\n },\n };\n}\n"],"names":[],"mappings":";;;;;AAcO,SAAS,0BAA4D,WAAA,EAAqC;AAC/G,EAAA,OAAO,MAAA,CAAO,OAAO,WAAW,CAAA;AAClC;AAMO,MAAM,gCAAwD,EAAE,QAAA,EAAU,MAAA,EAAW,OAAA,EAAS,EAAC;AAM/F,MAAM,iCAAyD,EAAE,QAAA,EAAU,MAAA,EAAW,OAAA,EAAS,EAAC;AAMhG,SAAS,wBAAwB,QAAA,EAItC;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,YAAY,IAAI,QAAA,CAAS,MAAM,EAAE,MAAA,EAAQ,KAAK;AAAA;AACtD,GACF;AACF;;;;;;;;;;;;;;;;;;"}
|
package/build/cjs/client/sdk.js
CHANGED
|
@@ -4,20 +4,23 @@ const core = require('@sentry/core');
|
|
|
4
4
|
const react = require('@sentry/react');
|
|
5
5
|
const tunnelRoute = require('./tunnelRoute.js');
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Initializes the TanStack Start React SDK
|
|
9
|
-
*
|
|
10
|
-
* @param options Configuration options for the SDK.
|
|
11
|
-
*/
|
|
12
7
|
function init(options) {
|
|
13
8
|
const sentryOptions = {
|
|
14
9
|
defaultIntegrations: [...react.getDefaultIntegrations(options)],
|
|
15
|
-
...options
|
|
10
|
+
...options
|
|
16
11
|
};
|
|
17
|
-
|
|
18
12
|
tunnelRoute.applyTunnelRouteOption(sentryOptions);
|
|
19
|
-
core.applySdkMetadata(sentryOptions,
|
|
20
|
-
|
|
13
|
+
core.applySdkMetadata(sentryOptions, "tanstackstart-react", ["tanstackstart-react", "react"]);
|
|
14
|
+
sentryOptions.ignoreSpans = [
|
|
15
|
+
...sentryOptions.ignoreSpans || [],
|
|
16
|
+
/\/node_modules\//,
|
|
17
|
+
/\/favicon\.ico/,
|
|
18
|
+
/\/@id\//,
|
|
19
|
+
/\/@react-refresh/,
|
|
20
|
+
/\/@tanstack-start\//,
|
|
21
|
+
/\/@fs\//,
|
|
22
|
+
/\/@vite\//
|
|
23
|
+
];
|
|
21
24
|
return react.init(sentryOptions);
|
|
22
25
|
}
|
|
23
26
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../src/client/sdk.ts"],"sourcesContent":["import type { Client } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\nimport type { BrowserOptions as ReactBrowserOptions } from '@sentry/react';\nimport { getDefaultIntegrations as getReactDefaultIntegrations, init as initReactSDK } from '@sentry/react';\nimport { applyTunnelRouteOption } from './tunnelRoute';\n\n/**\n * Initializes the TanStack Start React SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: ReactBrowserOptions): Client | undefined {\n const sentryOptions: ReactBrowserOptions = {\n defaultIntegrations: [...getReactDefaultIntegrations(options)],\n ...options,\n };\n\n applyTunnelRouteOption(sentryOptions);\n applySdkMetadata(sentryOptions, 'tanstackstart-react', ['tanstackstart-react', 'react']);\n\n return initReactSDK(sentryOptions);\n}\n"],"names":["getReactDefaultIntegrations","applyTunnelRouteOption","applySdkMetadata","initReactSDK"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../src/client/sdk.ts"],"sourcesContent":["import type { Client } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\nimport type { BrowserOptions as ReactBrowserOptions } from '@sentry/react';\nimport { getDefaultIntegrations as getReactDefaultIntegrations, init as initReactSDK } from '@sentry/react';\nimport { applyTunnelRouteOption } from './tunnelRoute';\n\n/**\n * Initializes the TanStack Start React SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: ReactBrowserOptions): Client | undefined {\n const sentryOptions: ReactBrowserOptions = {\n defaultIntegrations: [...getReactDefaultIntegrations(options)],\n ...options,\n };\n\n applyTunnelRouteOption(sentryOptions);\n applySdkMetadata(sentryOptions, 'tanstackstart-react', ['tanstackstart-react', 'react']);\n\n sentryOptions.ignoreSpans = [\n ...(sentryOptions.ignoreSpans || []),\n /\\/node_modules\\//,\n /\\/favicon\\.ico/,\n /\\/@id\\//,\n /\\/@react-refresh/,\n /\\/@tanstack-start\\//,\n /\\/@fs\\//,\n /\\/@vite\\//,\n ];\n\n return initReactSDK(sentryOptions);\n}\n"],"names":["getReactDefaultIntegrations","applyTunnelRouteOption","applySdkMetadata","initReactSDK"],"mappings":";;;;;;AAWO,SAAS,KAAK,OAAA,EAAkD;AACrE,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,mBAAA,EAAqB,CAAC,GAAGA,4BAAA,CAA4B,OAAO,CAAC,CAAA;AAAA,IAC7D,GAAG;AAAA,GACL;AAEA,EAAAC,kCAAA,CAAuB,aAAa,CAAA;AACpC,EAAAC,qBAAA,CAAiB,aAAA,EAAe,qBAAA,EAAuB,CAAC,qBAAA,EAAuB,OAAO,CAAC,CAAA;AAEvF,EAAA,aAAA,CAAc,WAAA,GAAc;AAAA,IAC1B,GAAI,aAAA,CAAc,WAAA,IAAe,EAAC;AAAA,IAClC,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOC,WAAa,aAAa,CAAA;AACnC;;;;"}
|
|
@@ -3,33 +3,22 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3
3
|
const core = require('@sentry/core');
|
|
4
4
|
|
|
5
5
|
let hasWarnedAboutManagedTunnelRouteOverride = false;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Applies the managed tunnel route from `sentryTanstackStart({ tunnelRoute: ... })` unless the user already
|
|
9
|
-
* configured an explicit runtime `tunnel` option in `Sentry.init()`.
|
|
10
|
-
*/
|
|
11
6
|
function applyTunnelRouteOption(options) {
|
|
12
|
-
const managedTunnelRoute =
|
|
13
|
-
typeof __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ !== 'undefined' ? __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ : undefined;
|
|
14
|
-
|
|
7
|
+
const managedTunnelRoute = typeof __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ !== "undefined" ? __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ : void 0;
|
|
15
8
|
if (!managedTunnelRoute) {
|
|
16
9
|
return;
|
|
17
10
|
}
|
|
18
|
-
|
|
19
11
|
if (options.tunnel) {
|
|
20
12
|
if (!hasWarnedAboutManagedTunnelRouteOverride) {
|
|
21
13
|
hasWarnedAboutManagedTunnelRouteOverride = true;
|
|
22
14
|
core.consoleSandbox(() => {
|
|
23
|
-
// eslint-disable-next-line no-console
|
|
24
15
|
console.warn(
|
|
25
|
-
|
|
16
|
+
"[@sentry/tanstackstart-react] `Sentry.init({ tunnel: ... })` overrides the managed `sentryTanstackStart({ tunnelRoute: ... })` route. Remove the runtime `tunnel` option if you want the managed tunnel route to be used."
|
|
26
17
|
);
|
|
27
18
|
});
|
|
28
19
|
}
|
|
29
|
-
|
|
30
20
|
return;
|
|
31
21
|
}
|
|
32
|
-
|
|
33
22
|
options.tunnel = managedTunnelRoute;
|
|
34
23
|
}
|
|
35
24
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnelRoute.js","sources":["../../../src/client/tunnelRoute.ts"],"sourcesContent":["import { consoleSandbox } from '@sentry/core';\nimport type { BrowserOptions as ReactBrowserOptions } from '@sentry/react';\n\ndeclare const __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__: string | undefined;\n\nlet hasWarnedAboutManagedTunnelRouteOverride = false;\n\n/**\n * Applies the managed tunnel route from `sentryTanstackStart({ tunnelRoute: ... })` unless the user already\n * configured an explicit runtime `tunnel` option in `Sentry.init()`.\n */\nexport function applyTunnelRouteOption(options: ReactBrowserOptions): void {\n const managedTunnelRoute =\n typeof __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ !== 'undefined' ? __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ : undefined;\n\n if (!managedTunnelRoute) {\n return;\n }\n\n if (options.tunnel) {\n if (!hasWarnedAboutManagedTunnelRouteOverride) {\n hasWarnedAboutManagedTunnelRouteOverride = true;\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n '[@sentry/tanstackstart-react] `Sentry.init({ tunnel: ... })` overrides the managed `sentryTanstackStart({ tunnelRoute: ... })` route. Remove the runtime `tunnel` option if you want the managed tunnel route to be used.',\n );\n });\n }\n\n return;\n }\n\n options.tunnel = managedTunnelRoute;\n}\n"],"names":["consoleSandbox"],"mappings":";;;;AAKA,IAAI,wCAAA,GAA2C,
|
|
1
|
+
{"version":3,"file":"tunnelRoute.js","sources":["../../../src/client/tunnelRoute.ts"],"sourcesContent":["import { consoleSandbox } from '@sentry/core';\nimport type { BrowserOptions as ReactBrowserOptions } from '@sentry/react';\n\ndeclare const __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__: string | undefined;\n\nlet hasWarnedAboutManagedTunnelRouteOverride = false;\n\n/**\n * Applies the managed tunnel route from `sentryTanstackStart({ tunnelRoute: ... })` unless the user already\n * configured an explicit runtime `tunnel` option in `Sentry.init()`.\n */\nexport function applyTunnelRouteOption(options: ReactBrowserOptions): void {\n const managedTunnelRoute =\n typeof __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ !== 'undefined' ? __SENTRY_TANSTACKSTART_TUNNEL_ROUTE__ : undefined;\n\n if (!managedTunnelRoute) {\n return;\n }\n\n if (options.tunnel) {\n if (!hasWarnedAboutManagedTunnelRouteOverride) {\n hasWarnedAboutManagedTunnelRouteOverride = true;\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n '[@sentry/tanstackstart-react] `Sentry.init({ tunnel: ... })` overrides the managed `sentryTanstackStart({ tunnelRoute: ... })` route. Remove the runtime `tunnel` option if you want the managed tunnel route to be used.',\n );\n });\n }\n\n return;\n }\n\n options.tunnel = managedTunnelRoute;\n}\n"],"names":["consoleSandbox"],"mappings":";;;;AAKA,IAAI,wCAAA,GAA2C,KAAA;AAMxC,SAAS,uBAAuB,OAAA,EAAoC;AACzE,EAAA,MAAM,kBAAA,GACJ,OAAO,qCAAA,KAA0C,WAAA,GAAc,qCAAA,GAAwC,MAAA;AAEzG,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,CAAC,wCAAA,EAA0C;AAC7C,MAAA,wCAAA,GAA2C,IAAA;AAC3C,MAAAA,mBAAA,CAAe,MAAM;AAEnB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,MAAA,GAAS,kBAAA;AACnB;;;;"}
|
|
@@ -11,6 +11,7 @@ const middleware = require('./server/middleware.js');
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
exports.ErrorBoundary = index.ErrorBoundary;
|
|
14
|
+
exports.replayIntegration = index.replayIntegration;
|
|
14
15
|
exports.tanstackRouterBrowserTracingIntegration = index.tanstackRouterBrowserTracingIntegration;
|
|
15
16
|
exports.withErrorBoundary = index.withErrorBoundary;
|
|
16
17
|
exports.createSentryTunnelRoute = tunnelRoute.createSentryTunnelRoute;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -9,40 +9,56 @@ function createSentryMiddlewareHandler(mechanismType) {
|
|
|
9
9
|
return await next();
|
|
10
10
|
} catch (e) {
|
|
11
11
|
core.captureException(e, {
|
|
12
|
-
mechanism: { type: mechanismType, handled: false }
|
|
12
|
+
mechanism: { type: mechanismType, handled: false }
|
|
13
|
+
});
|
|
14
|
+
throw e;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function createSentryFunctionMiddlewareHandler(mechanismType) {
|
|
19
|
+
return async function sentryFunctionMiddlewareHandler({
|
|
20
|
+
next,
|
|
21
|
+
serverFnMeta
|
|
22
|
+
}) {
|
|
23
|
+
const activeSpan = core.getActiveSpan();
|
|
24
|
+
const spanData = activeSpan ? core.spanToJSON(activeSpan) : void 0;
|
|
25
|
+
if (activeSpan && spanData?.op === "function.tanstackstart") {
|
|
26
|
+
if (serverFnMeta?.name) {
|
|
27
|
+
const method = spanData.description?.split(" ")[0] || "GET";
|
|
28
|
+
core.updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);
|
|
29
|
+
activeSpan.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
30
|
+
}
|
|
31
|
+
if (serverFnMeta?.id) {
|
|
32
|
+
activeSpan.setAttribute("tanstackstart.function.id", serverFnMeta.id);
|
|
33
|
+
}
|
|
34
|
+
if (serverFnMeta?.filename) {
|
|
35
|
+
activeSpan.setAttribute("tanstackstart.function.filename", serverFnMeta.filename);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return await next();
|
|
40
|
+
} catch (e) {
|
|
41
|
+
core.captureException(e, {
|
|
42
|
+
mechanism: { type: mechanismType, handled: false }
|
|
13
43
|
});
|
|
14
44
|
throw e;
|
|
15
45
|
}
|
|
16
46
|
};
|
|
17
47
|
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Global request middleware that captures errors from API route requests.
|
|
21
|
-
* Should be added as the first entry in the `requestMiddleware` array of `createStart()`.
|
|
22
|
-
*/
|
|
23
48
|
const sentryGlobalRequestMiddleware = {
|
|
24
|
-
|
|
25
|
-
|
|
49
|
+
"~types": void 0,
|
|
26
50
|
options: {
|
|
27
51
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
-
server: createSentryMiddlewareHandler(
|
|
29
|
-
}
|
|
52
|
+
server: createSentryMiddlewareHandler("auto.middleware.tanstackstart.request")
|
|
53
|
+
}
|
|
30
54
|
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Global function middleware that captures errors from server function invocations.
|
|
34
|
-
* Should be added as the first entry in the `functionMiddleware` array of `createStart()`.
|
|
35
|
-
*/
|
|
36
55
|
const sentryGlobalFunctionMiddleware = {
|
|
37
|
-
|
|
38
|
-
|
|
56
|
+
"~types": void 0,
|
|
39
57
|
options: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
58
|
+
server: createSentryFunctionMiddlewareHandler("auto.middleware.tanstackstart.server_function")
|
|
59
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
60
|
+
}
|
|
43
61
|
};
|
|
44
|
-
|
|
45
|
-
// Mark as internal so the Vite auto-instrumentation plugin skips these middleware
|
|
46
62
|
core.addNonEnumerableProperty(sentryGlobalRequestMiddleware, middleware.SENTRY_INTERNAL, true);
|
|
47
63
|
core.addNonEnumerableProperty(sentryGlobalFunctionMiddleware, middleware.SENTRY_INTERNAL, true);
|
|
48
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalMiddleware.js","sources":["../../../src/server/globalMiddleware.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"globalMiddleware.js","sources":["../../../src/server/globalMiddleware.ts"],"sourcesContent":["import {\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n addNonEnumerableProperty,\n captureException,\n getActiveSpan,\n spanToJSON,\n updateSpanName,\n} from '@sentry/core';\nimport type { TanStackMiddlewareBase } from '../common/types';\nimport { SENTRY_INTERNAL } from './middleware';\n\ntype ServerFnMeta = {\n id?: string;\n name?: string;\n filename?: string;\n};\n\nfunction createSentryMiddlewareHandler(mechanismType: string) {\n return async function sentryMiddlewareHandler({ next }: { next: () => Promise<unknown> }): Promise<unknown> {\n try {\n return await next();\n } catch (e) {\n captureException(e, {\n mechanism: { type: mechanismType, handled: false },\n });\n throw e;\n }\n };\n}\n\nfunction createSentryFunctionMiddlewareHandler(mechanismType: string) {\n return async function sentryFunctionMiddlewareHandler({\n next,\n serverFnMeta,\n }: {\n next: () => Promise<unknown>;\n serverFnMeta?: ServerFnMeta;\n }): Promise<unknown> {\n const activeSpan = getActiveSpan();\n const spanData = activeSpan ? spanToJSON(activeSpan) : undefined;\n if (activeSpan && spanData?.op === 'function.tanstackstart') {\n if (serverFnMeta?.name) {\n const method = spanData.description?.split(' ')[0] || 'GET';\n updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);\n activeSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n if (serverFnMeta?.id) {\n activeSpan.setAttribute('tanstackstart.function.id', serverFnMeta.id);\n }\n if (serverFnMeta?.filename) {\n activeSpan.setAttribute('tanstackstart.function.filename', serverFnMeta.filename);\n }\n }\n\n try {\n return await next();\n } catch (e) {\n captureException(e, {\n mechanism: { type: mechanismType, handled: false },\n });\n throw e;\n }\n };\n}\n\n/**\n * Global request middleware that captures errors from API route requests.\n * Should be added as the first entry in the `requestMiddleware` array of `createStart()`.\n */\nexport const sentryGlobalRequestMiddleware: TanStackMiddlewareBase = {\n '~types': undefined,\n\n options: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n server: createSentryMiddlewareHandler('auto.middleware.tanstackstart.request') as (...args: any[]) => any,\n },\n};\n\n/**\n * Global function middleware that captures errors from server function invocations.\n * Should be added as the first entry in the `functionMiddleware` array of `createStart()`.\n */\nexport const sentryGlobalFunctionMiddleware: TanStackMiddlewareBase = {\n '~types': undefined,\n\n options: {\n server: createSentryFunctionMiddlewareHandler('auto.middleware.tanstackstart.server_function') as (\n ...args: any[] // eslint-disable-line @typescript-eslint/no-explicit-any\n ) => any, // eslint-disable-line @typescript-eslint/no-explicit-any\n },\n};\n\n// Mark as internal so the Vite auto-instrumentation plugin skips these middleware\naddNonEnumerableProperty(sentryGlobalRequestMiddleware, SENTRY_INTERNAL, true);\naddNonEnumerableProperty(sentryGlobalFunctionMiddleware, SENTRY_INTERNAL, true);\n"],"names":["captureException","getActiveSpan","spanToJSON","updateSpanName","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","addNonEnumerableProperty","SENTRY_INTERNAL"],"mappings":";;;;;AAiBA,SAAS,8BAA8B,aAAA,EAAuB;AAC5D,EAAA,OAAO,eAAe,uBAAA,CAAwB,EAAE,IAAA,EAAK,EAAuD;AAC1G,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,CAAA,EAAG;AACV,MAAAA,qBAAA,CAAiB,CAAA,EAAG;AAAA,QAClB,SAAA,EAAW,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,KAAA;AAAM,OAClD,CAAA;AACD,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAEA,SAAS,sCAAsC,aAAA,EAAuB;AACpE,EAAA,OAAO,eAAe,+BAAA,CAAgC;AAAA,IACpD,IAAA;AAAA,IACA;AAAA,GACF,EAGqB;AACnB,IAAA,MAAM,aAAaC,kBAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAaC,eAAA,CAAW,UAAU,CAAA,GAAI,MAAA;AACvD,IAAA,IAAI,UAAA,IAAc,QAAA,EAAU,EAAA,KAAO,wBAAA,EAA0B;AAC3D,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,QAAA,CAAS,WAAA,EAAa,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AACtD,QAAAC,mBAAA,CAAe,YAAY,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,UAAA,CAAW,YAAA,CAAaC,uCAAkC,OAAO,CAAA;AAAA,MACnE;AACA,MAAA,IAAI,cAAc,EAAA,EAAI;AACpB,QAAA,UAAA,CAAW,YAAA,CAAa,2BAAA,EAA6B,YAAA,CAAa,EAAE,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,QAAA,UAAA,CAAW,YAAA,CAAa,iCAAA,EAAmC,YAAA,CAAa,QAAQ,CAAA;AAAA,MAClF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,CAAA,EAAG;AACV,MAAAJ,qBAAA,CAAiB,CAAA,EAAG;AAAA,QAClB,SAAA,EAAW,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,KAAA;AAAM,OAClD,CAAA;AACD,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAMO,MAAM,6BAAA,GAAwD;AAAA,EACnE,QAAA,EAAU,MAAA;AAAA,EAEV,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,8BAA8B,uCAAuC;AAAA;AAEjF;AAMO,MAAM,8BAAA,GAAyD;AAAA,EACpE,QAAA,EAAU,MAAA;AAAA,EAEV,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,sCAAsC,+CAA+C;AAAA;AAAA;AAIjG;AAGAK,6BAAA,CAAyB,6BAAA,EAA+BC,4BAAiB,IAAI,CAAA;AAC7ED,6BAAA,CAAyB,8BAAA,EAAgCC,4BAAiB,IAAI,CAAA;;;;;"}
|
|
@@ -7,45 +7,31 @@ const middleware = require('./middleware.js');
|
|
|
7
7
|
const globalMiddleware = require('./globalMiddleware.js');
|
|
8
8
|
const tunnelRoute = require('./tunnelRoute.js');
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* A no-op stub of the browser tracing integration for the server. Router setup code is shared between client and server,
|
|
12
|
-
* so this stub is needed to prevent build errors during SSR bundling.
|
|
13
|
-
*/
|
|
14
|
-
function tanstackRouterBrowserTracingIntegration(
|
|
15
|
-
_router,
|
|
16
|
-
_options,
|
|
17
|
-
) {
|
|
10
|
+
function replayIntegration(_options) {
|
|
18
11
|
return {
|
|
19
|
-
name:
|
|
20
|
-
setup() {
|
|
12
|
+
name: "Replay",
|
|
13
|
+
setup() {
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function tanstackRouterBrowserTracingIntegration(_router, _options) {
|
|
18
|
+
return {
|
|
19
|
+
name: "BrowserTracing",
|
|
20
|
+
setup() {
|
|
21
|
+
}
|
|
21
22
|
};
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors
|
|
26
|
-
* so they should simply be a passthrough.
|
|
27
|
-
*/
|
|
28
24
|
const ErrorBoundary = (props) => {
|
|
29
25
|
if (!props.children) {
|
|
30
26
|
return null;
|
|
31
27
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return (props.children )();
|
|
28
|
+
if (typeof props.children === "function") {
|
|
29
|
+
return props.children();
|
|
35
30
|
}
|
|
36
|
-
|
|
37
31
|
return props.children;
|
|
38
32
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
* A passthrough error boundary wrapper for the server that doesn't depend on any react. Error boundaries don't catch
|
|
42
|
-
* SSR errors so they should simply be a passthrough.
|
|
43
|
-
*/
|
|
44
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
-
function withErrorBoundary(
|
|
46
|
-
WrappedComponent,
|
|
47
|
-
) {
|
|
48
|
-
return WrappedComponent ;
|
|
33
|
+
function withErrorBoundary(WrappedComponent) {
|
|
34
|
+
return WrappedComponent;
|
|
49
35
|
}
|
|
50
36
|
|
|
51
37
|
exports.init = sdk.init;
|
|
@@ -55,6 +41,7 @@ exports.sentryGlobalFunctionMiddleware = globalMiddleware.sentryGlobalFunctionMi
|
|
|
55
41
|
exports.sentryGlobalRequestMiddleware = globalMiddleware.sentryGlobalRequestMiddleware;
|
|
56
42
|
exports.createSentryTunnelRoute = tunnelRoute.createSentryTunnelRoute;
|
|
57
43
|
exports.ErrorBoundary = ErrorBoundary;
|
|
44
|
+
exports.replayIntegration = replayIntegration;
|
|
58
45
|
exports.tanstackRouterBrowserTracingIntegration = tanstackRouterBrowserTracingIntegration;
|
|
59
46
|
exports.withErrorBoundary = withErrorBoundary;
|
|
60
47
|
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 */\nimport type { Integration } from '@sentry/core';\n\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\nexport { wrapMiddlewaresWithSentry } from './middleware';\nexport { sentryGlobalRequestMiddleware, sentryGlobalFunctionMiddleware } from './globalMiddleware';\nexport { createSentryTunnelRoute } from './tunnelRoute';\n\n/**\n * A no-op stub of the browser tracing integration for the server. Router setup code is shared between client and server,\n * so this stub is needed to prevent build errors during SSR bundling.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n _router: unknown,\n _options?: Record<string, unknown>,\n): Integration {\n return {\n name: 'BrowserTracing',\n setup() {},\n };\n}\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 */\nimport type { Integration } from '@sentry/core';\n\nexport * from '@sentry/node';\n\nexport { init } from './sdk';\nexport { wrapFetchWithSentry } from './wrapFetchWithSentry';\nexport { wrapMiddlewaresWithSentry } from './middleware';\nexport { sentryGlobalRequestMiddleware, sentryGlobalFunctionMiddleware } from './globalMiddleware';\nexport { createSentryTunnelRoute } from './tunnelRoute';\n\n/**\n * A no-op stub of the replay integration for the server. Router setup code is shared between client and server,\n * so this stub is needed to prevent build errors during SSR bundling.\n */\nexport function replayIntegration(_options?: Record<string, unknown>): Integration {\n return {\n name: 'Replay',\n setup() {},\n };\n}\n\n/**\n * A no-op stub of the browser tracing integration for the server. Router setup code is shared between client and server,\n * so this stub is needed to prevent build errors during SSR bundling.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n _router: unknown,\n _options?: Record<string, unknown>,\n): Integration {\n return {\n name: 'BrowserTracing',\n setup() {},\n };\n}\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":";;;;;;;;;AAiBO,SAAS,kBAAkB,QAAA,EAAiD;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,GAAQ;AAAA,IAAC;AAAA,GACX;AACF;AAMO,SAAS,uCAAA,CACd,SACA,QAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,GAAQ;AAAA,IAAC;AAAA,GACX;AACF;AAMO,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA6D;AACzF,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACxC,IAAA,OAAQ,MAAM,QAAA,EAAmC;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA,CAAM,QAAA;AACf;AAOO,SAAS,kBACd,gBAAA,EACa;AACb,EAAA,OAAO,gBAAA;AACT;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -4,109 +4,53 @@ const core = require('@sentry/core');
|
|
|
4
4
|
const node = require('@sentry/node');
|
|
5
5
|
const utils = require('./utils.js');
|
|
6
6
|
|
|
7
|
-
const SENTRY_WRAPPED =
|
|
8
|
-
const SENTRY_INTERNAL =
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Creates a proxy for the next function that ends the current span and restores the parent span.
|
|
12
|
-
* This ensures that subsequent middleware spans are children of the root span, not nested children.
|
|
13
|
-
*/
|
|
14
|
-
function getNextProxy(
|
|
15
|
-
next,
|
|
16
|
-
span,
|
|
17
|
-
prevSpan,
|
|
18
|
-
nextState,
|
|
19
|
-
) {
|
|
7
|
+
const SENTRY_WRAPPED = "__SENTRY_WRAPPED__";
|
|
8
|
+
const SENTRY_INTERNAL = "__SENTRY_INTERNAL__";
|
|
9
|
+
function getNextProxy(next, span, prevSpan, nextState) {
|
|
20
10
|
return new Proxy(next, {
|
|
21
11
|
apply: (originalNext, thisArgNext, argsNext) => {
|
|
22
12
|
nextState.called = true;
|
|
23
13
|
span.end();
|
|
24
|
-
|
|
25
14
|
if (prevSpan) {
|
|
26
15
|
return node.withActiveSpan(prevSpan, () => {
|
|
27
16
|
return Reflect.apply(originalNext, thisArgNext, argsNext);
|
|
28
17
|
});
|
|
29
18
|
}
|
|
30
|
-
|
|
31
19
|
return Reflect.apply(originalNext, thisArgNext, argsNext);
|
|
32
|
-
}
|
|
20
|
+
}
|
|
33
21
|
});
|
|
34
22
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* Wraps a TanStack Start middleware with Sentry instrumentation to create spans.
|
|
38
|
-
*/
|
|
39
|
-
function wrapMiddlewareWithSentry(
|
|
40
|
-
middleware,
|
|
41
|
-
options,
|
|
42
|
-
) {
|
|
43
|
-
if (
|
|
44
|
-
(middleware )[SENTRY_WRAPPED] ||
|
|
45
|
-
(middleware )[SENTRY_INTERNAL]
|
|
46
|
-
) {
|
|
47
|
-
// already instrumented or internal Sentry middleware
|
|
23
|
+
function wrapMiddlewareWithSentry(middleware, options) {
|
|
24
|
+
if (middleware[SENTRY_WRAPPED] || middleware[SENTRY_INTERNAL]) {
|
|
48
25
|
return middleware;
|
|
49
26
|
}
|
|
50
|
-
|
|
51
|
-
// instrument server middleware
|
|
52
27
|
if (middleware.options?.server) {
|
|
53
28
|
middleware.options.server = new Proxy(middleware.options.server, {
|
|
54
29
|
apply: (originalServer, thisArgServer, argsServer) => {
|
|
55
30
|
const prevSpan = node.getActiveSpan();
|
|
56
|
-
|
|
57
31
|
return node.startSpanManual(utils.getMiddlewareSpanOptions(options.name), async (span) => {
|
|
58
32
|
const nextState = { called: false };
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.
|
|
62
|
-
const middlewareArgs = argsServer[0] ;
|
|
63
|
-
if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {
|
|
33
|
+
const middlewareArgs = argsServer[0];
|
|
34
|
+
if (middlewareArgs && typeof middlewareArgs === "object" && typeof middlewareArgs.next === "function") {
|
|
64
35
|
middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);
|
|
65
36
|
}
|
|
66
|
-
|
|
67
37
|
try {
|
|
68
38
|
const result = await originalServer.apply(thisArgServer, argsServer);
|
|
69
|
-
|
|
70
|
-
// End span here if next() wasn't called, else we already ended it in next()
|
|
71
39
|
if (!nextState.called) {
|
|
72
40
|
span.end();
|
|
73
41
|
}
|
|
74
|
-
|
|
75
42
|
return result;
|
|
76
43
|
} catch (e) {
|
|
77
44
|
span.end();
|
|
78
45
|
throw e;
|
|
79
46
|
}
|
|
80
47
|
});
|
|
81
|
-
}
|
|
48
|
+
}
|
|
82
49
|
});
|
|
83
|
-
|
|
84
|
-
// mark as instrumented
|
|
85
|
-
core.addNonEnumerableProperty(middleware , SENTRY_WRAPPED, true);
|
|
50
|
+
core.addNonEnumerableProperty(middleware, SENTRY_WRAPPED, true);
|
|
86
51
|
}
|
|
87
|
-
|
|
88
52
|
return middleware;
|
|
89
53
|
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Wraps multiple TanStack Start middlewares with Sentry instrumentation.
|
|
93
|
-
* Object keys are used as span names to avoid users having to specify this manually.
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* ```ts
|
|
97
|
-
* import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
|
|
98
|
-
*
|
|
99
|
-
* const wrappedMiddlewares = wrapMiddlewaresWithSentry({
|
|
100
|
-
* authMiddleware,
|
|
101
|
-
* loggingMiddleware,
|
|
102
|
-
* });
|
|
103
|
-
*
|
|
104
|
-
* createServerFn().middleware(wrappedMiddlewares)
|
|
105
|
-
* ```
|
|
106
|
-
*
|
|
107
|
-
* @param middlewares - An object containing middlewares
|
|
108
|
-
* @returns An array of wrapped middlewares
|
|
109
|
-
*/
|
|
110
54
|
function wrapMiddlewaresWithSentry(middlewares) {
|
|
111
55
|
return Object.entries(middlewares).map(([name, middleware]) => {
|
|
112
56
|
return wrapMiddlewareWithSentry(middleware, { name });
|
|
@@ -1 +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__';\nexport const SENTRY_INTERNAL = '__SENTRY_INTERNAL__';\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 (\n (middleware as TanStackMiddlewareBase & { [SENTRY_WRAPPED]?: boolean })[SENTRY_WRAPPED] ||\n (middleware as TanStackMiddlewareBase & { [SENTRY_INTERNAL]?: boolean })[SENTRY_INTERNAL]\n ) {\n // already instrumented or internal Sentry middleware\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":";;;;;;AAMA,MAAM,cAAA,GAAiB,
|
|
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__';\nexport const SENTRY_INTERNAL = '__SENTRY_INTERNAL__';\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 (\n (middleware as TanStackMiddlewareBase & { [SENTRY_WRAPPED]?: boolean })[SENTRY_WRAPPED] ||\n (middleware as TanStackMiddlewareBase & { [SENTRY_INTERNAL]?: boolean })[SENTRY_INTERNAL]\n ) {\n // already instrumented or internal Sentry middleware\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":";;;;;;AAMA,MAAM,cAAA,GAAiB,oBAAA;AAChB,MAAM,eAAA,GAAkB;AAM/B,SAAS,YAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA,SAAA,EACG;AACH,EAAA,OAAO,IAAI,MAAM,IAAA,EAAM;AAAA,IACrB,KAAA,EAAO,CAAC,YAAA,EAAc,WAAA,EAAa,QAAA,KAAa;AAC9C,MAAA,SAAA,CAAU,MAAA,GAAS,IAAA;AACnB,MAAA,IAAA,CAAK,GAAA,EAAI;AAET,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAOA,mBAAA,CAAe,UAAU,MAAM;AACpC,UAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,QAC1D,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,IAC1D;AAAA,GACD,CAAA;AACH;AAKA,SAAS,wBAAA,CACP,YACA,OAAA,EACG;AACH,EAAA,IACG,UAAA,CAAuE,cAAc,CAAA,IACrF,UAAA,CAAwE,eAAe,CAAA,EACxF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,CAAW,SAAS,MAAA,EAAQ;AAC9B,IAAA,UAAA,CAAW,QAAQ,MAAA,GAAS,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,MAAA,EAAQ;AAAA,MAC/D,KAAA,EAAO,CAAC,cAAA,EAAgB,aAAA,EAAe,UAAA,KAAe;AACpD,QAAA,MAAM,WAAWC,kBAAA,EAAc;AAE/B,QAAA,OAAOC,qBAAgBC,8BAAA,CAAyB,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,IAAA,KAAe;AACnF,UAAA,MAAM,SAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,EAAM;AAIlC,UAAA,MAAM,cAAA,GAAiB,WAAW,CAAC,CAAA;AACnC,UAAA,IAAI,kBAAkB,OAAO,cAAA,KAAmB,YAAY,OAAO,cAAA,CAAe,SAAS,UAAA,EAAY;AACrG,YAAA,cAAA,CAAe,OAAO,YAAA,CAAa,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,UAAU,SAAS,CAAA;AAAA,UACnF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,eAAe,UAAU,CAAA;AAGnE,YAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,cAAA,IAAA,CAAK,GAAA,EAAI;AAAA,YACX;AAEA,YAAA,OAAO,MAAA;AAAA,UACT,SAAS,CAAA,EAAG;AACV,YAAA,IAAA,CAAK,GAAA,EAAI;AACT,YAAA,MAAM,CAAA;AAAA,UACR;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAGD,IAAAC,6BAAA,CAAyB,UAAA,EAAkD,gBAAgB,IAAI,CAAA;AAAA,EACjG;AAEA,EAAA,OAAO,UAAA;AACT;AAqBO,SAAS,0BAA4D,WAAA,EAAqC;AAC/G,EAAA,OAAO,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,UAAU,CAAA,KAAM;AAC7D,IAAA,OAAO,wBAAA,CAAyB,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;;;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const semanticConventions = require('@opentelemetry/semantic-conventions');
|
|
4
|
+
const core = require('@sentry/core');
|
|
5
|
+
|
|
6
|
+
function patternToRegex(pattern) {
|
|
7
|
+
const segments = pattern.split("/").map((segment) => {
|
|
8
|
+
if (segment.startsWith("$")) {
|
|
9
|
+
return "[^/]+";
|
|
10
|
+
}
|
|
11
|
+
return core.escapeStringForRegex(segment);
|
|
12
|
+
}).join("/");
|
|
13
|
+
return new RegExp(`^${segments}$`);
|
|
14
|
+
}
|
|
15
|
+
function matchUrlToRoutePattern(pathname, patterns) {
|
|
16
|
+
const normalizedPathname = pathname.length > 1 ? pathname.replace(/\/$/, "") : pathname;
|
|
17
|
+
for (const pattern of patterns) {
|
|
18
|
+
if (patternToRegex(pattern).test(normalizedPathname)) {
|
|
19
|
+
return pattern;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
function updateSpanWithRouteParametrization(method, pathname, patterns) {
|
|
25
|
+
const matchedPattern = matchUrlToRoutePattern(pathname, patterns);
|
|
26
|
+
if (!matchedPattern) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const activeSpan = core.getActiveSpan();
|
|
30
|
+
if (!activeSpan) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const rootSpan = core.getRootSpan(activeSpan);
|
|
34
|
+
const rootSpanData = core.spanToJSON(rootSpan).data;
|
|
35
|
+
if (rootSpanData?.[semanticConventions.ATTR_HTTP_ROUTE]) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const transactionName = `${method} ${matchedPattern}`;
|
|
39
|
+
core.updateSpanName(rootSpan, transactionName);
|
|
40
|
+
rootSpan.setAttribute(semanticConventions.ATTR_HTTP_ROUTE, matchedPattern);
|
|
41
|
+
rootSpan.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
42
|
+
core.getCurrentScope().setTransactionName(transactionName);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
exports.matchUrlToRoutePattern = matchUrlToRoutePattern;
|
|
46
|
+
exports.updateSpanWithRouteParametrization = updateSpanWithRouteParametrization;
|
|
47
|
+
//# sourceMappingURL=routeParametrization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeParametrization.js","sources":["../../../src/server/routeParametrization.ts"],"sourcesContent":["import { ATTR_HTTP_ROUTE } from '@opentelemetry/semantic-conventions';\nimport {\n escapeStringForRegex,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanToJSON,\n updateSpanName,\n} from '@sentry/core';\n\nfunction patternToRegex(pattern: string): RegExp {\n const segments = pattern\n .split('/')\n .map(segment => {\n if (segment.startsWith('$')) {\n return '[^/]+';\n }\n return escapeStringForRegex(segment);\n })\n .join('/');\n return new RegExp(`^${segments}$`);\n}\n\n/**\n * Matches a URL pathname against a list of TanStack Start route patterns.\n * Patterns use `$param` syntax for dynamic segments (e.g., `/users/$id`).\n *\n * Patterns are expected to be pre-sorted by specificity (more segments first, static before dynamic).\n */\nexport function matchUrlToRoutePattern(pathname: string, patterns: string[]): string | undefined {\n const normalizedPathname = pathname.length > 1 ? pathname.replace(/\\/$/, '') : pathname;\n for (const pattern of patterns) {\n if (patternToRegex(pattern).test(normalizedPathname)) {\n return pattern;\n }\n }\n return undefined;\n}\n\n/**\n * Updates the active root span with a parametrized route name.\n */\nexport function updateSpanWithRouteParametrization(method: string, pathname: string, patterns: string[]): void {\n const matchedPattern = matchUrlToRoutePattern(pathname, patterns);\n if (!matchedPattern) {\n return;\n }\n\n const activeSpan = getActiveSpan();\n if (!activeSpan) {\n return;\n }\n\n const rootSpan = getRootSpan(activeSpan);\n const rootSpanData = spanToJSON(rootSpan).data;\n if (rootSpanData?.[ATTR_HTTP_ROUTE]) {\n return;\n }\n\n const transactionName = `${method} ${matchedPattern}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttribute(ATTR_HTTP_ROUTE, matchedPattern);\n rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":["escapeStringForRegex","getActiveSpan","getRootSpan","spanToJSON","ATTR_HTTP_ROUTE","updateSpanName","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","getCurrentScope"],"mappings":";;;;;AAWA,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,MAAM,WAAW,OAAA,CACd,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAA,OAAA,KAAW;AACd,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAOA,0BAAqB,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,CAAA;AACnC;AAQO,SAAS,sBAAA,CAAuB,UAAkB,QAAA,EAAwC;AAC/F,EAAA,MAAM,kBAAA,GAAqB,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,QAAA;AAC/E,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,cAAA,CAAe,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACpD,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,kCAAA,CAAmC,MAAA,EAAgB,QAAA,EAAkB,QAAA,EAA0B;AAC7G,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,QAAA,EAAU,QAAQ,CAAA;AAChE,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAaC,kBAAA,EAAc;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAWC,iBAAY,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAeC,eAAA,CAAW,QAAQ,CAAA,CAAE,IAAA;AAC1C,EAAA,IAAI,YAAA,GAAeC,mCAAe,CAAA,EAAG;AACnC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACnD,EAAAC,mBAAA,CAAe,UAAU,eAAe,CAAA;AACxC,EAAA,QAAA,CAAS,YAAA,CAAaD,qCAAiB,cAAc,CAAA;AACrD,EAAA,QAAA,CAAS,YAAA,CAAaE,uCAAkC,OAAO,CAAA;AAC/D,EAAAC,oBAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AACtD;;;;;"}
|
package/build/cjs/server/sdk.js
CHANGED
|
@@ -3,17 +3,19 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3
3
|
const core = require('@sentry/core');
|
|
4
4
|
const node = require('@sentry/node');
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* Initializes the server side of the TanStack Start React SDK
|
|
8
|
-
*/
|
|
9
6
|
function init(options) {
|
|
10
7
|
const sentryOptions = {
|
|
11
8
|
defaultIntegrations: [...node.getDefaultIntegrations(options)],
|
|
12
|
-
...options
|
|
9
|
+
...options
|
|
13
10
|
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
core.applySdkMetadata(sentryOptions, "tanstackstart-react", ["tanstackstart-react", "node"]);
|
|
12
|
+
sentryOptions.ignoreSpans = [
|
|
13
|
+
...sentryOptions.ignoreSpans || [],
|
|
14
|
+
/\/node_modules\//,
|
|
15
|
+
/\/@id\//,
|
|
16
|
+
/\/@react-refresh/,
|
|
17
|
+
/\/@vite\//
|
|
18
|
+
];
|
|
17
19
|
return node.init(sentryOptions);
|
|
18
20
|
}
|
|
19
21
|
|