diff --git a/packages/astro/test/server/middleware.test.ts b/packages/astro/test/server/middleware.test.ts index 208e9a522d0a..a5a43f78e7b3 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, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 5, 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 8d4de6484544..38adc185eb1b 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; /** * Controls generative AI input/output recording. @@ -75,7 +78,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>; genAI: Required>; }; diff --git a/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts b/packages/core/src/utils/data-collection/defaultPiiToCollectionOptions.ts index 361275f62f02..3ae0a8aaa6ce 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 7, // default should be 5, but ContextLines integration uses 7 @@ -25,7 +25,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 }, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 7, // default should be 5, but ContextLines integration uses 7 diff --git a/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts b/packages/core/src/utils/data-collection/resolveDataCollectionOptions.ts index 558bb05a468c..8a79ef5c5141 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 5, @@ -42,7 +42,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, genAI: { inputs: dc.genAI?.inputs ?? base.genAI.inputs, outputs: dc.genAI?.outputs ?? base.genAI.outputs, diff --git a/packages/core/test/lib/integrations/mcp-server/testUtils.ts b/packages/core/test/lib/integrations/mcp-server/testUtils.ts index fce9bf7d2ae8..86dafe27b9f4 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, genAI: genAIOptions, stackFrameVariables: true, frameContextLines: 5, 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 fcd9463e7f0f..c1882827a0aa 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 7, @@ -24,7 +24,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'] }, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 7, @@ -40,7 +40,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'] }, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 7, @@ -56,7 +56,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'] }, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 7, 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 2cd76e599a05..4380e5ac116e 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 5, @@ -44,7 +44,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.genAI).toEqual({ inputs: true, outputs: true }); }); @@ -86,7 +86,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.genAI).toEqual({ inputs: true, outputs: true }); expect(result.stackFrameVariables).toBe(true); expect(result.frameContextLines).toBe(5); @@ -124,14 +124,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); }); }); @@ -146,7 +146,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('genAI'); expect(result).toHaveProperty('genAI.inputs'); expect(result).toHaveProperty('genAI.outputs'); @@ -154,4 +154,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(8); + }); + }); }); diff --git a/packages/core/test/lib/utils/request.test.ts b/packages/core/test/lib/utils/request.test.ts index 609dde8a05ab..16b176701ccf 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 5, diff --git a/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts b/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts index d022eef4492f..1792e01c4981 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, genAI: { inputs: false, outputs: false }, stackFrameVariables: true, frameContextLines: 5, diff --git a/packages/remix/test/server/errors.test.ts b/packages/remix/test/server/errors.test.ts index a3faf2dfdfdc..24050ff1e066 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, genAI: { inputs: true, outputs: true }, stackFrameVariables: true, frameContextLines: 5,