diff --git a/dev-packages/e2e-tests/test-applications/node-express/src/app.ts b/dev-packages/e2e-tests/test-applications/node-express/src/app.ts index de240b761df0..d756c0e08372 100644 --- a/dev-packages/e2e-tests/test-applications/node-express/src/app.ts +++ b/dev-packages/e2e-tests/test-applications/node-express/src/app.ts @@ -115,9 +115,11 @@ export const appRouter = t.router({ await new Promise(resolve => setTimeout(resolve, 400)); return { success: true }; }), - crashSomething: procedure.mutation(() => { - throw new Error('I crashed in a trpc handler'); - }), + crashSomething: procedure + .input(z.object({ nested: z.object({ nested: z.object({ nested: z.string() }) }) })) + .mutation(() => { + throw new Error('I crashed in a trpc handler'); + }), dontFindSomething: procedure.mutation(() => { throw new TRPCError({ code: 'NOT_FOUND', cause: new Error('Page not found') }); }), diff --git a/dev-packages/e2e-tests/test-applications/node-express/tests/trpc.test.ts b/dev-packages/e2e-tests/test-applications/node-express/tests/trpc.test.ts index fcdd9b39a103..633306ae713a 100644 --- a/dev-packages/e2e-tests/test-applications/node-express/tests/trpc.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-express/tests/trpc.test.ts @@ -87,13 +87,22 @@ test('Should record transaction and error for a crashing trpc handler', async ({ ], }); - await expect(trpcClient.crashSomething.mutate()).rejects.toBeDefined(); + await expect(trpcClient.crashSomething.mutate({ nested: { nested: { nested: 'foobar' } } })).rejects.toBeDefined(); await expect(transactionEventPromise).resolves.toBeDefined(); await expect(errorEventPromise).resolves.toBeDefined(); expect((await errorEventPromise).contexts?.trpc?.['procedure_type']).toBe('mutation'); expect((await errorEventPromise).contexts?.trpc?.['procedure_path']).toBe('crashSomething'); + + // Should record nested context + expect((await errorEventPromise).contexts?.trpc?.['input']).toEqual({ + nested: { + nested: { + nested: 'foobar', + }, + }, + }); }); test('Should record transaction and error for a trpc handler that returns a status code', async ({ baseURL }) => { diff --git a/packages/core/src/trpc.ts b/packages/core/src/trpc.ts index e9b4f733078a..571425deb51e 100644 --- a/packages/core/src/trpc.ts +++ b/packages/core/src/trpc.ts @@ -2,6 +2,7 @@ import { getClient, withScope } from './currentScopes'; import { captureException } from './exports'; import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from './semanticAttributes'; import { startSpanManual } from './tracing'; +import { addNonEnumerableProperty } from './utils-hoist'; import { normalize } from './utils-hoist/normalize'; interface SentryTrpcMiddlewareOptions { @@ -51,6 +52,13 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { procedure_type: type, }; + addNonEnumerableProperty( + trpcContext, + '__sentry_override_normalization_depth__', + 1 + // 1 for context.input + the normal normalization depth + (clientOptions?.normalizeDepth ?? 5), // 5 is a sane depth + ); + if (options.attachRpcInput !== undefined ? options.attachRpcInput : clientOptions?.sendDefaultPii) { if (rawInput !== undefined) { trpcContext.input = normalize(rawInput);