Skip to content

Commit e54b1ed

Browse files
Merge efea84f into ae2f6bc
2 parents ae2f6bc + efea84f commit e54b1ed

40 files changed

+210
-202
lines changed

packages/core/package.json

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,20 @@
6666
},
6767
"dependencies": {
6868
"@sentry/babel-plugin-component-annotate": "3.1.2",
69-
"@sentry/browser": "8.54.0",
69+
"@sentry/browser": "9.1.0",
7070
"@sentry/cli": "2.41.1",
71-
"@sentry/core": "8.54.0",
72-
"@sentry/react": "8.54.0",
73-
"@sentry/types": "8.54.0",
74-
"@sentry/utils": "8.54.0"
71+
"@sentry/core": "9.1.0",
72+
"@sentry/react": "9.1.0",
73+
"@sentry/types": "9.1.0"
7574
},
7675
"devDependencies": {
7776
"@babel/core": "^7.25.2",
7877
"@expo/metro-config": "0.19.5",
7978
"@mswjs/interceptors": "^0.25.15",
8079
"@react-native/babel-preset": "0.77.0",
81-
"@sentry-internal/eslint-config-sdk": "8.54.0",
82-
"@sentry-internal/eslint-plugin-sdk": "8.54.0",
83-
"@sentry-internal/typescript": "8.54.0",
80+
"@sentry-internal/eslint-config-sdk": "9.1.0",
81+
"@sentry-internal/eslint-plugin-sdk": "9.1.0",
82+
"@sentry-internal/typescript": "9.1.0",
8483
"@sentry/wizard": "3.40.0",
8584
"@testing-library/react-native": "^12.7.2",
8685
"@types/jest": "^29.5.13",
@@ -100,7 +99,7 @@
10099
"eslint-plugin-react-native": "^3.8.1",
101100
"expo": "^52.0.0",
102101
"expo-module-scripts": "3.1.0",
103-
"jest": "^29.6.2",
102+
"jest": "^29.7.0",
104103
"jest-environment-jsdom": "^29.6.2",
105104
"jest-extended": "^4.0.2",
106105
"madge": "^6.1.0",
@@ -110,7 +109,7 @@
110109
"react-native": "0.77.0",
111110
"react-test-renderer": "^18.3.1",
112111
"rimraf": "^4.1.1",
113-
"ts-jest": "^29.1.1",
112+
"ts-jest": "^29.2.5",
114113
"typescript": "4.9.5",
115114
"uglify-js": "^3.17.4",
116115
"uuid": "^9.0.1",

packages/core/plugin/src/withSentry.ts

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

18-
if (props && props.authToken) {
18+
if (props?.authToken) {
1919
// If not removed, the plugin config with the authToken will be written to the application package
2020
delete props.authToken;
2121
}

packages/core/src/js/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
export type {
22
Breadcrumb,
3-
Request,
43
SdkInfo,
54
Event,
65
Exception,
@@ -43,7 +42,6 @@ export {
4342
getClient,
4443
setCurrentClient,
4544
addEventProcessor,
46-
metricsDefault as metrics,
4745
lastEventId,
4846
} from '@sentry/core';
4947

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?.[0]?.stacktrace) {
147147
event.threads.values[0].stacktrace.frames = frames.reverse();
148148
}
149149
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,7 @@ export function getDefaultIntegrations(options: ReactNativeClientOptions): Integ
9191
// hasTracingEnabled from `@sentry/core` only check if tracesSampler or tracesSampleRate keys are present
9292
// that's different from prev imp here and might lead misconfiguration
9393
// `tracesSampleRate: undefined` should not enable tracing
94-
const hasTracingEnabled =
95-
options.enableTracing ||
96-
typeof options.tracesSampleRate === 'number' ||
97-
typeof options.tracesSampler === 'function';
94+
const hasTracingEnabled = typeof options.tracesSampleRate === 'number' || typeof options.tracesSampler === 'function';
9895
if (hasTracingEnabled && options.enableAppStartTracking) {
9996
integrations.push(appStartIntegration());
10097
}

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

Lines changed: 3 additions & 3 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,10 +176,10 @@ 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
},
182-
appleDebugImages: (nativeStackFrames && (nativeStackFrames.debugMetaImages as DebugImage[])) || [],
182+
appleDebugImages: (nativeStackFrames?.debugMetaImages as DebugImage[]) || [],
183183
};
184184
}
185185

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

Lines changed: 4 additions & 2 deletions
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) => {
@@ -155,7 +155,9 @@ function setupErrorUtilsGlobalHandler(): void {
155155
return;
156156
}
157157

158-
void client.flush(client.getOptions().shutdownTimeout || 2000).then(
158+
// SEE: https://github.com/getsentry/sentry-javascript/pull/15217
159+
// void client.flush(client.getOptions().shutdownTimeout || 2000).then(
160+
void client.flush(2000).then(
159161
() => {
160162
defaultHandler(error, isFatal);
161163
},

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ 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
}
2525

2626
const screenshots: ScreenshotAttachment[] | null = await NATIVE.captureScreenshot();
27-
if (screenshots && screenshots.length > 0) {
27+
if (screenshots?.length > 0) {
2828
hint.attachments = [...screenshots, ...(hint?.attachments || [])];
2929
}
3030

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ function getHostnameFromString(urlString: string): string | null {
103103
const regex = /^(?:\w+:)?\/\/([^/:]+)(:\d+)?(.*)$/;
104104
const matches = urlString.match(regex);
105105

106-
if (matches && matches[1]) {
106+
if (matches?.[1]) {
107107
return matches[1];
108108
} else {
109109
// Invalid URL format

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: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ 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
8282
// warn users that this is happening if they enable debug flag
83-
if (trace_id && trace_id.length !== 32) {
83+
if (trace_id?.length !== 32) {
8484
if (__DEV__) {
8585
logger.log(`[Profiling] Invalid traceId: ${trace_id} on profiled event`);
8686
}
@@ -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 && (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 && (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/sdk.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ export function wrap<P extends Record<string, unknown>>(
157157
const profilerProps = {
158158
...(options?.profilerProps ?? {}),
159159
name: RootComponent.displayName ?? 'Root',
160+
updateProps: {}
160161
};
161162

162163
const RootApp: React.FC<P> = (appProps) => {

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/tracing/span.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Client, Scope, Span, StartSpanOptions } from '@sentry/core';
22
import {
3-
generatePropagationContext,
3+
// generatePropagationContext replaced by generateTraceId,
4+
generateTraceId,
45
getActiveSpan,
56
getClient,
67
getCurrentScope,
@@ -104,7 +105,7 @@ export const startIdleSpan = (
104105
return new SentryNonRecordingSpan();
105106
}
106107

107-
getCurrentScope().setPropagationContext(generatePropagationContext());
108+
getCurrentScope().setPropagationContext({ traceId: generateTraceId(), sampleRand: Math.random() });
108109

109110
const span = coreStartIdleSpan(startSpanOption, { finalTimeout, idleTimeout });
110111
cancelInBackground(client, span);

packages/core/src/js/transports/encodePolyfill.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { RN_GLOBAL_OBJ } from '../utils/worldwide';
22
import { utf8ToBytes } from '../vendor';
33

44
export const useEncodePolyfill = (): void => {
5+
// TODO: Still required?
56
if (!RN_GLOBAL_OBJ.__SENTRY__) {
67
(RN_GLOBAL_OBJ.__SENTRY__ as Partial<(typeof RN_GLOBAL_OBJ)['__SENTRY__']>) = {};
78
}
89

9-
RN_GLOBAL_OBJ.__SENTRY__.encodePolyfill = encodePolyfill;
10+
// TODO: Should point to SDK dependency or latest dependency?
11+
RN_GLOBAL_OBJ.__SENTRY__['9.1.0'].encodePolyfill = encodePolyfill;
1012
};
1113

1214
export const encodePolyfill = (text: string): Uint8Array => {

0 commit comments

Comments
 (0)