Skip to content

feat: Refactor exposed defaultIntegrations to getDefaultIntegrations() #10243

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions packages/angular-ivy/src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { VERSION } from '@angular/core';
import type { BrowserOptions } from '@sentry/browser';
import { SDK_VERSION, defaultIntegrations, init as browserInit, setContext } from '@sentry/browser';
import { getDefaultIntegrations } from '@sentry/browser';
import { SDK_VERSION, init as browserInit, setContext } from '@sentry/browser';
import type { SdkMetadata } from '@sentry/types';
import { logger } from '@sentry/utils';

Expand All @@ -18,7 +19,7 @@ export function init(options: BrowserOptions): void {
// see:
// - https://github.com/getsentry/sentry-javascript/issues/5417#issuecomment-1453407097
// - https://github.com/getsentry/sentry-javascript/issues/2744
defaultIntegrations: defaultIntegrations.filter(integration => {
defaultIntegrations: getDefaultIntegrations(options).filter(integration => {
return integration.name !== 'TryCatch';
}),
...options,
Expand Down
5 changes: 3 additions & 2 deletions packages/angular/src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { VERSION } from '@angular/core';
import type { BrowserOptions } from '@sentry/browser';
import { SDK_VERSION, defaultIntegrations, init as browserInit, setContext } from '@sentry/browser';
import { getDefaultIntegrations } from '@sentry/browser';
import { SDK_VERSION, init as browserInit, setContext } from '@sentry/browser';
import type { SdkMetadata } from '@sentry/types';
import { logger } from '@sentry/utils';

Expand All @@ -18,7 +19,7 @@ export function init(options: BrowserOptions): void {
// see:
// - https://github.com/getsentry/sentry-javascript/issues/5417#issuecomment-1453407097
// - https://github.com/getsentry/sentry-javascript/issues/2744
defaultIntegrations: defaultIntegrations.filter(integration => {
defaultIntegrations: getDefaultIntegrations(options).filter(integration => {
return integration.name !== 'TryCatch';
}),
...options,
Expand Down
27 changes: 17 additions & 10 deletions packages/angular/test/sdk.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as SentryBrowser from '@sentry/browser';

import { defaultIntegrations, init } from '../src/index';
import { getDefaultIntegrations, init } from '../src/index';

describe('init', () => {
it('sets the Angular version (if available) in the global scope', () => {
Expand Down Expand Up @@ -30,16 +30,23 @@ describe('init', () => {
expect(options.defaultIntegrations).not.toContainEqual(expect.objectContaining({ name: 'TryCatch' }));
});

it.each([false as const, defaultIntegrations])(
"doesn't filter if `defaultIntegrations` is set to %s",
defaultIntegrations => {
init({ defaultIntegrations });
it("doesn't filter if `defaultIntegrations` is set to `false`", () => {
init({ defaultIntegrations: false });

expect(browserInitSpy).toHaveBeenCalledTimes(1);
expect(browserInitSpy).toHaveBeenCalledTimes(1);

const options = browserInitSpy.mock.calls[0][0] || {};
expect(options.defaultIntegrations).toEqual(false);
});

it("doesn't filter if `defaultIntegrations` is overwritten", () => {
const defaultIntegrations = getDefaultIntegrations({});
init({ defaultIntegrations });

const options = browserInitSpy.mock.calls[0][0] || {};
expect(options.defaultIntegrations).toEqual(defaultIntegrations);
},
);
expect(browserInitSpy).toHaveBeenCalledTimes(1);

const options = browserInitSpy.mock.calls[0][0] || {};
expect(options.defaultIntegrations).toEqual(defaultIntegrations);
});
});
});
2 changes: 2 additions & 0 deletions packages/astro/src/index.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ export {
withIsolationScope,
autoDiscoverNodePerformanceMonitoringIntegrations,
makeNodeTransport,
// eslint-disable-next-line deprecation/deprecation
defaultIntegrations,
getDefaultIntegrations,
defaultStackParser,
// eslint-disable-next-line deprecation/deprecation
lastEventId,
Expand Down
1 change: 1 addition & 0 deletions packages/astro/src/index.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export declare function init(options: Options | clientSdk.BrowserOptions | serve
export declare const Integrations: typeof clientSdk.Integrations & typeof serverSdk.Integrations;

export declare const defaultIntegrations: Integration[];
export declare const getDefaultIntegrations: (options: Options) => Integration[];
export declare const defaultStackParser: StackParser;

export declare function close(timeout?: number | undefined): PromiseLike<boolean>;
Expand Down
2 changes: 2 additions & 0 deletions packages/browser/src/exports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ export {
export { eventFromException, eventFromMessage, exceptionFromError } from './eventbuilder';
export { createUserFeedbackEnvelope } from './userfeedback';
export {
// eslint-disable-next-line deprecation/deprecation
defaultIntegrations,
getDefaultIntegrations,
forceLoad,
init,
onLoad,
Expand Down
18 changes: 14 additions & 4 deletions packages/browser/src/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
initAndBind,
startSession,
} from '@sentry/core';
import type { UserFeedback } from '@sentry/types';
import type { Integration, Options, UserFeedback } from '@sentry/types';
import {
addHistoryInstrumentationHandler,
logger,
Expand All @@ -27,18 +27,28 @@ import { Breadcrumbs, Dedupe, GlobalHandlers, HttpContext, LinkedErrors, TryCatc
import { defaultStackParser } from './stack-parsers';
import { makeFetchTransport, makeXHRTransport } from './transports';

/* eslint-disable deprecation/deprecation */
/** @deprecated Use `getDefaultIntegrations(options)` instead. */
export const defaultIntegrations = [
/* eslint-disable deprecation/deprecation */
new InboundFilters(),
new FunctionToString(),
/* eslint-enable deprecation/deprecation */
new TryCatch(),
new Breadcrumbs(),
new GlobalHandlers(),
new LinkedErrors(),
new Dedupe(),
new HttpContext(),
];
/* eslint-enable deprecation/deprecation */

/** Get the default integrations for the browser SDK. */
export function getDefaultIntegrations(_options: Options): Integration[] {
// We return a copy of the defaultIntegrations here to avoid mutating this
return [
// eslint-disable-next-line deprecation/deprecation
...defaultIntegrations,
];
}

/**
* A magic string that build tooling can leverage in order to inject a release value into the SDK.
Expand Down Expand Up @@ -104,7 +114,7 @@ declare const __SENTRY_RELEASE__: string | undefined;
*/
export function init(options: BrowserOptions = {}): void {
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = defaultIntegrations;
options.defaultIntegrations = getDefaultIntegrations(options);
}
if (options.release === undefined) {
// This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value
Expand Down
7 changes: 6 additions & 1 deletion packages/bun/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ export type { SpanStatusType } from '@sentry/core';
export { autoDiscoverNodePerformanceMonitoringIntegrations, cron } from '@sentry/node';

export { BunClient } from './client';
export { defaultIntegrations, init } from './sdk';
export {
// eslint-disable-next-line deprecation/deprecation
defaultIntegrations,
getDefaultIntegrations,
init,
} from './sdk';

import { Integrations as CoreIntegrations } from '@sentry/core';
import { Integrations as NodeIntegrations } from '@sentry/node';
Expand Down
23 changes: 17 additions & 6 deletions packages/bun/src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
/* eslint-disable max-lines */
import { FunctionToString, InboundFilters, LinkedErrors } from '@sentry/core';
import { Integrations as NodeIntegrations, init as initNode } from '@sentry/node';
import type { Integration, Options } from '@sentry/types';

import { BunClient } from './client';
import { BunServer } from './integrations';
import { makeFetchTransport } from './transports';
import type { BunOptions } from './types';

/* eslint-disable deprecation/deprecation */
/** @deprecated Use `getDefaultIntegrations(options)` instead. */
export const defaultIntegrations = [
/* eslint-disable deprecation/deprecation */
// Common
new InboundFilters(),
new FunctionToString(),
new LinkedErrors(),
/* eslint-enable deprecation/deprecation */
// Native Wrappers
new NodeIntegrations.Console(),
new NodeIntegrations.Http(),
Expand All @@ -29,7 +32,15 @@ export const defaultIntegrations = [
// Bun Specific
new BunServer(),
];
/* eslint-enable deprecation/deprecation */

/** Get the default integrations for the Bun SDK. */
export function getDefaultIntegrations(_options: Options): Integration[] {
// We return a copy of the defaultIntegrations here to avoid mutating this
return [
// eslint-disable-next-line deprecation/deprecation
...defaultIntegrations,
];
}

/**
* The Sentry Bun SDK Client.
Expand Down Expand Up @@ -90,9 +101,9 @@ export function init(options: BunOptions = {}): void {
options.clientClass = BunClient;
options.transport = options.transport || makeFetchTransport;

options.defaultIntegrations =
options.defaultIntegrations === false
? []
: [...(Array.isArray(options.defaultIntegrations) ? options.defaultIntegrations : defaultIntegrations)];
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = getDefaultIntegrations(options);
}

initNode(options);
}
7 changes: 6 additions & 1 deletion packages/deno/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,12 @@ export type { SpanStatusType } from '@sentry/core';

export { DenoClient } from './client';

export { defaultIntegrations, init } from './sdk';
export {
// eslint-disable-next-line deprecation/deprecation
defaultIntegrations,
getDefaultIntegrations,
init,
} from './sdk';

import { Integrations as CoreIntegrations } from '@sentry/core';

Expand Down
23 changes: 16 additions & 7 deletions packages/deno/src/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@ import { Breadcrumbs, Dedupe } from '@sentry/browser';
import type { ServerRuntimeClientOptions } from '@sentry/core';
import { FunctionToString, InboundFilters, LinkedErrors } from '@sentry/core';
import { getIntegrationsToSetup, initAndBind } from '@sentry/core';
import type { StackParser } from '@sentry/types';
import type { Integration, Options, StackParser } from '@sentry/types';
import { createStackParser, nodeStackLineParser, stackParserFromStackParserOptions } from '@sentry/utils';

import { DenoClient } from './client';
import { ContextLines, DenoContext, GlobalHandlers, NormalizePaths } from './integrations';
import { makeFetchTransport } from './transports';
import type { DenoOptions } from './types';

/* eslint-disable deprecation/deprecation */
/** @deprecated Use `getDefaultIntegrations(options)` instead. */
export const defaultIntegrations = [
/* eslint-disable deprecation/deprecation */
// Common
new InboundFilters(),
new FunctionToString(),
new LinkedErrors(),
/* eslint-enable deprecation/deprecation */
// From Browser
new Dedupe(),
new Breadcrumbs({
Expand All @@ -29,7 +31,15 @@ export const defaultIntegrations = [
new NormalizePaths(),
new GlobalHandlers(),
];
/* eslint-enable deprecation/deprecation */

/** Get the default integrations for the Deno SDK. */
export function getDefaultIntegrations(_options: Options): Integration[] {
// We return a copy of the defaultIntegrations here to avoid mutating this
return [
// eslint-disable-next-line deprecation/deprecation
...defaultIntegrations,
];
}

const defaultStackParser: StackParser = createStackParser(nodeStackLineParser());

Expand Down Expand Up @@ -89,10 +99,9 @@ const defaultStackParser: StackParser = createStackParser(nodeStackLineParser())
* @see {@link DenoOptions} for documentation on configuration options.
*/
export function init(options: DenoOptions = {}): void {
options.defaultIntegrations =
options.defaultIntegrations === false
? []
: [...(Array.isArray(options.defaultIntegrations) ? options.defaultIntegrations : defaultIntegrations)];
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = getDefaultIntegrations(options);
}

const clientOptions: ServerRuntimeClientOptions = {
...options,
Expand Down
4 changes: 2 additions & 2 deletions packages/deno/test/mod.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { assertSnapshot } from 'https://deno.land/[email protected]/testing/snapshot.t

import type { sentryTypes } from '../build-test/index.js';
import { sentryUtils } from '../build-test/index.js';
import { DenoClient, Hub, Scope, defaultIntegrations } from '../build/index.mjs';
import { DenoClient, Hub, Scope, getDefaultIntegrations } from '../build/index.mjs';
import { getNormalizedEvent } from './normalize.ts';
import { makeTestTransport } from './transport.ts';

Expand All @@ -14,7 +14,7 @@ function getTestClient(
const client = new DenoClient({
dsn: 'https://[email protected]/5650507',
debug: true,
integrations: [...defaultIntegrations, ...integrations],
integrations: [...getDefaultIntegrations({}), ...integrations],
stackParser: sentryUtils.createStackParser(sentryUtils.nodeStackLineParser()),
transport: makeTestTransport(envelope => {
callback(getNormalizedEvent(envelope));
Expand Down
1 change: 1 addition & 0 deletions packages/nextjs/src/index.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export declare const Integrations: typeof clientSdk.Integrations &
typeof edgeSdk.Integrations;

export declare const defaultIntegrations: Integration[];
export declare const getDefaultIntegrations: (options: Options) => Integration[];
export declare const defaultStackParser: StackParser;

export declare function getSentryRelease(fallback?: string): string | undefined;
Expand Down
2 changes: 1 addition & 1 deletion packages/nextjs/test/clientSdk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ describe('Client init()', () => {
});

const reactInitOptions = reactInit.mock.calls[0][0] as ModifiedInitOptionsIntegrationFunction;
const materializedIntegrations = reactInitOptions.integrations(SentryReact.defaultIntegrations);
const materializedIntegrations = reactInitOptions.integrations(SentryReact.getDefaultIntegrations({}));
const browserTracingIntegration = findIntegrationByName(materializedIntegrations, 'BrowserTracing');

expect(browserTracingIntegration).toEqual(
Expand Down
8 changes: 8 additions & 0 deletions packages/node-experimental/src/integrations/node-fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import type { Instrumentation } from '@opentelemetry/instrumentation';
import { addBreadcrumb, hasTracingEnabled } from '@sentry/core';
import { _INTERNAL, getClient, getSpanKind } from '@sentry/opentelemetry';
import type { Integration } from '@sentry/types';
import { parseSemver } from '@sentry/utils';

import type { NodeExperimentalClient } from '../types';
import { addOriginToSpan } from '../utils/addOriginToSpan';
import { NodePerformanceIntegration } from './NodePerformanceIntegration';

const NODE_VERSION: ReturnType<typeof parseSemver> = parseSemver(process.versions.node);

interface NodeFetchOptions {
/**
* Whether breadcrumbs should be recorded for requests
Expand Down Expand Up @@ -65,6 +68,11 @@ export class NodeFetch extends NodePerformanceIntegration<NodeFetchOptions> impl

/** @inheritDoc */
public setupInstrumentation(): void | Instrumentation[] {
// Only add NodeFetch if Node >= 16, as previous versions do not support it
if (!NODE_VERSION.major || NODE_VERSION.major < 16) {
return;
}

try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { FetchInstrumentation } = require('opentelemetry-instrumentation-fetch-node');
Expand Down
Loading