diff --git a/packages/astro/test/server/middleware.test.ts b/packages/astro/test/server/middleware.test.ts index 6293bff213d7..205cfb7e757f 100644 --- a/packages/astro/test/server/middleware.test.ts +++ b/packages/astro/test/server/middleware.test.ts @@ -63,7 +63,7 @@ describe('sentryMiddleware', () => { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: [], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: false, outputs: false }, databaseQueryData: true, diff --git a/packages/core/src/integrations/requestdata.ts b/packages/core/src/integrations/requestdata.ts index 5dc956c4dd73..27990ad2d6cc 100644 --- a/packages/core/src/integrations/requestdata.ts +++ b/packages/core/src/integrations/requestdata.ts @@ -56,7 +56,7 @@ const _requestDataIntegration = ((options: RequestDataIntegrationOptions = {}) = data: true, headers: dataCollection.httpHeaders.request !== false, ip: dataCollection.userInfo, - query_string: dataCollection.queryParams !== false, + query_string: dataCollection.urlQueryParams !== false, // No dataCollection equivalent — URL is always included url: true, ...options.include, diff --git a/packages/core/src/types/datacollection.ts b/packages/core/src/types/datacollection.ts index 88af5b354ebd..b160170761d7 100644 --- a/packages/core/src/types/datacollection.ts +++ b/packages/core/src/types/datacollection.ts @@ -44,11 +44,14 @@ export interface DataCollection { */ httpBodies?: HttpBodyCollectionTarget[]; + /** @deprecated Use `urlQueryParams` instead. */ + queryParams?: CollectBehavior; + /** - * Controls query parameter collection and sensitive value filtering. + * Controls URL query parameter collection and sensitive value filtering. * @default true */ - queryParams?: CollectBehavior; + urlQueryParams?: CollectBehavior; /** * Allow collection of GraphQL operation data when using the SDK's GraphQL integrations @@ -102,7 +105,8 @@ export interface DataCollection { /** * Fully resolved `DataCollection` with all defaults applied. */ -export type ResolvedDataCollection = Required & { +// todo(v11): change `Omit` to just `DataCollection` +export type ResolvedDataCollection = Required> & { httpHeaders: Required>; graphQL: Required>; genAI: Required>; diff --git a/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts b/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts index b1338bf6a777..b70cddc267f4 100644 --- a/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts +++ b/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts @@ -15,7 +15,7 @@ export function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): Resolve cookies: true, httpHeaders: { request: true, response: true }, httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true, @@ -27,7 +27,7 @@ export function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): Resolve cookies: { deny: PII_HEADER_SNIPPETS }, httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } }, httpBodies: [], - queryParams: { deny: PII_HEADER_SNIPPETS }, + urlQueryParams: { deny: PII_HEADER_SNIPPETS }, // The GraphQL document has literal values redacted at collection time, so it was historically // always attached regardless of `sendDefaultPii`; keep it on to preserve that behavior. graphQL: { document: true, variables: true }, diff --git a/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts b/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts index 26da8ac0c1f5..4c558737903e 100644 --- a/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts +++ b/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts @@ -6,7 +6,7 @@ const DEFAULTS: ResolvedDataCollection = { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true, @@ -44,7 +44,8 @@ export function resolveDataCollectionOptions(options: { response: dc.httpHeaders?.response ?? base.httpHeaders.response, }, httpBodies: dc.httpBodies ?? base.httpBodies, - queryParams: dc.queryParams ?? base.queryParams, + // oxlint-disable-next-line typescript/no-deprecated + urlQueryParams: dc.urlQueryParams ?? dc.queryParams ?? base.urlQueryParams, graphQL: { document: dc.graphQL?.document ?? base.graphQL.document, variables: dc.graphQL?.variables ?? base.graphQL.variables, diff --git a/packages/core/test/lib/integrations/mcp-server/testUtils.ts b/packages/core/test/lib/integrations/mcp-server/testUtils.ts index d1b0c0aab237..2a34ee6eeb8a 100644 --- a/packages/core/test/lib/integrations/mcp-server/testUtils.ts +++ b/packages/core/test/lib/integrations/mcp-server/testUtils.ts @@ -16,7 +16,7 @@ export function createMockClient(userInfo = true, genAI?: { inputs: boolean; out cookies: true, httpHeaders: { request: true, response: true }, httpBodies: [], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: genAIOptions, databaseQueryData: true, diff --git a/packages/core/test/lib/utils/data-collection/defaultPiiToCollectionOptions.test.ts b/packages/core/test/lib/utils/data-collection/defaultPiiToCollectionOptions.test.ts index 55449201d664..c76dc1dccb4b 100644 --- a/packages/core/test/lib/utils/data-collection/defaultPiiToCollectionOptions.test.ts +++ b/packages/core/test/lib/utils/data-collection/defaultPiiToCollectionOptions.test.ts @@ -8,7 +8,7 @@ describe('defaultPiiToCollectionOptions', () => { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true, @@ -26,7 +26,7 @@ describe('defaultPiiToCollectionOptions', () => { response: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, }, httpBodies: [], - queryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, + urlQueryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, graphQL: { document: true, variables: true }, genAI: { inputs: false, outputs: false }, databaseQueryData: false, @@ -44,7 +44,7 @@ describe('defaultPiiToCollectionOptions', () => { response: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, }, httpBodies: [], - queryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, + urlQueryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, graphQL: { document: true, variables: true }, genAI: { inputs: false, outputs: false }, databaseQueryData: false, @@ -62,7 +62,7 @@ describe('defaultPiiToCollectionOptions', () => { response: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, }, httpBodies: [], - queryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, + urlQueryParams: { deny: ['forwarded', '-ip', 'remote-', 'via', '-user'] }, graphQL: { document: true, variables: true }, genAI: { inputs: false, outputs: false }, databaseQueryData: false, diff --git a/packages/core/test/lib/utils/data-collection/resolveDataCollectionOptions.test.ts b/packages/core/test/lib/utils/data-collection/resolveDataCollectionOptions.test.ts index 0deee7654d09..9f554a1897e2 100644 --- a/packages/core/test/lib/utils/data-collection/resolveDataCollectionOptions.test.ts +++ b/packages/core/test/lib/utils/data-collection/resolveDataCollectionOptions.test.ts @@ -7,7 +7,7 @@ describe('resolveDataCollectionOptions', () => { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true, @@ -49,7 +49,7 @@ describe('resolveDataCollectionOptions', () => { expect(result.cookies).toBe(true); expect(result.httpHeaders).toEqual({ request: true, response: true }); expect(result.httpBodies).toEqual(['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse']); - expect(result.queryParams).toBe(true); + expect(result.urlQueryParams).toBe(true); expect(result.graphQL).toEqual({ document: true, variables: true }); expect(result.genAI).toEqual({ inputs: true, outputs: true }); expect(result.databaseQueryData).toBe(true); @@ -96,7 +96,7 @@ describe('resolveDataCollectionOptions', () => { // Everything else is spec default expect(result.cookies).toBe(true); expect(result.httpHeaders).toEqual({ request: true, response: true }); - expect(result.queryParams).toBe(true); + expect(result.urlQueryParams).toBe(true); expect(result.graphQL).toEqual({ document: true, variables: true }); expect(result.genAI).toEqual({ inputs: true, outputs: true }); expect(result.databaseQueryData).toBe(true); @@ -147,14 +147,14 @@ describe('resolveDataCollectionOptions', () => { expect(result.cookies).toEqual({ deny: ['x-custom'] }); }); - it('supports turning off query params', () => { + it('supports turning off URL query params', () => { const result = resolveDataCollectionOptions({ dataCollection: { - queryParams: false, + urlQueryParams: false, }, }); - expect(result.queryParams).toBe(false); + expect(result.urlQueryParams).toBe(false); }); it('supports turning off database query data', () => { @@ -179,7 +179,7 @@ describe('resolveDataCollectionOptions', () => { expect(result).toHaveProperty('httpHeaders.request'); expect(result).toHaveProperty('httpHeaders.response'); expect(result).toHaveProperty('httpBodies'); - expect(result).toHaveProperty('queryParams'); + expect(result).toHaveProperty('urlQueryParams'); expect(result).toHaveProperty('graphQL'); expect(result).toHaveProperty('graphQL.document'); expect(result).toHaveProperty('graphQL.variables'); @@ -191,4 +191,36 @@ describe('resolveDataCollectionOptions', () => { expect(result).toHaveProperty('frameContextLines'); }); }); + + describe('deprecated queryParams alias', () => { + it('honors deprecated queryParams when urlQueryParams is not set', () => { + expect(resolveDataCollectionOptions({ dataCollection: { queryParams: false } }).urlQueryParams).toBe(false); + + expect( + resolveDataCollectionOptions({ dataCollection: { queryParams: { deny: ['token'] } } }).urlQueryParams, + ).toEqual({ deny: ['token'] }); + }); + + it('prefers urlQueryParams over the deprecated queryParams when both are set', () => { + // new field wins, even when it is the "off" value + expect( + resolveDataCollectionOptions({ dataCollection: { urlQueryParams: false, queryParams: true } }).urlQueryParams, + ).toBe(false); + + expect( + resolveDataCollectionOptions({ dataCollection: { urlQueryParams: true, queryParams: false } }).urlQueryParams, + ).toBe(true); + }); + + it('falls back to the default when neither is set', () => { + // dataCollection provided → spec default (collect) + expect(resolveDataCollectionOptions({ dataCollection: {} }).urlQueryParams).toBe(true); + }); + + it('does not leak the deprecated queryParams key into the resolved output', () => { + const result = resolveDataCollectionOptions({ dataCollection: { queryParams: false } }); + expect(result).not.toHaveProperty('queryParams'); + expect(Object.keys(result)).toHaveLength(10); + }); + }); }); diff --git a/packages/core/test/lib/utils/request.test.ts b/packages/core/test/lib/utils/request.test.ts index cf0ffe3ac231..4783f98be9f0 100644 --- a/packages/core/test/lib/utils/request.test.ts +++ b/packages/core/test/lib/utils/request.test.ts @@ -873,7 +873,7 @@ describe('request utils', () => { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: [], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true, diff --git a/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts b/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts index c19bcc1ed099..e84b6aeb461b 100644 --- a/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts +++ b/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts @@ -46,7 +46,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { cookies: true, httpHeaders: { request: true, response: true }, httpBodies: [], - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: false, outputs: false }, databaseQueryData: true, diff --git a/packages/remix/test/server/errors.test.ts b/packages/remix/test/server/errors.test.ts index 4f58e280c3ee..6288d4df8238 100644 --- a/packages/remix/test/server/errors.test.ts +++ b/packages/remix/test/server/errors.test.ts @@ -16,7 +16,7 @@ function createMockClient(httpBodies: string[] = []): Client { cookies: true, httpHeaders: { request: true, response: true }, httpBodies, - queryParams: true, + urlQueryParams: true, graphQL: { document: true, variables: true }, genAI: { inputs: true, outputs: true }, databaseQueryData: true,