@sentry/react-router 10.70.0 → 11.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/build/cjs/client/createClientInstrumentation.js +20 -13
  2. package/build/cjs/client/createClientInstrumentation.js.map +1 -1
  3. package/build/cjs/client/hydratedRouter.js +10 -6
  4. package/build/cjs/client/hydratedRouter.js.map +1 -1
  5. package/build/cjs/client/tracingIntegration.js +1 -0
  6. package/build/cjs/client/tracingIntegration.js.map +1 -1
  7. package/build/cjs/client/utils.js +6 -2
  8. package/build/cjs/client/utils.js.map +1 -1
  9. package/build/cjs/index.server.js +0 -5
  10. package/build/cjs/index.server.js.map +1 -1
  11. package/build/cjs/server/createSentryHandleRequest.js.map +1 -1
  12. package/build/cjs/server/createServerInstrumentation.js +71 -65
  13. package/build/cjs/server/createServerInstrumentation.js.map +1 -1
  14. package/build/cjs/server/integration/lowQualityTransactionsFilterIntegration.js +1 -1
  15. package/build/cjs/server/integration/lowQualityTransactionsFilterIntegration.js.map +1 -1
  16. package/build/cjs/server/integration/reactRouterServer.js +1 -40
  17. package/build/cjs/server/integration/reactRouterServer.js.map +1 -1
  18. package/build/cjs/server/sdk.js +1 -1
  19. package/build/cjs/server/sdk.js.map +1 -1
  20. package/build/cjs/server/serverBuild.js +0 -4
  21. package/build/cjs/server/serverBuild.js.map +1 -1
  22. package/build/cjs/server/serverGlobals.js +0 -9
  23. package/build/cjs/server/serverGlobals.js.map +1 -1
  24. package/build/cjs/server/wrapSentryHandleRequest.js +0 -2
  25. package/build/cjs/server/wrapSentryHandleRequest.js.map +1 -1
  26. package/build/cjs/vite/buildEnd/handleOnBuildEnd.js +4 -14
  27. package/build/cjs/vite/buildEnd/handleOnBuildEnd.js.map +1 -1
  28. package/build/cjs/vite/makeCustomSentryVitePlugins.js +2 -2
  29. package/build/cjs/vite/makeCustomSentryVitePlugins.js.map +1 -1
  30. package/build/cjs/vite/makeServerBuildCapturePlugin.js +2 -6
  31. package/build/cjs/vite/makeServerBuildCapturePlugin.js.map +1 -1
  32. package/build/cjs/vite/plugin.js +2 -0
  33. package/build/cjs/vite/plugin.js.map +1 -1
  34. package/build/esm/client/createClientInstrumentation.js +22 -15
  35. package/build/esm/client/createClientInstrumentation.js.map +1 -1
  36. package/build/esm/client/hydratedRouter.js +11 -7
  37. package/build/esm/client/hydratedRouter.js.map +1 -1
  38. package/build/esm/client/tracingIntegration.js +1 -0
  39. package/build/esm/client/tracingIntegration.js.map +1 -1
  40. package/build/esm/client/utils.js +7 -3
  41. package/build/esm/client/utils.js.map +1 -1
  42. package/build/esm/index.server.js +1 -3
  43. package/build/esm/index.server.js.map +1 -1
  44. package/build/esm/package.json +1 -1
  45. package/build/esm/server/createSentryHandleRequest.js.map +1 -1
  46. package/build/esm/server/createServerInstrumentation.js +73 -67
  47. package/build/esm/server/createServerInstrumentation.js.map +1 -1
  48. package/build/esm/server/integration/lowQualityTransactionsFilterIntegration.js +1 -1
  49. package/build/esm/server/integration/lowQualityTransactionsFilterIntegration.js.map +1 -1
  50. package/build/esm/server/integration/reactRouterServer.js +3 -41
  51. package/build/esm/server/integration/reactRouterServer.js.map +1 -1
  52. package/build/esm/server/sdk.js +1 -1
  53. package/build/esm/server/sdk.js.map +1 -1
  54. package/build/esm/server/serverBuild.js +1 -4
  55. package/build/esm/server/serverBuild.js.map +1 -1
  56. package/build/esm/server/serverGlobals.js +1 -8
  57. package/build/esm/server/serverGlobals.js.map +1 -1
  58. package/build/esm/server/wrapSentryHandleRequest.js +1 -2
  59. package/build/esm/server/wrapSentryHandleRequest.js.map +1 -1
  60. package/build/esm/vite/buildEnd/handleOnBuildEnd.js +4 -14
  61. package/build/esm/vite/buildEnd/handleOnBuildEnd.js.map +1 -1
  62. package/build/esm/vite/makeCustomSentryVitePlugins.js +1 -1
  63. package/build/esm/vite/makeCustomSentryVitePlugins.js.map +1 -1
  64. package/build/esm/vite/makeServerBuildCapturePlugin.js +2 -6
  65. package/build/esm/vite/makeServerBuildCapturePlugin.js.map +1 -1
  66. package/build/esm/vite/plugin.js +2 -0
  67. package/build/esm/vite/plugin.js.map +1 -1
  68. package/build/types/client/createClientInstrumentation.d.ts.map +1 -1
  69. package/build/types/client/hydratedRouter.d.ts.map +1 -1
  70. package/build/types/client/tracingIntegration.d.ts.map +1 -1
  71. package/build/types/client/utils.d.ts.map +1 -1
  72. package/build/types/index.types.d.ts +1 -0
  73. package/build/types/index.types.d.ts.map +1 -1
  74. package/build/types/server/createSentryHandleRequest.d.ts.map +1 -1
  75. package/build/types/server/createServerInstrumentation.d.ts.map +1 -1
  76. package/build/types/server/index.d.ts +1 -3
  77. package/build/types/server/index.d.ts.map +1 -1
  78. package/build/types/server/integration/lowQualityTransactionsFilterIntegration.d.ts +1 -2
  79. package/build/types/server/integration/lowQualityTransactionsFilterIntegration.d.ts.map +1 -1
  80. package/build/types/server/integration/reactRouterServer.d.ts +0 -3
  81. package/build/types/server/integration/reactRouterServer.d.ts.map +1 -1
  82. package/build/types/server/serverGlobals.d.ts +0 -10
  83. package/build/types/server/serverGlobals.d.ts.map +1 -1
  84. package/build/types/server/wrapSentryHandleRequest.d.ts +0 -2
  85. package/build/types/server/wrapSentryHandleRequest.d.ts.map +1 -1
  86. package/build/types/vite/buildEnd/handleOnBuildEnd.d.ts.map +1 -1
  87. package/build/types/vite/makeServerBuildCapturePlugin.d.ts.map +1 -1
  88. package/build/types/vite/plugin.d.ts.map +1 -1
  89. package/build/types/vite/types.d.ts +1 -49
  90. package/build/types/vite/types.d.ts.map +1 -1
  91. package/package.json +15 -15
  92. package/build/cjs/server/instrumentation/reactRouter.js +0 -106
  93. package/build/cjs/server/instrumentation/reactRouter.js.map +0 -1
  94. package/build/cjs/server/instrumentation/util.js +0 -24
  95. package/build/cjs/server/instrumentation/util.js.map +0 -1
  96. package/build/cjs/server/wrapServerAction.js +0 -56
  97. package/build/cjs/server/wrapServerAction.js.map +0 -1
  98. package/build/cjs/server/wrapServerLoader.js +0 -56
  99. package/build/cjs/server/wrapServerLoader.js.map +0 -1
  100. package/build/esm/server/instrumentation/reactRouter.js +0 -104
  101. package/build/esm/server/instrumentation/reactRouter.js.map +0 -1
  102. package/build/esm/server/instrumentation/util.js +0 -18
  103. package/build/esm/server/instrumentation/util.js.map +0 -1
  104. package/build/esm/server/wrapServerAction.js +0 -54
  105. package/build/esm/server/wrapServerAction.js.map +0 -1
  106. package/build/esm/server/wrapServerLoader.js +0 -54
  107. package/build/esm/server/wrapServerLoader.js.map +0 -1
  108. package/build/types/server/instrumentation/reactRouter.d.ts +0 -19
  109. package/build/types/server/instrumentation/reactRouter.d.ts.map +0 -1
  110. package/build/types/server/instrumentation/util.d.ts +0 -31
  111. package/build/types/server/instrumentation/util.d.ts.map +0 -1
  112. package/build/types/server/wrapServerAction.d.ts +0 -33
  113. package/build/types/server/wrapServerAction.d.ts.map +0 -1
  114. package/build/types/server/wrapServerLoader.d.ts +0 -33
  115. package/build/types/server/wrapServerLoader.d.ts.map +0 -1
@@ -1,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const api = require('@opentelemetry/api');
4
3
  const attributes = require('@sentry/conventions/attributes');
4
+ const op = require('@sentry/conventions/op');
5
5
  const core = require('@sentry/core');
6
6
  const debugBuild = require('../common/debug-build.js');
7
7
  const utils = require('../common/utils.js');
8
8
  const serverBuild = require('./serverBuild.js');
9
9
  const serverGlobals = require('./serverGlobals.js');
10
10
 
11
- const MIDDLEWARE_COUNTER_KEY = api.createContextKey("sentry_react_router_middleware_counter");
11
+ const middlewareCountersByRootSpan = /* @__PURE__ */ new WeakMap();
12
12
  function createSentryServerInstrumentation(options = {}) {
13
13
  const { captureErrors = true } = options;
14
14
  debugBuild.DEBUG_BUILD && core.debug.log("React Router server instrumentation created.");
@@ -20,61 +20,57 @@ function createSentryServerInstrumentation(options = {}) {
20
20
  const pathname = utils.getPathFromRequest(info.request);
21
21
  const activeSpan = core.getActiveSpan();
22
22
  const existingRootSpan = activeSpan ? core.getRootSpan(activeSpan) : void 0;
23
- const counterStore = { counters: {} };
24
- const ctx = api.context.active().setValue(MIDDLEWARE_COUNTER_KEY, counterStore);
25
- await api.context.with(ctx, async () => {
26
- if (existingRootSpan) {
27
- core.updateSpanName(existingRootSpan, `${info.request.method} ${pathname}`);
28
- existingRootSpan.setAttributes({
29
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
30
- [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.react_router.instrumentation_api",
31
- [core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url",
32
- [attributes.URL_FULL]: info.request.url,
33
- [attributes.URL_PATH]: pathname
34
- });
35
- try {
36
- const result = await handleRequest();
37
- if (result.status === "error" && result.error instanceof Error) {
38
- existingRootSpan.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
39
- utils.captureInstrumentationError(result, captureErrors, "react_router.request_handler", {
40
- "http.method": info.request.method,
41
- "http.url": pathname
42
- });
43
- }
44
- } finally {
45
- await core.flushIfServerless();
23
+ if (existingRootSpan) {
24
+ core.updateSpanName(existingRootSpan, `${info.request.method} ${pathname}`);
25
+ existingRootSpan.setAttributes({
26
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
27
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.react_router.instrumentation_api",
28
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url",
29
+ [attributes.URL_FULL]: core.filterCollectedUrl(info.request.url),
30
+ [attributes.URL_PATH]: pathname
31
+ });
32
+ try {
33
+ const result = await handleRequest();
34
+ if (result.status === "error" && result.error instanceof Error) {
35
+ existingRootSpan.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
36
+ utils.captureInstrumentationError(result, captureErrors, "react_router.request_handler", {
37
+ "http.method": info.request.method,
38
+ [attributes.URL_FULL]: pathname
39
+ });
46
40
  }
47
- } else {
48
- await core.startSpan(
49
- {
50
- name: `${info.request.method} ${pathname}`,
51
- forceTransaction: true,
52
- attributes: {
53
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
54
- [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.react_router.instrumentation_api",
55
- [core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url",
56
- [attributes.HTTP_REQUEST_METHOD]: info.request.method,
57
- [attributes.URL_PATH]: pathname,
58
- [attributes.URL_FULL]: info.request.url
59
- }
60
- },
61
- async (span) => {
62
- try {
63
- const result = await handleRequest();
64
- if (result.status === "error" && result.error instanceof Error) {
65
- span.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
66
- utils.captureInstrumentationError(result, captureErrors, "react_router.request_handler", {
67
- "http.method": info.request.method,
68
- "http.url": pathname
69
- });
70
- }
71
- } finally {
72
- await core.flushIfServerless();
41
+ } finally {
42
+ await core.flushIfServerless();
43
+ }
44
+ } else {
45
+ await core.startSpan(
46
+ {
47
+ name: `${info.request.method} ${pathname}`,
48
+ forceTransaction: true,
49
+ attributes: {
50
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
51
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.react_router.instrumentation_api",
52
+ [core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url",
53
+ [attributes.HTTP_REQUEST_METHOD]: info.request.method,
54
+ [attributes.URL_PATH]: pathname,
55
+ [attributes.URL_FULL]: core.filterCollectedUrl(info.request.url)
56
+ }
57
+ },
58
+ async (span) => {
59
+ try {
60
+ const result = await handleRequest();
61
+ if (result.status === "error" && result.error instanceof Error) {
62
+ span.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
63
+ utils.captureInstrumentationError(result, captureErrors, "react_router.request_handler", {
64
+ "http.method": info.request.method,
65
+ [attributes.URL_FULL]: pathname
66
+ });
73
67
  }
68
+ } finally {
69
+ await core.flushIfServerless();
74
70
  }
75
- );
76
- }
77
- });
71
+ }
72
+ );
73
+ }
78
74
  }
79
75
  });
80
76
  },
@@ -91,7 +87,8 @@ function createSentryServerInstrumentation(options = {}) {
91
87
  {
92
88
  name: routePattern,
93
89
  attributes: {
94
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "function.react_router.loader",
90
+ [attributes.SENTRY_OP]: op.WEB_SERVER_FUNCTION_SPAN_OP,
91
+ [attributes.CODE_FUNCTION_NAME]: "loader",
95
92
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.react_router.instrumentation_api"
96
93
  }
97
94
  },
@@ -101,7 +98,7 @@ function createSentryServerInstrumentation(options = {}) {
101
98
  span.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
102
99
  utils.captureInstrumentationError(result, captureErrors, "react_router.loader", {
103
100
  "http.method": info.request.method,
104
- "http.url": urlPath
101
+ [attributes.URL_FULL]: urlPath
105
102
  });
106
103
  }
107
104
  }
@@ -116,7 +113,8 @@ function createSentryServerInstrumentation(options = {}) {
116
113
  {
117
114
  name: routePattern,
118
115
  attributes: {
119
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "function.react_router.action",
116
+ [attributes.SENTRY_OP]: op.WEB_SERVER_FUNCTION_SPAN_OP,
117
+ [attributes.CODE_FUNCTION_NAME]: "action",
120
118
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.react_router.instrumentation_api"
121
119
  }
122
120
  },
@@ -126,7 +124,7 @@ function createSentryServerInstrumentation(options = {}) {
126
124
  span.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
127
125
  utils.captureInstrumentationError(result, captureErrors, "react_router.action", {
128
126
  "http.method": info.request.method,
129
- "http.url": urlPath
127
+ [attributes.URL_FULL]: urlPath
130
128
  });
131
129
  }
132
130
  }
@@ -137,18 +135,25 @@ function createSentryServerInstrumentation(options = {}) {
137
135
  const pattern = utils.getPattern(info);
138
136
  const routePattern = utils.normalizeRoutePath(pattern) || urlPath;
139
137
  updateRootSpanWithRoute(info.request.method, pattern, urlPath);
140
- const counterStore = api.context.active().getValue(MIDDLEWARE_COUNTER_KEY);
138
+ const activeSpan = core.getActiveSpan();
139
+ const rootSpan = activeSpan ? core.getRootSpan(activeSpan) : void 0;
141
140
  let middlewareIndex = 0;
142
- if (counterStore) {
143
- middlewareIndex = counterStore.counters[routeId] ?? 0;
144
- counterStore.counters[routeId] = middlewareIndex + 1;
141
+ if (rootSpan) {
142
+ let counters = middlewareCountersByRootSpan.get(rootSpan);
143
+ if (!counters) {
144
+ counters = {};
145
+ middlewareCountersByRootSpan.set(rootSpan, counters);
146
+ }
147
+ middlewareIndex = counters[routeId] ?? 0;
148
+ counters[routeId] = middlewareIndex + 1;
145
149
  }
146
150
  const middlewareName = serverBuild.getMiddlewareName(routeId, middlewareIndex);
147
151
  await core.startSpan(
148
152
  {
149
153
  name: `middleware ${middlewareName || routeId}`,
150
154
  attributes: {
151
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "function.react_router.middleware",
155
+ [attributes.SENTRY_OP]: op.WEB_SERVER_MIDDLEWARE_SPAN_OP,
156
+ [attributes.CODE_FUNCTION_NAME]: "middleware",
152
157
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.react_router.instrumentation_api",
153
158
  "react_router.route.id": routeId,
154
159
  [attributes.HTTP_ROUTE]: routePattern,
@@ -162,7 +167,7 @@ function createSentryServerInstrumentation(options = {}) {
162
167
  span.setStatus({ code: core.SPAN_STATUS_ERROR, message: "internal_error" });
163
168
  utils.captureInstrumentationError(result, captureErrors, "react_router.middleware", {
164
169
  "http.method": info.request.method,
165
- "http.url": urlPath
170
+ [attributes.URL_FULL]: urlPath
166
171
  });
167
172
  }
168
173
  }
@@ -173,7 +178,8 @@ function createSentryServerInstrumentation(options = {}) {
173
178
  {
174
179
  name: "Lazy Route Load",
175
180
  attributes: {
176
- [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "function.react_router.lazy",
181
+ [attributes.SENTRY_OP]: op.WEB_SERVER_FUNCTION_SPAN_OP,
182
+ [attributes.CODE_FUNCTION_NAME]: "lazy",
177
183
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.react_router.instrumentation_api"
178
184
  }
179
185
  },
@@ -1 +1 @@
1
- {"version":3,"file":"createServerInstrumentation.js","sources":["../../../src/server/createServerInstrumentation.ts"],"sourcesContent":["import { context, createContextKey } from '@opentelemetry/api';\nimport { HTTP_REQUEST_METHOD, HTTP_ROUTE, URL_FULL, URL_PATH } from '@sentry/conventions/attributes';\nimport {\n debug,\n flushIfServerless,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SPAN_STATUS_ERROR,\n startSpan,\n updateSpanName,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { InstrumentableRequestHandler, InstrumentableRoute, ServerInstrumentation } from '../common/types';\nimport { captureInstrumentationError, getPathFromRequest, getPattern, normalizeRoutePath } from '../common/utils';\nimport { getMiddlewareName } from './serverBuild';\nimport { markInstrumentationApiUsed } from './serverGlobals';\n\nconst MIDDLEWARE_COUNTER_KEY = createContextKey('sentry_react_router_middleware_counter');\n\n// Re-export for backward compatibility and external use\nexport { isInstrumentationApiUsed } from './serverGlobals';\n\n/**\n * Options for creating Sentry server instrumentation.\n */\nexport interface CreateSentryServerInstrumentationOptions {\n /**\n * Whether to capture errors from loaders/actions automatically.\n * @default true\n */\n captureErrors?: boolean;\n}\n\n/**\n * Creates a Sentry server instrumentation for React Router's instrumentation API.\n */\nexport function createSentryServerInstrumentation(\n options: CreateSentryServerInstrumentationOptions = {},\n): ServerInstrumentation {\n const { captureErrors = true } = options;\n\n DEBUG_BUILD && debug.log('React Router server instrumentation created.');\n\n return {\n handler(handler: InstrumentableRequestHandler) {\n // Mark the instrumentation API active only when React Router actually invokes this\n markInstrumentationApiUsed();\n handler.instrument({\n async request(handleRequest, info) {\n const pathname = getPathFromRequest(info.request);\n const activeSpan = getActiveSpan();\n const existingRootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n const counterStore = { counters: {} as Record<string, number> };\n const ctx = context.active().setValue(MIDDLEWARE_COUNTER_KEY, counterStore);\n\n await context.with(ctx, async () => {\n if (existingRootSpan) {\n updateSpanName(existingRootSpan, `${info.request.method} ${pathname}`);\n existingRootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.server',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.instrumentation_api',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [URL_FULL]: info.request.url,\n [URL_PATH]: pathname,\n });\n\n try {\n const result = await handleRequest();\n if (result.status === 'error' && result.error instanceof Error) {\n existingRootSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.request_handler', {\n 'http.method': info.request.method,\n 'http.url': pathname,\n });\n }\n } finally {\n await flushIfServerless();\n }\n } else {\n await startSpan(\n {\n name: `${info.request.method} ${pathname}`,\n forceTransaction: true,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.server',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.instrumentation_api',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [HTTP_REQUEST_METHOD]: info.request.method,\n [URL_PATH]: pathname,\n [URL_FULL]: info.request.url,\n },\n },\n async span => {\n try {\n const result = await handleRequest();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.request_handler', {\n 'http.method': info.request.method,\n 'http.url': pathname,\n });\n }\n } finally {\n await flushIfServerless();\n }\n },\n );\n }\n });\n },\n });\n },\n\n route(route: InstrumentableRoute) {\n // Also mark active here, in case route registration runs (mirrors the handler callback above).\n markInstrumentationApiUsed();\n const routeId = route.id;\n\n route.instrument({\n async loader(callLoader, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n await startSpan(\n {\n name: routePattern,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.react_router.loader',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callLoader();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.loader', {\n 'http.method': info.request.method,\n 'http.url': urlPath,\n });\n }\n },\n );\n },\n\n async action(callAction, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n await startSpan(\n {\n name: routePattern,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.react_router.action',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callAction();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.action', {\n 'http.method': info.request.method,\n 'http.url': urlPath,\n });\n }\n },\n );\n },\n\n async middleware(callMiddleware, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n const counterStore = context.active().getValue(MIDDLEWARE_COUNTER_KEY) as\n | { counters: Record<string, number> }\n | undefined;\n let middlewareIndex = 0;\n if (counterStore) {\n middlewareIndex = counterStore.counters[routeId] ?? 0;\n counterStore.counters[routeId] = middlewareIndex + 1;\n }\n\n const middlewareName = getMiddlewareName(routeId, middlewareIndex);\n\n await startSpan(\n {\n name: `middleware ${middlewareName || routeId}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.react_router.middleware',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n 'react_router.route.id': routeId,\n [HTTP_ROUTE]: routePattern,\n ...(middlewareName && { 'react_router.middleware.name': middlewareName }),\n 'react_router.middleware.index': middlewareIndex,\n },\n },\n async span => {\n const result = await callMiddleware();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.middleware', {\n 'http.method': info.request.method,\n 'http.url': urlPath,\n });\n }\n },\n );\n },\n\n async lazy(callLazy) {\n await startSpan(\n {\n name: 'Lazy Route Load',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.react_router.lazy',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callLazy();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.lazy', {});\n }\n },\n );\n },\n });\n },\n };\n}\n\nfunction updateRootSpanWithRoute(method: string, pattern: string | undefined, urlPath: string): void {\n const activeSpan = getActiveSpan();\n if (!activeSpan) return;\n const rootSpan = getRootSpan(activeSpan);\n if (!rootSpan) return;\n\n // Skip update if URL path is invalid (failed to parse)\n if (!urlPath || urlPath === '<unknown>') {\n DEBUG_BUILD && debug.warn('Cannot update span with invalid URL path:', urlPath);\n return;\n }\n\n const hasPattern = !!pattern;\n const routeName = hasPattern ? normalizeRoutePath(pattern) || urlPath : urlPath;\n\n const transactionName = `${method} ${routeName}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: hasPattern ? 'route' : 'url',\n });\n\n // Also update the scope's transaction name so errors captured during this request\n // have the correct transaction name (not the initial placeholder like \"GET *\")\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":["createContextKey","DEBUG_BUILD","debug","markInstrumentationApiUsed","getPathFromRequest","getActiveSpan","getRootSpan","context","updateSpanName","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","URL_FULL","URL_PATH","SPAN_STATUS_ERROR","captureInstrumentationError","flushIfServerless","startSpan","HTTP_REQUEST_METHOD","getPattern","normalizeRoutePath","getMiddlewareName","HTTP_ROUTE","getCurrentScope"],"mappings":"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"}
1
+ {"version":3,"file":"createServerInstrumentation.js","sources":["../../../src/server/createServerInstrumentation.ts"],"sourcesContent":["import {\n CODE_FUNCTION_NAME,\n HTTP_REQUEST_METHOD,\n HTTP_ROUTE,\n SENTRY_OP,\n URL_FULL,\n URL_PATH,\n} from '@sentry/conventions/attributes';\nimport { WEB_SERVER_FUNCTION_SPAN_OP, WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op';\nimport {\n debug,\n flushIfServerless,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SPAN_STATUS_ERROR,\n startSpan,\n updateSpanName,\n filterCollectedUrl,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { InstrumentableRequestHandler, InstrumentableRoute, ServerInstrumentation } from '../common/types';\nimport { captureInstrumentationError, getPathFromRequest, getPattern, normalizeRoutePath } from '../common/utils';\nimport { getMiddlewareName } from './serverBuild';\nimport { markInstrumentationApiUsed } from './serverGlobals';\n\n// Per-request middleware counters, keyed by the request's root span (the one transaction all of a\n// request's middlewares run under). The root span is the same instance across those middleware hooks\n// whether or not a Sentry OpenTelemetry tracer provider is set up, unlike the OTel context the counter\n// used to live on (which does not propagate without a provider).\nconst middlewareCountersByRootSpan = new WeakMap<object, Record<string, number>>();\n\n// Re-export for backward compatibility and external use\nexport { isInstrumentationApiUsed } from './serverGlobals';\n\n/**\n * Options for creating Sentry server instrumentation.\n */\nexport interface CreateSentryServerInstrumentationOptions {\n /**\n * Whether to capture errors from loaders/actions automatically.\n * @default true\n */\n captureErrors?: boolean;\n}\n\n/**\n * Creates a Sentry server instrumentation for React Router's instrumentation API.\n */\nexport function createSentryServerInstrumentation(\n options: CreateSentryServerInstrumentationOptions = {},\n): ServerInstrumentation {\n const { captureErrors = true } = options;\n\n DEBUG_BUILD && debug.log('React Router server instrumentation created.');\n\n return {\n handler(handler: InstrumentableRequestHandler) {\n // Mark the instrumentation API active only when React Router actually invokes this\n markInstrumentationApiUsed();\n handler.instrument({\n async request(handleRequest, info) {\n const pathname = getPathFromRequest(info.request);\n const activeSpan = getActiveSpan();\n const existingRootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n if (existingRootSpan) {\n updateSpanName(existingRootSpan, `${info.request.method} ${pathname}`);\n existingRootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.server',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.instrumentation_api',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [URL_FULL]: filterCollectedUrl(info.request.url),\n [URL_PATH]: pathname,\n });\n\n try {\n const result = await handleRequest();\n if (result.status === 'error' && result.error instanceof Error) {\n existingRootSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.request_handler', {\n 'http.method': info.request.method,\n [URL_FULL]: pathname,\n });\n }\n } finally {\n await flushIfServerless();\n }\n } else {\n await startSpan(\n {\n name: `${info.request.method} ${pathname}`,\n forceTransaction: true,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.server',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.instrumentation_api',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [HTTP_REQUEST_METHOD]: info.request.method,\n [URL_PATH]: pathname,\n [URL_FULL]: filterCollectedUrl(info.request.url),\n },\n },\n async span => {\n try {\n const result = await handleRequest();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.request_handler', {\n 'http.method': info.request.method,\n [URL_FULL]: pathname,\n });\n }\n } finally {\n await flushIfServerless();\n }\n },\n );\n }\n },\n });\n },\n\n route(route: InstrumentableRoute) {\n // Also mark active here, in case route registration runs (mirrors the handler callback above).\n markInstrumentationApiUsed();\n const routeId = route.id;\n\n route.instrument({\n async loader(callLoader, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n await startSpan(\n {\n name: routePattern,\n attributes: {\n [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP,\n [CODE_FUNCTION_NAME]: 'loader',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callLoader();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.loader', {\n 'http.method': info.request.method,\n [URL_FULL]: urlPath,\n });\n }\n },\n );\n },\n\n async action(callAction, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n await startSpan(\n {\n name: routePattern,\n attributes: {\n [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP,\n [CODE_FUNCTION_NAME]: 'action',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callAction();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.action', {\n 'http.method': info.request.method,\n [URL_FULL]: urlPath,\n });\n }\n },\n );\n },\n\n async middleware(callMiddleware, info) {\n const urlPath = getPathFromRequest(info.request);\n const pattern = getPattern(info);\n const routePattern = normalizeRoutePath(pattern) || urlPath;\n\n updateRootSpanWithRoute(info.request.method, pattern, urlPath);\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n let middlewareIndex = 0;\n if (rootSpan) {\n let counters = middlewareCountersByRootSpan.get(rootSpan);\n if (!counters) {\n counters = {};\n middlewareCountersByRootSpan.set(rootSpan, counters);\n }\n middlewareIndex = counters[routeId] ?? 0;\n counters[routeId] = middlewareIndex + 1;\n }\n\n const middlewareName = getMiddlewareName(routeId, middlewareIndex);\n\n await startSpan(\n {\n name: `middleware ${middlewareName || routeId}`,\n attributes: {\n [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP,\n [CODE_FUNCTION_NAME]: 'middleware',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n 'react_router.route.id': routeId,\n [HTTP_ROUTE]: routePattern,\n ...(middlewareName && { 'react_router.middleware.name': middlewareName }),\n 'react_router.middleware.index': middlewareIndex,\n },\n },\n async span => {\n const result = await callMiddleware();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.middleware', {\n 'http.method': info.request.method,\n [URL_FULL]: urlPath,\n });\n }\n },\n );\n },\n\n async lazy(callLazy) {\n await startSpan(\n {\n name: 'Lazy Route Load',\n attributes: {\n [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP,\n [CODE_FUNCTION_NAME]: 'lazy',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.react_router.instrumentation_api',\n },\n },\n async span => {\n const result = await callLazy();\n if (result.status === 'error' && result.error instanceof Error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureInstrumentationError(result, captureErrors, 'react_router.lazy', {});\n }\n },\n );\n },\n });\n },\n };\n}\n\nfunction updateRootSpanWithRoute(method: string, pattern: string | undefined, urlPath: string): void {\n const activeSpan = getActiveSpan();\n if (!activeSpan) return;\n const rootSpan = getRootSpan(activeSpan);\n if (!rootSpan) return;\n\n // Skip update if URL path is invalid (failed to parse)\n if (!urlPath || urlPath === '<unknown>') {\n DEBUG_BUILD && debug.warn('Cannot update span with invalid URL path:', urlPath);\n return;\n }\n\n const hasPattern = !!pattern;\n const routeName = hasPattern ? normalizeRoutePath(pattern) || urlPath : urlPath;\n\n const transactionName = `${method} ${routeName}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: hasPattern ? 'route' : 'url',\n });\n\n // Also update the scope's transaction name so errors captured during this request\n // have the correct transaction name (not the initial placeholder like \"GET *\")\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":["DEBUG_BUILD","debug","markInstrumentationApiUsed","getPathFromRequest","getActiveSpan","getRootSpan","updateSpanName","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","URL_FULL","filterCollectedUrl","URL_PATH","SPAN_STATUS_ERROR","captureInstrumentationError","flushIfServerless","startSpan","HTTP_REQUEST_METHOD","getPattern","normalizeRoutePath","SENTRY_OP","WEB_SERVER_FUNCTION_SPAN_OP","CODE_FUNCTION_NAME","getMiddlewareName","WEB_SERVER_MIDDLEWARE_SPAN_OP","HTTP_ROUTE","getCurrentScope"],"mappings":"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"}
@@ -10,7 +10,7 @@ const LOW_QUALITY_TRANSACTIONS_FILTERS = [
10
10
  // Filter by `http.target` instead, which carries the raw request path.
11
11
  { attributes: { "http.target": /\/__manifest/ } }
12
12
  ];
13
- const _lowQualityTransactionsFilterIntegration = ((_options) => ({
13
+ const _lowQualityTransactionsFilterIntegration = (() => ({
14
14
  name: "LowQualityTransactionsFilter",
15
15
  beforeSetup(client) {
16
16
  const opts = client.getOptions();
@@ -1 +1 @@
1
- {"version":3,"file":"lowQualityTransactionsFilterIntegration.js","sources":["../../../../src/server/integration/lowQualityTransactionsFilterIntegration.ts"],"sourcesContent":["import type { IntegrationFn } from '@sentry/core';\nimport { defineIntegration } from '@sentry/core';\nimport type { NodeOptions } from '@sentry/node';\n\nconst LOW_QUALITY_TRANSACTIONS_FILTERS = [\n /GET \\/node_modules\\//,\n /GET \\/favicon\\.ico/,\n /GET \\/@id\\//,\n // The span description for the `__manifest` endpoint is `GET *` (`http.route` resolves to `*`).\n // Filter by `http.target` instead, which carries the raw request path.\n { attributes: { 'http.target': /\\/__manifest/ } },\n];\n\n// TODO(v11): Remove the `_options` parameter (unused and only kept for back-compat with the previous signature)\nconst _lowQualityTransactionsFilterIntegration = ((_options?: NodeOptions) => ({\n name: 'LowQualityTransactionsFilter' as const,\n beforeSetup(client) {\n const opts = client.getOptions();\n opts.ignoreSpans = [...(opts.ignoreSpans || []), ...LOW_QUALITY_TRANSACTIONS_FILTERS];\n },\n})) satisfies IntegrationFn;\n\n/**\n * Integration that filters out noisy http transactions such as requests to node_modules, favicon.ico, @id/, __manifest.\n * Adds entries to `ignoreSpans` so the filter applies in both static and streaming trace lifecycles.\n */\nexport const lowQualityTransactionsFilterIntegration = defineIntegration(_lowQualityTransactionsFilterIntegration);\n"],"names":["defineIntegration"],"mappings":";;;;AAIA,MAAM,gCAAA,GAAmC;AAAA,EACvC,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA;AAAA;AAAA,EAGA,EAAE,UAAA,EAAY,EAAE,aAAA,EAAe,gBAAe;AAChD,CAAA;AAGA,MAAM,wCAAA,IAA4C,CAAC,QAAA,MAA4B;AAAA,EAC7E,IAAA,EAAM,8BAAA;AAAA,EACN,YAAY,MAAA,EAAQ;AAClB,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAC,GAAI,IAAA,CAAK,eAAe,EAAC,EAAI,GAAG,gCAAgC,CAAA;AAAA,EACtF;AACF,CAAA,CAAA,CAAA;AAMO,MAAM,uCAAA,GAA0CA,uBAAkB,wCAAwC;;;;"}
1
+ {"version":3,"file":"lowQualityTransactionsFilterIntegration.js","sources":["../../../../src/server/integration/lowQualityTransactionsFilterIntegration.ts"],"sourcesContent":["import type { IntegrationFn } from '@sentry/core';\nimport { defineIntegration } from '@sentry/core';\n\nconst LOW_QUALITY_TRANSACTIONS_FILTERS = [\n /GET \\/node_modules\\//,\n /GET \\/favicon\\.ico/,\n /GET \\/@id\\//,\n // The span description for the `__manifest` endpoint is `GET *` (`http.route` resolves to `*`).\n // Filter by `http.target` instead, which carries the raw request path.\n { attributes: { 'http.target': /\\/__manifest/ } },\n];\n\nconst _lowQualityTransactionsFilterIntegration = (() => ({\n name: 'LowQualityTransactionsFilter' as const,\n beforeSetup(client) {\n const opts = client.getOptions();\n opts.ignoreSpans = [...(opts.ignoreSpans || []), ...LOW_QUALITY_TRANSACTIONS_FILTERS];\n },\n})) satisfies IntegrationFn;\n\n/**\n * Integration that filters out noisy http transactions such as requests to node_modules, favicon.ico, @id/, __manifest.\n * Adds entries to `ignoreSpans` so the filter applies in both static and streaming trace lifecycles.\n */\nexport const lowQualityTransactionsFilterIntegration = defineIntegration(_lowQualityTransactionsFilterIntegration);\n"],"names":["defineIntegration"],"mappings":";;;;AAGA,MAAM,gCAAA,GAAmC;AAAA,EACvC,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA;AAAA;AAAA,EAGA,EAAE,UAAA,EAAY,EAAE,aAAA,EAAe,gBAAe;AAChD,CAAA;AAEA,MAAM,4CAA4C,OAAO;AAAA,EACvD,IAAA,EAAM,8BAAA;AAAA,EACN,YAAY,MAAA,EAAQ;AAClB,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAC,GAAI,IAAA,CAAK,eAAe,EAAC,EAAI,GAAG,gCAAgC,CAAA;AAAA,EACtF;AACF,CAAA,CAAA,CAAA;AAMO,MAAM,uCAAA,GAA0CA,uBAAkB,wCAAwC;;;;"}
@@ -1,56 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const attributes = require('@sentry/conventions/attributes');
4
3
  const core = require('@sentry/core');
5
- const node = require('@sentry/node');
6
- const reactRouter = require('../instrumentation/reactRouter.js');
7
4
  const serverBuild = require('../serverBuild.js');
8
- const serverGlobals = require('../serverGlobals.js');
9
5
 
10
6
  const INTEGRATION_NAME = "ReactRouterServer";
11
- const instrumentReactRouter = node.generateInstrumentOnce(INTEGRATION_NAME, () => {
12
- return new reactRouter.ReactRouterInstrumentation();
13
- });
14
- const instrumentReactRouterServer = Object.assign(
15
- () => {
16
- instrumentReactRouter();
17
- serverBuild.registerServerBuildGlobal();
18
- },
19
- { id: INTEGRATION_NAME }
20
- );
21
7
  const reactRouterServerIntegration = core.defineIntegration(() => {
22
8
  return {
23
9
  name: INTEGRATION_NAME,
24
10
  setupOnce() {
25
- if (node.NODE_VERSION.major === 20 && node.NODE_VERSION.minor < 19 || node.NODE_VERSION.major === 22 && node.NODE_VERSION.minor < 12) {
26
- serverGlobals.enableOtelDataLoaderSpanCreation();
27
- }
28
- instrumentReactRouterServer();
29
- },
30
- processEvent(event) {
31
- if (event.type === "transaction" && event.contexts?.trace?.data && event.contexts.trace.data[attributes.HTTP_ROUTE] === "*") {
32
- const origin = event.contexts.trace.origin;
33
- const isInstrumentationApiOrigin = origin?.includes("instrumentation_api");
34
- if (isInstrumentationApiOrigin || !event.transaction?.endsWith(" *")) {
35
- delete event.contexts.trace.data[attributes.HTTP_ROUTE];
36
- }
37
- }
38
- return event;
39
- },
40
- processSegmentSpan(span) {
41
- const attributes$1 = span.attributes;
42
- if (attributes$1?.[attributes.HTTP_ROUTE] !== "*") {
43
- return;
44
- }
45
- const origin = attributes$1[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN];
46
- const isInstrumentationApiOrigin = typeof origin === "string" && origin.includes("instrumentation_api");
47
- if (isInstrumentationApiOrigin || !span.name?.endsWith(" *")) {
48
- delete attributes$1[attributes.HTTP_ROUTE];
49
- }
11
+ serverBuild.registerServerBuildGlobal();
50
12
  }
51
13
  };
52
14
  });
53
15
 
54
- exports.instrumentReactRouterServer = instrumentReactRouterServer;
55
16
  exports.reactRouterServerIntegration = reactRouterServerIntegration;
56
17
  //# sourceMappingURL=reactRouterServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactRouterServer.js","sources":["../../../../src/server/integration/reactRouterServer.ts"],"sourcesContent":["import { HTTP_ROUTE } from '@sentry/conventions/attributes';\nimport { defineIntegration, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport { generateInstrumentOnce, NODE_VERSION } from '@sentry/node';\nimport { ReactRouterInstrumentation } from '../instrumentation/reactRouter';\nimport { registerServerBuildGlobal } from '../serverBuild';\nimport { enableOtelDataLoaderSpanCreation } from '../serverGlobals';\n\nconst INTEGRATION_NAME = 'ReactRouterServer' as const;\n\nconst instrumentReactRouter = generateInstrumentOnce(INTEGRATION_NAME, () => {\n return new ReactRouterInstrumentation();\n});\n\nexport const instrumentReactRouterServer = Object.assign(\n (): void => {\n instrumentReactRouter();\n // Register global for Vite plugin ServerBuild capture\n registerServerBuildGlobal();\n },\n { id: INTEGRATION_NAME },\n);\n\n/**\n * Integration capturing tracing data for React Router server functions.\n */\nexport const reactRouterServerIntegration = defineIntegration(() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n // Enable OTEL data-loader spans only on Node versions without the diagnostics_channel-based instrumentation API.\n if (\n (NODE_VERSION.major === 20 && NODE_VERSION.minor < 19) ||\n (NODE_VERSION.major === 22 && NODE_VERSION.minor < 12)\n ) {\n enableOtelDataLoaderSpanCreation();\n }\n\n // Always install to capture ServerBuild for middleware names.\n // Skips per-request wrapping when instrumentation API is active or OTEL span creation is disabled.\n instrumentReactRouterServer();\n },\n processEvent(event) {\n // Express generates bogus `*` routes for data loaders, which we want to remove here\n // we cannot do this earlier because some OTEL instrumentation adds this at some unexpected point\n if (\n event.type === 'transaction' &&\n event.contexts?.trace?.data &&\n event.contexts.trace.data[HTTP_ROUTE] === '*'\n ) {\n const origin = event.contexts.trace.origin;\n const isInstrumentationApiOrigin = origin?.includes('instrumentation_api');\n\n // For instrumentation_api, always clean up bogus `*` route since we set better names\n // For legacy, only clean up if the name has been adjusted (not METHOD *)\n if (isInstrumentationApiOrigin || !event.transaction?.endsWith(' *')) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete event.contexts.trace.data[HTTP_ROUTE];\n }\n }\n\n return event;\n },\n processSegmentSpan(span) {\n // Express generates bogus `*` routes for data loaders, which we want to remove here\n // we cannot do this earlier because some OTEL instrumentation adds this at some unexpected point\n const attributes = span.attributes;\n if (attributes?.[HTTP_ROUTE] !== '*') {\n return;\n }\n\n const origin = attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN];\n const isInstrumentationApiOrigin = typeof origin === 'string' && origin.includes('instrumentation_api');\n\n // For instrumentation_api, always clean up bogus `*` route since we set better names\n // For legacy, only clean up if the name has been adjusted (not METHOD *)\n if (isInstrumentationApiOrigin || !span.name?.endsWith(' *')) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[HTTP_ROUTE];\n }\n },\n };\n});\n"],"names":["generateInstrumentOnce","ReactRouterInstrumentation","registerServerBuildGlobal","defineIntegration","NODE_VERSION","enableOtelDataLoaderSpanCreation","HTTP_ROUTE","attributes","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"],"mappings":";;;;;;;;;AAOA,MAAM,gBAAA,GAAmB,mBAAA;AAEzB,MAAM,qBAAA,GAAwBA,2BAAA,CAAuB,gBAAA,EAAkB,MAAM;AAC3E,EAAA,OAAO,IAAIC,sCAAA,EAA2B;AACxC,CAAC,CAAA;AAEM,MAAM,8BAA8B,MAAA,CAAO,MAAA;AAAA,EAChD,MAAY;AACV,IAAA,qBAAA,EAAsB;AAEtB,IAAAC,qCAAA,EAA0B;AAAA,EAC5B,CAAA;AAAA,EACA,EAAE,IAAI,gBAAA;AACR;AAKO,MAAM,4BAAA,GAA+BC,uBAAkB,MAAM;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AAEV,MAAA,IACGC,iBAAA,CAAa,KAAA,KAAU,EAAA,IAAMA,iBAAA,CAAa,KAAA,GAAQ,EAAA,IAClDA,iBAAA,CAAa,KAAA,KAAU,EAAA,IAAMA,iBAAA,CAAa,KAAA,GAAQ,EAAA,EACnD;AACA,QAAAC,8CAAA,EAAiC;AAAA,MACnC;AAIA,MAAA,2BAAA,EAA4B;AAAA,IAC9B,CAAA;AAAA,IACA,aAAa,KAAA,EAAO;AAGlB,MAAA,IACE,KAAA,CAAM,IAAA,KAAS,aAAA,IACf,KAAA,CAAM,QAAA,EAAU,KAAA,EAAO,IAAA,IACvB,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,IAAA,CAAKC,qBAAU,MAAM,GAAA,EAC1C;AACA,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA;AACpC,QAAA,MAAM,0BAAA,GAA6B,MAAA,EAAQ,QAAA,CAAS,qBAAqB,CAAA;AAIzE,QAAA,IAAI,8BAA8B,CAAC,KAAA,CAAM,WAAA,EAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AAEpE,UAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,IAAA,CAAKA,qBAAU,CAAA;AAAA,QAC7C;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,mBAAmB,IAAA,EAAM;AAGvB,MAAA,MAAMC,eAAa,IAAA,CAAK,UAAA;AACxB,MAAA,IAAIA,YAAA,GAAaD,qBAAU,CAAA,KAAM,GAAA,EAAK;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAASC,aAAWC,qCAAgC,CAAA;AAC1D,MAAA,MAAM,6BAA6B,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,SAAS,qBAAqB,CAAA;AAItG,MAAA,IAAI,8BAA8B,CAAC,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAE5D,QAAA,OAAOD,aAAWD,qBAAU,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,GACF;AACF,CAAC;;;;;"}
1
+ {"version":3,"file":"reactRouterServer.js","sources":["../../../../src/server/integration/reactRouterServer.ts"],"sourcesContent":["import { defineIntegration } from '@sentry/core';\nimport { registerServerBuildGlobal } from '../serverBuild';\n\nconst INTEGRATION_NAME = 'ReactRouterServer' as const;\n\n/**\n * Integration capturing tracing data for React Router server functions.\n */\nexport const reactRouterServerIntegration = defineIntegration(() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n // Register global for Vite plugin ServerBuild capture (used for middleware name resolution).\n registerServerBuildGlobal();\n },\n };\n});\n"],"names":["defineIntegration","registerServerBuildGlobal"],"mappings":";;;;;AAGA,MAAM,gBAAA,GAAmB,mBAAA;AAKlB,MAAM,4BAAA,GAA+BA,uBAAkB,MAAM;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AAEV,MAAAC,qCAAA,EAA0B;AAAA,IAC5B;AAAA,GACF;AACF,CAAC;;;;"}
@@ -9,7 +9,7 @@ const reactRouterServer = require('./integration/reactRouterServer.js');
9
9
  function getDefaultReactRouterServerIntegrations(options) {
10
10
  return [
11
11
  ...node.getDefaultIntegrations(options),
12
- lowQualityTransactionsFilterIntegration.lowQualityTransactionsFilterIntegration(options),
12
+ lowQualityTransactionsFilterIntegration.lowQualityTransactionsFilterIntegration(),
13
13
  reactRouterServer.reactRouterServerIntegration()
14
14
  ];
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { applySdkMetadata, debug, setTag } from '@sentry/core';\nimport type { NodeClient, NodeOptions } from '@sentry/node';\nimport { getDefaultIntegrations as getNodeDefaultIntegrations, init as initNodeSdk } from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport { lowQualityTransactionsFilterIntegration } from './integration/lowQualityTransactionsFilterIntegration';\nimport { reactRouterServerIntegration } from './integration/reactRouterServer';\n\n/**\n * Returns the default integrations for the React Router SDK.\n * @param options The options for the SDK.\n */\nexport function getDefaultReactRouterServerIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getNodeDefaultIntegrations(options),\n lowQualityTransactionsFilterIntegration(options),\n reactRouterServerIntegration(),\n ];\n}\n\n/**\n * Initializes the server side of the React Router SDK\n */\nexport function init(options: NodeOptions): NodeClient | undefined {\n const opts: NodeOptions = {\n ...options,\n defaultIntegrations: getDefaultReactRouterServerIntegrations(options),\n };\n\n DEBUG_BUILD && debug.log('Initializing SDK...');\n\n applySdkMetadata(opts, 'react-router', ['react-router', 'node']);\n\n const client = initNodeSdk(opts);\n\n setTag('runtime', 'node');\n\n DEBUG_BUILD && debug.log('SDK successfully initialized');\n\n return client;\n}\n"],"names":["getNodeDefaultIntegrations","lowQualityTransactionsFilterIntegration","reactRouterServerIntegration","DEBUG_BUILD","debug","applySdkMetadata","initNodeSdk","setTag"],"mappings":";;;;;;;;AAYO,SAAS,wCAAwC,OAAA,EAAqC;AAC3F,EAAA,OAAO;AAAA,IACL,GAAGA,4BAA2B,OAAO,CAAA;AAAA,IACrCC,gFAAwC,OAAO,CAAA;AAAA,IAC/CC,8CAAA;AAA6B,GAC/B;AACF;AAKO,SAAS,KAAK,OAAA,EAA8C;AACjE,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAG,OAAA;AAAA,IACH,mBAAA,EAAqB,wCAAwC,OAAO;AAAA,GACtE;AAEA,EAAAC,sBAAA,IAAeC,UAAA,CAAM,IAAI,qBAAqB,CAAA;AAE9C,EAAAC,qBAAA,CAAiB,IAAA,EAAM,cAAA,EAAgB,CAAC,cAAA,EAAgB,MAAM,CAAC,CAAA;AAE/D,EAAA,MAAM,MAAA,GAASC,UAAY,IAAI,CAAA;AAE/B,EAAAC,WAAA,CAAO,WAAW,MAAM,CAAA;AAExB,EAAAJ,sBAAA,IAAeC,UAAA,CAAM,IAAI,8BAA8B,CAAA;AAEvD,EAAA,OAAO,MAAA;AACT;;;;;"}
1
+ {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { applySdkMetadata, debug, setTag } from '@sentry/core';\nimport type { NodeClient, NodeOptions } from '@sentry/node';\nimport { getDefaultIntegrations as getNodeDefaultIntegrations, init as initNodeSdk } from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport { lowQualityTransactionsFilterIntegration } from './integration/lowQualityTransactionsFilterIntegration';\nimport { reactRouterServerIntegration } from './integration/reactRouterServer';\n\n/**\n * Returns the default integrations for the React Router SDK.\n * @param options The options for the SDK.\n */\nexport function getDefaultReactRouterServerIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getNodeDefaultIntegrations(options),\n lowQualityTransactionsFilterIntegration(),\n reactRouterServerIntegration(),\n ];\n}\n\n/**\n * Initializes the server side of the React Router SDK\n */\nexport function init(options: NodeOptions): NodeClient | undefined {\n const opts: NodeOptions = {\n ...options,\n defaultIntegrations: getDefaultReactRouterServerIntegrations(options),\n };\n\n DEBUG_BUILD && debug.log('Initializing SDK...');\n\n applySdkMetadata(opts, 'react-router', ['react-router', 'node']);\n\n const client = initNodeSdk(opts);\n\n setTag('runtime', 'node');\n\n DEBUG_BUILD && debug.log('SDK successfully initialized');\n\n return client;\n}\n"],"names":["getNodeDefaultIntegrations","lowQualityTransactionsFilterIntegration","reactRouterServerIntegration","DEBUG_BUILD","debug","applySdkMetadata","initNodeSdk","setTag"],"mappings":";;;;;;;;AAYO,SAAS,wCAAwC,OAAA,EAAqC;AAC3F,EAAA,OAAO;AAAA,IACL,GAAGA,4BAA2B,OAAO,CAAA;AAAA,IACrCC,+EAAA,EAAwC;AAAA,IACxCC,8CAAA;AAA6B,GAC/B;AACF;AAKO,SAAS,KAAK,OAAA,EAA8C;AACjE,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAG,OAAA;AAAA,IACH,mBAAA,EAAqB,wCAAwC,OAAO;AAAA,GACtE;AAEA,EAAAC,sBAAA,IAAeC,UAAA,CAAM,IAAI,qBAAqB,CAAA;AAE9C,EAAAC,qBAAA,CAAiB,IAAA,EAAM,cAAA,EAAgB,CAAC,cAAA,EAAgB,MAAM,CAAC,CAAA;AAE/D,EAAA,MAAM,MAAA,GAASC,UAAY,IAAI,CAAA;AAE/B,EAAAC,WAAA,CAAO,WAAW,MAAM,CAAA;AAExB,EAAAJ,sBAAA,IAAeC,UAAA,CAAM,IAAI,8BAA8B,CAAA;AAEvD,EAAA,OAAO,MAAA;AACT;;;;;"}
@@ -4,9 +4,6 @@ const core = require('@sentry/core');
4
4
 
5
5
  const GLOBAL_KEY = "__sentrySetServerBuild";
6
6
  let _serverBuild;
7
- function isServerBuildLike(build) {
8
- return build !== null && typeof build === "object" && "routes" in build && build.routes !== null && typeof build.routes === "object";
9
- }
10
7
  function setServerBuild(build) {
11
8
  _serverBuild = build;
12
9
  }
@@ -23,7 +20,6 @@ function registerServerBuildGlobal() {
23
20
 
24
21
  exports.GLOBAL_KEY = GLOBAL_KEY;
25
22
  exports.getMiddlewareName = getMiddlewareName;
26
- exports.isServerBuildLike = isServerBuildLike;
27
23
  exports.registerServerBuildGlobal = registerServerBuildGlobal;
28
24
  exports.setServerBuild = setServerBuild;
29
25
  //# sourceMappingURL=serverBuild.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverBuild.js","sources":["../../../src/server/serverBuild.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/**\n * Subset of ServerBuild shape for middleware name lookup.\n * The official React Router types don't expose `middleware` on route modules yet.\n * @internal\n */\ninterface ServerBuildLike {\n routes?: Record<\n string,\n {\n module?: {\n middleware?: Array<{ name?: string }>;\n };\n }\n >;\n}\n\n/** @internal */\nexport const GLOBAL_KEY = '__sentrySetServerBuild';\n\ntype GlobalObjWithBuildCapture = typeof GLOBAL_OBJ & {\n [GLOBAL_KEY]?: (build: ServerBuildLike) => void;\n};\n\n// ServerBuild reference for middleware name lookup. Updated on each createRequestHandler call.\nlet _serverBuild: ServerBuildLike | undefined;\n\n/** @internal */\nexport function isServerBuildLike(build: unknown): build is ServerBuildLike {\n return (\n build !== null &&\n typeof build === 'object' &&\n 'routes' in build &&\n build.routes !== null &&\n typeof build.routes === 'object'\n );\n}\n\n/** @internal */\nexport function setServerBuild(build: ServerBuildLike): void {\n _serverBuild = build;\n}\n\n/** @internal */\nexport function getMiddlewareName(routeId: string, index: number): string | undefined {\n if (!_serverBuild?.routes) return undefined;\n\n const route = _serverBuild.routes[routeId];\n if (!route?.module?.middleware) return undefined;\n\n const middlewareFn = route.module.middleware[index];\n return middlewareFn?.name || undefined;\n}\n\n/** @internal */\nexport function registerServerBuildGlobal(): void {\n (GLOBAL_OBJ as GlobalObjWithBuildCapture)[GLOBAL_KEY] = setServerBuild;\n}\n\n/** @internal Exported for testing. */\nexport function _resetServerBuild(): void {\n _serverBuild = undefined;\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (GLOBAL_OBJ as GlobalObjWithBuildCapture)[GLOBAL_KEY];\n}\n"],"names":["GLOBAL_OBJ"],"mappings":";;;;AAmBO,MAAM,UAAA,GAAa;AAO1B,IAAI,YAAA;AAGG,SAAS,kBAAkB,KAAA,EAA0C;AAC1E,EAAA,OACE,KAAA,KAAU,IAAA,IACV,OAAO,KAAA,KAAU,QAAA,IACjB,QAAA,IAAY,KAAA,IACZ,KAAA,CAAM,MAAA,KAAW,IAAA,IACjB,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA;AAE5B;AAGO,SAAS,eAAe,KAAA,EAA8B;AAC3D,EAAA,YAAA,GAAe,KAAA;AACjB;AAGO,SAAS,iBAAA,CAAkB,SAAiB,KAAA,EAAmC;AACpF,EAAA,IAAI,CAAC,YAAA,EAAc,MAAA,EAAQ,OAAO,MAAA;AAElC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,OAAO,MAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAClD,EAAA,OAAO,cAAc,IAAA,IAAQ,MAAA;AAC/B;AAGO,SAAS,yBAAA,GAAkC;AAChD,EAACA,eAAA,CAAyC,UAAU,CAAA,GAAI,cAAA;AAC1D;;;;;;;;"}
1
+ {"version":3,"file":"serverBuild.js","sources":["../../../src/server/serverBuild.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/**\n * Subset of ServerBuild shape for middleware name lookup.\n * The official React Router types don't expose `middleware` on route modules yet.\n * @internal\n */\ninterface ServerBuildLike {\n routes?: Record<\n string,\n {\n module?: {\n middleware?: Array<{ name?: string }>;\n };\n }\n >;\n}\n\n/** @internal */\nexport const GLOBAL_KEY = '__sentrySetServerBuild';\n\ntype GlobalObjWithBuildCapture = typeof GLOBAL_OBJ & {\n [GLOBAL_KEY]?: (build: ServerBuildLike) => void;\n};\n\n// ServerBuild reference for middleware name lookup. Updated on each createRequestHandler call.\nlet _serverBuild: ServerBuildLike | undefined;\n\n/** @internal */\nexport function isServerBuildLike(build: unknown): build is ServerBuildLike {\n return (\n build !== null &&\n typeof build === 'object' &&\n 'routes' in build &&\n build.routes !== null &&\n typeof build.routes === 'object'\n );\n}\n\n/** @internal */\nexport function setServerBuild(build: ServerBuildLike): void {\n _serverBuild = build;\n}\n\n/** @internal */\nexport function getMiddlewareName(routeId: string, index: number): string | undefined {\n if (!_serverBuild?.routes) return undefined;\n\n const route = _serverBuild.routes[routeId];\n if (!route?.module?.middleware) return undefined;\n\n const middlewareFn = route.module.middleware[index];\n return middlewareFn?.name || undefined;\n}\n\n/** @internal */\nexport function registerServerBuildGlobal(): void {\n (GLOBAL_OBJ as GlobalObjWithBuildCapture)[GLOBAL_KEY] = setServerBuild;\n}\n\n/** @internal Exported for testing. */\nexport function _resetServerBuild(): void {\n _serverBuild = undefined;\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (GLOBAL_OBJ as GlobalObjWithBuildCapture)[GLOBAL_KEY];\n}\n"],"names":["GLOBAL_OBJ"],"mappings":";;;;AAmBO,MAAM,UAAA,GAAa;AAO1B,IAAI,YAAA;AAcG,SAAS,eAAe,KAAA,EAA8B;AAC3D,EAAA,YAAA,GAAe,KAAA;AACjB;AAGO,SAAS,iBAAA,CAAkB,SAAiB,KAAA,EAAmC;AACpF,EAAA,IAAI,CAAC,YAAA,EAAc,MAAA,EAAQ,OAAO,MAAA;AAElC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,OAAO,MAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAClD,EAAA,OAAO,cAAc,IAAA,IAAQ,MAAA;AAC/B;AAGO,SAAS,yBAAA,GAAkC;AAChD,EAACA,eAAA,CAAyC,UAAU,CAAA,GAAI,cAAA;AAC1D;;;;;;;"}
@@ -3,22 +3,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  const core = require('@sentry/core');
4
4
 
5
5
  const SENTRY_SERVER_INSTRUMENTATION_FLAG = "__sentryReactRouterServerInstrumentationUsed";
6
- const SENTRY_OTEL_SPAN_CREATION_FLAG = "__sentryReactRouterOtelSpanCreationEnabled";
7
6
  function markInstrumentationApiUsed() {
8
7
  core.GLOBAL_OBJ[SENTRY_SERVER_INSTRUMENTATION_FLAG] = true;
9
8
  }
10
9
  function isInstrumentationApiUsed() {
11
10
  return !!core.GLOBAL_OBJ[SENTRY_SERVER_INSTRUMENTATION_FLAG];
12
11
  }
13
- function enableOtelDataLoaderSpanCreation() {
14
- core.GLOBAL_OBJ[SENTRY_OTEL_SPAN_CREATION_FLAG] = true;
15
- }
16
- function isOtelDataLoaderSpanCreationEnabled() {
17
- return !!core.GLOBAL_OBJ[SENTRY_OTEL_SPAN_CREATION_FLAG];
18
- }
19
12
 
20
- exports.enableOtelDataLoaderSpanCreation = enableOtelDataLoaderSpanCreation;
21
13
  exports.isInstrumentationApiUsed = isInstrumentationApiUsed;
22
- exports.isOtelDataLoaderSpanCreationEnabled = isOtelDataLoaderSpanCreationEnabled;
23
14
  exports.markInstrumentationApiUsed = markInstrumentationApiUsed;
24
15
  //# sourceMappingURL=serverGlobals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverGlobals.js","sources":["../../../src/server/serverGlobals.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\nconst SENTRY_SERVER_INSTRUMENTATION_FLAG = '__sentryReactRouterServerInstrumentationUsed';\nconst SENTRY_OTEL_SPAN_CREATION_FLAG = '__sentryReactRouterOtelSpanCreationEnabled';\n\ntype GlobalObjWithFlag = typeof GLOBAL_OBJ & {\n [SENTRY_SERVER_INSTRUMENTATION_FLAG]?: boolean;\n [SENTRY_OTEL_SPAN_CREATION_FLAG]?: boolean;\n};\n\n/**\n * Mark that the React Router instrumentation API is being used on the server.\n * @internal\n */\nexport function markInstrumentationApiUsed(): void {\n (GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_SERVER_INSTRUMENTATION_FLAG] = true;\n}\n\n/**\n * Check if React Router's instrumentation API is being used on the server.\n */\nexport function isInstrumentationApiUsed(): boolean {\n return !!(GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_SERVER_INSTRUMENTATION_FLAG];\n}\n\n/**\n * Enable OTEL data-loader span creation for React Router server.\n * @internal\n */\nexport function enableOtelDataLoaderSpanCreation(): void {\n (GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_OTEL_SPAN_CREATION_FLAG] = true;\n}\n\n/**\n * Check if OTEL data-loader span creation is enabled for React Router server.\n * @internal\n */\nexport function isOtelDataLoaderSpanCreationEnabled(): boolean {\n return !!(GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_OTEL_SPAN_CREATION_FLAG];\n}\n"],"names":["GLOBAL_OBJ"],"mappings":";;;;AAEA,MAAM,kCAAA,GAAqC,8CAAA;AAC3C,MAAM,8BAAA,GAAiC,4CAAA;AAWhC,SAAS,0BAAA,GAAmC;AACjD,EAACA,eAAA,CAAiC,kCAAkC,CAAA,GAAI,IAAA;AAC1E;AAKO,SAAS,wBAAA,GAAoC;AAClD,EAAA,OAAO,CAAC,CAAEA,eAAA,CAAiC,kCAAkC,CAAA;AAC/E;AAMO,SAAS,gCAAA,GAAyC;AACvD,EAACA,eAAA,CAAiC,8BAA8B,CAAA,GAAI,IAAA;AACtE;AAMO,SAAS,mCAAA,GAA+C;AAC7D,EAAA,OAAO,CAAC,CAAEA,eAAA,CAAiC,8BAA8B,CAAA;AAC3E;;;;;;;"}
1
+ {"version":3,"file":"serverGlobals.js","sources":["../../../src/server/serverGlobals.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\nconst SENTRY_SERVER_INSTRUMENTATION_FLAG = '__sentryReactRouterServerInstrumentationUsed';\n\ntype GlobalObjWithFlag = typeof GLOBAL_OBJ & {\n [SENTRY_SERVER_INSTRUMENTATION_FLAG]?: boolean;\n};\n\n/**\n * Mark that the React Router instrumentation API is being used on the server.\n * @internal\n */\nexport function markInstrumentationApiUsed(): void {\n (GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_SERVER_INSTRUMENTATION_FLAG] = true;\n}\n\n/**\n * Check if React Router's instrumentation API is being used on the server.\n */\nexport function isInstrumentationApiUsed(): boolean {\n return !!(GLOBAL_OBJ as GlobalObjWithFlag)[SENTRY_SERVER_INSTRUMENTATION_FLAG];\n}\n"],"names":["GLOBAL_OBJ"],"mappings":";;;;AAEA,MAAM,kCAAA,GAAqC,8CAAA;AAUpC,SAAS,0BAAA,GAAmC;AACjD,EAACA,eAAA,CAAiC,kCAAkC,CAAA,GAAI,IAAA;AAC1E;AAKO,SAAS,wBAAA,GAAoC;AAClD,EAAA,OAAO,CAAC,CAAEA,eAAA,CAAiC,kCAAkC,CAAA;AAC/E;;;;;"}
@@ -53,8 +53,6 @@ function wrapSentryHandleRequest(originalHandle) {
53
53
  }
54
54
  };
55
55
  }
56
- const sentryHandleRequest = wrapSentryHandleRequest;
57
56
 
58
- exports.sentryHandleRequest = sentryHandleRequest;
59
57
  exports.wrapSentryHandleRequest = wrapSentryHandleRequest;
60
58
  //# sourceMappingURL=wrapSentryHandleRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrapSentryHandleRequest.js","sources":["../../../src/server/wrapSentryHandleRequest.ts"],"sourcesContent":["import { HTTP_ROUTE } from '@sentry/conventions/attributes';\nimport {\n flushIfServerless,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n updateSpanName,\n} from '@sentry/core';\nimport type { AppLoadContext, EntryContext, RouterContextProvider } from 'react-router';\nimport { isInstrumentationApiUsed } from './serverGlobals';\n\ntype OriginalHandleRequestWithoutMiddleware = (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: AppLoadContext,\n) => Promise<unknown>;\n\ntype OriginalHandleRequestWithMiddleware = (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: RouterContextProvider,\n) => Promise<unknown>;\n\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithoutMiddleware,\n): OriginalHandleRequestWithoutMiddleware;\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithMiddleware,\n): OriginalHandleRequestWithMiddleware;\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware,\n): OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware {\n return async function sentryInstrumentedHandleRequest(\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: AppLoadContext | RouterContextProvider,\n ) {\n const parameterizedPath =\n routerContext?.staticHandlerContext?.matches?.[routerContext.staticHandlerContext.matches.length - 1]?.route.path;\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n if (parameterizedPath && rootSpan) {\n // Normalize route name - avoid \"//\" for root routes\n const routeName = parameterizedPath.startsWith('/') ? parameterizedPath : `/${parameterizedPath}`;\n\n const transactionName = `${request.method} ${routeName}`;\n\n updateSpanName(rootSpan, transactionName);\n getCurrentScope().setTransactionName(transactionName);\n\n // Set route attributes - acts as fallback for lazy-only routes when using instrumentation API\n // Don't override origin when instrumentation API is used (preserve instrumentation_api origin)\n if (isInstrumentationApiUsed()) {\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n });\n } else {\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.request_handler',\n });\n }\n }\n\n try {\n // Type guard to call the correct overload based on loadContext type\n if (isRouterContextProvider(loadContext)) {\n // loadContext is RouterContextProvider\n return await (originalHandle as OriginalHandleRequestWithMiddleware)(\n request,\n responseStatusCode,\n responseHeaders,\n routerContext,\n loadContext,\n );\n } else {\n // loadContext is AppLoadContext\n return await (originalHandle as OriginalHandleRequestWithoutMiddleware)(\n request,\n responseStatusCode,\n responseHeaders,\n routerContext,\n loadContext,\n );\n }\n } finally {\n await flushIfServerless();\n }\n\n /**\n * Helper type guard to determine if the context is a RouterContextProvider.\n *\n * @param ctx - The context to check\n * @returns True if the context is a RouterContextProvider\n */\n function isRouterContextProvider(ctx: AppLoadContext | RouterContextProvider): ctx is RouterContextProvider {\n return typeof (ctx as RouterContextProvider)?.get === 'function';\n }\n };\n}\n\n// todo(v11): remove this\n/** @deprecated Use `wrapSentryHandleRequest` instead. */\nexport const sentryHandleRequest = wrapSentryHandleRequest;\n"],"names":["getActiveSpan","getRootSpan","updateSpanName","getCurrentScope","isInstrumentationApiUsed","HTTP_ROUTE","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","flushIfServerless"],"mappings":";;;;;;AAqDO,SAAS,wBACd,cAAA,EAC8E;AAC9E,EAAA,OAAO,eAAe,+BAAA,CACpB,OAAA,EACA,kBAAA,EACA,eAAA,EACA,eACA,WAAA,EACA;AACA,IAAA,MAAM,iBAAA,GACJ,aAAA,EAAe,oBAAA,EAAsB,OAAA,GAAU,aAAA,CAAc,qBAAqB,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA;AAE/G,IAAA,MAAM,aAAaA,kBAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAaC,gBAAA,CAAY,UAAU,CAAA,GAAI,MAAA;AAExD,IAAA,IAAI,qBAAqB,QAAA,EAAU;AAEjC,MAAA,MAAM,YAAY,iBAAA,CAAkB,UAAA,CAAW,GAAG,CAAA,GAAI,iBAAA,GAAoB,IAAI,iBAAiB,CAAA,CAAA;AAE/F,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,OAAA,CAAQ,MAAM,IAAI,SAAS,CAAA,CAAA;AAEtD,MAAAC,mBAAA,CAAe,UAAU,eAAe,CAAA;AACxC,MAAAC,oBAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AAIpD,MAAA,IAAIC,wCAAyB,EAAG;AAC9B,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,CAACC,qBAAU,GAAG,SAAA;AAAA,UACd,CAACC,qCAAgC,GAAG;AAAA,SACrC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,CAACD,qBAAU,GAAG,SAAA;AAAA,UACd,CAACC,qCAAgC,GAAG,OAAA;AAAA,UACpC,CAACC,qCAAgC,GAAG;AAAA,SACrC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,uBAAA,CAAwB,WAAW,CAAA,EAAG;AAExC,QAAA,OAAO,MAAO,cAAA;AAAA,UACZ,OAAA;AAAA,UACA,kBAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAO,MAAO,cAAA;AAAA,UACZ,OAAA;AAAA,UACA,kBAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAMC,sBAAA,EAAkB;AAAA,IAC1B;AAQA,IAAA,SAAS,wBAAwB,GAAA,EAA2E;AAC1G,MAAA,OAAO,OAAQ,KAA+B,GAAA,KAAQ,UAAA;AAAA,IACxD;AAAA,EACF,CAAA;AACF;AAIO,MAAM,mBAAA,GAAsB;;;;;"}
1
+ {"version":3,"file":"wrapSentryHandleRequest.js","sources":["../../../src/server/wrapSentryHandleRequest.ts"],"sourcesContent":["import { HTTP_ROUTE } from '@sentry/conventions/attributes';\nimport {\n flushIfServerless,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n updateSpanName,\n} from '@sentry/core';\nimport type { AppLoadContext, EntryContext, RouterContextProvider } from 'react-router';\nimport { isInstrumentationApiUsed } from './serverGlobals';\n\ntype OriginalHandleRequestWithoutMiddleware = (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: AppLoadContext,\n) => Promise<unknown>;\n\ntype OriginalHandleRequestWithMiddleware = (\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: RouterContextProvider,\n) => Promise<unknown>;\n\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithoutMiddleware,\n): OriginalHandleRequestWithoutMiddleware;\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithMiddleware,\n): OriginalHandleRequestWithMiddleware;\n/**\n * Wraps the original handleRequest function to add Sentry instrumentation.\n *\n * @param originalHandle - The original handleRequest function to wrap\n * @returns A wrapped version of the handle request function with Sentry instrumentation\n */\nexport function wrapSentryHandleRequest(\n originalHandle: OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware,\n): OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware {\n return async function sentryInstrumentedHandleRequest(\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n routerContext: EntryContext,\n loadContext: AppLoadContext | RouterContextProvider,\n ) {\n const parameterizedPath =\n routerContext?.staticHandlerContext?.matches?.[routerContext.staticHandlerContext.matches.length - 1]?.route.path;\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n if (parameterizedPath && rootSpan) {\n // Normalize route name - avoid \"//\" for root routes\n const routeName = parameterizedPath.startsWith('/') ? parameterizedPath : `/${parameterizedPath}`;\n\n const transactionName = `${request.method} ${routeName}`;\n\n updateSpanName(rootSpan, transactionName);\n getCurrentScope().setTransactionName(transactionName);\n\n // Set route attributes - acts as fallback for lazy-only routes when using instrumentation API\n // Don't override origin when instrumentation API is used (preserve instrumentation_api origin)\n if (isInstrumentationApiUsed()) {\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n });\n } else {\n rootSpan.setAttributes({\n [HTTP_ROUTE]: routeName,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.react_router.request_handler',\n });\n }\n }\n\n try {\n // Type guard to call the correct overload based on loadContext type\n if (isRouterContextProvider(loadContext)) {\n // loadContext is RouterContextProvider\n return await (originalHandle as OriginalHandleRequestWithMiddleware)(\n request,\n responseStatusCode,\n responseHeaders,\n routerContext,\n loadContext,\n );\n } else {\n // loadContext is AppLoadContext\n return await (originalHandle as OriginalHandleRequestWithoutMiddleware)(\n request,\n responseStatusCode,\n responseHeaders,\n routerContext,\n loadContext,\n );\n }\n } finally {\n await flushIfServerless();\n }\n\n /**\n * Helper type guard to determine if the context is a RouterContextProvider.\n *\n * @param ctx - The context to check\n * @returns True if the context is a RouterContextProvider\n */\n function isRouterContextProvider(ctx: AppLoadContext | RouterContextProvider): ctx is RouterContextProvider {\n return typeof (ctx as RouterContextProvider)?.get === 'function';\n }\n };\n}\n"],"names":["getActiveSpan","getRootSpan","updateSpanName","getCurrentScope","isInstrumentationApiUsed","HTTP_ROUTE","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","flushIfServerless"],"mappings":";;;;;;AAqDO,SAAS,wBACd,cAAA,EAC8E;AAC9E,EAAA,OAAO,eAAe,+BAAA,CACpB,OAAA,EACA,kBAAA,EACA,eAAA,EACA,eACA,WAAA,EACA;AACA,IAAA,MAAM,iBAAA,GACJ,aAAA,EAAe,oBAAA,EAAsB,OAAA,GAAU,aAAA,CAAc,qBAAqB,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA;AAE/G,IAAA,MAAM,aAAaA,kBAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAaC,gBAAA,CAAY,UAAU,CAAA,GAAI,MAAA;AAExD,IAAA,IAAI,qBAAqB,QAAA,EAAU;AAEjC,MAAA,MAAM,YAAY,iBAAA,CAAkB,UAAA,CAAW,GAAG,CAAA,GAAI,iBAAA,GAAoB,IAAI,iBAAiB,CAAA,CAAA;AAE/F,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,OAAA,CAAQ,MAAM,IAAI,SAAS,CAAA,CAAA;AAEtD,MAAAC,mBAAA,CAAe,UAAU,eAAe,CAAA;AACxC,MAAAC,oBAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AAIpD,MAAA,IAAIC,wCAAyB,EAAG;AAC9B,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,CAACC,qBAAU,GAAG,SAAA;AAAA,UACd,CAACC,qCAAgC,GAAG;AAAA,SACrC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,CAACD,qBAAU,GAAG,SAAA;AAAA,UACd,CAACC,qCAAgC,GAAG,OAAA;AAAA,UACpC,CAACC,qCAAgC,GAAG;AAAA,SACrC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,uBAAA,CAAwB,WAAW,CAAA,EAAG;AAExC,QAAA,OAAO,MAAO,cAAA;AAAA,UACZ,OAAA;AAAA,UACA,kBAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAO,MAAO,cAAA;AAAA,UACZ,OAAA;AAAA,UACA,kBAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAMC,sBAAA,EAAkB;AAAA,IAC1B;AAQA,IAAA,SAAS,wBAAwB,GAAA,EAA2E;AAC1G,MAAA,OAAO,OAAQ,KAA+B,GAAA,KAAQ,UAAA;AAAA,IACxD;AAAA,EACF,CAAA;AACF;;;;"}
@@ -11,18 +11,10 @@ function getSentryConfig(viteConfig) {
11
11
  return viteConfig.sentryConfig;
12
12
  }
13
13
  function resolveSourceMapsDisable(sentryConfig) {
14
- if (sentryConfig.sourceMapsUploadOptions?.enabled === false) {
15
- return true;
16
- }
17
- return sentryConfig.unstable_sentryVitePluginOptions?.sourcemaps?.disable ?? sentryConfig.sourcemaps?.disable;
14
+ return sentryConfig.sourcemaps?.disable ?? sentryConfig.unstable_sentryVitePluginOptions?.sourcemaps?.disable;
18
15
  }
19
16
  const sentryOnBuildEnd = async ({ reactRouterConfig, viteConfig }) => {
20
17
  const sentryConfig = getSentryConfig(viteConfig);
21
- const {
22
- sourceMapsUploadOptions,
23
- // extract to exclude from rest config
24
- ...sentryConfigWithoutDeprecatedSourceMapOption
25
- } = sentryConfig;
26
18
  const unstableSentryVitePluginOptions = sentryConfig.unstable_sentryVitePluginOptions;
27
19
  const {
28
20
  authToken,
@@ -33,19 +25,17 @@ const sentryOnBuildEnd = async ({ reactRouterConfig, viteConfig }) => {
33
25
  debug = false
34
26
  } = {
35
27
  ...unstableSentryVitePluginOptions,
36
- ...sentryConfigWithoutDeprecatedSourceMapOption,
37
- // spread in the config without the deprecated sourceMapsUploadOptions
28
+ ...sentryConfig,
38
29
  sourcemaps: {
39
30
  ...unstableSentryVitePluginOptions?.sourcemaps,
40
31
  ...sentryConfig.sourcemaps,
41
- ...sourceMapsUploadOptions,
42
32
  disable: resolveSourceMapsDisable(sentryConfig)
43
33
  },
44
34
  release: {
45
35
  ...unstableSentryVitePluginOptions?.release,
46
36
  ...sentryConfig.release
47
37
  },
48
- project: unstableSentryVitePluginOptions?.project ? Array.isArray(unstableSentryVitePluginOptions?.project) ? unstableSentryVitePluginOptions?.project[0] : unstableSentryVitePluginOptions?.project : sentryConfigWithoutDeprecatedSourceMapOption.project
38
+ project: unstableSentryVitePluginOptions?.project ? Array.isArray(unstableSentryVitePluginOptions?.project) ? unstableSentryVitePluginOptions?.project[0] : unstableSentryVitePluginOptions?.project : sentryConfig.project
49
39
  };
50
40
  const cliInstance = new SentryCli.default(null, {
51
41
  authToken,
@@ -95,7 +85,7 @@ const sentryOnBuildEnd = async ({ reactRouterConfig, viteConfig }) => {
95
85
  updatedFilesToDeleteAfterUpload = [`${reactRouterConfig.buildDirectory}/**/*.map`];
96
86
  debug && // eslint-disable-next-line no-console
97
87
  console.info(
98
- `[Sentry] Automatically setting \`sourceMapsUploadOptions.filesToDeleteAfterUpload: ${JSON.stringify(
88
+ `[Sentry] Automatically setting \`sourcemaps.filesToDeleteAfterUpload: ${JSON.stringify(
99
89
  updatedFilesToDeleteAfterUpload
100
90
  )}\` to delete generated source maps after they were uploaded to Sentry.`
101
91
  );