From cd6fda6e977dd7a5bbb1ab7a5da186809154df40 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 12 Feb 2025 10:08:45 +0000 Subject: [PATCH 1/2] feat(core): Allow for nested trpc context --- .../test-applications/node-express/src/app.ts | 8 +++++--- .../test-applications/node-express/tests/trpc.test.ts | 11 ++++++++++- packages/core/src/trpc.ts | 8 ++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) 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..a955838db04b 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 ?? 3), + ); + if (options.attachRpcInput !== undefined ? options.attachRpcInput : clientOptions?.sendDefaultPii) { if (rawInput !== undefined) { trpcContext.input = normalize(rawInput); From 6275d9cbc601dfe9bbef5d4525d8e37fd8cf156f Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 12 Feb 2025 10:10:21 +0000 Subject: [PATCH 2/2] maybe 5 is more sane --- packages/core/src/trpc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/trpc.ts b/packages/core/src/trpc.ts index a955838db04b..571425deb51e 100644 --- a/packages/core/src/trpc.ts +++ b/packages/core/src/trpc.ts @@ -56,7 +56,7 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { trpcContext, '__sentry_override_normalization_depth__', 1 + // 1 for context.input + the normal normalization depth - (clientOptions?.normalizeDepth ?? 3), + (clientOptions?.normalizeDepth ?? 5), // 5 is a sane depth ); if (options.attachRpcInput !== undefined ? options.attachRpcInput : clientOptions?.sendDefaultPii) {