Skip to content

Commit f0a7919

Browse files
committed
ECMAScript 2020 typescript-eslint/prefer-optional-chain
1 parent e72710b commit f0a7919

26 files changed

+54
-71
lines changed

packages/core/plugin/src/withSentry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ interface PluginProps {
1818
const withSentryPlugin: ConfigPlugin<PluginProps | void> = (config, props) => {
1919
const sentryProperties = getSentryProperties(props);
2020

21-
if (props && props.authToken) {
21+
if (props?.authToken) {
2222
// If not removed, the plugin config with the authToken will be written to the application package
2323
delete props.authToken;
2424
}

packages/core/plugin/src/withSentryAndroidGradlePlugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function withSentryAndroidGradlePlugin(
3535
const withSentryProjectBuildGradle = (config: any): any => {
3636
return withProjectBuildGradle(config, (projectBuildGradle: any) => {
3737
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
38-
if (!projectBuildGradle.modResults || !projectBuildGradle.modResults.contents) {
38+
if (!projectBuildGradle.modResults?.contents) {
3939
warnOnce('android/build.gradle content is missing or undefined.');
4040
return config;
4141
}

packages/core/src/js/integrations/debugsymbolicator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function replaceExceptionFramesInException(exception: Exception, frames: SentryS
143143
* @param frames StackFrame[]
144144
*/
145145
function replaceThreadFramesInEvent(event: Event, frames: SentryStackFrame[]): void {
146-
if (event.threads && event.threads.values && event.threads.values[0] && event.threads.values[0].stacktrace) {
146+
if (event.threads?.values && event.threads?.values[0] && event.threads?.values[0].stacktrace) {
147147
event.threads.values[0].stacktrace.frames = frames.reverse();
148148
}
149149
}

packages/core/src/js/integrations/nativelinkederrors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const nativeLinkedErrorsIntegration = (options: Partial<LinkedErrorsOptio
4343
};
4444

4545
function preprocessEvent(event: Event, hint: EventHint | undefined, client: Client, limit: number, key: string): void {
46-
if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {
46+
if (!event.exception?.values || !hint || !isInstanceOf(hint.originalException, Error)) {
4747
return;
4848
}
4949

@@ -176,7 +176,7 @@ function exceptionFromAppleStackReturnAddresses(objCException: {
176176
type: objCException.name,
177177
value: objCException.message,
178178
stacktrace: {
179-
frames: (nativeStackFrames && nativeStackFrames.frames.reverse()) || [],
179+
frames: nativeStackFrames?.frames.reverse() || [],
180180
},
181181
},
182182
appleDebugImages: (nativeStackFrames && (nativeStackFrames.debugMetaImages as DebugImage[])) || [],

packages/core/src/js/integrations/reactnativeerrorhandlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ function setupErrorUtilsGlobalHandler(): void {
9999
return;
100100
}
101101

102-
const defaultHandler = errorUtils.getGlobalHandler && errorUtils.getGlobalHandler();
102+
const defaultHandler = errorUtils.getGlobalHandler?.();
103103

104104
// eslint-disable-next-line @typescript-eslint/no-explicit-any
105105
errorUtils.setGlobalHandler(async (error: any, isFatal?: boolean) => {

packages/core/src/js/integrations/screenshot.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const screenshotIntegration = (): Integration => {
1818
};
1919

2020
async function processEvent(event: Event, hint: EventHint, client: ReactNativeClient): Promise<Event> {
21-
const hasException = event.exception && event.exception.values && event.exception.values.length > 0;
21+
const hasException = event.exception?.values?.length > 0;
2222
if (!hasException || client.getOptions().beforeScreenshot?.(event, hint) === false) {
2323
return event;
2424
}

packages/core/src/js/integrations/spotlight.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,5 @@ export function getDefaultSidecarUrl(): string {
102102
function getHostnameFromString(urlString: string): string | null {
103103
const regex = /^(?:\w+:)?\/\/([^/:]+)(:\d+)?(.*)$/;
104104
const matches = urlString.match(regex);
105-
106-
if (matches && matches[1]) {
107-
return matches[1];
108-
} else {
109-
// Invalid URL format
110-
return null;
111-
}
105+
return matches?.[1] ?? null;
112106
}

packages/core/src/js/integrations/viewhierarchy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const viewHierarchyIntegration = (): Integration => {
2121
};
2222

2323
async function processEvent(event: Event, hint: EventHint): Promise<Event> {
24-
const hasException = event.exception && event.exception.values && event.exception.values.length > 0;
24+
const hasException = event.exception?.values?.length > 0;
2525
if (!hasException) {
2626
return event;
2727
}

packages/core/src/js/profiling/convertHermesProfile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ function mapStacks(
163163
while (currentHermesFrameId !== undefined) {
164164
const sentryFrameId = hermesStackFrameIdToSentryFrameIdMap.get(currentHermesFrameId);
165165
sentryFrameId !== undefined && stack.push(sentryFrameId);
166-
currentHermesFrameId = hermesStackFrames[currentHermesFrameId] && hermesStackFrames[currentHermesFrameId].parent;
166+
currentHermesFrameId = hermesStackFrames[currentHermesFrameId]?.parent;
167167
}
168168
stacks.push(stack);
169169
}

packages/core/src/js/profiling/integration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export const hermesProfilingIntegration = (initOptions: HermesProfilingOptions =
128128
}
129129

130130
const client = getClient<ReactNativeClient>();
131-
const options = client && client.getOptions();
131+
const options = client?.getOptions();
132132

133133
const profilesSampleRate =
134134
options && typeof options.profilesSampleRate === 'number' ? options.profilesSampleRate : undefined;

packages/core/src/js/profiling/utils.ts

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function enrichCombinedProfileWithEventContext(
7575
return null;
7676
}
7777

78-
const trace_id = (event.contexts && event.contexts.trace && event.contexts.trace.trace_id) || '';
78+
const trace_id = event.contexts?.trace?.trace_id || '';
7979

8080
// Log a warning if the profile has an invalid traceId (should be uuidv4).
8181
// All profiles and transactions are rejected if this is the case and we want to
@@ -97,25 +97,25 @@ export function enrichCombinedProfileWithEventContext(
9797
release: event.release || '',
9898
environment: event.environment || getDefaultEnvironment(),
9999
os: {
100-
name: (event.contexts && event.contexts.os && event.contexts.os.name) || '',
101-
version: (event.contexts && event.contexts.os && event.contexts.os.version) || '',
102-
build_number: (event.contexts && event.contexts.os && event.contexts.os.build) || '',
100+
name: event.contexts?.os?.name || '',
101+
version: event.contexts?.os?.version || '',
102+
build_number: event.contexts?.os?.build || '',
103103
},
104104
device: {
105-
locale: (event.contexts && event.contexts.device && (event.contexts.device.locale as string)) || '',
106-
model: (event.contexts && event.contexts.device && event.contexts.device.model) || '',
107-
manufacturer: (event.contexts && event.contexts.device && event.contexts.device.manufacturer) || '',
108-
architecture: (event.contexts && event.contexts.device && event.contexts.device.arch) || '',
109-
is_emulator: (event.contexts && event.contexts.device && event.contexts.device.simulator) || false,
105+
locale: (event.contexts?.device?.locale as string) || '',
106+
model: event.contexts?.device?.model || '',
107+
manufacturer: event.contexts?.device?.manufacturer || '',
108+
architecture: event.contexts?.device?.arch || '',
109+
is_emulator: event.contexts?.device?.simulator || false,
110110
},
111111
transaction: {
112112
name: event.transaction || '',
113113
id: event.event_id || '',
114114
trace_id,
115-
active_thread_id: (profile.transaction && profile.transaction.active_thread_id) || '',
115+
active_thread_id: profile.transaction?.active_thread_id || '',
116116
},
117117
debug_meta: {
118-
images: [...getDebugMetadata(), ...((profile.debug_meta && profile.debug_meta.images) || [])],
118+
images: [...getDebugMetadata(), ...(profile.debug_meta?.images || [])],
119119
},
120120
};
121121
}
@@ -136,19 +136,15 @@ export function enrichAndroidProfileWithEventContext(
136136
build_id: profile.build_id || '',
137137

138138
device_cpu_frequencies: [],
139-
device_is_emulator: (event.contexts && event.contexts.device && event.contexts.device.simulator) || false,
140-
device_locale: (event.contexts && event.contexts.device && (event.contexts.device.locale as string)) || '',
141-
device_manufacturer: (event.contexts && event.contexts.device && event.contexts.device.manufacturer) || '',
142-
device_model: (event.contexts && event.contexts.device && event.contexts.device.model) || '',
143-
device_os_name: (event.contexts && event.contexts.os && event.contexts.os.name) || '',
144-
device_os_version: (event.contexts && event.contexts.os && event.contexts.os.version) || '',
139+
device_is_emulator: event.contexts?.device?.simulator || false,
140+
device_locale: (event.contexts?.device?.locale as string) || '',
141+
device_manufacturer: event.contexts?.device?.manufacturer || '',
142+
device_model: event.contexts?.device?.model || '',
143+
device_os_name: event.contexts?.os?.name || '',
144+
device_os_version: event.contexts?.os?.version || '',
145145

146146
device_physical_memory_bytes:
147-
(event.contexts &&
148-
event.contexts.device &&
149-
event.contexts.device.memory_size &&
150-
Number(event.contexts.device.memory_size).toString(10)) ||
151-
'',
147+
(event.contexts?.device?.memory_size && Number(event.contexts.device.memory_size).toString(10)) || '',
152148

153149
environment: event.environment || getDefaultEnvironment(),
154150

@@ -161,7 +157,7 @@ export function enrichAndroidProfileWithEventContext(
161157

162158
transaction_id: event.event_id || '',
163159
transaction_name: event.transaction || '',
164-
trace_id: (event.contexts && event.contexts.trace && event.contexts.trace.trace_id) || '',
160+
trace_id: event.contexts?.trace?.trace_id || '',
165161

166162
version_name: event.release || '',
167163
version_code: event.dist || '',

packages/core/src/js/replay/CustomMask.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const UnmaskFallback = (viewProps: ViewProps): React.ReactElement => {
3232
return <View {...viewProps} />;
3333
};
3434

35-
const hasViewManagerConfig = (nativeComponentName: string): boolean => UIManager.hasViewManagerConfig && UIManager.hasViewManagerConfig(nativeComponentName);
35+
const hasViewManagerConfig = (nativeComponentName: string): boolean => UIManager.hasViewManagerConfig?.(nativeComponentName);
3636

3737
const Mask = ((): HostComponent<ViewProps> | React.ComponentType<ViewProps> => {
3838
if (!hasViewManagerConfig(MaskNativeComponentName)) {

packages/core/src/js/replay/mobilereplay.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export const mobileReplayIntegration = (initOptions: MobileReplayOptions = defau
7676
const options = { ...defaultOptions, ...initOptions };
7777

7878
async function processEvent(event: Event): Promise<Event> {
79-
const hasException = event.exception && event.exception.values && event.exception.values.length > 0;
79+
const hasException = event.exception?.values?.length > 0;
8080
if (!hasException) {
8181
// Event is not an error, will not capture replay
8282
return event;

packages/core/src/js/tools/metroconfig.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export function withSentryBabelTransformer(
140140
config: MetroConfig,
141141
annotateReactComponents: true | { ignoredComponents?: string[] },
142142
): MetroConfig {
143-
const defaultBabelTransformerPath = config.transformer && config.transformer.babelTransformerPath;
143+
const defaultBabelTransformerPath = config.transformer?.babelTransformerPath;
144144
logger.debug('Default Babel transformer path from `config.transformer`:', defaultBabelTransformerPath);
145145

146146
if (!defaultBabelTransformerPath) {
@@ -270,10 +270,10 @@ export function withSentryFramesCollapsed(config: MetroConfig): MetroConfig {
270270
originalCustomization: MetroCustomizeFrame | undefined,
271271
): MetroCustomizeFrame => ({
272272
...originalCustomization,
273-
collapse: (originalCustomization && originalCustomization.collapse) || collapseSentryInternalFrames(frame),
273+
collapse: originalCustomization?.collapse || collapseSentryInternalFrames(frame),
274274
});
275275

276-
const maybePromiseCustomization = (originalCustomizeFrame && originalCustomizeFrame(frame)) || undefined;
276+
const maybePromiseCustomization = originalCustomizeFrame?.(frame) || undefined;
277277

278278
if (maybePromiseCustomization !== undefined && 'then' in maybePromiseCustomization) {
279279
return maybePromiseCustomization.then<MetroCustomizeFrame>(originalCustomization =>

packages/core/src/js/tracing/integrations/appStart.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ export const appStartIntegration = ({
212212
return;
213213
}
214214

215-
if (!event.contexts || !event.contexts.trace) {
215+
if (!event.contexts?.trace) {
216216
logger.warn('[AppStart] Transaction event is missing trace context. Can not attach app start.');
217217
return;
218218
}

packages/core/src/js/tracing/onSpanEndUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export const cancelInBackground = (client: Client, span: Span): void => {
129129
client.on('spanEnd', (endedSpan: Span) => {
130130
if (endedSpan === span) {
131131
logger.debug(`Removing AppState listener for ${spanToJSON(span).op} transaction.`);
132-
subscription && subscription.remove && subscription.remove();
132+
subscription?.remove?.();
133133
}
134134
});
135135
};

packages/core/src/js/tracing/reactnativenavigation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export const reactNativeNavigationIntegration = ({
129129
}
130130

131131
latestNavigationSpan = startGenericIdleNavigationSpan(
132-
tracing && tracing.options.beforeStartSpan
132+
tracing?.options.beforeStartSpan
133133
? tracing.options.beforeStartSpan(getDefaultIdleNavigationSpanOptions())
134134
: getDefaultIdleNavigationSpanOptions(),
135135
idleSpanOptions,

packages/core/src/js/tracing/reactnativeprofiler.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class ReactNativeProfiler extends Profiler {
4343
return;
4444
}
4545

46-
client.addIntegration && client.addIntegration(createIntegration(this.name));
46+
client.addIntegration?.(createIntegration(this.name));
4747
// eslint-disable-next-line @typescript-eslint/no-floating-promises
4848
_captureAppStart({ isManual: false });
4949
}

packages/core/src/js/tracing/reactnavigation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ export const reactNavigationIntegration = ({
190190
}
191191

192192
latestNavigationSpan = startGenericIdleNavigationSpan(
193-
tracing && tracing.options.beforeStartSpan
193+
tracing?.options.beforeStartSpan
194194
? tracing.options.beforeStartSpan(getDefaultIdleNavigationSpanOptions())
195195
: getDefaultIdleNavigationSpanOptions(),
196196
idleSpanOptions,

packages/core/src/js/utils/AsyncExpiringMap.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export class AsyncExpiringMap<K, V> {
116116
*/
117117
public ttl(key: K): number | undefined {
118118
const entry = this._map.get(key);
119-
if (entry && entry.expiresAt) {
119+
if (entry?.expiresAt) {
120120
const remainingTime = entry.expiresAt - Date.now();
121121
return remainingTime > 0 ? remainingTime : 0;
122122
}

packages/core/src/js/utils/envelope.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@ export function createUserFeedbackEnvelope(
2222
const headers: EventEnvelope[0] = {
2323
event_id: feedback.event_id,
2424
sent_at: new Date().toISOString(),
25-
...(metadata &&
26-
metadata.sdk && {
27-
sdk: {
28-
name: metadata.sdk.name,
29-
version: metadata.sdk.version,
30-
},
31-
}),
25+
...(metadata?.sdk && {
26+
sdk: {
27+
name: metadata.sdk.name,
28+
version: metadata.sdk.version,
29+
},
30+
}),
3231
...(!!tunnel && !!dsn && { dsn: dsnToString(dsn) }),
3332
};
3433
const item = createUserFeedbackEnvelopeItem(feedback);

packages/core/src/js/utils/environment.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function isExpo(): boolean {
3636
/** Check if JS runs in Expo Go */
3737
export function isExpoGo(): boolean {
3838
const expoConstants = getExpoConstants();
39-
return (expoConstants && expoConstants.appOwnership) === 'expo';
39+
return expoConstants?.appOwnership === 'expo';
4040
}
4141

4242
/** Check Expo Go version if available */
@@ -75,11 +75,7 @@ export function notMobileOs(): boolean {
7575

7676
/** Returns Hermes Version if hermes is present in the runtime */
7777
export function getHermesVersion(): string | undefined {
78-
return (
79-
RN_GLOBAL_OBJ.HermesInternal &&
80-
RN_GLOBAL_OBJ.HermesInternal.getRuntimeProperties &&
81-
RN_GLOBAL_OBJ.HermesInternal.getRuntimeProperties()['OSS Release Version']
82-
);
78+
return RN_GLOBAL_OBJ.HermesInternal?.getRuntimeProperties?.()['OSS Release Version'];
8379
}
8480

8581
/** Returns default environment based on __DEV__ */

packages/core/src/js/utils/expomodules.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import { RN_GLOBAL_OBJ } from './worldwide';
55
* Returns the Expo Constants module if present
66
*/
77
export function getExpoConstants(): ExpoConstants | undefined {
8-
return (
9-
(RN_GLOBAL_OBJ.expo && RN_GLOBAL_OBJ.expo.modules && RN_GLOBAL_OBJ.expo.modules.ExponentConstants) || undefined
10-
);
8+
return RN_GLOBAL_OBJ.expo?.modules?.ExponentConstants || undefined;
119
}
1210

1311
/**
1412
* Returns the Expo Device module if present
1513
*/
1614
export function getExpoDevice(): ExpoDevice | undefined {
17-
return (RN_GLOBAL_OBJ.expo && RN_GLOBAL_OBJ.expo.modules && RN_GLOBAL_OBJ.expo.modules.ExpoDevice) || undefined;
15+
return RN_GLOBAL_OBJ.expo?.modules?.ExpoDevice || undefined;
1816
}

packages/core/src/js/wrapper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import { base64StringFromByteArray, utf8ToBytes } from './vendor';
3737
*/
3838
export function getRNSentryModule(): Spec | undefined {
3939
return isTurboModuleEnabled()
40-
? ReactNativeLibraries.TurboModuleRegistry && ReactNativeLibraries.TurboModuleRegistry.get<Spec>('RNSentry')
40+
? ReactNativeLibraries.TurboModuleRegistry?.get<Spec>('RNSentry')
4141
: NativeModules.RNSentry;
4242
}
4343

packages/core/test/mocks/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export class TestClient extends BaseClient<TestClientOptions> {
8888
super.sendEvent(event, hint);
8989
return;
9090
}
91-
TestClient.sendEventCalled && TestClient.sendEventCalled(event);
91+
TestClient.sendEventCalled?.(event);
9292
}
9393

9494
public sendSession(session: Session): void {

packages/core/test/profiling/integration.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,5 +429,5 @@ function addIntegrationAndForceSetupOnce(integration: Integration): void {
429429
}
430430

431431
client.addIntegration(integration);
432-
integration.setupOnce && integration.setupOnce();
432+
integration.setupOnce?.();
433433
}

0 commit comments

Comments
 (0)