@sentry/tanstackstart-react 11.0.0-alpha.1 → 11.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/build/cjs/server/globalMiddleware.js +1 -1
  2. package/build/cjs/server/globalMiddleware.js.map +1 -1
  3. package/build/cjs/server/routeParametrization.js +1 -1
  4. package/build/cjs/server/routeParametrization.js.map +1 -1
  5. package/build/cjs/server/tunnelRoute.js +2 -1
  6. package/build/cjs/server/tunnelRoute.js.map +1 -1
  7. package/build/cjs/server/utils.js +1 -1
  8. package/build/cjs/server/utils.js.map +1 -1
  9. package/build/cjs/server/wrapFetchWithSentry.js +3 -2
  10. package/build/cjs/server/wrapFetchWithSentry.js.map +1 -1
  11. package/build/cjs/vite/sourceMaps.js +3 -2
  12. package/build/cjs/vite/sourceMaps.js.map +1 -1
  13. package/build/esm/package.json +1 -1
  14. package/build/esm/server/globalMiddleware.js +3 -3
  15. package/build/esm/server/globalMiddleware.js.map +1 -1
  16. package/build/esm/server/routeParametrization.js +3 -3
  17. package/build/esm/server/routeParametrization.js.map +1 -1
  18. package/build/esm/server/tunnelRoute.js +2 -1
  19. package/build/esm/server/tunnelRoute.js.map +1 -1
  20. package/build/esm/server/utils.js +2 -2
  21. package/build/esm/server/utils.js.map +1 -1
  22. package/build/esm/server/wrapFetchWithSentry.js +4 -3
  23. package/build/esm/server/wrapFetchWithSentry.js.map +1 -1
  24. package/build/esm/vite/sourceMaps.js +3 -2
  25. package/build/esm/vite/sourceMaps.js.map +1 -1
  26. package/build/import-hook.mjs +1 -1
  27. package/build/types/index.client.d.ts.map +1 -1
  28. package/build/types/index.server.d.ts +0 -1
  29. package/build/types/index.server.d.ts.map +1 -1
  30. package/build/types/index.types.d.ts +3 -2
  31. package/build/types/index.types.d.ts.map +1 -1
  32. package/build/types/server/globalMiddleware.d.ts.map +1 -1
  33. package/build/types/server/routeParametrization.d.ts.map +1 -1
  34. package/build/types/server/tunnelRoute.d.ts +1 -1
  35. package/build/types/server/tunnelRoute.d.ts.map +1 -1
  36. package/build/types/server/wrapFetchWithSentry.d.ts.map +1 -1
  37. package/build/types/vite/sourceMaps.d.ts.map +1 -1
  38. package/package.json +24 -9
  39. package/build/types/config/index.d.ts +0 -2
  40. package/build/types/config/index.d.ts.map +0 -1
@@ -27,7 +27,7 @@ function createSentryFunctionMiddlewareHandler(mechanismType) {
27
27
  if (serverFnMeta?.name) {
28
28
  const method = spanData.name.split(" ")[0] || "GET";
29
29
  core.updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);
30
- activeSpan.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
30
+ activeSpan.setAttribute(attributes.SENTRY_SEGMENT_NAME_SOURCE, "route");
31
31
  }
32
32
  if (serverFnMeta?.id) {
33
33
  activeSpan.setAttribute("tanstackstart.function.id", serverFnMeta.id);
@@ -1 +1 @@
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 { SentryGlobalFunctionMiddleware, SentryGlobalRequestMiddleware } from '../common/types';\nimport { SENTRY_INTERNAL } from './middleware';\nimport { SENTRY_ORIGIN } from '@sentry/conventions/attributes';\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?.attributes[SENTRY_ORIGIN] === 'auto.function.tanstackstart.server') {\n if (serverFnMeta?.name) {\n const method = spanData.name.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: SentryGlobalRequestMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalRequestMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalRequestMiddleware['_types'],\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: SentryGlobalFunctionMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalFunctionMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalFunctionMiddleware['_types'],\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","SENTRY_ORIGIN","updateSpanName","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","addNonEnumerableProperty","SENTRY_INTERNAL"],"mappings":";;;;;;AAkBA,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,UAAA,CAAWC,wBAAa,MAAM,oCAAA,EAAsC;AAC9F,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC9C,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,MAAAL,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,GAA+D;AAAA;AAAA,EAE1E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,8BAA8B,uCAAuC;AAAA;AAEjF;AAMO,MAAM,8BAAA,GAAiE;AAAA;AAAA,EAE5E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,sCAAsC,+CAA+C;AAAA;AAAA;AAIjG;AAGAM,6BAAA,CAAyB,6BAAA,EAA+BC,4BAAiB,IAAI,CAAA;AAC7ED,6BAAA,CAAyB,8BAAA,EAAgCC,4BAAiB,IAAI,CAAA;;;;;"}
1
+ {"version":3,"file":"globalMiddleware.js","sources":["../../../src/server/globalMiddleware.ts"],"sourcesContent":["import { addNonEnumerableProperty, captureException, getActiveSpan, spanToJSON, updateSpanName } from '@sentry/core';\nimport type { SentryGlobalFunctionMiddleware, SentryGlobalRequestMiddleware } from '../common/types';\nimport { SENTRY_INTERNAL } from './middleware';\nimport { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\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?.attributes[SENTRY_ORIGIN] === 'auto.function.tanstackstart.server') {\n if (serverFnMeta?.name) {\n const method = spanData.name.split(' ')[0] || 'GET';\n updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);\n activeSpan.setAttribute(SENTRY_SEGMENT_NAME_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: SentryGlobalRequestMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalRequestMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalRequestMiddleware['_types'],\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: SentryGlobalFunctionMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalFunctionMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalFunctionMiddleware['_types'],\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","SENTRY_ORIGIN","updateSpanName","SENTRY_SEGMENT_NAME_SOURCE","addNonEnumerableProperty","SENTRY_INTERNAL"],"mappings":";;;;;;AAWA,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,UAAA,CAAWC,wBAAa,MAAM,oCAAA,EAAsC;AAC9F,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC9C,QAAAC,mBAAA,CAAe,YAAY,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,UAAA,CAAW,YAAA,CAAaC,uCAA4B,OAAO,CAAA;AAAA,MAC7D;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,MAAAL,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,GAA+D;AAAA;AAAA,EAE1E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,8BAA8B,uCAAuC;AAAA;AAEjF;AAMO,MAAM,8BAAA,GAAiE;AAAA;AAAA,EAE5E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,sCAAsC,+CAA+C;AAAA;AAAA;AAIjG;AAGAM,6BAAA,CAAyB,6BAAA,EAA+BC,4BAAiB,IAAI,CAAA;AAC7ED,6BAAA,CAAyB,8BAAA,EAAgCC,4BAAiB,IAAI,CAAA;;;;;"}
@@ -38,7 +38,7 @@ function updateSpanWithRouteParametrization(method, pathname, patterns) {
38
38
  const transactionName = `${method} ${matchedPattern}`;
39
39
  core.updateSpanName(rootSpan, transactionName);
40
40
  rootSpan.setAttribute(attributes.HTTP_ROUTE, matchedPattern);
41
- rootSpan.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
41
+ rootSpan.setAttribute(attributes.SENTRY_SEGMENT_NAME_SOURCE, "route");
42
42
  core.getCurrentScope().setTransactionName(transactionName);
43
43
  }
44
44
 
@@ -1 +1 @@
1
- {"version":3,"file":"routeParametrization.js","sources":["../../../src/server/routeParametrization.ts"],"sourcesContent":["import { HTTP_ROUTE } from '@sentry/conventions/attributes';\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).attributes;\n if (rootSpanData?.[HTTP_ROUTE]) {\n return;\n }\n\n const transactionName = `${method} ${matchedPattern}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttribute(HTTP_ROUTE, matchedPattern);\n rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":["escapeStringForRegex","getActiveSpan","getRootSpan","spanToJSON","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,UAAA;AAC1C,EAAA,IAAI,YAAA,GAAeC,qBAAU,CAAA,EAAG;AAC9B,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,uBAAY,cAAc,CAAA;AAChD,EAAA,QAAA,CAAS,YAAA,CAAaE,uCAAkC,OAAO,CAAA;AAC/D,EAAAC,oBAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AACtD;;;;;"}
1
+ {"version":3,"file":"routeParametrization.js","sources":["../../../src/server/routeParametrization.ts"],"sourcesContent":["import { SENTRY_SEGMENT_NAME_SOURCE, HTTP_ROUTE } from '@sentry/conventions/attributes';\nimport {\n escapeStringForRegex,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\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).attributes;\n if (rootSpanData?.[HTTP_ROUTE]) {\n return;\n }\n\n const transactionName = `${method} ${matchedPattern}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttribute(HTTP_ROUTE, matchedPattern);\n rootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, 'route');\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":["escapeStringForRegex","getActiveSpan","getRootSpan","spanToJSON","HTTP_ROUTE","updateSpanName","SENTRY_SEGMENT_NAME_SOURCE","getCurrentScope"],"mappings":";;;;;AAUA,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,UAAA;AAC1C,EAAA,IAAI,YAAA,GAAeC,qBAAU,CAAA,EAAG;AAC9B,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,uBAAY,cAAc,CAAA;AAChD,EAAA,QAAA,CAAS,YAAA,CAAaE,uCAA4B,OAAO,CAAA;AACzD,EAAAC,oBAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AACtD;;;;;"}
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const core = require('@sentry/core');
4
5
 
5
6
  const registeredTunnelRoutePaths = /* @__PURE__ */ new Set();
@@ -15,7 +16,7 @@ function registerSentryServerTunnelRoute(path) {
15
16
  const options = client.getOptions();
16
17
  options.ignoreSpans = [
17
18
  ...options.ignoreSpans ?? [],
18
- { attributes: { "http.target": new RegExp(`^${core.escapeStringForRegex(path)}(?:[/?#]|$)`) } }
19
+ { attributes: { [attributes.URL_PATH]: new RegExp(`^${core.escapeStringForRegex(path)}(?:[/?#]|$)`) } }
19
20
  ];
20
21
  }
21
22
  function createSentryTunnelRoute(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"tunnelRoute.js","sources":["../../../src/server/tunnelRoute.ts"],"sourcesContent":["import { dsnToString, escapeStringForRegex, getClient, handleTunnelRequest } from '@sentry/core';\n\nconst registeredTunnelRoutePaths = new Set<string>();\n\n/**\n * Drops the incoming `http.server` transaction for a tunnel route by matching its request path (the\n * `http.target` attribute, set at span creation, so it works for static and streamed lifecycles).\n * Called at server startup for the managed route and from the handler (self-registration) otherwise.\n */\nexport function registerSentryServerTunnelRoute(path: string): void {\n // Dedupe: the route module can be re-evaluated (HMR, multiple import paths).\n if (registeredTunnelRoutePaths.has(path)) {\n return;\n }\n\n const client = getClient();\n if (!client) {\n return;\n }\n\n registeredTunnelRoutePaths.add(path);\n\n const options = client.getOptions();\n options.ignoreSpans = [\n ...(options.ignoreSpans ?? []),\n { attributes: { 'http.target': new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } },\n ];\n}\n\nexport interface CreateSentryTunnelRouteOptions {\n allowedDsns?: string[];\n}\n\ntype SentryTunnelRouteHandlerContext = {\n request: Request;\n};\n\ntype SentryTunnelRoute = {\n handlers: {\n POST: (context: SentryTunnelRouteHandlerContext) => Promise<Response>;\n };\n};\n\n/**\n * Creates a TanStack Start server route configuration for tunneling Sentry envelopes.\n *\n * @example\n * ```ts\n * import { createFileRoute } from '@tanstack/react-router';\n * import * as Sentry from '@sentry/tanstackstart-react';\n *\n * export const Route = createFileRoute('/monitoring')({\n * server: Sentry.createSentryTunnelRoute({\n * allowedDsns: ['https://public@o0.ingest.sentry.io/0'],\n * }),\n * });\n * ```\n */\nexport function createSentryTunnelRoute(options: CreateSentryTunnelRouteOptions): SentryTunnelRoute {\n return {\n handlers: {\n POST: async ({ request }) => {\n // Self-register the path so the tunnel route's own transaction is dropped: at span-end for the\n // static path, and at span-start for subsequent streamed requests. The first streamed request\n // still leaks here (this runs after its span was sampled); managed routes avoid even that via\n // the startup registration.\n registerSentryServerTunnelRoute(new URL(request.url).pathname);\n\n const allowedDsnsFromOptions = options.allowedDsns?.length ? options.allowedDsns : undefined;\n\n const allowedDsns =\n allowedDsnsFromOptions ??\n (() => {\n const client = getClient();\n const dsn = client?.getDsn();\n return dsn ? [dsnToString(dsn)] : undefined;\n })();\n\n if (!allowedDsns) {\n return new Response(\n 'Tunnel route requires Sentry server SDK initialized with a DSN, or pass allowedDsns explicitly.',\n { status: 500 },\n );\n }\n\n return handleTunnelRequest({\n request,\n allowedDsns,\n });\n },\n },\n };\n}\n"],"names":["getClient","escapeStringForRegex","dsnToString","handleTunnelRequest"],"mappings":";;;;AAEA,MAAM,0BAAA,uBAAiC,GAAA,EAAY;AAO5C,SAAS,gCAAgC,IAAA,EAAoB;AAElE,EAAA,IAAI,0BAAA,CAA2B,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAASA,cAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA;AAAA,EACF;AAEA,EAAA,0BAAA,CAA2B,IAAI,IAAI,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,OAAA,CAAQ,WAAA,GAAc;AAAA,IACpB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC;AAAA,IAC5B,EAAE,UAAA,EAAY,EAAE,aAAA,EAAe,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIC,yBAAA,CAAqB,IAAI,CAAC,CAAA,WAAA,CAAa,CAAA,EAAE;AAAE,GAC3F;AACF;AA+BO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,OAAO,EAAE,OAAA,EAAQ,KAAM;AAK3B,QAAA,+BAAA,CAAgC,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,EAAE,QAAQ,CAAA;AAE7D,QAAA,MAAM,sBAAA,GAAyB,OAAA,CAAQ,WAAA,EAAa,MAAA,GAAS,QAAQ,WAAA,GAAc,MAAA;AAEnF,QAAA,MAAM,WAAA,GACJ,2BACC,MAAM;AACL,UAAA,MAAM,SAASD,cAAA,EAAU;AACzB,UAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,EAAO;AAC3B,UAAA,OAAO,GAAA,GAAM,CAACE,gBAAA,CAAY,GAAG,CAAC,CAAA,GAAI,MAAA;AAAA,QACpC,CAAA,GAAG;AAEL,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,IAAI,QAAA;AAAA,YACT,iGAAA;AAAA,YACA,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAEA,QAAA,OAAOC,wBAAA,CAAoB;AAAA,UACzB,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF;;;;;"}
1
+ {"version":3,"file":"tunnelRoute.js","sources":["../../../src/server/tunnelRoute.ts"],"sourcesContent":["import { URL_PATH } from '@sentry/conventions/attributes';\nimport { dsnToString, escapeStringForRegex, getClient, handleTunnelRequest } from '@sentry/core';\n\nconst registeredTunnelRoutePaths = new Set<string>();\n\n/**\n * Drops the incoming `http.server` transaction for a tunnel route by matching its request path (the\n * `url.path` attribute, set at span creation, so it works for static and streamed lifecycles).\n * Called at server startup for the managed route and from the handler (self-registration) otherwise.\n */\nexport function registerSentryServerTunnelRoute(path: string): void {\n // Dedupe: the route module can be re-evaluated (HMR, multiple import paths).\n if (registeredTunnelRoutePaths.has(path)) {\n return;\n }\n\n const client = getClient();\n if (!client) {\n return;\n }\n\n registeredTunnelRoutePaths.add(path);\n\n const options = client.getOptions();\n options.ignoreSpans = [\n ...(options.ignoreSpans ?? []),\n { attributes: { [URL_PATH]: new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } },\n ];\n}\n\nexport interface CreateSentryTunnelRouteOptions {\n allowedDsns?: string[];\n}\n\ntype SentryTunnelRouteHandlerContext = {\n request: Request;\n};\n\ntype SentryTunnelRoute = {\n handlers: {\n POST: (context: SentryTunnelRouteHandlerContext) => Promise<Response>;\n };\n};\n\n/**\n * Creates a TanStack Start server route configuration for tunneling Sentry envelopes.\n *\n * @example\n * ```ts\n * import { createFileRoute } from '@tanstack/react-router';\n * import * as Sentry from '@sentry/tanstackstart-react';\n *\n * export const Route = createFileRoute('/monitoring')({\n * server: Sentry.createSentryTunnelRoute({\n * allowedDsns: ['https://public@o0.ingest.sentry.io/0'],\n * }),\n * });\n * ```\n */\nexport function createSentryTunnelRoute(options: CreateSentryTunnelRouteOptions): SentryTunnelRoute {\n return {\n handlers: {\n POST: async ({ request }) => {\n // Self-register the path so the tunnel route's own transaction is dropped: at span-end for the\n // static path, and at span-start for subsequent streamed requests. The first streamed request\n // still leaks here (this runs after its span was sampled); managed routes avoid even that via\n // the startup registration.\n registerSentryServerTunnelRoute(new URL(request.url).pathname);\n\n const allowedDsnsFromOptions = options.allowedDsns?.length ? options.allowedDsns : undefined;\n\n const allowedDsns =\n allowedDsnsFromOptions ??\n (() => {\n const client = getClient();\n const dsn = client?.getDsn();\n return dsn ? [dsnToString(dsn)] : undefined;\n })();\n\n if (!allowedDsns) {\n return new Response(\n 'Tunnel route requires Sentry server SDK initialized with a DSN, or pass allowedDsns explicitly.',\n { status: 500 },\n );\n }\n\n return handleTunnelRequest({\n request,\n allowedDsns,\n });\n },\n },\n };\n}\n"],"names":["getClient","URL_PATH","escapeStringForRegex","dsnToString","handleTunnelRequest"],"mappings":";;;;;AAGA,MAAM,0BAAA,uBAAiC,GAAA,EAAY;AAO5C,SAAS,gCAAgC,IAAA,EAAoB;AAElE,EAAA,IAAI,0BAAA,CAA2B,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAASA,cAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA;AAAA,EACF;AAEA,EAAA,0BAAA,CAA2B,IAAI,IAAI,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,OAAA,CAAQ,WAAA,GAAc;AAAA,IACpB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC;AAAA,IAC5B,EAAE,UAAA,EAAY,EAAE,CAACC,mBAAQ,GAAG,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIC,yBAAA,CAAqB,IAAI,CAAC,CAAA,WAAA,CAAa,GAAE;AAAE,GACxF;AACF;AA+BO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,OAAO,EAAE,OAAA,EAAQ,KAAM;AAK3B,QAAA,+BAAA,CAAgC,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,EAAE,QAAQ,CAAA;AAE7D,QAAA,MAAM,sBAAA,GAAyB,OAAA,CAAQ,WAAA,EAAa,MAAA,GAAS,QAAQ,WAAA,GAAc,MAAA;AAEnF,QAAA,MAAM,WAAA,GACJ,2BACC,MAAM;AACL,UAAA,MAAM,SAASF,cAAA,EAAU;AACzB,UAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,EAAO;AAC3B,UAAA,OAAO,GAAA,GAAM,CAACG,gBAAA,CAAY,GAAG,CAAC,CAAA,GAAI,MAAA;AAAA,QACpC,CAAA,GAAG;AAEL,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,IAAI,QAAA;AAAA,YACT,iGAAA;AAAA,YACA,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAEA,QAAA,OAAOC,wBAAA,CAAoB;AAAA,UACzB,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF;;;;;"}
@@ -9,7 +9,7 @@ function getMiddlewareSpanOptions(name) {
9
9
  name,
10
10
  attributes: {
11
11
  [node.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.middleware.tanstackstart",
12
- [attributes.SENTRY_OP]: op.WEB_SERVER_MIDDLEWARE_SPAN_OP
12
+ [attributes.SENTRY_OP]: op.MIDDLEWARE
13
13
  }
14
14
  };
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op';\nimport type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.tanstackstart',\n [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP,\n },\n };\n}\n"],"names":["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SENTRY_OP","WEB_SERVER_MIDDLEWARE_SPAN_OP"],"mappings":";;;;;;AAQO,SAAS,yBAAyB,IAAA,EAAgC;AACvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,CAACA,qCAAgC,GAAG,+BAAA;AAAA,MACpC,CAACC,oBAAS,GAAGC;AAAA;AACf,GACF;AACF;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { MIDDLEWARE } from '@sentry/conventions/op';\nimport type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.tanstackstart',\n [SENTRY_OP]: MIDDLEWARE,\n },\n };\n}\n"],"names":["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SENTRY_OP","MIDDLEWARE"],"mappings":";;;;;;AAQO,SAAS,yBAAyB,IAAA,EAAgC;AACvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,CAACA,qCAAgC,GAAG,+BAAA;AAAA,MACpC,CAACC,oBAAS,GAAGC;AAAA;AACf,GACF;AACF;;;;"}
@@ -1,6 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const core = require('@sentry/core');
4
+ const server = require('@sentry/core/server');
4
5
  const node = require('@sentry/node');
5
6
  const attributes = require('@sentry/conventions/attributes');
6
7
  const op = require('@sentry/conventions/op');
@@ -93,7 +94,7 @@ function wrapFetchWithSentry(serverEntry) {
93
94
  name: `${method} ${url.pathname}`,
94
95
  attributes: {
95
96
  [node.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.tanstackstart.server",
96
- [attributes.SENTRY_OP]: op.WEB_SERVER_FUNCTION_SPAN_OP
97
+ [attributes.SENTRY_OP]: op.FUNCTION
97
98
  }
98
99
  },
99
100
  async () => {
@@ -106,7 +107,7 @@ function wrapFetchWithSentry(serverEntry) {
106
107
  }
107
108
  return injectMetaTagsInResponse(await target.apply(thisArg, args));
108
109
  } finally {
109
- await core.flushIfServerless();
110
+ await server.flushIfServerless();
110
111
  }
111
112
  }
112
113
  });
@@ -1 +1 @@
1
- {"version":3,"file":"wrapFetchWithSentry.js","sources":["../../../src/server/wrapFetchWithSentry.ts"],"sourcesContent":["import { flushIfServerless, getTraceMetaTags } from '@sentry/core';\nimport { captureException, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { WEB_SERVER_FUNCTION_SPAN_OP } from '@sentry/conventions/op';\nimport { updateSpanWithRouteParametrization } from './routeParametrization';\n\ndeclare const __SENTRY_ROUTE_PATTERNS__: string[] | undefined;\n\nexport type ServerEntry = {\n // `opts` is forwarded verbatim to the wrapped handler, so this must accept whatever shape\n // the real framework entry uses (e.g. TanStack's `RequestOptions<Register>`). Under\n // parameter contravariance `unknown` would reject such an entry; `any` keeps it assignable.\n // oxlint-disable-next-line typescript/no-explicit-any\n fetch: (request: Request, opts?: any) => Promise<Response> | Response;\n};\n\n/**\n * This function optimistically assumes that the HTML coming in chunks will not be split\n * within the <head> tag. If this still happens, we simply won't replace anything.\n */\nfunction addMetaTagToHead(htmlChunk: string, metaTagsStr: string): string {\n if (typeof htmlChunk !== 'string' || !metaTagsStr) {\n return htmlChunk;\n }\n\n if (htmlChunk.includes('\"sentry-trace\"')) {\n return htmlChunk;\n }\n\n // Skip quoted attribute values so we don't match <head> inside e.g. data-code=\"...<head>...\"\n let replaced = false;\n return htmlChunk.replace(/\"[^\"]*\"|'[^']*'|(<head>)/g, (match, headTag) => {\n if (headTag && !replaced) {\n replaced = true;\n return `<head>${metaTagsStr}`;\n }\n return match;\n });\n}\n\nfunction injectMetaTagsInResponse(originalResponse: Response): Response {\n try {\n const contentType = originalResponse.headers.get('content-type');\n\n const isPageloadRequest = contentType?.startsWith('text/html');\n if (!isPageloadRequest) {\n return originalResponse;\n }\n\n // Type case necessary b/c the body's ReadableStream type doesn't include\n // the async iterator that is actually available in Node\n // We later on use the async iterator to read the body chunks\n // see https://github.com/microsoft/TypeScript/issues/39051\n const originalBody = originalResponse.body as NodeJS.ReadableStream | null;\n if (!originalBody) {\n return originalResponse;\n }\n\n const metaTagsStr = getTraceMetaTags();\n const decoder = new TextDecoder();\n\n const newResponseStream = new ReadableStream({\n start: async controller => {\n // Assign to a new variable to avoid TS losing the narrower type checked above.\n const body = originalBody;\n\n async function* bodyReporter(): AsyncGenerator<string | Buffer> {\n try {\n for await (const chunk of body) {\n yield chunk;\n }\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n }\n\n let errored = false;\n try {\n for await (const chunk of bodyReporter()) {\n const html = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n const modifiedHtml = addMetaTagToHead(html, metaTagsStr);\n controller.enqueue(new TextEncoder().encode(modifiedHtml));\n }\n } catch (e) {\n errored = true;\n controller.error(e);\n } finally {\n if (!errored) {\n controller.close();\n }\n }\n },\n });\n\n return new Response(newResponseStream, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: new Headers(originalResponse.headers),\n });\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n}\n\n/**\n * This function can be used to wrap the server entry request handler to add tracing to server-side functionality.\n * You must explicitly define a server entry point in your application for this to work. This is done by passing the request handler to the `createServerEntry` function.\n * For more information about the server entry point, see the [TanStack Start documentation](https://tanstack.com/start/docs/server-entry).\n *\n * @example\n * ```ts\n * import { wrapFetchWithSentry } from '@sentry/tanstackstart-react';\n *\n * import handler, { createServerEntry } from '@tanstack/react-start/server-entry';\n * import type { ServerEntry } from '@tanstack/react-start/server-entry';\n *\n * const requestHandler: ServerEntry = wrapFetchWithSentry({\n * fetch(request: Request) {\n * return handler.fetch(request);\n * },\n * });\n *\n * export default serverEntry = createServerEntry(requestHandler);\n * ```\n *\n * @param serverEntry - request handler to wrap\n * @returns - wrapped request handler\n */\nexport function wrapFetchWithSentry(serverEntry: ServerEntry): ServerEntry {\n if (serverEntry.fetch) {\n serverEntry.fetch = new Proxy<typeof serverEntry.fetch>(serverEntry.fetch, {\n async apply(target, thisArg, args) {\n try {\n const request: Request = args[0];\n const url = new URL(request.url);\n const method = request.method || 'GET';\n\n // instrument server functions\n if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) {\n return await startSpan(\n {\n name: `${method} ${url.pathname}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server',\n [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP,\n },\n },\n async () => {\n return target.apply(thisArg, args);\n },\n );\n }\n\n if (typeof __SENTRY_ROUTE_PATTERNS__ !== 'undefined') {\n updateSpanWithRouteParametrization(method, url.pathname, __SENTRY_ROUTE_PATTERNS__);\n }\n\n return injectMetaTagsInResponse(await target.apply(thisArg, args));\n } finally {\n await flushIfServerless();\n }\n },\n });\n }\n return serverEntry;\n}\n"],"names":["getTraceMetaTags","captureException","startSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SENTRY_OP","WEB_SERVER_FUNCTION_SPAN_OP","updateSpanWithRouteParametrization","flushIfServerless"],"mappings":"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"}
1
+ {"version":3,"file":"wrapFetchWithSentry.js","sources":["../../../src/server/wrapFetchWithSentry.ts"],"sourcesContent":["import { getTraceMetaTags } from '@sentry/core';\nimport { flushIfServerless } from '@sentry/core/server';\nimport { captureException, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { FUNCTION } from '@sentry/conventions/op';\nimport { updateSpanWithRouteParametrization } from './routeParametrization';\n\ndeclare const __SENTRY_ROUTE_PATTERNS__: string[] | undefined;\n\nexport type ServerEntry = {\n // `opts` is forwarded verbatim to the wrapped handler, so this must accept whatever shape\n // the real framework entry uses (e.g. TanStack's `RequestOptions<Register>`). Under\n // parameter contravariance `unknown` would reject such an entry; `any` keeps it assignable.\n // oxlint-disable-next-line typescript/no-explicit-any\n fetch: (request: Request, opts?: any) => Promise<Response> | Response;\n};\n\n/**\n * This function optimistically assumes that the HTML coming in chunks will not be split\n * within the <head> tag. If this still happens, we simply won't replace anything.\n */\nfunction addMetaTagToHead(htmlChunk: string, metaTagsStr: string): string {\n if (typeof htmlChunk !== 'string' || !metaTagsStr) {\n return htmlChunk;\n }\n\n if (htmlChunk.includes('\"sentry-trace\"')) {\n return htmlChunk;\n }\n\n // Skip quoted attribute values so we don't match <head> inside e.g. data-code=\"...<head>...\"\n let replaced = false;\n return htmlChunk.replace(/\"[^\"]*\"|'[^']*'|(<head>)/g, (match, headTag) => {\n if (headTag && !replaced) {\n replaced = true;\n return `<head>${metaTagsStr}`;\n }\n return match;\n });\n}\n\nfunction injectMetaTagsInResponse(originalResponse: Response): Response {\n try {\n const contentType = originalResponse.headers.get('content-type');\n\n const isPageloadRequest = contentType?.startsWith('text/html');\n if (!isPageloadRequest) {\n return originalResponse;\n }\n\n // Type case necessary b/c the body's ReadableStream type doesn't include\n // the async iterator that is actually available in Node\n // We later on use the async iterator to read the body chunks\n // see https://github.com/microsoft/TypeScript/issues/39051\n const originalBody = originalResponse.body as NodeJS.ReadableStream | null;\n if (!originalBody) {\n return originalResponse;\n }\n\n const metaTagsStr = getTraceMetaTags();\n const decoder = new TextDecoder();\n\n const newResponseStream = new ReadableStream({\n start: async controller => {\n // Assign to a new variable to avoid TS losing the narrower type checked above.\n const body = originalBody;\n\n async function* bodyReporter(): AsyncGenerator<string | Buffer> {\n try {\n for await (const chunk of body) {\n yield chunk;\n }\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n }\n\n let errored = false;\n try {\n for await (const chunk of bodyReporter()) {\n const html = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n const modifiedHtml = addMetaTagToHead(html, metaTagsStr);\n controller.enqueue(new TextEncoder().encode(modifiedHtml));\n }\n } catch (e) {\n errored = true;\n controller.error(e);\n } finally {\n if (!errored) {\n controller.close();\n }\n }\n },\n });\n\n return new Response(newResponseStream, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: new Headers(originalResponse.headers),\n });\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n}\n\n/**\n * This function can be used to wrap the server entry request handler to add tracing to server-side functionality.\n * You must explicitly define a server entry point in your application for this to work. This is done by passing the request handler to the `createServerEntry` function.\n * For more information about the server entry point, see the [TanStack Start documentation](https://tanstack.com/start/docs/server-entry).\n *\n * @example\n * ```ts\n * import { wrapFetchWithSentry } from '@sentry/tanstackstart-react';\n *\n * import handler, { createServerEntry } from '@tanstack/react-start/server-entry';\n * import type { ServerEntry } from '@tanstack/react-start/server-entry';\n *\n * const requestHandler: ServerEntry = wrapFetchWithSentry({\n * fetch(request: Request) {\n * return handler.fetch(request);\n * },\n * });\n *\n * export default serverEntry = createServerEntry(requestHandler);\n * ```\n *\n * @param serverEntry - request handler to wrap\n * @returns - wrapped request handler\n */\nexport function wrapFetchWithSentry(serverEntry: ServerEntry): ServerEntry {\n if (serverEntry.fetch) {\n serverEntry.fetch = new Proxy<typeof serverEntry.fetch>(serverEntry.fetch, {\n async apply(target, thisArg, args) {\n try {\n const request: Request = args[0];\n const url = new URL(request.url);\n const method = request.method || 'GET';\n\n // instrument server functions\n if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) {\n return await startSpan(\n {\n name: `${method} ${url.pathname}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server',\n [SENTRY_OP]: FUNCTION,\n },\n },\n async () => {\n return target.apply(thisArg, args);\n },\n );\n }\n\n if (typeof __SENTRY_ROUTE_PATTERNS__ !== 'undefined') {\n updateSpanWithRouteParametrization(method, url.pathname, __SENTRY_ROUTE_PATTERNS__);\n }\n\n return injectMetaTagsInResponse(await target.apply(thisArg, args));\n } finally {\n await flushIfServerless();\n }\n },\n });\n }\n return serverEntry;\n}\n"],"names":["getTraceMetaTags","captureException","startSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SENTRY_OP","FUNCTION","updateSpanWithRouteParametrization","flushIfServerless"],"mappings":"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"}
@@ -10,6 +10,7 @@ function makeAddSentryVitePlugin(options) {
10
10
  debug,
11
11
  errorHandler,
12
12
  headers,
13
+ moduleMetadata,
13
14
  org,
14
15
  project,
15
16
  release,
@@ -48,6 +49,7 @@ function makeAddSentryVitePlugin(options) {
48
49
  debug: debug ?? false,
49
50
  errorHandler,
50
51
  headers,
52
+ moduleMetadata,
51
53
  org: org ?? process.env.SENTRY_ORG,
52
54
  project: project ?? process.env.SENTRY_PROJECT,
53
55
  release,
@@ -56,9 +58,8 @@ function makeAddSentryVitePlugin(options) {
56
58
  assets: sourcemaps?.assets,
57
59
  disable: sourcemaps?.disable,
58
60
  ignore: sourcemaps?.ignore,
59
- // BuildTimeOptionsBase types can lag behind bundler plugin options in some local setups.
60
- // Keep runtime support while staying resilient to type version skew.
61
61
  rewriteSources: sourcemaps?.rewriteSources,
62
+ resolveSourceMap: sourcemaps?.resolveSourceMap,
62
63
  filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise
63
64
  },
64
65
  reactComponentAnnotation: {
@@ -1 +1 @@
1
- {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import { sentryVitePlugin } from '@sentry/bundler-plugins/vite';\nimport type { Plugin, UserConfig } from 'vite';\nimport type { SentryTanstackStartOptions } from './sentryTanstackStart';\n\ntype FilesToDeleteAfterUpload = string | string[] | undefined;\n\n/**\n * A Sentry plugin for adding the @sentry/bundler-plugins/vite to automatically upload source maps to Sentry.\n */\nexport function makeAddSentryVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n const {\n applicationKey,\n authToken,\n bundleSizeOptimizations,\n debug,\n errorHandler,\n headers,\n org,\n project,\n release,\n sentryUrl,\n silent,\n sourcemaps,\n telemetry,\n reactComponentAnnotation,\n } = options;\n\n // defer resolving the filesToDeleteAfterUpload until we got access to the Vite config\n let resolveFilesToDeleteAfterUpload: ((value: FilesToDeleteAfterUpload) => void) | undefined;\n const filesToDeleteAfterUploadPromise = new Promise<FilesToDeleteAfterUpload>(resolve => {\n resolveFilesToDeleteAfterUpload = resolve;\n });\n\n const configPlugin: Plugin = {\n name: 'sentry-tanstackstart-files-to-delete-after-upload-plugin',\n apply: 'build',\n enforce: 'post',\n config(config) {\n const userFilesToDelete = sourcemaps?.filesToDeleteAfterUpload;\n\n // Only auto-delete source maps if the user didn't configure sourcemaps at all\n if (typeof userFilesToDelete === 'undefined' && typeof config.build?.sourcemap === 'undefined') {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Automatically setting `sourcemaps.filesToDeleteAfterUpload: [\"./**/*.map\"]` to delete generated source maps after they were uploaded to Sentry.',\n );\n }\n resolveFilesToDeleteAfterUpload?.(['./**/*.map']);\n } else {\n resolveFilesToDeleteAfterUpload?.(userFilesToDelete);\n }\n },\n };\n\n const sentryPlugins = sentryVitePlugin({\n applicationKey,\n authToken: authToken ?? process.env.SENTRY_AUTH_TOKEN,\n bundleSizeOptimizations: bundleSizeOptimizations ?? undefined,\n debug: debug ?? false,\n errorHandler,\n headers,\n org: org ?? process.env.SENTRY_ORG,\n project: project ?? process.env.SENTRY_PROJECT,\n release,\n silent,\n sourcemaps: {\n assets: sourcemaps?.assets,\n disable: sourcemaps?.disable,\n ignore: sourcemaps?.ignore,\n // BuildTimeOptionsBase types can lag behind bundler plugin options in some local setups.\n // Keep runtime support while staying resilient to type version skew.\n rewriteSources: (sourcemaps as unknown as { rewriteSources?: unknown } | undefined)?.rewriteSources as never,\n filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,\n },\n reactComponentAnnotation: {\n enabled: reactComponentAnnotation?.enabled ?? undefined,\n ignoredComponents: reactComponentAnnotation?.ignoredComponents ?? undefined,\n },\n telemetry: telemetry ?? true,\n url: sentryUrl,\n _metaOptions: {\n telemetry: {\n metaFramework: 'tanstackstart-react',\n },\n },\n });\n\n return [configPlugin, ...sentryPlugins];\n}\n\n/**\n * A Sentry plugin for TanStack Start React to enable \"hidden\" source maps if they are unset.\n */\nexport function makeEnableSourceMapsVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n return [\n {\n name: 'sentry-tanstackstart-react-source-maps',\n apply: 'build',\n enforce: 'post',\n config(viteConfig) {\n return {\n ...viteConfig,\n build: {\n ...viteConfig.build,\n sourcemap: getUpdatedSourceMapSettings(viteConfig, options),\n },\n };\n },\n },\n ];\n}\n\n/** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)\n *\n * 1. User explicitly disabled source maps\n * - keep this setting (emit a warning that errors won't be unminified in Sentry)\n * - We won't upload anything\n *\n * 2. Users enabled source map generation (true, 'hidden', 'inline').\n * - keep this setting (don't do anything - like deletion - besides uploading)\n *\n * 3. Users didn't set source maps generation\n * - we enable 'hidden' source maps generation\n * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n *\n * --> only exported for testing\n */\nexport function getUpdatedSourceMapSettings(\n viteConfig: UserConfig,\n sentryPluginOptions?: SentryTanstackStartOptions,\n): boolean | 'inline' | 'hidden' {\n viteConfig.build = viteConfig.build || {};\n\n const viteUserSourceMapSetting = viteConfig.build?.sourcemap;\n const settingKey = 'vite.build.sourcemap';\n const debug = sentryPluginOptions?.debug;\n\n // Respect user source map setting if it is explicitly set\n if (viteUserSourceMapSetting === false) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your TanStack Start configuration (\\`${settingKey}: false\\`). Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Source map generation is disabled in your TanStack Start configuration.');\n }\n\n return viteUserSourceMapSetting;\n } else if (viteUserSourceMapSetting && ['hidden', 'inline', true].includes(viteUserSourceMapSetting)) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`${viteUserSourceMapSetting.toString()}\\`. Sentry will keep this source map setting.`,\n );\n }\n\n return viteUserSourceMapSetting;\n }\n\n // If the user did not specify a source map setting, we enable 'hidden' by default\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Enabled source map generation in the build options with \\`${settingKey}: 'hidden'\\`. The source maps will be deleted after they were uploaded to Sentry.`,\n );\n }\n\n return 'hidden';\n}\n"],"names":["sentryVitePlugin"],"mappings":"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"}
1
+ {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import { sentryVitePlugin } from '@sentry/bundler-plugins/vite';\nimport type { Plugin, UserConfig } from 'vite';\nimport type { SentryTanstackStartOptions } from './sentryTanstackStart';\n\ntype FilesToDeleteAfterUpload = string | string[] | undefined;\n\n/**\n * A Sentry plugin for adding the @sentry/bundler-plugins/vite to automatically upload source maps to Sentry.\n */\nexport function makeAddSentryVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n const {\n applicationKey,\n authToken,\n bundleSizeOptimizations,\n debug,\n errorHandler,\n headers,\n moduleMetadata,\n org,\n project,\n release,\n sentryUrl,\n silent,\n sourcemaps,\n telemetry,\n reactComponentAnnotation,\n } = options;\n\n // defer resolving the filesToDeleteAfterUpload until we got access to the Vite config\n let resolveFilesToDeleteAfterUpload: ((value: FilesToDeleteAfterUpload) => void) | undefined;\n const filesToDeleteAfterUploadPromise = new Promise<FilesToDeleteAfterUpload>(resolve => {\n resolveFilesToDeleteAfterUpload = resolve;\n });\n\n const configPlugin: Plugin = {\n name: 'sentry-tanstackstart-files-to-delete-after-upload-plugin',\n apply: 'build',\n enforce: 'post',\n config(config) {\n const userFilesToDelete = sourcemaps?.filesToDeleteAfterUpload;\n\n // Only auto-delete source maps if the user didn't configure sourcemaps at all\n if (typeof userFilesToDelete === 'undefined' && typeof config.build?.sourcemap === 'undefined') {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Automatically setting `sourcemaps.filesToDeleteAfterUpload: [\"./**/*.map\"]` to delete generated source maps after they were uploaded to Sentry.',\n );\n }\n resolveFilesToDeleteAfterUpload?.(['./**/*.map']);\n } else {\n resolveFilesToDeleteAfterUpload?.(userFilesToDelete);\n }\n },\n };\n\n const sentryPlugins = sentryVitePlugin({\n applicationKey,\n authToken: authToken ?? process.env.SENTRY_AUTH_TOKEN,\n bundleSizeOptimizations: bundleSizeOptimizations ?? undefined,\n debug: debug ?? false,\n errorHandler,\n headers,\n moduleMetadata,\n org: org ?? process.env.SENTRY_ORG,\n project: project ?? process.env.SENTRY_PROJECT,\n release,\n silent,\n sourcemaps: {\n assets: sourcemaps?.assets,\n disable: sourcemaps?.disable,\n ignore: sourcemaps?.ignore,\n rewriteSources: sourcemaps?.rewriteSources,\n resolveSourceMap: sourcemaps?.resolveSourceMap,\n filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,\n },\n reactComponentAnnotation: {\n enabled: reactComponentAnnotation?.enabled ?? undefined,\n ignoredComponents: reactComponentAnnotation?.ignoredComponents ?? undefined,\n },\n telemetry: telemetry ?? true,\n url: sentryUrl,\n _metaOptions: {\n telemetry: {\n metaFramework: 'tanstackstart-react',\n },\n },\n });\n\n return [configPlugin, ...sentryPlugins];\n}\n\n/**\n * A Sentry plugin for TanStack Start React to enable \"hidden\" source maps if they are unset.\n */\nexport function makeEnableSourceMapsVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n return [\n {\n name: 'sentry-tanstackstart-react-source-maps',\n apply: 'build',\n enforce: 'post',\n config(viteConfig) {\n return {\n ...viteConfig,\n build: {\n ...viteConfig.build,\n sourcemap: getUpdatedSourceMapSettings(viteConfig, options),\n },\n };\n },\n },\n ];\n}\n\n/** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)\n *\n * 1. User explicitly disabled source maps\n * - keep this setting (emit a warning that errors won't be unminified in Sentry)\n * - We won't upload anything\n *\n * 2. Users enabled source map generation (true, 'hidden', 'inline').\n * - keep this setting (don't do anything - like deletion - besides uploading)\n *\n * 3. Users didn't set source maps generation\n * - we enable 'hidden' source maps generation\n * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n *\n * --> only exported for testing\n */\nexport function getUpdatedSourceMapSettings(\n viteConfig: UserConfig,\n sentryPluginOptions?: SentryTanstackStartOptions,\n): boolean | 'inline' | 'hidden' {\n viteConfig.build = viteConfig.build || {};\n\n const viteUserSourceMapSetting = viteConfig.build?.sourcemap;\n const settingKey = 'vite.build.sourcemap';\n const debug = sentryPluginOptions?.debug;\n\n // Respect user source map setting if it is explicitly set\n if (viteUserSourceMapSetting === false) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your TanStack Start configuration (\\`${settingKey}: false\\`). Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Source map generation is disabled in your TanStack Start configuration.');\n }\n\n return viteUserSourceMapSetting;\n } else if (viteUserSourceMapSetting && ['hidden', 'inline', true].includes(viteUserSourceMapSetting)) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`${viteUserSourceMapSetting.toString()}\\`. Sentry will keep this source map setting.`,\n );\n }\n\n return viteUserSourceMapSetting;\n }\n\n // If the user did not specify a source map setting, we enable 'hidden' by default\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Enabled source map generation in the build options with \\`${settingKey}: 'hidden'\\`. The source maps will be deleted after they were uploaded to Sentry.`,\n );\n }\n\n return 'hidden';\n}\n"],"names":["sentryVitePlugin"],"mappings":"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"}
@@ -1 +1 @@
1
- {"type":"module","version":"11.0.0-alpha.1","sideEffects":false}
1
+ {"type":"module","version":"11.0.0-beta.0","sideEffects":false}
@@ -1,6 +1,6 @@
1
- import { addNonEnumerableProperty, captureException, getActiveSpan, spanToJSON, updateSpanName, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
1
+ import { addNonEnumerableProperty, captureException, getActiveSpan, spanToJSON, updateSpanName } from '@sentry/core';
2
2
  import { SENTRY_INTERNAL } from './middleware.js';
3
- import { SENTRY_ORIGIN } from '@sentry/conventions/attributes';
3
+ import { SENTRY_ORIGIN, SENTRY_SEGMENT_NAME_SOURCE } from '@sentry/conventions/attributes';
4
4
 
5
5
  function createSentryMiddlewareHandler(mechanismType) {
6
6
  return async function sentryMiddlewareHandler({ next }) {
@@ -25,7 +25,7 @@ function createSentryFunctionMiddlewareHandler(mechanismType) {
25
25
  if (serverFnMeta?.name) {
26
26
  const method = spanData.name.split(" ")[0] || "GET";
27
27
  updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);
28
- activeSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
28
+ activeSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, "route");
29
29
  }
30
30
  if (serverFnMeta?.id) {
31
31
  activeSpan.setAttribute("tanstackstart.function.id", serverFnMeta.id);
@@ -1 +1 @@
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 { SentryGlobalFunctionMiddleware, SentryGlobalRequestMiddleware } from '../common/types';\nimport { SENTRY_INTERNAL } from './middleware';\nimport { SENTRY_ORIGIN } from '@sentry/conventions/attributes';\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?.attributes[SENTRY_ORIGIN] === 'auto.function.tanstackstart.server') {\n if (serverFnMeta?.name) {\n const method = spanData.name.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: SentryGlobalRequestMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalRequestMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalRequestMiddleware['_types'],\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: SentryGlobalFunctionMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalFunctionMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalFunctionMiddleware['_types'],\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":[],"mappings":";;;;AAkBA,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,MAAA,gBAAA,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,aAAa,aAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,UAAU,CAAA,GAAI,MAAA;AACvD,IAAA,IAAI,UAAA,IAAc,QAAA,EAAU,UAAA,CAAW,aAAa,MAAM,oCAAA,EAAsC;AAC9F,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC9C,QAAA,cAAA,CAAe,YAAY,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,UAAA,CAAW,YAAA,CAAa,kCAAkC,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,MAAA,gBAAA,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,GAA+D;AAAA;AAAA,EAE1E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,8BAA8B,uCAAuC;AAAA;AAEjF;AAMO,MAAM,8BAAA,GAAiE;AAAA;AAAA,EAE5E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,sCAAsC,+CAA+C;AAAA;AAAA;AAIjG;AAGA,wBAAA,CAAyB,6BAAA,EAA+B,iBAAiB,IAAI,CAAA;AAC7E,wBAAA,CAAyB,8BAAA,EAAgC,iBAAiB,IAAI,CAAA;;;;"}
1
+ {"version":3,"file":"globalMiddleware.js","sources":["../../../src/server/globalMiddleware.ts"],"sourcesContent":["import { addNonEnumerableProperty, captureException, getActiveSpan, spanToJSON, updateSpanName } from '@sentry/core';\nimport type { SentryGlobalFunctionMiddleware, SentryGlobalRequestMiddleware } from '../common/types';\nimport { SENTRY_INTERNAL } from './middleware';\nimport { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\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?.attributes[SENTRY_ORIGIN] === 'auto.function.tanstackstart.server') {\n if (serverFnMeta?.name) {\n const method = spanData.name.split(' ')[0] || 'GET';\n updateSpanName(activeSpan, `${method} /_serverFn/${serverFnMeta.name}`);\n activeSpan.setAttribute(SENTRY_SEGMENT_NAME_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: SentryGlobalRequestMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalRequestMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalRequestMiddleware['_types'],\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: SentryGlobalFunctionMiddleware = {\n // `~types`/`_types` only exist on the type level in TanStack Start middlewares and hold no runtime value\n '~types': undefined as unknown as SentryGlobalFunctionMiddleware['~types'],\n _types: undefined as unknown as SentryGlobalFunctionMiddleware['_types'],\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":[],"mappings":";;;;AAWA,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,MAAA,gBAAA,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,aAAa,aAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,UAAU,CAAA,GAAI,MAAA;AACvD,IAAA,IAAI,UAAA,IAAc,QAAA,EAAU,UAAA,CAAW,aAAa,MAAM,oCAAA,EAAsC;AAC9F,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC9C,QAAA,cAAA,CAAe,YAAY,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,UAAA,CAAW,YAAA,CAAa,4BAA4B,OAAO,CAAA;AAAA,MAC7D;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,MAAA,gBAAA,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,GAA+D;AAAA;AAAA,EAE1E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,8BAA8B,uCAAuC;AAAA;AAEjF;AAMO,MAAM,8BAAA,GAAiE;AAAA;AAAA,EAE5E,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EAER,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,sCAAsC,+CAA+C;AAAA;AAAA;AAIjG;AAGA,wBAAA,CAAyB,6BAAA,EAA+B,iBAAiB,IAAI,CAAA;AAC7E,wBAAA,CAAyB,8BAAA,EAAgC,iBAAiB,IAAI,CAAA;;;;"}
@@ -1,5 +1,5 @@
1
- import { HTTP_ROUTE } from '@sentry/conventions/attributes';
2
- import { getActiveSpan, getRootSpan, spanToJSON, updateSpanName, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, getCurrentScope, escapeStringForRegex } from '@sentry/core';
1
+ import { HTTP_ROUTE, SENTRY_SEGMENT_NAME_SOURCE } from '@sentry/conventions/attributes';
2
+ import { getActiveSpan, getRootSpan, spanToJSON, updateSpanName, getCurrentScope, escapeStringForRegex } from '@sentry/core';
3
3
 
4
4
  function patternToRegex(pattern) {
5
5
  const segments = pattern.split("/").map((segment) => {
@@ -36,7 +36,7 @@ function updateSpanWithRouteParametrization(method, pathname, patterns) {
36
36
  const transactionName = `${method} ${matchedPattern}`;
37
37
  updateSpanName(rootSpan, transactionName);
38
38
  rootSpan.setAttribute(HTTP_ROUTE, matchedPattern);
39
- rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
39
+ rootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, "route");
40
40
  getCurrentScope().setTransactionName(transactionName);
41
41
  }
42
42
 
@@ -1 +1 @@
1
- {"version":3,"file":"routeParametrization.js","sources":["../../../src/server/routeParametrization.ts"],"sourcesContent":["import { HTTP_ROUTE } from '@sentry/conventions/attributes';\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).attributes;\n if (rootSpanData?.[HTTP_ROUTE]) {\n return;\n }\n\n const transactionName = `${method} ${matchedPattern}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttribute(HTTP_ROUTE, matchedPattern);\n rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":[],"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,OAAO,qBAAqB,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,aAAa,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,QAAQ,CAAA,CAAE,UAAA;AAC1C,EAAA,IAAI,YAAA,GAAe,UAAU,CAAA,EAAG;AAC9B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACnD,EAAA,cAAA,CAAe,UAAU,eAAe,CAAA;AACxC,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,cAAc,CAAA;AAChD,EAAA,QAAA,CAAS,YAAA,CAAa,kCAAkC,OAAO,CAAA;AAC/D,EAAA,eAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AACtD;;;;"}
1
+ {"version":3,"file":"routeParametrization.js","sources":["../../../src/server/routeParametrization.ts"],"sourcesContent":["import { SENTRY_SEGMENT_NAME_SOURCE, HTTP_ROUTE } from '@sentry/conventions/attributes';\nimport {\n escapeStringForRegex,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\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).attributes;\n if (rootSpanData?.[HTTP_ROUTE]) {\n return;\n }\n\n const transactionName = `${method} ${matchedPattern}`;\n updateSpanName(rootSpan, transactionName);\n rootSpan.setAttribute(HTTP_ROUTE, matchedPattern);\n rootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, 'route');\n getCurrentScope().setTransactionName(transactionName);\n}\n"],"names":[],"mappings":";;;AAUA,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,OAAO,qBAAqB,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,aAAa,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,QAAQ,CAAA,CAAE,UAAA;AAC1C,EAAA,IAAI,YAAA,GAAe,UAAU,CAAA,EAAG;AAC9B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACnD,EAAA,cAAA,CAAe,UAAU,eAAe,CAAA;AACxC,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,cAAc,CAAA;AAChD,EAAA,QAAA,CAAS,YAAA,CAAa,4BAA4B,OAAO,CAAA;AACzD,EAAA,eAAA,EAAgB,CAAE,mBAAmB,eAAe,CAAA;AACtD;;;;"}
@@ -1,3 +1,4 @@
1
+ import { URL_PATH } from '@sentry/conventions/attributes';
1
2
  import { getClient, dsnToString, handleTunnelRequest, escapeStringForRegex } from '@sentry/core';
2
3
 
3
4
  const registeredTunnelRoutePaths = /* @__PURE__ */ new Set();
@@ -13,7 +14,7 @@ function registerSentryServerTunnelRoute(path) {
13
14
  const options = client.getOptions();
14
15
  options.ignoreSpans = [
15
16
  ...options.ignoreSpans ?? [],
16
- { attributes: { "http.target": new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } }
17
+ { attributes: { [URL_PATH]: new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } }
17
18
  ];
18
19
  }
19
20
  function createSentryTunnelRoute(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"tunnelRoute.js","sources":["../../../src/server/tunnelRoute.ts"],"sourcesContent":["import { dsnToString, escapeStringForRegex, getClient, handleTunnelRequest } from '@sentry/core';\n\nconst registeredTunnelRoutePaths = new Set<string>();\n\n/**\n * Drops the incoming `http.server` transaction for a tunnel route by matching its request path (the\n * `http.target` attribute, set at span creation, so it works for static and streamed lifecycles).\n * Called at server startup for the managed route and from the handler (self-registration) otherwise.\n */\nexport function registerSentryServerTunnelRoute(path: string): void {\n // Dedupe: the route module can be re-evaluated (HMR, multiple import paths).\n if (registeredTunnelRoutePaths.has(path)) {\n return;\n }\n\n const client = getClient();\n if (!client) {\n return;\n }\n\n registeredTunnelRoutePaths.add(path);\n\n const options = client.getOptions();\n options.ignoreSpans = [\n ...(options.ignoreSpans ?? []),\n { attributes: { 'http.target': new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } },\n ];\n}\n\nexport interface CreateSentryTunnelRouteOptions {\n allowedDsns?: string[];\n}\n\ntype SentryTunnelRouteHandlerContext = {\n request: Request;\n};\n\ntype SentryTunnelRoute = {\n handlers: {\n POST: (context: SentryTunnelRouteHandlerContext) => Promise<Response>;\n };\n};\n\n/**\n * Creates a TanStack Start server route configuration for tunneling Sentry envelopes.\n *\n * @example\n * ```ts\n * import { createFileRoute } from '@tanstack/react-router';\n * import * as Sentry from '@sentry/tanstackstart-react';\n *\n * export const Route = createFileRoute('/monitoring')({\n * server: Sentry.createSentryTunnelRoute({\n * allowedDsns: ['https://public@o0.ingest.sentry.io/0'],\n * }),\n * });\n * ```\n */\nexport function createSentryTunnelRoute(options: CreateSentryTunnelRouteOptions): SentryTunnelRoute {\n return {\n handlers: {\n POST: async ({ request }) => {\n // Self-register the path so the tunnel route's own transaction is dropped: at span-end for the\n // static path, and at span-start for subsequent streamed requests. The first streamed request\n // still leaks here (this runs after its span was sampled); managed routes avoid even that via\n // the startup registration.\n registerSentryServerTunnelRoute(new URL(request.url).pathname);\n\n const allowedDsnsFromOptions = options.allowedDsns?.length ? options.allowedDsns : undefined;\n\n const allowedDsns =\n allowedDsnsFromOptions ??\n (() => {\n const client = getClient();\n const dsn = client?.getDsn();\n return dsn ? [dsnToString(dsn)] : undefined;\n })();\n\n if (!allowedDsns) {\n return new Response(\n 'Tunnel route requires Sentry server SDK initialized with a DSN, or pass allowedDsns explicitly.',\n { status: 500 },\n );\n }\n\n return handleTunnelRequest({\n request,\n allowedDsns,\n });\n },\n },\n };\n}\n"],"names":[],"mappings":";;AAEA,MAAM,0BAAA,uBAAiC,GAAA,EAAY;AAO5C,SAAS,gCAAgC,IAAA,EAAoB;AAElE,EAAA,IAAI,0BAAA,CAA2B,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA;AAAA,EACF;AAEA,EAAA,0BAAA,CAA2B,IAAI,IAAI,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,OAAA,CAAQ,WAAA,GAAc;AAAA,IACpB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC;AAAA,IAC5B,EAAE,UAAA,EAAY,EAAE,aAAA,EAAe,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,IAAI,CAAC,CAAA,WAAA,CAAa,CAAA,EAAE;AAAE,GAC3F;AACF;AA+BO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,OAAO,EAAE,OAAA,EAAQ,KAAM;AAK3B,QAAA,+BAAA,CAAgC,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,EAAE,QAAQ,CAAA;AAE7D,QAAA,MAAM,sBAAA,GAAyB,OAAA,CAAQ,WAAA,EAAa,MAAA,GAAS,QAAQ,WAAA,GAAc,MAAA;AAEnF,QAAA,MAAM,WAAA,GACJ,2BACC,MAAM;AACL,UAAA,MAAM,SAAS,SAAA,EAAU;AACzB,UAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,EAAO;AAC3B,UAAA,OAAO,GAAA,GAAM,CAAC,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,MAAA;AAAA,QACpC,CAAA,GAAG;AAEL,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,IAAI,QAAA;AAAA,YACT,iGAAA;AAAA,YACA,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAEA,QAAA,OAAO,mBAAA,CAAoB;AAAA,UACzB,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF;;;;"}
1
+ {"version":3,"file":"tunnelRoute.js","sources":["../../../src/server/tunnelRoute.ts"],"sourcesContent":["import { URL_PATH } from '@sentry/conventions/attributes';\nimport { dsnToString, escapeStringForRegex, getClient, handleTunnelRequest } from '@sentry/core';\n\nconst registeredTunnelRoutePaths = new Set<string>();\n\n/**\n * Drops the incoming `http.server` transaction for a tunnel route by matching its request path (the\n * `url.path` attribute, set at span creation, so it works for static and streamed lifecycles).\n * Called at server startup for the managed route and from the handler (self-registration) otherwise.\n */\nexport function registerSentryServerTunnelRoute(path: string): void {\n // Dedupe: the route module can be re-evaluated (HMR, multiple import paths).\n if (registeredTunnelRoutePaths.has(path)) {\n return;\n }\n\n const client = getClient();\n if (!client) {\n return;\n }\n\n registeredTunnelRoutePaths.add(path);\n\n const options = client.getOptions();\n options.ignoreSpans = [\n ...(options.ignoreSpans ?? []),\n { attributes: { [URL_PATH]: new RegExp(`^${escapeStringForRegex(path)}(?:[/?#]|$)`) } },\n ];\n}\n\nexport interface CreateSentryTunnelRouteOptions {\n allowedDsns?: string[];\n}\n\ntype SentryTunnelRouteHandlerContext = {\n request: Request;\n};\n\ntype SentryTunnelRoute = {\n handlers: {\n POST: (context: SentryTunnelRouteHandlerContext) => Promise<Response>;\n };\n};\n\n/**\n * Creates a TanStack Start server route configuration for tunneling Sentry envelopes.\n *\n * @example\n * ```ts\n * import { createFileRoute } from '@tanstack/react-router';\n * import * as Sentry from '@sentry/tanstackstart-react';\n *\n * export const Route = createFileRoute('/monitoring')({\n * server: Sentry.createSentryTunnelRoute({\n * allowedDsns: ['https://public@o0.ingest.sentry.io/0'],\n * }),\n * });\n * ```\n */\nexport function createSentryTunnelRoute(options: CreateSentryTunnelRouteOptions): SentryTunnelRoute {\n return {\n handlers: {\n POST: async ({ request }) => {\n // Self-register the path so the tunnel route's own transaction is dropped: at span-end for the\n // static path, and at span-start for subsequent streamed requests. The first streamed request\n // still leaks here (this runs after its span was sampled); managed routes avoid even that via\n // the startup registration.\n registerSentryServerTunnelRoute(new URL(request.url).pathname);\n\n const allowedDsnsFromOptions = options.allowedDsns?.length ? options.allowedDsns : undefined;\n\n const allowedDsns =\n allowedDsnsFromOptions ??\n (() => {\n const client = getClient();\n const dsn = client?.getDsn();\n return dsn ? [dsnToString(dsn)] : undefined;\n })();\n\n if (!allowedDsns) {\n return new Response(\n 'Tunnel route requires Sentry server SDK initialized with a DSN, or pass allowedDsns explicitly.',\n { status: 500 },\n );\n }\n\n return handleTunnelRequest({\n request,\n allowedDsns,\n });\n },\n },\n };\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,0BAAA,uBAAiC,GAAA,EAAY;AAO5C,SAAS,gCAAgC,IAAA,EAAoB;AAElE,EAAA,IAAI,0BAAA,CAA2B,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA;AAAA,EACF;AAEA,EAAA,0BAAA,CAA2B,IAAI,IAAI,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,OAAA,CAAQ,WAAA,GAAc;AAAA,IACpB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC;AAAA,IAC5B,EAAE,UAAA,EAAY,EAAE,CAAC,QAAQ,GAAG,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,IAAI,CAAC,CAAA,WAAA,CAAa,GAAE;AAAE,GACxF;AACF;AA+BO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,OAAO,EAAE,OAAA,EAAQ,KAAM;AAK3B,QAAA,+BAAA,CAAgC,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,EAAE,QAAQ,CAAA;AAE7D,QAAA,MAAM,sBAAA,GAAyB,OAAA,CAAQ,WAAA,EAAa,MAAA,GAAS,QAAQ,WAAA,GAAc,MAAA;AAEnF,QAAA,MAAM,WAAA,GACJ,2BACC,MAAM;AACL,UAAA,MAAM,SAAS,SAAA,EAAU;AACzB,UAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,EAAO;AAC3B,UAAA,OAAO,GAAA,GAAM,CAAC,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,MAAA;AAAA,QACpC,CAAA,GAAG;AAEL,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,IAAI,QAAA;AAAA,YACT,iGAAA;AAAA,YACA,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAEA,QAAA,OAAO,mBAAA,CAAoB;AAAA,UACzB,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { SENTRY_OP } from '@sentry/conventions/attributes';
2
- import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op';
2
+ import { MIDDLEWARE } from '@sentry/conventions/op';
3
3
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';
4
4
 
5
5
  function getMiddlewareSpanOptions(name) {
@@ -7,7 +7,7 @@ function getMiddlewareSpanOptions(name) {
7
7
  name,
8
8
  attributes: {
9
9
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.middleware.tanstackstart",
10
- [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP
10
+ [SENTRY_OP]: MIDDLEWARE
11
11
  }
12
12
  };
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op';\nimport type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.tanstackstart',\n [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP,\n },\n };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,yBAAyB,IAAA,EAAgC;AACvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,CAAC,gCAAgC,GAAG,+BAAA;AAAA,MACpC,CAAC,SAAS,GAAG;AAAA;AACf,GACF;AACF;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { MIDDLEWARE } from '@sentry/conventions/op';\nimport type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.tanstackstart',\n [SENTRY_OP]: MIDDLEWARE,\n },\n };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,yBAAyB,IAAA,EAAgC;AACvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,CAAC,gCAAgC,GAAG,+BAAA;AAAA,MACpC,CAAC,SAAS,GAAG;AAAA;AACf,GACF;AACF;;;;"}
@@ -1,7 +1,8 @@
1
- import { flushIfServerless, getTraceMetaTags } from '@sentry/core';
1
+ import { getTraceMetaTags } from '@sentry/core';
2
+ import { flushIfServerless } from '@sentry/core/server';
2
3
  import { startSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, captureException } from '@sentry/node';
3
4
  import { SENTRY_OP } from '@sentry/conventions/attributes';
4
- import { WEB_SERVER_FUNCTION_SPAN_OP } from '@sentry/conventions/op';
5
+ import { FUNCTION } from '@sentry/conventions/op';
5
6
  import { updateSpanWithRouteParametrization } from './routeParametrization.js';
6
7
 
7
8
  function addMetaTagToHead(htmlChunk, metaTagsStr) {
@@ -91,7 +92,7 @@ function wrapFetchWithSentry(serverEntry) {
91
92
  name: `${method} ${url.pathname}`,
92
93
  attributes: {
93
94
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.function.tanstackstart.server",
94
- [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP
95
+ [SENTRY_OP]: FUNCTION
95
96
  }
96
97
  },
97
98
  async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"wrapFetchWithSentry.js","sources":["../../../src/server/wrapFetchWithSentry.ts"],"sourcesContent":["import { flushIfServerless, getTraceMetaTags } from '@sentry/core';\nimport { captureException, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { WEB_SERVER_FUNCTION_SPAN_OP } from '@sentry/conventions/op';\nimport { updateSpanWithRouteParametrization } from './routeParametrization';\n\ndeclare const __SENTRY_ROUTE_PATTERNS__: string[] | undefined;\n\nexport type ServerEntry = {\n // `opts` is forwarded verbatim to the wrapped handler, so this must accept whatever shape\n // the real framework entry uses (e.g. TanStack's `RequestOptions<Register>`). Under\n // parameter contravariance `unknown` would reject such an entry; `any` keeps it assignable.\n // oxlint-disable-next-line typescript/no-explicit-any\n fetch: (request: Request, opts?: any) => Promise<Response> | Response;\n};\n\n/**\n * This function optimistically assumes that the HTML coming in chunks will not be split\n * within the <head> tag. If this still happens, we simply won't replace anything.\n */\nfunction addMetaTagToHead(htmlChunk: string, metaTagsStr: string): string {\n if (typeof htmlChunk !== 'string' || !metaTagsStr) {\n return htmlChunk;\n }\n\n if (htmlChunk.includes('\"sentry-trace\"')) {\n return htmlChunk;\n }\n\n // Skip quoted attribute values so we don't match <head> inside e.g. data-code=\"...<head>...\"\n let replaced = false;\n return htmlChunk.replace(/\"[^\"]*\"|'[^']*'|(<head>)/g, (match, headTag) => {\n if (headTag && !replaced) {\n replaced = true;\n return `<head>${metaTagsStr}`;\n }\n return match;\n });\n}\n\nfunction injectMetaTagsInResponse(originalResponse: Response): Response {\n try {\n const contentType = originalResponse.headers.get('content-type');\n\n const isPageloadRequest = contentType?.startsWith('text/html');\n if (!isPageloadRequest) {\n return originalResponse;\n }\n\n // Type case necessary b/c the body's ReadableStream type doesn't include\n // the async iterator that is actually available in Node\n // We later on use the async iterator to read the body chunks\n // see https://github.com/microsoft/TypeScript/issues/39051\n const originalBody = originalResponse.body as NodeJS.ReadableStream | null;\n if (!originalBody) {\n return originalResponse;\n }\n\n const metaTagsStr = getTraceMetaTags();\n const decoder = new TextDecoder();\n\n const newResponseStream = new ReadableStream({\n start: async controller => {\n // Assign to a new variable to avoid TS losing the narrower type checked above.\n const body = originalBody;\n\n async function* bodyReporter(): AsyncGenerator<string | Buffer> {\n try {\n for await (const chunk of body) {\n yield chunk;\n }\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n }\n\n let errored = false;\n try {\n for await (const chunk of bodyReporter()) {\n const html = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n const modifiedHtml = addMetaTagToHead(html, metaTagsStr);\n controller.enqueue(new TextEncoder().encode(modifiedHtml));\n }\n } catch (e) {\n errored = true;\n controller.error(e);\n } finally {\n if (!errored) {\n controller.close();\n }\n }\n },\n });\n\n return new Response(newResponseStream, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: new Headers(originalResponse.headers),\n });\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n}\n\n/**\n * This function can be used to wrap the server entry request handler to add tracing to server-side functionality.\n * You must explicitly define a server entry point in your application for this to work. This is done by passing the request handler to the `createServerEntry` function.\n * For more information about the server entry point, see the [TanStack Start documentation](https://tanstack.com/start/docs/server-entry).\n *\n * @example\n * ```ts\n * import { wrapFetchWithSentry } from '@sentry/tanstackstart-react';\n *\n * import handler, { createServerEntry } from '@tanstack/react-start/server-entry';\n * import type { ServerEntry } from '@tanstack/react-start/server-entry';\n *\n * const requestHandler: ServerEntry = wrapFetchWithSentry({\n * fetch(request: Request) {\n * return handler.fetch(request);\n * },\n * });\n *\n * export default serverEntry = createServerEntry(requestHandler);\n * ```\n *\n * @param serverEntry - request handler to wrap\n * @returns - wrapped request handler\n */\nexport function wrapFetchWithSentry(serverEntry: ServerEntry): ServerEntry {\n if (serverEntry.fetch) {\n serverEntry.fetch = new Proxy<typeof serverEntry.fetch>(serverEntry.fetch, {\n async apply(target, thisArg, args) {\n try {\n const request: Request = args[0];\n const url = new URL(request.url);\n const method = request.method || 'GET';\n\n // instrument server functions\n if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) {\n return await startSpan(\n {\n name: `${method} ${url.pathname}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server',\n [SENTRY_OP]: WEB_SERVER_FUNCTION_SPAN_OP,\n },\n },\n async () => {\n return target.apply(thisArg, args);\n },\n );\n }\n\n if (typeof __SENTRY_ROUTE_PATTERNS__ !== 'undefined') {\n updateSpanWithRouteParametrization(method, url.pathname, __SENTRY_ROUTE_PATTERNS__);\n }\n\n return injectMetaTagsInResponse(await target.apply(thisArg, args));\n } finally {\n await flushIfServerless();\n }\n },\n });\n }\n return serverEntry;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wrapFetchWithSentry.js","sources":["../../../src/server/wrapFetchWithSentry.ts"],"sourcesContent":["import { getTraceMetaTags } from '@sentry/core';\nimport { flushIfServerless } from '@sentry/core/server';\nimport { captureException, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { FUNCTION } from '@sentry/conventions/op';\nimport { updateSpanWithRouteParametrization } from './routeParametrization';\n\ndeclare const __SENTRY_ROUTE_PATTERNS__: string[] | undefined;\n\nexport type ServerEntry = {\n // `opts` is forwarded verbatim to the wrapped handler, so this must accept whatever shape\n // the real framework entry uses (e.g. TanStack's `RequestOptions<Register>`). Under\n // parameter contravariance `unknown` would reject such an entry; `any` keeps it assignable.\n // oxlint-disable-next-line typescript/no-explicit-any\n fetch: (request: Request, opts?: any) => Promise<Response> | Response;\n};\n\n/**\n * This function optimistically assumes that the HTML coming in chunks will not be split\n * within the <head> tag. If this still happens, we simply won't replace anything.\n */\nfunction addMetaTagToHead(htmlChunk: string, metaTagsStr: string): string {\n if (typeof htmlChunk !== 'string' || !metaTagsStr) {\n return htmlChunk;\n }\n\n if (htmlChunk.includes('\"sentry-trace\"')) {\n return htmlChunk;\n }\n\n // Skip quoted attribute values so we don't match <head> inside e.g. data-code=\"...<head>...\"\n let replaced = false;\n return htmlChunk.replace(/\"[^\"]*\"|'[^']*'|(<head>)/g, (match, headTag) => {\n if (headTag && !replaced) {\n replaced = true;\n return `<head>${metaTagsStr}`;\n }\n return match;\n });\n}\n\nfunction injectMetaTagsInResponse(originalResponse: Response): Response {\n try {\n const contentType = originalResponse.headers.get('content-type');\n\n const isPageloadRequest = contentType?.startsWith('text/html');\n if (!isPageloadRequest) {\n return originalResponse;\n }\n\n // Type case necessary b/c the body's ReadableStream type doesn't include\n // the async iterator that is actually available in Node\n // We later on use the async iterator to read the body chunks\n // see https://github.com/microsoft/TypeScript/issues/39051\n const originalBody = originalResponse.body as NodeJS.ReadableStream | null;\n if (!originalBody) {\n return originalResponse;\n }\n\n const metaTagsStr = getTraceMetaTags();\n const decoder = new TextDecoder();\n\n const newResponseStream = new ReadableStream({\n start: async controller => {\n // Assign to a new variable to avoid TS losing the narrower type checked above.\n const body = originalBody;\n\n async function* bodyReporter(): AsyncGenerator<string | Buffer> {\n try {\n for await (const chunk of body) {\n yield chunk;\n }\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n }\n\n let errored = false;\n try {\n for await (const chunk of bodyReporter()) {\n const html = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n const modifiedHtml = addMetaTagToHead(html, metaTagsStr);\n controller.enqueue(new TextEncoder().encode(modifiedHtml));\n }\n } catch (e) {\n errored = true;\n controller.error(e);\n } finally {\n if (!errored) {\n controller.close();\n }\n }\n },\n });\n\n return new Response(newResponseStream, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: new Headers(originalResponse.headers),\n });\n } catch (e) {\n captureException(e, {\n mechanism: { type: 'auto.http.tanstackstart', handled: false },\n });\n throw e;\n }\n}\n\n/**\n * This function can be used to wrap the server entry request handler to add tracing to server-side functionality.\n * You must explicitly define a server entry point in your application for this to work. This is done by passing the request handler to the `createServerEntry` function.\n * For more information about the server entry point, see the [TanStack Start documentation](https://tanstack.com/start/docs/server-entry).\n *\n * @example\n * ```ts\n * import { wrapFetchWithSentry } from '@sentry/tanstackstart-react';\n *\n * import handler, { createServerEntry } from '@tanstack/react-start/server-entry';\n * import type { ServerEntry } from '@tanstack/react-start/server-entry';\n *\n * const requestHandler: ServerEntry = wrapFetchWithSentry({\n * fetch(request: Request) {\n * return handler.fetch(request);\n * },\n * });\n *\n * export default serverEntry = createServerEntry(requestHandler);\n * ```\n *\n * @param serverEntry - request handler to wrap\n * @returns - wrapped request handler\n */\nexport function wrapFetchWithSentry(serverEntry: ServerEntry): ServerEntry {\n if (serverEntry.fetch) {\n serverEntry.fetch = new Proxy<typeof serverEntry.fetch>(serverEntry.fetch, {\n async apply(target, thisArg, args) {\n try {\n const request: Request = args[0];\n const url = new URL(request.url);\n const method = request.method || 'GET';\n\n // instrument server functions\n if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) {\n return await startSpan(\n {\n name: `${method} ${url.pathname}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server',\n [SENTRY_OP]: FUNCTION,\n },\n },\n async () => {\n return target.apply(thisArg, args);\n },\n );\n }\n\n if (typeof __SENTRY_ROUTE_PATTERNS__ !== 'undefined') {\n updateSpanWithRouteParametrization(method, url.pathname, __SENTRY_ROUTE_PATTERNS__);\n }\n\n return injectMetaTagsInResponse(await target.apply(thisArg, args));\n } finally {\n await flushIfServerless();\n }\n },\n });\n }\n return serverEntry;\n}\n"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ function makeAddSentryVitePlugin(options) {
8
8
  debug,
9
9
  errorHandler,
10
10
  headers,
11
+ moduleMetadata,
11
12
  org,
12
13
  project,
13
14
  release,
@@ -46,6 +47,7 @@ function makeAddSentryVitePlugin(options) {
46
47
  debug: debug ?? false,
47
48
  errorHandler,
48
49
  headers,
50
+ moduleMetadata,
49
51
  org: org ?? process.env.SENTRY_ORG,
50
52
  project: project ?? process.env.SENTRY_PROJECT,
51
53
  release,
@@ -54,9 +56,8 @@ function makeAddSentryVitePlugin(options) {
54
56
  assets: sourcemaps?.assets,
55
57
  disable: sourcemaps?.disable,
56
58
  ignore: sourcemaps?.ignore,
57
- // BuildTimeOptionsBase types can lag behind bundler plugin options in some local setups.
58
- // Keep runtime support while staying resilient to type version skew.
59
59
  rewriteSources: sourcemaps?.rewriteSources,
60
+ resolveSourceMap: sourcemaps?.resolveSourceMap,
60
61
  filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise
61
62
  },
62
63
  reactComponentAnnotation: {
@@ -1 +1 @@
1
- {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import { sentryVitePlugin } from '@sentry/bundler-plugins/vite';\nimport type { Plugin, UserConfig } from 'vite';\nimport type { SentryTanstackStartOptions } from './sentryTanstackStart';\n\ntype FilesToDeleteAfterUpload = string | string[] | undefined;\n\n/**\n * A Sentry plugin for adding the @sentry/bundler-plugins/vite to automatically upload source maps to Sentry.\n */\nexport function makeAddSentryVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n const {\n applicationKey,\n authToken,\n bundleSizeOptimizations,\n debug,\n errorHandler,\n headers,\n org,\n project,\n release,\n sentryUrl,\n silent,\n sourcemaps,\n telemetry,\n reactComponentAnnotation,\n } = options;\n\n // defer resolving the filesToDeleteAfterUpload until we got access to the Vite config\n let resolveFilesToDeleteAfterUpload: ((value: FilesToDeleteAfterUpload) => void) | undefined;\n const filesToDeleteAfterUploadPromise = new Promise<FilesToDeleteAfterUpload>(resolve => {\n resolveFilesToDeleteAfterUpload = resolve;\n });\n\n const configPlugin: Plugin = {\n name: 'sentry-tanstackstart-files-to-delete-after-upload-plugin',\n apply: 'build',\n enforce: 'post',\n config(config) {\n const userFilesToDelete = sourcemaps?.filesToDeleteAfterUpload;\n\n // Only auto-delete source maps if the user didn't configure sourcemaps at all\n if (typeof userFilesToDelete === 'undefined' && typeof config.build?.sourcemap === 'undefined') {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Automatically setting `sourcemaps.filesToDeleteAfterUpload: [\"./**/*.map\"]` to delete generated source maps after they were uploaded to Sentry.',\n );\n }\n resolveFilesToDeleteAfterUpload?.(['./**/*.map']);\n } else {\n resolveFilesToDeleteAfterUpload?.(userFilesToDelete);\n }\n },\n };\n\n const sentryPlugins = sentryVitePlugin({\n applicationKey,\n authToken: authToken ?? process.env.SENTRY_AUTH_TOKEN,\n bundleSizeOptimizations: bundleSizeOptimizations ?? undefined,\n debug: debug ?? false,\n errorHandler,\n headers,\n org: org ?? process.env.SENTRY_ORG,\n project: project ?? process.env.SENTRY_PROJECT,\n release,\n silent,\n sourcemaps: {\n assets: sourcemaps?.assets,\n disable: sourcemaps?.disable,\n ignore: sourcemaps?.ignore,\n // BuildTimeOptionsBase types can lag behind bundler plugin options in some local setups.\n // Keep runtime support while staying resilient to type version skew.\n rewriteSources: (sourcemaps as unknown as { rewriteSources?: unknown } | undefined)?.rewriteSources as never,\n filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,\n },\n reactComponentAnnotation: {\n enabled: reactComponentAnnotation?.enabled ?? undefined,\n ignoredComponents: reactComponentAnnotation?.ignoredComponents ?? undefined,\n },\n telemetry: telemetry ?? true,\n url: sentryUrl,\n _metaOptions: {\n telemetry: {\n metaFramework: 'tanstackstart-react',\n },\n },\n });\n\n return [configPlugin, ...sentryPlugins];\n}\n\n/**\n * A Sentry plugin for TanStack Start React to enable \"hidden\" source maps if they are unset.\n */\nexport function makeEnableSourceMapsVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n return [\n {\n name: 'sentry-tanstackstart-react-source-maps',\n apply: 'build',\n enforce: 'post',\n config(viteConfig) {\n return {\n ...viteConfig,\n build: {\n ...viteConfig.build,\n sourcemap: getUpdatedSourceMapSettings(viteConfig, options),\n },\n };\n },\n },\n ];\n}\n\n/** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)\n *\n * 1. User explicitly disabled source maps\n * - keep this setting (emit a warning that errors won't be unminified in Sentry)\n * - We won't upload anything\n *\n * 2. Users enabled source map generation (true, 'hidden', 'inline').\n * - keep this setting (don't do anything - like deletion - besides uploading)\n *\n * 3. Users didn't set source maps generation\n * - we enable 'hidden' source maps generation\n * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n *\n * --> only exported for testing\n */\nexport function getUpdatedSourceMapSettings(\n viteConfig: UserConfig,\n sentryPluginOptions?: SentryTanstackStartOptions,\n): boolean | 'inline' | 'hidden' {\n viteConfig.build = viteConfig.build || {};\n\n const viteUserSourceMapSetting = viteConfig.build?.sourcemap;\n const settingKey = 'vite.build.sourcemap';\n const debug = sentryPluginOptions?.debug;\n\n // Respect user source map setting if it is explicitly set\n if (viteUserSourceMapSetting === false) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your TanStack Start configuration (\\`${settingKey}: false\\`). Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Source map generation is disabled in your TanStack Start configuration.');\n }\n\n return viteUserSourceMapSetting;\n } else if (viteUserSourceMapSetting && ['hidden', 'inline', true].includes(viteUserSourceMapSetting)) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`${viteUserSourceMapSetting.toString()}\\`. Sentry will keep this source map setting.`,\n );\n }\n\n return viteUserSourceMapSetting;\n }\n\n // If the user did not specify a source map setting, we enable 'hidden' by default\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Enabled source map generation in the build options with \\`${settingKey}: 'hidden'\\`. The source maps will be deleted after they were uploaded to Sentry.`,\n );\n }\n\n return 'hidden';\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import { sentryVitePlugin } from '@sentry/bundler-plugins/vite';\nimport type { Plugin, UserConfig } from 'vite';\nimport type { SentryTanstackStartOptions } from './sentryTanstackStart';\n\ntype FilesToDeleteAfterUpload = string | string[] | undefined;\n\n/**\n * A Sentry plugin for adding the @sentry/bundler-plugins/vite to automatically upload source maps to Sentry.\n */\nexport function makeAddSentryVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n const {\n applicationKey,\n authToken,\n bundleSizeOptimizations,\n debug,\n errorHandler,\n headers,\n moduleMetadata,\n org,\n project,\n release,\n sentryUrl,\n silent,\n sourcemaps,\n telemetry,\n reactComponentAnnotation,\n } = options;\n\n // defer resolving the filesToDeleteAfterUpload until we got access to the Vite config\n let resolveFilesToDeleteAfterUpload: ((value: FilesToDeleteAfterUpload) => void) | undefined;\n const filesToDeleteAfterUploadPromise = new Promise<FilesToDeleteAfterUpload>(resolve => {\n resolveFilesToDeleteAfterUpload = resolve;\n });\n\n const configPlugin: Plugin = {\n name: 'sentry-tanstackstart-files-to-delete-after-upload-plugin',\n apply: 'build',\n enforce: 'post',\n config(config) {\n const userFilesToDelete = sourcemaps?.filesToDeleteAfterUpload;\n\n // Only auto-delete source maps if the user didn't configure sourcemaps at all\n if (typeof userFilesToDelete === 'undefined' && typeof config.build?.sourcemap === 'undefined') {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Automatically setting `sourcemaps.filesToDeleteAfterUpload: [\"./**/*.map\"]` to delete generated source maps after they were uploaded to Sentry.',\n );\n }\n resolveFilesToDeleteAfterUpload?.(['./**/*.map']);\n } else {\n resolveFilesToDeleteAfterUpload?.(userFilesToDelete);\n }\n },\n };\n\n const sentryPlugins = sentryVitePlugin({\n applicationKey,\n authToken: authToken ?? process.env.SENTRY_AUTH_TOKEN,\n bundleSizeOptimizations: bundleSizeOptimizations ?? undefined,\n debug: debug ?? false,\n errorHandler,\n headers,\n moduleMetadata,\n org: org ?? process.env.SENTRY_ORG,\n project: project ?? process.env.SENTRY_PROJECT,\n release,\n silent,\n sourcemaps: {\n assets: sourcemaps?.assets,\n disable: sourcemaps?.disable,\n ignore: sourcemaps?.ignore,\n rewriteSources: sourcemaps?.rewriteSources,\n resolveSourceMap: sourcemaps?.resolveSourceMap,\n filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,\n },\n reactComponentAnnotation: {\n enabled: reactComponentAnnotation?.enabled ?? undefined,\n ignoredComponents: reactComponentAnnotation?.ignoredComponents ?? undefined,\n },\n telemetry: telemetry ?? true,\n url: sentryUrl,\n _metaOptions: {\n telemetry: {\n metaFramework: 'tanstackstart-react',\n },\n },\n });\n\n return [configPlugin, ...sentryPlugins];\n}\n\n/**\n * A Sentry plugin for TanStack Start React to enable \"hidden\" source maps if they are unset.\n */\nexport function makeEnableSourceMapsVitePlugin(options: SentryTanstackStartOptions): Plugin[] {\n return [\n {\n name: 'sentry-tanstackstart-react-source-maps',\n apply: 'build',\n enforce: 'post',\n config(viteConfig) {\n return {\n ...viteConfig,\n build: {\n ...viteConfig.build,\n sourcemap: getUpdatedSourceMapSettings(viteConfig, options),\n },\n };\n },\n },\n ];\n}\n\n/** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)\n *\n * 1. User explicitly disabled source maps\n * - keep this setting (emit a warning that errors won't be unminified in Sentry)\n * - We won't upload anything\n *\n * 2. Users enabled source map generation (true, 'hidden', 'inline').\n * - keep this setting (don't do anything - like deletion - besides uploading)\n *\n * 3. Users didn't set source maps generation\n * - we enable 'hidden' source maps generation\n * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n *\n * --> only exported for testing\n */\nexport function getUpdatedSourceMapSettings(\n viteConfig: UserConfig,\n sentryPluginOptions?: SentryTanstackStartOptions,\n): boolean | 'inline' | 'hidden' {\n viteConfig.build = viteConfig.build || {};\n\n const viteUserSourceMapSetting = viteConfig.build?.sourcemap;\n const settingKey = 'vite.build.sourcemap';\n const debug = sentryPluginOptions?.debug;\n\n // Respect user source map setting if it is explicitly set\n if (viteUserSourceMapSetting === false) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your TanStack Start configuration (\\`${settingKey}: false\\`). Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Source map generation is disabled in your TanStack Start configuration.');\n }\n\n return viteUserSourceMapSetting;\n } else if (viteUserSourceMapSetting && ['hidden', 'inline', true].includes(viteUserSourceMapSetting)) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`${viteUserSourceMapSetting.toString()}\\`. Sentry will keep this source map setting.`,\n );\n }\n\n return viteUserSourceMapSetting;\n }\n\n // If the user did not specify a source map setting, we enable 'hidden' by default\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Enabled source map generation in the build options with \\`${settingKey}: 'hidden'\\`. The source maps will be deleted after they were uploaded to Sentry.`,\n );\n }\n\n return 'hidden';\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import '@sentry/server-utils/orchestrion/import-hook';
1
+ import '@sentry/server-runtime-injection/import-hook';
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -1,4 +1,3 @@
1
- export * from './config';
2
1
  export * from './server';
3
2
  export * from './common';
4
3
  //# sourceMappingURL=index.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../../src/index.server.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../../src/index.server.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import type { Client, Integration, Options, StackParser } from '@sentry/core';
2
2
  import type * as clientSdk from './client';
3
3
  import type * as serverSdk from './server';
4
- export * from './config';
5
4
  export * from './client';
6
5
  export * from './server';
7
6
  export * from './common';
@@ -9,7 +8,9 @@ export * from './common';
9
8
  export declare function init(options: Options | clientSdk.BrowserOptions | serverSdk.NodeOptions): Client | undefined;
10
9
  export declare const linkedErrorsIntegration: typeof clientSdk.linkedErrorsIntegration;
11
10
  export declare const contextLinesIntegration: typeof clientSdk.contextLinesIntegration;
12
- export declare const spanStreamingIntegration: typeof clientSdk.spanStreamingIntegration;
11
+ export declare const startSpan: typeof clientSdk.startSpan;
12
+ export declare const startSpanManual: typeof clientSdk.startSpanManual;
13
+ export declare const startInactiveSpan: typeof clientSdk.startInactiveSpan;
13
14
  export declare const withStaticSpan: typeof clientSdk.withStaticSpan;
14
15
  export declare const withStreamedSpan: typeof clientSdk.withStreamedSpan;
15
16
  export declare const getDefaultIntegrations: (options: Options) => Integration[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"globalMiddleware.d.ts","sourceRoot":"","sources":["../../../src/server/globalMiddleware.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AA0DrG;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,6BAS3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,8BAU5C,CAAC"}
1
+ {"version":3,"file":"globalMiddleware.d.ts","sourceRoot":"","sources":["../../../src/server/globalMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AA0DrG;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,6BAS3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,8BAU5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"routeParametrization.d.ts","sourceRoot":"","sources":["../../../src/server/routeParametrization.ts"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAQ/F;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAsB7G"}
1
+ {"version":3,"file":"routeParametrization.d.ts","sourceRoot":"","sources":["../../../src/server/routeParametrization.ts"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAQ/F;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAsB7G"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Drops the incoming `http.server` transaction for a tunnel route by matching its request path (the
3
- * `http.target` attribute, set at span creation, so it works for static and streamed lifecycles).
3
+ * `url.path` attribute, set at span creation, so it works for static and streamed lifecycles).
4
4
  * Called at server startup for the managed route and from the handler (self-registration) otherwise.
5
5
  */
6
6
  export declare function registerSentryServerTunnelRoute(path: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tunnelRoute.d.ts","sourceRoot":"","sources":["../../../src/server/tunnelRoute.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBlE;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,+BAA+B,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KACvE,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,iBAAiB,CAkClG"}
1
+ {"version":3,"file":"tunnelRoute.d.ts","sourceRoot":"","sources":["../../../src/server/tunnelRoute.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBlE;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,+BAA+B,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KACvE,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,iBAAiB,CAkClG"}
@@ -1 +1 @@
1
- {"version":3,"file":"wrapFetchWithSentry.d.ts","sourceRoot":"","sources":["../../../src/server/wrapFetchWithSentry.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GAAG;IAKxB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;CACvE,CAAC;AAgGF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAqCzE"}
1
+ {"version":3,"file":"wrapFetchWithSentry.d.ts","sourceRoot":"","sources":["../../../src/server/wrapFetchWithSentry.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,WAAW,GAAG;IAKxB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;CACvE,CAAC;AAgGF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAqCzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"sourceMaps.d.ts","sourceRoot":"","sources":["../../../src/vite/sourceMaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAIxE;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAgFrF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAiB5F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,UAAU,EACtB,mBAAmB,CAAC,EAAE,0BAA0B,GAC/C,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAwC/B"}
1
+ {"version":3,"file":"sourceMaps.d.ts","sourceRoot":"","sources":["../../../src/vite/sourceMaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAIxE;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAiFrF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAiB5F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,UAAU,EACtB,mBAAmB,CAAC,EAAE,0BAA0B,GAC/C,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAwC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/tanstackstart-react",
3
- "version": "11.0.0-alpha.1",
3
+ "version": "11.0.0-beta.0",
4
4
  "description": "Official Sentry SDK for TanStack Start React",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/tanstackstart-react",
@@ -52,13 +52,14 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@opentelemetry/api": "^1.9.1",
55
- "@sentry/browser-utils": "11.0.0-alpha.1",
56
- "@sentry/conventions": "^0.19.0",
57
- "@sentry/core": "11.0.0-alpha.1",
58
- "@sentry/node": "11.0.0-alpha.1",
59
- "@sentry/react": "11.0.0-alpha.1",
60
- "@sentry/server-utils": "11.0.0-alpha.1",
61
- "@sentry/bundler-plugins": "11.0.0-alpha.1"
55
+ "@sentry/browser-utils": "11.0.0-beta.0",
56
+ "@sentry/conventions": "^0.20.0",
57
+ "@sentry/core": "11.0.0-beta.0",
58
+ "@sentry/node": "11.0.0-beta.0",
59
+ "@sentry/react": "11.0.0-beta.0",
60
+ "@sentry/server-runtime-injection": "11.0.0-beta.0",
61
+ "@sentry/server-utils": "11.0.0-beta.0",
62
+ "@sentry/bundler-plugins": "11.0.0-beta.0"
62
63
  },
63
64
  "devDependencies": {
64
65
  "vite": "^6.4.3"
@@ -76,6 +77,7 @@
76
77
  "clean": "rimraf build coverage sentry-tanstackstart-react-*.tgz",
77
78
  "lint:fix": "oxlint . --fix --type-aware",
78
79
  "lint": "oxlint . --type-aware",
80
+ "lint:types": "oxlint src --type-aware --type-check",
79
81
  "lint:es-compatibility": "es-check es2020 ./build/cjs/*.js && es-check es2020 ./build/esm/*.js --module",
80
82
  "test": "yarn test:unit",
81
83
  "test:unit": "vitest run",
@@ -85,5 +87,18 @@
85
87
  "volta": {
86
88
  "extends": "../../package.json"
87
89
  },
88
- "sideEffects": false
90
+ "sideEffects": false,
91
+ "nx": {
92
+ "targets": {
93
+ "build:transpile": {
94
+ "outputs": [
95
+ "{projectRoot}/build/esm",
96
+ "{projectRoot}/build/cjs",
97
+ "{projectRoot}/build/npm/esm",
98
+ "{projectRoot}/build/npm/cjs",
99
+ "{projectRoot}/build/import-hook.mjs"
100
+ ]
101
+ }
102
+ }
103
+ }
89
104
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC"}