@sentry/tanstackstart-react 10.33.0 → 10.35.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 (68) hide show
  1. package/build/cjs/client/index.js +14 -7
  2. package/build/cjs/client/index.js.map +1 -1
  3. package/build/cjs/index.client.js +3 -1
  4. package/build/cjs/index.client.js.map +1 -1
  5. package/build/cjs/index.server.js +4 -0
  6. package/build/cjs/index.server.js.map +1 -1
  7. package/build/cjs/server/index.js +2 -0
  8. package/build/cjs/server/index.js.map +1 -1
  9. package/build/cjs/server/middleware.js +113 -0
  10. package/build/cjs/server/middleware.js.map +1 -0
  11. package/build/cjs/server/utils.js +17 -0
  12. package/build/cjs/server/utils.js.map +1 -1
  13. package/build/cjs/vite/sentryTanstackStart.js +46 -0
  14. package/build/cjs/vite/sentryTanstackStart.js.map +1 -0
  15. package/build/cjs/vite/sourceMaps.js +165 -0
  16. package/build/cjs/vite/sourceMaps.js.map +1 -0
  17. package/build/esm/client/index.js +10 -0
  18. package/build/esm/client/index.js.map +1 -1
  19. package/build/esm/index.client.js +2 -1
  20. package/build/esm/index.client.js.map +1 -1
  21. package/build/esm/index.server.js +2 -0
  22. package/build/esm/index.server.js.map +1 -1
  23. package/build/esm/package.json +1 -1
  24. package/build/esm/server/index.js +1 -0
  25. package/build/esm/server/index.js.map +1 -1
  26. package/build/esm/server/middleware.js +111 -0
  27. package/build/esm/server/middleware.js.map +1 -0
  28. package/build/esm/server/utils.js +17 -1
  29. package/build/esm/server/utils.js.map +1 -1
  30. package/build/esm/vite/sentryTanstackStart.js +44 -0
  31. package/build/esm/vite/sentryTanstackStart.js.map +1 -0
  32. package/build/esm/vite/sourceMaps.js +161 -0
  33. package/build/esm/vite/sourceMaps.js.map +1 -0
  34. package/build/types/client/index.d.ts +6 -0
  35. package/build/types/client/index.d.ts.map +1 -1
  36. package/build/types/common/index.d.ts +1 -1
  37. package/build/types/common/index.d.ts.map +1 -1
  38. package/build/types/common/types.d.ts +9 -0
  39. package/build/types/common/types.d.ts.map +1 -0
  40. package/build/types/index.client.d.ts.map +1 -1
  41. package/build/types/index.server.d.ts +1 -0
  42. package/build/types/index.server.d.ts.map +1 -1
  43. package/build/types/index.types.d.ts +2 -0
  44. package/build/types/index.types.d.ts.map +1 -1
  45. package/build/types/server/index.d.ts +1 -0
  46. package/build/types/server/index.d.ts.map +1 -1
  47. package/build/types/server/middleware.d.ts +22 -0
  48. package/build/types/server/middleware.d.ts.map +1 -0
  49. package/build/types/server/utils.d.ts +5 -0
  50. package/build/types/server/utils.d.ts.map +1 -1
  51. package/build/types/vite/index.d.ts +2 -0
  52. package/build/types/vite/index.d.ts.map +1 -0
  53. package/build/types/vite/sentryTanstackStart.d.ts +28 -0
  54. package/build/types/vite/sentryTanstackStart.d.ts.map +1 -0
  55. package/build/types/vite/sourceMaps.d.ts +27 -0
  56. package/build/types/vite/sourceMaps.d.ts.map +1 -0
  57. package/build/types-ts3.8/client/index.d.ts +6 -0
  58. package/build/types-ts3.8/common/index.d.ts +1 -1
  59. package/build/types-ts3.8/common/types.d.ts +9 -0
  60. package/build/types-ts3.8/index.server.d.ts +1 -0
  61. package/build/types-ts3.8/index.types.d.ts +2 -0
  62. package/build/types-ts3.8/server/index.d.ts +1 -0
  63. package/build/types-ts3.8/server/middleware.d.ts +22 -0
  64. package/build/types-ts3.8/server/utils.d.ts +5 -0
  65. package/build/types-ts3.8/vite/index.d.ts +2 -0
  66. package/build/types-ts3.8/vite/sentryTanstackStart.d.ts +28 -0
  67. package/build/types-ts3.8/vite/sourceMaps.d.ts +27 -0
  68. package/package.json +9 -5
@@ -0,0 +1,111 @@
1
+ import { addNonEnumerableProperty } from '@sentry/core';
2
+ import { getActiveSpan, startSpanManual, withActiveSpan } from '@sentry/node';
3
+ import { getMiddlewareSpanOptions } from './utils.js';
4
+
5
+ const SENTRY_WRAPPED = '__SENTRY_WRAPPED__';
6
+
7
+ /**
8
+ * Creates a proxy for the next function that ends the current span and restores the parent span.
9
+ * This ensures that subsequent middleware spans are children of the root span, not nested children.
10
+ */
11
+ function getNextProxy(
12
+ next,
13
+ span,
14
+ prevSpan,
15
+ nextState,
16
+ ) {
17
+ return new Proxy(next, {
18
+ apply: (originalNext, thisArgNext, argsNext) => {
19
+ nextState.called = true;
20
+ span.end();
21
+
22
+ if (prevSpan) {
23
+ return withActiveSpan(prevSpan, () => {
24
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
25
+ });
26
+ }
27
+
28
+ return Reflect.apply(originalNext, thisArgNext, argsNext);
29
+ },
30
+ });
31
+ }
32
+
33
+ /**
34
+ * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.
35
+ */
36
+ function wrapMiddlewareWithSentry(
37
+ middleware,
38
+ options,
39
+ ) {
40
+ if ((middleware )[SENTRY_WRAPPED]) {
41
+ // already instrumented
42
+ return middleware;
43
+ }
44
+
45
+ // instrument server middleware
46
+ if (middleware.options?.server) {
47
+ middleware.options.server = new Proxy(middleware.options.server, {
48
+ apply: (originalServer, thisArgServer, argsServer) => {
49
+ const prevSpan = getActiveSpan();
50
+
51
+ return startSpanManual(getMiddlewareSpanOptions(options.name), async (span) => {
52
+ const nextState = { called: false };
53
+
54
+ // The server function receives { next, context, request } as first argument
55
+ // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.
56
+ const middlewareArgs = argsServer[0] ;
57
+ if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {
58
+ middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);
59
+ }
60
+
61
+ try {
62
+ const result = await originalServer.apply(thisArgServer, argsServer);
63
+
64
+ // End span here if next() wasn't called, else we already ended it in next()
65
+ if (!nextState.called) {
66
+ span.end();
67
+ }
68
+
69
+ return result;
70
+ } catch (e) {
71
+ span.end();
72
+ throw e;
73
+ }
74
+ });
75
+ },
76
+ });
77
+
78
+ // mark as instrumented
79
+ addNonEnumerableProperty(middleware , SENTRY_WRAPPED, true);
80
+ }
81
+
82
+ return middleware;
83
+ }
84
+
85
+ /**
86
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
87
+ * Object keys are used as span names to avoid users having to specify this manually.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
92
+ *
93
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
94
+ * authMiddleware,
95
+ * loggingMiddleware,
96
+ * });
97
+ *
98
+ * createServerFn().middleware(wrappedMiddlewares)
99
+ * ```
100
+ *
101
+ * @param middlewares - An object containing middlewares
102
+ * @returns An array of wrapped middlewares
103
+ */
104
+ function wrapMiddlewaresWithSentry(middlewares) {
105
+ return Object.entries(middlewares).map(([name, middleware]) => {
106
+ return wrapMiddlewareWithSentry(middleware, { name });
107
+ });
108
+ }
109
+
110
+ export { wrapMiddlewaresWithSentry };
111
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sources":["../../../src/server/middleware.ts"],"sourcesContent":["import { addNonEnumerableProperty } from '@sentry/core';\nimport type { Span } from '@sentry/node';\nimport { getActiveSpan, startSpanManual, withActiveSpan } from '@sentry/node';\nimport type { MiddlewareWrapperOptions, TanStackMiddlewareBase } from '../common/types';\nimport { getMiddlewareSpanOptions } from './utils';\n\nconst SENTRY_WRAPPED = '__SENTRY_WRAPPED__';\n\n/**\n * Creates a proxy for the next function that ends the current span and restores the parent span.\n * This ensures that subsequent middleware spans are children of the root span, not nested children.\n */\nfunction getNextProxy<T extends (...args: unknown[]) => unknown>(\n next: T,\n span: Span,\n prevSpan: Span | undefined,\n nextState: { called: boolean },\n): T {\n return new Proxy(next, {\n apply: (originalNext, thisArgNext, argsNext) => {\n nextState.called = true;\n span.end();\n\n if (prevSpan) {\n return withActiveSpan(prevSpan, () => {\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n });\n }\n\n return Reflect.apply(originalNext, thisArgNext, argsNext);\n },\n });\n}\n\n/**\n * Wraps a TanStack Start middleware with Sentry instrumentation to create spans.\n */\nfunction wrapMiddlewareWithSentry<T extends TanStackMiddlewareBase>(\n middleware: T,\n options: MiddlewareWrapperOptions,\n): T {\n if ((middleware as TanStackMiddlewareBase & { [SENTRY_WRAPPED]?: boolean })[SENTRY_WRAPPED]) {\n // already instrumented\n return middleware;\n }\n\n // instrument server middleware\n if (middleware.options?.server) {\n middleware.options.server = new Proxy(middleware.options.server, {\n apply: (originalServer, thisArgServer, argsServer) => {\n const prevSpan = getActiveSpan();\n\n return startSpanManual(getMiddlewareSpanOptions(options.name), async (span: Span) => {\n const nextState = { called: false };\n\n // The server function receives { next, context, request } as first argument\n // Users call next() inside their middleware to move down the middleware chain. We proxy next() to end the span when it is called.\n const middlewareArgs = argsServer[0] as { next?: (...args: unknown[]) => unknown } | undefined;\n if (middlewareArgs && typeof middlewareArgs === 'object' && typeof middlewareArgs.next === 'function') {\n middlewareArgs.next = getNextProxy(middlewareArgs.next, span, prevSpan, nextState);\n }\n\n try {\n const result = await originalServer.apply(thisArgServer, argsServer);\n\n // End span here if next() wasn't called, else we already ended it in next()\n if (!nextState.called) {\n span.end();\n }\n\n return result;\n } catch (e) {\n span.end();\n throw e;\n }\n });\n },\n });\n\n // mark as instrumented\n addNonEnumerableProperty(middleware as unknown as Record<string, unknown>, SENTRY_WRAPPED, true);\n }\n\n return middleware;\n}\n\n/**\n * Wraps multiple TanStack Start middlewares with Sentry instrumentation.\n * Object keys are used as span names to avoid users having to specify this manually.\n *\n * @example\n * ```ts\n * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';\n *\n * const wrappedMiddlewares = wrapMiddlewaresWithSentry({\n * authMiddleware,\n * loggingMiddleware,\n * });\n *\n * createServerFn().middleware(wrappedMiddlewares)\n * ```\n *\n * @param middlewares - An object containing middlewares\n * @returns An array of wrapped middlewares\n */\nexport function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[] {\n return Object.entries(middlewares).map(([name, middleware]) => {\n return wrapMiddlewareWithSentry(middleware, { name });\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';
2
+
1
3
  /**
2
4
  * Extracts the SHA-256 hash from a server function pathname.
3
5
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -11,5 +13,19 @@ function extractServerFunctionSha256(pathname) {
11
13
  return serverFnMatch?.[1] ?? 'unknown';
12
14
  }
13
15
 
14
- export { extractServerFunctionSha256 };
16
+ /**
17
+ * Returns span options for TanStack Start middleware spans.
18
+ */
19
+ function getMiddlewareSpanOptions(name) {
20
+ return {
21
+ op: 'middleware.tanstackstart',
22
+ name,
23
+ attributes: {
24
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',
25
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',
26
+ },
27
+ };
28
+ }
29
+
30
+ export { extractServerFunctionSha256, getMiddlewareSpanOptions };
15
31
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/server/utils.ts"],"sourcesContent":["import type { StartSpanOptions } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node';\n\n/**\n * Extracts the SHA-256 hash from a server function pathname.\n * Server function pathnames are structured as `/_serverFn/<hash>`.\n * This function matches the pattern and returns the hash if found.\n *\n * @param pathname - the pathname of the server function\n * @returns the sha256 of the server function\n */\nexport function extractServerFunctionSha256(pathname: string): string {\n const serverFnMatch = pathname.match(/\\/_serverFn\\/([a-f0-9]{64})/i);\n return serverFnMatch?.[1] ?? 'unknown';\n}\n\n/**\n * Returns span options for TanStack Start middleware spans.\n */\nexport function getMiddlewareSpanOptions(name: string): StartSpanOptions {\n return {\n op: 'middleware.tanstackstart',\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual.middleware.tanstackstart',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart',\n },\n };\n}\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,QAAQ,EAAkB;AACtE,EAAE,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC;AACtE,EAAE,OAAO,aAAa,GAAG,CAAC,CAAA,IAAK,SAAS;AACxC;;AAEA;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,IAAI,EAA4B;AACzE,EAAE,OAAO;AACT,IAAI,EAAE,EAAE,0BAA0B;AAClC,IAAI,IAAI;AACR,IAAI,UAAU,EAAE;AAChB,MAAM,CAAC,gCAAgC,GAAG,iCAAiC;AAC3E,MAAM,CAAC,4BAA4B,GAAG,0BAA0B;AAChE,KAAK;AACL,GAAG;AACH;;;;"}
@@ -0,0 +1,44 @@
1
+ import { makeAddSentryVitePlugin, makeEnableSourceMapsVitePlugin } from './sourceMaps.js';
2
+
3
+ /**
4
+ * Vite plugins for the Sentry TanStack Start SDK.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // vite.config.ts
9
+ * import { defineConfig } from 'vite';
10
+ * import { sentryTanstackStart } from '@sentry/tanstackstart-react';
11
+ * import { tanstackStart } from '@tanstack/react-start/plugin/vite';
12
+ *
13
+ * export default defineConfig({
14
+ * plugins: [
15
+ * sentryTanstackStart({
16
+ * org: 'your-org',
17
+ * project: 'your-project',
18
+ * }),
19
+ * tanstackStart(),
20
+ * ],
21
+ * });
22
+ * ```
23
+ *
24
+ * @param options - Options to configure the Sentry Vite plugins
25
+ * @returns An array of Vite plugins
26
+ */
27
+ function sentryTanstackStart(options = {}) {
28
+ // Only add plugins in production builds
29
+ if (process.env.NODE_ENV === 'development') {
30
+ return [];
31
+ }
32
+
33
+ const plugins = [...makeAddSentryVitePlugin(options)];
34
+
35
+ const sourceMapsDisabled = options.sourcemaps?.disable === true || options.sourcemaps?.disable === 'disable-upload';
36
+ if (!sourceMapsDisabled) {
37
+ plugins.push(...makeEnableSourceMapsVitePlugin(options));
38
+ }
39
+
40
+ return plugins;
41
+ }
42
+
43
+ export { sentryTanstackStart };
44
+ //# sourceMappingURL=sentryTanstackStart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentryTanstackStart.js","sources":["../../../src/vite/sentryTanstackStart.ts"],"sourcesContent":["import type { BuildTimeOptionsBase } from '@sentry/core';\nimport type { Plugin } from 'vite';\nimport { makeAddSentryVitePlugin, makeEnableSourceMapsVitePlugin } from './sourceMaps';\n\n/**\n * Vite plugins for the Sentry TanStack Start SDK.\n *\n * @example\n * ```typescript\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import { sentryTanstackStart } from '@sentry/tanstackstart-react';\n * import { tanstackStart } from '@tanstack/react-start/plugin/vite';\n *\n * export default defineConfig({\n * plugins: [\n * sentryTanstackStart({\n * org: 'your-org',\n * project: 'your-project',\n * }),\n * tanstackStart(),\n * ],\n * });\n * ```\n *\n * @param options - Options to configure the Sentry Vite plugins\n * @returns An array of Vite plugins\n */\nexport function sentryTanstackStart(options: BuildTimeOptionsBase = {}): Plugin[] {\n // Only add plugins in production builds\n if (process.env.NODE_ENV === 'development') {\n return [];\n }\n\n const plugins: Plugin[] = [...makeAddSentryVitePlugin(options)];\n\n const sourceMapsDisabled = options.sourcemaps?.disable === true || options.sourcemaps?.disable === 'disable-upload';\n if (!sourceMapsDisabled) {\n plugins.push(...makeEnableSourceMapsVitePlugin(options));\n }\n\n return plugins;\n}\n"],"names":[],"mappings":";;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,OAAO,GAAyB,EAAE,EAAY;AAClF;AACA,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAA,KAAa,aAAa,EAAE;AAC9C,IAAI,OAAO,EAAE;AACb,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAa,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;;AAEjE,EAAE,MAAM,kBAAA,GAAqB,OAAO,CAAC,UAAU,EAAE,OAAA,KAAY,IAAA,IAAQ,OAAO,CAAC,UAAU,EAAE,OAAA,KAAY,gBAAgB;AACrH,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;AAC5D,EAAE;;AAEF,EAAE,OAAO,OAAO;AAChB;;;;"}
@@ -0,0 +1,161 @@
1
+ import { sentryVitePlugin } from '@sentry/vite-plugin';
2
+
3
+ /**
4
+ * A Sentry plugin for adding the @sentry/vite-plugin to automatically upload source maps to Sentry.
5
+ */
6
+ function makeAddSentryVitePlugin(options) {
7
+ const {
8
+ authToken,
9
+ bundleSizeOptimizations,
10
+ debug,
11
+ errorHandler,
12
+ headers,
13
+ org,
14
+ project,
15
+ release,
16
+ sentryUrl,
17
+ silent,
18
+ sourcemaps,
19
+ telemetry,
20
+ } = options;
21
+
22
+ // defer resolving the filesToDeleteAfterUpload until we got access to the Vite config
23
+ let resolveFilesToDeleteAfterUpload;
24
+ const filesToDeleteAfterUploadPromise = new Promise(resolve => {
25
+ resolveFilesToDeleteAfterUpload = resolve;
26
+ });
27
+
28
+ const configPlugin = {
29
+ name: 'sentry-tanstackstart-files-to-delete-after-upload-plugin',
30
+ apply: 'build',
31
+ enforce: 'post',
32
+ config(config) {
33
+ const userFilesToDelete = sourcemaps?.filesToDeleteAfterUpload;
34
+
35
+ // Only auto-delete source maps if the user didn't configure sourcemaps at all
36
+ if (typeof userFilesToDelete === 'undefined' && typeof config.build?.sourcemap === 'undefined') {
37
+ if (debug) {
38
+ // eslint-disable-next-line no-console
39
+ console.log(
40
+ '[Sentry] Automatically setting `sourcemaps.filesToDeleteAfterUpload: ["./**/*.map"]` to delete generated source maps after they were uploaded to Sentry.',
41
+ );
42
+ }
43
+ resolveFilesToDeleteAfterUpload?.(['./**/*.map']);
44
+ } else {
45
+ resolveFilesToDeleteAfterUpload?.(userFilesToDelete);
46
+ }
47
+ },
48
+ };
49
+
50
+ const sentryPlugins = sentryVitePlugin({
51
+ authToken: authToken ?? process.env.SENTRY_AUTH_TOKEN,
52
+ bundleSizeOptimizations: bundleSizeOptimizations ?? undefined,
53
+ debug: debug ?? false,
54
+ errorHandler,
55
+ headers,
56
+ org: org ?? process.env.SENTRY_ORG,
57
+ project: project ?? process.env.SENTRY_PROJECT,
58
+ release,
59
+ silent,
60
+ sourcemaps: {
61
+ assets: sourcemaps?.assets,
62
+ disable: sourcemaps?.disable,
63
+ ignore: sourcemaps?.ignore,
64
+ filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,
65
+ },
66
+ telemetry: telemetry ?? true,
67
+ url: sentryUrl,
68
+ _metaOptions: {
69
+ telemetry: {
70
+ metaFramework: 'tanstackstart-react',
71
+ },
72
+ },
73
+ });
74
+
75
+ return [configPlugin, ...sentryPlugins];
76
+ }
77
+
78
+ /**
79
+ * A Sentry plugin for TanStack Start React to enable "hidden" source maps if they are unset.
80
+ */
81
+ function makeEnableSourceMapsVitePlugin(options) {
82
+ return [
83
+ {
84
+ name: 'sentry-tanstackstart-react-source-maps',
85
+ apply: 'build',
86
+ enforce: 'post',
87
+ config(viteConfig) {
88
+ return {
89
+ ...viteConfig,
90
+ build: {
91
+ ...viteConfig.build,
92
+ sourcemap: getUpdatedSourceMapSettings(viteConfig, options),
93
+ },
94
+ };
95
+ },
96
+ },
97
+ ];
98
+ }
99
+
100
+ /** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)
101
+ *
102
+ * 1. User explicitly disabled source maps
103
+ * - keep this setting (emit a warning that errors won't be unminified in Sentry)
104
+ * - We won't upload anything
105
+ *
106
+ * 2. Users enabled source map generation (true, 'hidden', 'inline').
107
+ * - keep this setting (don't do anything - like deletion - besides uploading)
108
+ *
109
+ * 3. Users didn't set source maps generation
110
+ * - we enable 'hidden' source maps generation
111
+ * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)
112
+ *
113
+ * --> only exported for testing
114
+ */
115
+ function getUpdatedSourceMapSettings(
116
+ viteConfig,
117
+ sentryPluginOptions,
118
+ ) {
119
+ viteConfig.build = viteConfig.build || {};
120
+
121
+ const viteUserSourceMapSetting = viteConfig.build?.sourcemap;
122
+ const settingKey = 'vite.build.sourcemap';
123
+ const debug = sentryPluginOptions?.debug;
124
+
125
+ // Respect user source map setting if it is explicitly set
126
+ if (viteUserSourceMapSetting === false) {
127
+ if (debug) {
128
+ // eslint-disable-next-line no-console
129
+ console.warn(
130
+ `[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.`,
131
+ );
132
+ } else {
133
+ // eslint-disable-next-line no-console
134
+ console.warn('[Sentry] Source map generation is disabled in your TanStack Start configuration.');
135
+ }
136
+
137
+ return viteUserSourceMapSetting;
138
+ } else if (viteUserSourceMapSetting && ['hidden', 'inline', true].includes(viteUserSourceMapSetting)) {
139
+ if (debug) {
140
+ // eslint-disable-next-line no-console
141
+ console.log(
142
+ `[Sentry] We discovered \`${settingKey}\` is set to \`${viteUserSourceMapSetting.toString()}\`. Sentry will keep this source map setting.`,
143
+ );
144
+ }
145
+
146
+ return viteUserSourceMapSetting;
147
+ }
148
+
149
+ // If the user did not specify a source map setting, we enable 'hidden' by default
150
+ if (debug) {
151
+ // eslint-disable-next-line no-console
152
+ console.log(
153
+ `[Sentry] Enabled source map generation in the build options with \`${settingKey}: 'hidden'\`. The source maps will be deleted after they were uploaded to Sentry.`,
154
+ );
155
+ }
156
+
157
+ return 'hidden';
158
+ }
159
+
160
+ export { getUpdatedSourceMapSettings, makeAddSentryVitePlugin, makeEnableSourceMapsVitePlugin };
161
+ //# sourceMappingURL=sourceMaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import type { BuildTimeOptionsBase } from '@sentry/core';\nimport { sentryVitePlugin } from '@sentry/vite-plugin';\nimport type { Plugin, UserConfig } from 'vite';\n\ntype FilesToDeleteAfterUpload = string | string[] | undefined;\n\n/**\n * A Sentry plugin for adding the @sentry/vite-plugin to automatically upload source maps to Sentry.\n */\nexport function makeAddSentryVitePlugin(options: BuildTimeOptionsBase): Plugin[] {\n const {\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 } = 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 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 filesToDeleteAfterUpload: filesToDeleteAfterUploadPromise,\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: BuildTimeOptionsBase): 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?: BuildTimeOptionsBase,\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":";;AAMA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,OAAO,EAAkC;AACjF,EAAE,MAAM;AACR,IAAI,SAAS;AACb,IAAI,uBAAuB;AAC3B,IAAI,KAAK;AACT,IAAI,YAAY;AAChB,IAAI,OAAO;AACX,IAAI,GAAG;AACP,IAAI,OAAO;AACX,IAAI,OAAO;AACX,IAAI,SAAS;AACb,IAAI,MAAM;AACV,IAAI,UAAU;AACd,IAAI,SAAS;AACb,GAAE,GAAI,OAAO;;AAEb;AACA,EAAE,IAAI,+BAA+B;AACrC,EAAE,MAAM,+BAAA,GAAkC,IAAI,OAAO,CAA2B,WAAW;AAC3F,IAAI,+BAAA,GAAkC,OAAO;AAC7C,EAAE,CAAC,CAAC;;AAEJ,EAAE,MAAM,YAAY,GAAW;AAC/B,IAAI,IAAI,EAAE,0DAA0D;AACpE,IAAI,KAAK,EAAE,OAAO;AAClB,IAAI,OAAO,EAAE,MAAM;AACnB,IAAI,MAAM,CAAC,MAAM,EAAE;AACnB,MAAM,MAAM,iBAAA,GAAoB,UAAU,EAAE,wBAAwB;;AAEpE;AACA,MAAM,IAAI,OAAO,iBAAA,KAAsB,WAAA,IAAe,OAAO,MAAM,CAAC,KAAK,EAAE,SAAA,KAAc,WAAW,EAAE;AACtG,QAAQ,IAAI,KAAK,EAAE;AACnB;AACA,UAAU,OAAO,CAAC,GAAG;AACrB,YAAY,0JAA0J;AACtK,WAAW;AACX,QAAQ;AACR,QAAQ,+BAA+B,GAAG,CAAC,YAAY,CAAC,CAAC;AACzD,MAAM,OAAO;AACb,QAAQ,+BAA+B,GAAG,iBAAiB,CAAC;AAC5D,MAAM;AACN,IAAI,CAAC;AACL,GAAG;;AAEH,EAAE,MAAM,aAAA,GAAgB,gBAAgB,CAAC;AACzC,IAAI,SAAS,EAAE,SAAA,IAAa,OAAO,CAAC,GAAG,CAAC,iBAAiB;AACzD,IAAI,uBAAuB,EAAE,uBAAA,IAA2B,SAAS;AACjE,IAAI,KAAK,EAAE,KAAA,IAAS,KAAK;AACzB,IAAI,YAAY;AAChB,IAAI,OAAO;AACX,IAAI,GAAG,EAAE,GAAA,IAAO,OAAO,CAAC,GAAG,CAAC,UAAU;AACtC,IAAI,OAAO,EAAE,OAAA,IAAW,OAAO,CAAC,GAAG,CAAC,cAAc;AAClD,IAAI,OAAO;AACX,IAAI,MAAM;AACV,IAAI,UAAU,EAAE;AAChB,MAAM,MAAM,EAAE,UAAU,EAAE,MAAM;AAChC,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO;AAClC,MAAM,MAAM,EAAE,UAAU,EAAE,MAAM;AAChC,MAAM,wBAAwB,EAAE,+BAA+B;AAC/D,KAAK;AACL,IAAI,SAAS,EAAE,SAAA,IAAa,IAAI;AAChC,IAAI,GAAG,EAAE,SAAS;AAClB,IAAI,YAAY,EAAE;AAClB,MAAM,SAAS,EAAE;AACjB,QAAQ,aAAa,EAAE,qBAAqB;AAC5C,OAAO;AACP,KAAK;AACL,GAAG,CAAC;;AAEJ,EAAE,OAAO,CAAC,YAAY,EAAE,GAAG,aAAa,CAAC;AACzC;;AAEA;AACA;AACA;AACO,SAAS,8BAA8B,CAAC,OAAO,EAAkC;AACxF,EAAE,OAAO;AACT,IAAI;AACJ,MAAM,IAAI,EAAE,wCAAwC;AACpD,MAAM,KAAK,EAAE,OAAO;AACpB,MAAM,OAAO,EAAE,MAAM;AACrB,MAAM,MAAM,CAAC,UAAU,EAAE;AACzB,QAAQ,OAAO;AACf,UAAU,GAAG,UAAU;AACvB,UAAU,KAAK,EAAE;AACjB,YAAY,GAAG,UAAU,CAAC,KAAK;AAC/B,YAAY,SAAS,EAAE,2BAA2B,CAAC,UAAU,EAAE,OAAO,CAAC;AACvE,WAAW;AACX,SAAS;AACT,MAAM,CAAC;AACP,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B;AAC3C,EAAE,UAAU;AACZ,EAAE,mBAAmB;AACrB,EAAiC;AACjC,EAAE,UAAU,CAAC,KAAA,GAAQ,UAAU,CAAC,KAAA,IAAS,EAAE;;AAE3C,EAAE,MAAM,wBAAA,GAA2B,UAAU,CAAC,KAAK,EAAE,SAAS;AAC9D,EAAE,MAAM,UAAA,GAAa,sBAAsB;AAC3C,EAAE,MAAM,KAAA,GAAQ,mBAAmB,EAAE,KAAK;;AAE1C;AACA,EAAE,IAAI,wBAAA,KAA6B,KAAK,EAAE;AAC1C,IAAI,IAAI,KAAK,EAAE;AACf;AACA,MAAM,OAAO,CAAC,IAAI;AAClB,QAAQ,CAAC,6FAA6F,EAAE,UAAU,CAAC,kIAAkI,CAAC;AACtP,OAAO;AACP,IAAI,OAAO;AACX;AACA,MAAM,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC;AACtG,IAAI;;AAEJ,IAAI,OAAO,wBAAwB;AACnC,EAAE,OAAO,IAAI,wBAAA,IAA4B,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;AACxG,IAAI,IAAI,KAAK,EAAE;AACf;AACA,MAAM,OAAO,CAAC,GAAG;AACjB,QAAQ,CAAC,yBAAyB,EAAE,UAAU,CAAC,eAAe,EAAE,wBAAwB,CAAC,QAAQ,EAAE,CAAC,6CAA6C,CAAC;AAClJ,OAAO;AACP,IAAI;;AAEJ,IAAI,OAAO,wBAAwB;AACnC,EAAE;;AAEF;AACA,EAAE,IAAI,KAAK,EAAE;AACb;AACA,IAAI,OAAO,CAAC,GAAG;AACf,MAAM,CAAC,mEAAmE,EAAE,UAAU,CAAC,iFAAiF,CAAC;AACzK,KAAK;AACL,EAAE;;AAEF,EAAE,OAAO,QAAQ;AACjB;;;;"}
@@ -1,3 +1,9 @@
1
+ import type { TanStackMiddlewareBase } from '../common/types';
1
2
  export * from '@sentry/react';
2
3
  export { init } from './sdk';
4
+ /**
5
+ * No-op stub for client-side builds.
6
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
7
+ */
8
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAGA,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAE/G"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ export type { TanStackMiddlewareBase, MiddlewareWrapperOptions } from './types';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type TanStackMiddlewareBase = {
2
+ options?: {
3
+ server?: (...args: unknown[]) => unknown;
4
+ };
5
+ };
6
+ export type MiddlewareWrapperOptions = {
7
+ name: string;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AAGzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './config';
2
2
  export * from './server';
3
3
  export * from './common';
4
+ export * from './vite';
4
5
  //# 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;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
@@ -5,6 +5,7 @@ export * from './config';
5
5
  export * from './client';
6
6
  export * from './server';
7
7
  export * from './common';
8
+ export * from './vite';
8
9
  /** Initializes Sentry TanStack Start SDK */
9
10
  export declare function init(options: Options | clientSdk.BrowserOptions | serverSdk.NodeOptions): Client | undefined;
10
11
  export declare const linkedErrorsIntegration: typeof clientSdk.linkedErrorsIntegration;
@@ -21,4 +22,5 @@ export declare const openFeatureIntegration: typeof clientSdk.openFeatureIntegra
21
22
  export declare const OpenFeatureIntegrationHook: typeof clientSdk.OpenFeatureIntegrationHook;
22
23
  export declare const statsigIntegration: typeof clientSdk.statsigIntegration;
23
24
  export declare const unleashIntegration: typeof clientSdk.unleashIntegration;
25
+ export declare const wrapMiddlewaresWithSentry: typeof serverSdk.wrapMiddlewaresWithSentry;
24
26
  //# sourceMappingURL=index.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAE3C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AAEzB,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AAEvF,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,SAAS,CAAC,aAAa,CAAC;AACnE,MAAM,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,SAAS,CAAC,iBAAiB,CAAC;AAE3E,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAE/E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAE3C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AAEvB,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AAEvF,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,SAAS,CAAC,aAAa,CAAC;AACnE,MAAM,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,SAAS,CAAC,iBAAiB,CAAC;AAE3E,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAE/E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAE7E,MAAM,CAAC,OAAO,CAAC,MAAM,yBAAyB,EAAE,OAAO,SAAS,CAAC,yBAAyB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from '@sentry/node';
2
2
  export { init } from './sdk';
3
3
  export { wrapFetchWithSentry } from './wrapFetchWithSentry';
4
+ export { wrapMiddlewaresWithSentry } from './middleware';
4
5
  /**
5
6
  * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors
6
7
  * so they should simply be a passthrough.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,SAU7E,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GACvC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAEb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,SAU7E,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GACvC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAEb"}
@@ -0,0 +1,22 @@
1
+ import type { TanStackMiddlewareBase } from '../common/types';
2
+ /**
3
+ * Wraps multiple TanStack Start middlewares with Sentry instrumentation.
4
+ * Object keys are used as span names to avoid users having to specify this manually.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { wrapMiddlewaresWithSentry } from '@sentry/tanstackstart-react';
9
+ *
10
+ * const wrappedMiddlewares = wrapMiddlewaresWithSentry({
11
+ * authMiddleware,
12
+ * loggingMiddleware,
13
+ * });
14
+ *
15
+ * createServerFn().middleware(wrappedMiddlewares)
16
+ * ```
17
+ *
18
+ * @param middlewares - An object containing middlewares
19
+ * @returns An array of wrapped middlewares
20
+ */
21
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
22
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/server/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA4B,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAmFxF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAI/G"}
@@ -1,3 +1,4 @@
1
+ import type { StartSpanOptions } from '@sentry/core';
1
2
  /**
2
3
  * Extracts the SHA-256 hash from a server function pathname.
3
4
  * Server function pathnames are structured as `/_serverFn/<hash>`.
@@ -7,4 +8,8 @@
7
8
  * @returns the sha256 of the server function
8
9
  */
9
10
  export declare function extractServerFunctionSha256(pathname: string): string;
11
+ /**
12
+ * Returns span options for TanStack Start middleware spans.
13
+ */
14
+ export declare function getMiddlewareSpanOptions(name: string): StartSpanOptions;
10
15
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CASvE"}
@@ -0,0 +1,2 @@
1
+ export { sentryTanstackStart } from './sentryTanstackStart';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { BuildTimeOptionsBase } from '@sentry/core';
2
+ import type { Plugin } from 'vite';
3
+ /**
4
+ * Vite plugins for the Sentry TanStack Start SDK.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // vite.config.ts
9
+ * import { defineConfig } from 'vite';
10
+ * import { sentryTanstackStart } from '@sentry/tanstackstart-react';
11
+ * import { tanstackStart } from '@tanstack/react-start/plugin/vite';
12
+ *
13
+ * export default defineConfig({
14
+ * plugins: [
15
+ * sentryTanstackStart({
16
+ * org: 'your-org',
17
+ * project: 'your-project',
18
+ * }),
19
+ * tanstackStart(),
20
+ * ],
21
+ * });
22
+ * ```
23
+ *
24
+ * @param options - Options to configure the Sentry Vite plugins
25
+ * @returns An array of Vite plugins
26
+ */
27
+ export declare function sentryTanstackStart(options?: BuildTimeOptionsBase): Plugin[];
28
+ //# sourceMappingURL=sentryTanstackStart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentryTanstackStart.d.ts","sourceRoot":"","sources":["../../../src/vite/sentryTanstackStart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,EAAE,CAchF"}
@@ -0,0 +1,27 @@
1
+ import type { BuildTimeOptionsBase } from '@sentry/core';
2
+ import type { Plugin, UserConfig } from 'vite';
3
+ /**
4
+ * A Sentry plugin for adding the @sentry/vite-plugin to automatically upload source maps to Sentry.
5
+ */
6
+ export declare function makeAddSentryVitePlugin(options: BuildTimeOptionsBase): Plugin[];
7
+ /**
8
+ * A Sentry plugin for TanStack Start React to enable "hidden" source maps if they are unset.
9
+ */
10
+ export declare function makeEnableSourceMapsVitePlugin(options: BuildTimeOptionsBase): Plugin[];
11
+ /** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)
12
+ *
13
+ * 1. User explicitly disabled source maps
14
+ * - keep this setting (emit a warning that errors won't be unminified in Sentry)
15
+ * - We won't upload anything
16
+ *
17
+ * 2. Users enabled source map generation (true, 'hidden', 'inline').
18
+ * - keep this setting (don't do anything - like deletion - besides uploading)
19
+ *
20
+ * 3. Users didn't set source maps generation
21
+ * - we enable 'hidden' source maps generation
22
+ * - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)
23
+ *
24
+ * --> only exported for testing
25
+ */
26
+ export declare function getUpdatedSourceMapSettings(viteConfig: UserConfig, sentryPluginOptions?: BuildTimeOptionsBase): boolean | 'inline' | 'hidden';
27
+ //# sourceMappingURL=sourceMaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMaps.d.ts","sourceRoot":"","sources":["../../../src/vite/sourceMaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAI/C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAsE/E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAiBtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,UAAU,EACtB,mBAAmB,CAAC,EAAE,oBAAoB,GACzC,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAwC/B"}
@@ -1,3 +1,9 @@
1
+ import { TanStackMiddlewareBase } from '../common/types';
1
2
  export * from '@sentry/react';
2
3
  export { init } from './sdk';
4
+ /**
5
+ * No-op stub for client-side builds.
6
+ * The actual implementation is server-only, but this stub is needed to prevent build errors.
7
+ */
8
+ export declare function wrapMiddlewaresWithSentry<T extends TanStackMiddlewareBase>(middlewares: Record<string, T>): T[];
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export {};
1
+ export { TanStackMiddlewareBase, MiddlewareWrapperOptions } from './types';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ export type TanStackMiddlewareBase = {
2
+ options?: {
3
+ server?: (...args: unknown[]) => unknown;
4
+ };
5
+ };
6
+ export type MiddlewareWrapperOptions = {
7
+ name: string;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map