From 787a4fca6b4f56f9048be10c8783482cc8134a8d Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Wed, 14 Sep 2022 12:31:40 -0700 Subject: [PATCH 1/2] move `CrossPlatformRequest` to types package --- packages/node/src/index.ts | 3 +- packages/node/src/requestDataDeprecated.ts | 3 +- packages/node/src/sdk.ts | 3 +- .../tracing/src/integrations/node/express.ts | 10 +-- packages/types/src/index.ts | 2 +- packages/types/src/polymorphics.ts | 67 +++++++++++++++++++ packages/utils/src/requestdata.ts | 67 +------------------ 7 files changed, 75 insertions(+), 80 deletions(-) diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index a0724035533a..5d77a40baae1 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,6 +1,7 @@ export type { Breadcrumb, BreadcrumbHint, + CrossPlatformRequest, Request, SdkInfo, Event, @@ -15,7 +16,7 @@ export type { Thread, User, } from '@sentry/types'; -export type { AddRequestDataToEventOptions, CrossPlatformRequest } from '@sentry/utils'; +export type { AddRequestDataToEventOptions } from '@sentry/utils'; export type { NodeOptions } from './types'; diff --git a/packages/node/src/requestDataDeprecated.ts b/packages/node/src/requestDataDeprecated.ts index e5f562626fd5..570c758f7f67 100644 --- a/packages/node/src/requestDataDeprecated.ts +++ b/packages/node/src/requestDataDeprecated.ts @@ -6,11 +6,10 @@ /* eslint-disable deprecation/deprecation */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Event, ExtractedNodeRequestData } from '@sentry/types'; +import { CrossPlatformRequest, Event, ExtractedNodeRequestData } from '@sentry/types'; import { addRequestDataToEvent, AddRequestDataToEventOptions, - CrossPlatformRequest, extractRequestData as _extractRequestData, } from '@sentry/utils'; import * as cookie from 'cookie'; diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 02566bc22f6c..086cc2179d96 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -1,12 +1,11 @@ /* eslint-disable max-lines */ import { getCurrentHub, getIntegrationsToSetup, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; -import { Event, ExtractedNodeRequestData, SessionStatus, StackParser } from '@sentry/types'; +import { CrossPlatformRequest, Event, ExtractedNodeRequestData, SessionStatus, StackParser } from '@sentry/types'; import { addRequestDataToEvent as _addRequestDataToEvent, AddRequestDataToEventOptions, createStackParser, - CrossPlatformRequest, extractRequestData as _extractRequestData, getGlobalObject, logger, diff --git a/packages/tracing/src/integrations/node/express.ts b/packages/tracing/src/integrations/node/express.ts index d82d29292e46..433faaaec27a 100644 --- a/packages/tracing/src/integrations/node/express.ts +++ b/packages/tracing/src/integrations/node/express.ts @@ -1,12 +1,6 @@ /* eslint-disable max-lines */ -import { Integration, Transaction } from '@sentry/types'; -import { - CrossPlatformRequest, - extractPathForTransaction, - getNumberOfUrlSegments, - isRegExp, - logger, -} from '@sentry/utils'; +import { CrossPlatformRequest, Integration, Transaction } from '@sentry/types'; +import { extractPathForTransaction, getNumberOfUrlSegments, isRegExp, logger } from '@sentry/utils'; type Method = | 'all' diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 99ba88469a20..7541fa7447e4 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -38,7 +38,7 @@ export type { Mechanism } from './mechanism'; export type { ExtractedNodeRequestData, HttpHeaderValue, Primitive, WorkerLocation } from './misc'; export type { ClientOptions, Options } from './options'; export type { Package } from './package'; -export type { PolymorphicEvent } from './polymorphics'; +export type { PolymorphicEvent, CrossPlatformRequest } from './polymorphics'; export type { QueryParams, Request } from './request'; export type { Runtime } from './runtime'; export type { CaptureContext, Scope, ScopeContext } from './scope'; diff --git a/packages/types/src/polymorphics.ts b/packages/types/src/polymorphics.ts index 0274aedfb2b4..4a95ab8105ec 100644 --- a/packages/types/src/polymorphics.ts +++ b/packages/types/src/polymorphics.ts @@ -1,6 +1,8 @@ /** * Event-like interface that's usable in browser and node. * + * Note: Here we mean the kind of events handled by event listeners, not our `Event` type. + * * Property availability taken from https://developer.mozilla.org/en-US/docs/Web/API/Event#browser_compatibility */ export interface PolymorphicEvent { @@ -9,3 +11,68 @@ export interface PolymorphicEvent { readonly target?: unknown; readonly currentTarget?: unknown; } + +/** A `Request` type compatible with Node, Express, browser, etc., because everything is optional */ +export type CrossPlatformRequest = BaseRequest & + BrowserRequest & + NodeRequest & + ExpressRequest & + KoaRequest & + NextjsRequest; + +type BaseRequest = { + method?: string; + url?: string; +}; + +type BrowserRequest = BaseRequest; + +type NodeRequest = BaseRequest & { + headers?: { + [key: string]: string | string[] | undefined; + }; + protocol?: string; + socket?: { + encrypted?: boolean; + remoteAddress?: string; + }; +}; + +type KoaRequest = NodeRequest & { + host?: string; + hostname?: string; + ip?: string; + originalUrl?: string; +}; + +type NextjsRequest = NodeRequest & { + cookies?: { + [key: string]: string; + }; + query?: { + [key: string]: any; + }; +}; + +type ExpressRequest = NodeRequest & { + baseUrl?: string; + body?: string | { [key: string]: any }; + host?: string; + hostname?: string; + ip?: string; + originalUrl?: string; + route?: { + path: string; + stack: [ + { + name: string; + }, + ]; + }; + query?: { + [key: string]: any; + }; + user?: { + [key: string]: any; + }; +}; diff --git a/packages/utils/src/requestdata.ts b/packages/utils/src/requestdata.ts index b45f3e874cfc..355e60fdb5be 100644 --- a/packages/utils/src/requestdata.ts +++ b/packages/utils/src/requestdata.ts @@ -12,7 +12,7 @@ /* eslint-disable max-lines */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Event, ExtractedNodeRequestData, Transaction, TransactionSource } from '@sentry/types'; +import { CrossPlatformRequest, Event, ExtractedNodeRequestData, Transaction, TransactionSource } from '@sentry/types'; import { isPlainObject, isString } from './is'; import { normalize } from './normalize'; @@ -27,71 +27,6 @@ const DEFAULT_INCLUDES = { const DEFAULT_REQUEST_INCLUDES = ['cookies', 'data', 'headers', 'method', 'query_string', 'url']; const DEFAULT_USER_INCLUDES = ['id', 'username', 'email']; -type BaseRequest = { - method?: string; - url?: string; -}; - -type BrowserRequest = BaseRequest; - -type NodeRequest = BaseRequest & { - headers?: { - [key: string]: string | string[] | undefined; - }; - protocol?: string; - socket?: { - encrypted?: boolean; - remoteAddress?: string; - }; -}; - -type KoaRequest = NodeRequest & { - host?: string; - hostname?: string; - ip?: string; - originalUrl?: string; -}; - -type NextjsRequest = NodeRequest & { - cookies?: { - [key: string]: string; - }; - query?: { - [key: string]: any; - }; -}; - -type ExpressRequest = NodeRequest & { - baseUrl?: string; - body?: string | { [key: string]: any }; - host?: string; - hostname?: string; - ip?: string; - originalUrl?: string; - route?: { - path: string; - stack: [ - { - name: string; - }, - ]; - }; - query?: { - [key: string]: any; - }; - user?: { - [key: string]: any; - }; -}; - -/** A `Request` type compatible with Node, Express, browser, etc., because everything is optional */ -export type CrossPlatformRequest = BaseRequest & - BrowserRequest & - NodeRequest & - ExpressRequest & - KoaRequest & - NextjsRequest; - type InjectedNodeDeps = { cookie: { parse: (cookieStr: string) => Record; From 270809e787f988036ea8b10e0de94038e05ef2a1 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Wed, 14 Sep 2022 12:38:32 -0700 Subject: [PATCH 2/2] s/CrossPlatformRequest/PolymorphicRequest --- packages/node/src/index.ts | 2 +- packages/node/src/requestDataDeprecated.ts | 6 +++--- packages/node/src/sdk.ts | 6 +++--- packages/node/test/requestdata.test.ts | 21 +++++++++---------- .../tracing/src/integrations/node/express.ts | 6 +++--- packages/types/src/index.ts | 2 +- packages/types/src/polymorphics.ts | 2 +- packages/utils/src/requestdata.ts | 14 ++++++------- 8 files changed, 29 insertions(+), 30 deletions(-) diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 5d77a40baae1..29f5da167782 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,7 +1,7 @@ export type { Breadcrumb, BreadcrumbHint, - CrossPlatformRequest, + PolymorphicRequest, Request, SdkInfo, Event, diff --git a/packages/node/src/requestDataDeprecated.ts b/packages/node/src/requestDataDeprecated.ts index 570c758f7f67..75f1cca7b65f 100644 --- a/packages/node/src/requestDataDeprecated.ts +++ b/packages/node/src/requestDataDeprecated.ts @@ -6,7 +6,7 @@ /* eslint-disable deprecation/deprecation */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { CrossPlatformRequest, Event, ExtractedNodeRequestData } from '@sentry/types'; +import { Event, ExtractedNodeRequestData, PolymorphicRequest } from '@sentry/types'; import { addRequestDataToEvent, AddRequestDataToEventOptions, @@ -16,9 +16,9 @@ import * as cookie from 'cookie'; import * as url from 'url'; /** - * @deprecated `Handlers.ExpressRequest` is deprecated and will be removed in v8. Use `CrossPlatformRequest` instead. + * @deprecated `Handlers.ExpressRequest` is deprecated and will be removed in v8. Use `PolymorphicRequest` instead. */ -export type ExpressRequest = CrossPlatformRequest; +export type ExpressRequest = PolymorphicRequest; /** * Normalizes data from the request object, accounting for framework differences. diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 086cc2179d96..bb4c3bad7018 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -1,7 +1,7 @@ /* eslint-disable max-lines */ import { getCurrentHub, getIntegrationsToSetup, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; -import { CrossPlatformRequest, Event, ExtractedNodeRequestData, SessionStatus, StackParser } from '@sentry/types'; +import { Event, ExtractedNodeRequestData, PolymorphicRequest, SessionStatus, StackParser } from '@sentry/types'; import { addRequestDataToEvent as _addRequestDataToEvent, AddRequestDataToEventOptions, @@ -293,7 +293,7 @@ function startSessionTracking(): void { */ export function addRequestDataToEvent( event: Event, - req: CrossPlatformRequest, + req: PolymorphicRequest, options?: Omit, ): Event { return _addRequestDataToEvent(event, req, { @@ -317,7 +317,7 @@ export function addRequestDataToEvent( * @returns An object containing normalized request data */ export function extractRequestData( - req: CrossPlatformRequest, + req: PolymorphicRequest, options?: { include?: string[]; }, diff --git a/packages/node/test/requestdata.test.ts b/packages/node/test/requestdata.test.ts index e79e86bb981b..94b1ee939286 100644 --- a/packages/node/test/requestdata.test.ts +++ b/packages/node/test/requestdata.test.ts @@ -6,11 +6,10 @@ // TODO (v8 / #5257): Remove everything above -import { Event, TransactionSource, User } from '@sentry/types'; +import { Event, PolymorphicRequest, TransactionSource, User } from '@sentry/types'; import { addRequestDataToEvent, AddRequestDataToEventOptions, - CrossPlatformRequest, extractPathForTransaction, extractRequestData as newExtractRequestData, } from '@sentry/utils'; @@ -43,7 +42,7 @@ describe.each([parseRequest, addRequestDataToEvent])( } else { return [ event, - req as CrossPlatformRequest, + req as PolymorphicRequest, { include, deps: { @@ -277,7 +276,7 @@ describe.each([oldExtractRequestData, newExtractRequestData])( return [req as ExpressRequest, include] as Parameters; } else { return [ - req as CrossPlatformRequest, + req as PolymorphicRequest, { include, deps: { @@ -496,7 +495,7 @@ describe('extractPathForTransaction', () => { baseUrl: '/api/users', route: { path: '/:id/details' }, originalUrl: '/api/users/123/details', - } as CrossPlatformRequest, + } as PolymorphicRequest, { path: true, method: true }, 'GET /api/users/:id/details', 'route' as TransactionSource, @@ -508,7 +507,7 @@ describe('extractPathForTransaction', () => { baseUrl: '/api/users', route: { path: '/:id/details' }, originalUrl: '/api/users/123/details', - } as CrossPlatformRequest, + } as PolymorphicRequest, { path: true, method: false }, '/api/users/:id/details', 'route' as TransactionSource, @@ -520,7 +519,7 @@ describe('extractPathForTransaction', () => { baseUrl: '/api/users', route: { path: '/:id/details' }, originalUrl: '/api/users/123/details', - } as CrossPlatformRequest, + } as PolymorphicRequest, { path: false, method: true }, 'GET', 'route' as TransactionSource, @@ -532,7 +531,7 @@ describe('extractPathForTransaction', () => { baseUrl: '/api/users', route: { path: '/:id/details' }, originalUrl: '/api/users/123/details', - } as CrossPlatformRequest, + } as PolymorphicRequest, { path: false, method: false }, '', 'route' as TransactionSource, @@ -543,7 +542,7 @@ describe('extractPathForTransaction', () => { method: 'get', baseUrl: '/api/users', originalUrl: '/api/users/123/details', - } as CrossPlatformRequest, + } as PolymorphicRequest, { path: true, method: true }, 'GET /api/users/123/details', 'url' as TransactionSource, @@ -552,7 +551,7 @@ describe('extractPathForTransaction', () => { '%s', ( _: string, - req: CrossPlatformRequest, + req: PolymorphicRequest, options: { path?: boolean; method?: boolean }, expectedRoute: string, expectedSource: TransactionSource, @@ -570,7 +569,7 @@ describe('extractPathForTransaction', () => { baseUrl: '/api/users', route: { path: '/:id/details' }, originalUrl: '/api/users/123/details', - } as CrossPlatformRequest; + } as PolymorphicRequest; const [route, source] = extractPathForTransaction(req, { path: true, diff --git a/packages/tracing/src/integrations/node/express.ts b/packages/tracing/src/integrations/node/express.ts index 433faaaec27a..4633cf3f78f1 100644 --- a/packages/tracing/src/integrations/node/express.ts +++ b/packages/tracing/src/integrations/node/express.ts @@ -1,5 +1,5 @@ /* eslint-disable max-lines */ -import { CrossPlatformRequest, Integration, Transaction } from '@sentry/types'; +import { Integration, PolymorphicRequest, Transaction } from '@sentry/types'; import { extractPathForTransaction, getNumberOfUrlSegments, isRegExp, logger } from '@sentry/utils'; type Method = @@ -33,8 +33,8 @@ type Router = { [method in Method]: (...args: any) => any; // eslint-disable-line @typescript-eslint/no-explicit-any }; -/* Extend the CrossPlatformRequest type with a patched parameter to build a reconstructed route */ -type PatchedRequest = CrossPlatformRequest & { _reconstructedRoute?: string }; +/* Extend the PolymorphicRequest type with a patched parameter to build a reconstructed route */ +type PatchedRequest = PolymorphicRequest & { _reconstructedRoute?: string }; /* Types used for patching the express router prototype */ type ExpressRouter = Router & { diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 7541fa7447e4..19922c56b98d 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -38,7 +38,7 @@ export type { Mechanism } from './mechanism'; export type { ExtractedNodeRequestData, HttpHeaderValue, Primitive, WorkerLocation } from './misc'; export type { ClientOptions, Options } from './options'; export type { Package } from './package'; -export type { PolymorphicEvent, CrossPlatformRequest } from './polymorphics'; +export type { PolymorphicEvent, PolymorphicRequest } from './polymorphics'; export type { QueryParams, Request } from './request'; export type { Runtime } from './runtime'; export type { CaptureContext, Scope, ScopeContext } from './scope'; diff --git a/packages/types/src/polymorphics.ts b/packages/types/src/polymorphics.ts index 4a95ab8105ec..e6fcac8a682f 100644 --- a/packages/types/src/polymorphics.ts +++ b/packages/types/src/polymorphics.ts @@ -13,7 +13,7 @@ export interface PolymorphicEvent { } /** A `Request` type compatible with Node, Express, browser, etc., because everything is optional */ -export type CrossPlatformRequest = BaseRequest & +export type PolymorphicRequest = BaseRequest & BrowserRequest & NodeRequest & ExpressRequest & diff --git a/packages/utils/src/requestdata.ts b/packages/utils/src/requestdata.ts index 355e60fdb5be..3c8c11589575 100644 --- a/packages/utils/src/requestdata.ts +++ b/packages/utils/src/requestdata.ts @@ -12,7 +12,7 @@ /* eslint-disable max-lines */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { CrossPlatformRequest, Event, ExtractedNodeRequestData, Transaction, TransactionSource } from '@sentry/types'; +import { Event, ExtractedNodeRequestData, PolymorphicRequest, Transaction, TransactionSource } from '@sentry/types'; import { isPlainObject, isString } from './is'; import { normalize } from './normalize'; @@ -44,7 +44,7 @@ type InjectedNodeDeps = { */ export function addRequestDataToTransaction( transaction: Transaction | undefined, - req: CrossPlatformRequest, + req: PolymorphicRequest, deps?: InjectedNodeDeps, ): void { if (!transaction) return; @@ -74,7 +74,7 @@ export function addRequestDataToTransaction( * @returns A tuple of the fully constructed transaction name [0] and its source [1] (can be either 'route' or 'url') */ export function extractPathForTransaction( - req: CrossPlatformRequest, + req: PolymorphicRequest, options: { path?: boolean; method?: boolean; customRoute?: string } = {}, ): [string, TransactionSource] { const method = req.method && req.method.toUpperCase(); @@ -110,7 +110,7 @@ export function extractPathForTransaction( type TransactionNamingScheme = 'path' | 'methodPath' | 'handler'; /** JSDoc */ -function extractTransaction(req: CrossPlatformRequest, type: boolean | TransactionNamingScheme): string { +function extractTransaction(req: PolymorphicRequest, type: boolean | TransactionNamingScheme): string { switch (type) { case 'path': { return extractPathForTransaction(req, { path: true })[0]; @@ -154,7 +154,7 @@ function extractUserData( * @returns An object containing normalized request data */ export function extractRequestData( - req: CrossPlatformRequest, + req: PolymorphicRequest, options?: { include?: string[]; deps?: InjectedNodeDeps; @@ -282,7 +282,7 @@ export interface AddRequestDataToEventOptions { */ export function addRequestDataToEvent( event: Event, - req: CrossPlatformRequest, + req: PolymorphicRequest, options?: AddRequestDataToEventOptions, ): Event { const include = { @@ -335,7 +335,7 @@ export function addRequestDataToEvent( } function extractQueryParams( - req: CrossPlatformRequest, + req: PolymorphicRequest, deps?: InjectedNodeDeps, ): string | Record | undefined { // url (including path and query string):