-
Notifications
You must be signed in to change notification settings - Fork 83
/
sentry.ts
147 lines (134 loc) · 4.94 KB
/
sentry.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import { Platform } from 'react-native';
import Constants, { ExecutionEnvironment } from 'expo-constants';
import * as Application from 'expo-application';
import { RewriteFrames } from '@sentry/integrations';
import { Integration, SdkInfo } from '@sentry/types';
import { ExpoBareIntegration } from './integrations/bare';
import { ExpoManagedIntegration } from './integrations/managed';
import * as Updates from './integrations/Updates'
import { SentryExpoNativeOptions, overrideDefaultIntegrations } from './utils';
import {
SENTRY_EXPO_PACKAGE,
SENTRY_EXPO_VERSION,
SENTRY_REACT_NATIVE_PACKAGE,
} from './version';
import {
init as initNative,
Integrations,
SDK_VERSION as SENTRY_REACT_NATIVE_VERSION,
} from '@sentry/react-native';
import { AppManifest } from 'expo-constants/build/Constants.types';
export * as Native from '@sentry/react-native';
const defaultSdkInfo: SdkInfo = {
name: 'sentry.javascript.react-native.expo',
packages: [
{
name: SENTRY_EXPO_PACKAGE,
version: SENTRY_EXPO_VERSION,
},
{
name: SENTRY_REACT_NATIVE_PACKAGE,
version: SENTRY_REACT_NATIVE_VERSION,
}
],
version: SENTRY_EXPO_VERSION,
};
const MANIFEST = Updates.manifest as AppManifest;
const IS_BARE_WORKFLOW = Constants.executionEnvironment === ExecutionEnvironment.Bare;
const getDefaultOptions = () => ({
enableNativeNagger: false, // Otherwise this will trigger an Alert(), let's rely on the logs instead
release: getDefaultRelease(),
dist: getDist(),
...(IS_BARE_WORKFLOW ? {} : { enableNative: false, enableNativeCrashHandling: false }),
_metadata: {
sdk: defaultSdkInfo,
},
});
/**
* For embedded updates, the dist version needs to match what is set by the Sentry build script.
* For modern manifest OTA updates, the updateId is used.
*/
function getDist(): string | null | undefined {
if (Updates.isEmbeddedLaunch) {
return MANIFEST.revisionId ? MANIFEST.version : `${Application.nativeBuildVersion}`;
} else {
return Updates.updateId;
}
}
/**
* We assign the appropriate release based on if the app is running in development,
* on an Classic OTA Update, or on a no-publish build.
*/
function getDefaultRelease(): string {
if (__DEV__) {
return 'DEVELOPMENT';
} else if (MANIFEST.revisionId) {
// Want to make sure this still exists in EAS update: equal on iOS & Android
return MANIFEST.revisionId;
} else {
// This is the default set by Sentry's native Xcode & Gradle scripts
return `${Application.applicationId}@${Application.nativeApplicationVersion}+${Application.nativeBuildVersion}`;
}
}
export const init = (options: SentryExpoNativeOptions = {}) => {
const defaultExpoIntegrations = [
new Integrations.ReactNativeErrorHandlers({
onerror: false,
onunhandledrejection: true,
}),
IS_BARE_WORKFLOW ? new ExpoBareIntegration() : new ExpoManagedIntegration(),
new RewriteFrames({
iteratee: (frame) => {
if (frame.filename && frame.filename !== '[native code]') {
frame.filename =
Platform.OS === 'android' ? 'app:///index.android.bundle' : 'app:///main.jsbundle';
}
return frame;
},
}),
];
let nativeOptions = { ...getDefaultOptions(), ...options } as SentryExpoNativeOptions;
if (Array.isArray(nativeOptions.integrations)) {
// Allow users to override Expo defaults...ymmv
nativeOptions.integrations = overrideDefaultIntegrations(
defaultExpoIntegrations,
nativeOptions.integrations
);
} else if (typeof nativeOptions.integrations === 'function') {
// Need to rewrite the function to take Expo's default integrations
let functionWithoutExpoIntegrations = nativeOptions.integrations;
const functionWithExpoIntegrations = (integrations: Integration[]) => {
return functionWithoutExpoIntegrations(
overrideDefaultIntegrations(integrations, defaultExpoIntegrations)
);
};
nativeOptions.integrations = functionWithExpoIntegrations;
} else {
nativeOptions.integrations = [...defaultExpoIntegrations];
}
if (__DEV__ && !nativeOptions.enableInExpoDevelopment) {
nativeOptions.enabled = false;
if (!nativeOptions.hasOwnProperty('enableInExpoDevelopment')) {
console.log(
'[sentry-expo] Disabled Sentry in development. Note you can set Sentry.init({ enableInExpoDevelopment: true });'
);
}
}
try {
return initNative({ ...nativeOptions });
} catch (e) {
if (IS_BARE_WORKFLOW) {
// Native projects have not been linked, try to continue with no native capability
console.warn(
`[sentry-expo] Disabling the Sentry Native SDK (all JS errors will still be reported).\nTo enable it, run 'npx expo install @sentry/react-native' in your project directory. To silence this warning, pass 'enableNative: false' to Sentry.init().`
);
return initNative({
...nativeOptions,
enableNative: false,
enableNativeCrashHandling: false,
});
} else {
throw e;
}
}
};