Skip to content

Commit afd9ad3

Browse files
committed
feat: Allow providing discoveredIntegrations through internal options
1 parent bd50c6d commit afd9ad3

File tree

6 files changed

+53
-40
lines changed

6 files changed

+53
-40
lines changed

packages/browser/src/sdk.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,16 @@ export const defaultIntegrations = [
7474
* @see {@link BrowserOptions} for documentation on configuration options.
7575
*/
7676
export function init(options: BrowserOptions = {}): void {
77-
if (options.defaultIntegrations === undefined) {
78-
options.defaultIntegrations = defaultIntegrations;
77+
options._internal = options._internal || {};
78+
79+
// Both `defaultIntegrations` and `discoverIntegrations` should be `boolean`, but we are stuck with this type
80+
// for backwards compatibility at the momement.
81+
if (options.defaultIntegrations !== false) {
82+
options._internal.defaultIntegrations = Array.isArray(options.defaultIntegrations)
83+
? options.defaultIntegrations
84+
: defaultIntegrations;
7985
}
86+
8087
if (options.release === undefined) {
8188
const window = getGlobalObject<Window>();
8289
// This supports the variable that sentry-webpack-plugin injects

packages/core/src/baseclient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export abstract class BaseClient<B extends Backend, O extends Options> implement
202202
*/
203203
public setupIntegrations(): void {
204204
if (this._isEnabled()) {
205-
this._integrations = setupIntegrations(this._options);
205+
this._integrations = setupIntegrations(this.getOptions());
206206
}
207207
}
208208

packages/core/src/integration.ts

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,35 @@ export interface IntegrationIndex {
1111

1212
/** Gets integration to install */
1313
export function getIntegrationsToSetup(options: Options): Integration[] {
14-
const defaultIntegrations = (options.defaultIntegrations && [...options.defaultIntegrations]) || [];
15-
const userIntegrations = options.integrations;
16-
let integrations: Integration[] = [];
17-
if (Array.isArray(userIntegrations)) {
18-
const userIntegrationsNames = userIntegrations.map(i => i.name);
19-
const pickedIntegrationsNames: string[] = [];
14+
const defaultIntegrations = options._internal?.defaultIntegrations || [];
15+
const discoveredIntegrations = options._internal?.discoveredIntegrations || [];
16+
const userIntegrations = options.integrations || [];
2017

21-
// Leave only unique default integrations, that were not overridden with provided user integrations
22-
defaultIntegrations.forEach(defaultIntegration => {
23-
if (
24-
userIntegrationsNames.indexOf(defaultIntegration.name) === -1 &&
25-
pickedIntegrationsNames.indexOf(defaultIntegration.name) === -1
26-
) {
27-
integrations.push(defaultIntegration);
28-
pickedIntegrationsNames.push(defaultIntegration.name);
29-
}
30-
});
18+
// Filter out default integrations that are also discovered
19+
let integrations: Integration[] = [
20+
...defaultIntegrations.filter(defaultIntegration =>
21+
discoveredIntegrations.every(discoveredIntegration => discoveredIntegration.name !== defaultIntegration.name),
22+
),
23+
...discoveredIntegrations,
24+
];
3125

32-
// Don't add same user integration twice
33-
userIntegrations.forEach(userIntegration => {
34-
if (pickedIntegrationsNames.indexOf(userIntegration.name) === -1) {
35-
integrations.push(userIntegration);
36-
pickedIntegrationsNames.push(userIntegration.name);
37-
}
38-
});
26+
if (Array.isArray(userIntegrations)) {
27+
// Filter out integrations that are also included in user options
28+
integrations = [
29+
...integrations.filter(integrations =>
30+
userIntegrations.every(userIntegration => userIntegration.name !== integrations.name),
31+
),
32+
// And filter out duplicated user options integrations
33+
...userIntegrations.reduce((acc, userIntegration) => {
34+
if (acc.every(accIntegration => userIntegration.name !== accIntegration.name)) {
35+
acc.push(userIntegration);
36+
}
37+
return acc;
38+
}, [] as Integration[]),
39+
];
3940
} else if (typeof userIntegrations === 'function') {
40-
integrations = userIntegrations(defaultIntegrations);
41+
integrations = userIntegrations(integrations);
4142
integrations = Array.isArray(integrations) ? integrations : [integrations];
42-
} else {
43-
integrations = [...defaultIntegrations];
44-
}
45-
46-
// Make sure that if present, `Debug` integration will always run last
47-
const integrationsNames = integrations.map(i => i.name);
48-
const alwaysLastToRun = 'Debug';
49-
if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {
50-
integrations.push(...integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1));
5143
}
5244

5345
return integrations;
@@ -69,7 +61,7 @@ export function setupIntegration(integration: Integration): void {
6961
* @param integrations array of integration instances
7062
* @param withDefault should enable default integrations
7163
*/
72-
export function setupIntegrations<O extends Options>(options: O): IntegrationIndex {
64+
export function setupIntegrations(options: Options): IntegrationIndex {
7365
const integrations: IntegrationIndex = {};
7466
getIntegrationsToSetup(options).forEach(integration => {
7567
integrations[integration.name] = integration;

packages/node/src/sdk.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';
22
import { getMainCarrier, setHubOnCarrier } from '@sentry/hub';
3+
import { Integration } from '@sentry/types';
34
import { getGlobalObject } from '@sentry/utils';
45
import * as domain from 'domain';
56

@@ -77,8 +78,14 @@ export const defaultIntegrations = [
7778
* @see {@link NodeOptions} for documentation on configuration options.
7879
*/
7980
export function init(options: NodeOptions = {}): void {
80-
if (options.defaultIntegrations === undefined) {
81-
options.defaultIntegrations = defaultIntegrations;
81+
options._internal = options._internal || {};
82+
83+
// Both `defaultIntegrations` and `discoverIntegrations` should be `boolean`, but we are stuck with this type
84+
// for backwards compatibility at the momement.
85+
if (options.defaultIntegrations !== false) {
86+
options._internal.defaultIntegrations = Array.isArray(options.defaultIntegrations)
87+
? options.defaultIntegrations
88+
: defaultIntegrations;
8289
}
8390

8491
if (options.dsn === undefined && process.env.SENTRY_DSN) {

packages/tracing/src/hubextensions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ function sample<T extends Transaction>(transaction: T, options: Options, samplin
117117
return transaction;
118118
}
119119

120-
logger.log(`[Tracing] starting ${transaction.op} transaction - ${transaction.name}`);
120+
logger.log(`[Tracing] Starting ${transaction.op} transaction: ${transaction.name}.`);
121121
return transaction;
122122
}
123123

packages/types/src/options.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ export interface Options {
3333
*/
3434
defaultIntegrations?: false | Integration[];
3535

36+
/**
37+
* If this is set to false, will not try to auto-discover installed integrations.
38+
*/
39+
discoverIntegrations?: boolean;
40+
3641
/**
3742
* List of integrations that should be installed after SDK was initialized.
3843
* Accepts either a list of integrations or a function that receives
@@ -124,6 +129,8 @@ export interface Options {
124129
* and provide additional data about every request.
125130
* */
126131
sdk?: SdkInfo;
132+
defaultIntegrations?: Integration[];
133+
discoveredIntegrations?: Integration[];
127134
};
128135

129136
/**

0 commit comments

Comments
 (0)