@sentry/react-native 6.7.0-alpha.0 → 6.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/RNSentry.podspec +2 -2
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +280 -2
  4. package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
  5. package/dist/js/integrations/debugsymbolicator.js +9 -1
  6. package/dist/js/integrations/debugsymbolicator.js.map +1 -1
  7. package/dist/js/integrations/debugsymbolicatorutils.js +9 -1
  8. package/dist/js/integrations/debugsymbolicatorutils.js.map +1 -1
  9. package/dist/js/integrations/devicecontext.js +9 -1
  10. package/dist/js/integrations/devicecontext.js.map +1 -1
  11. package/dist/js/integrations/modulesloader.js +9 -1
  12. package/dist/js/integrations/modulesloader.js.map +1 -1
  13. package/dist/js/integrations/reactnativeerrorhandlers.js +9 -1
  14. package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
  15. package/dist/js/integrations/release.js +9 -1
  16. package/dist/js/integrations/release.js.map +1 -1
  17. package/dist/js/integrations/screenshot.js +9 -1
  18. package/dist/js/integrations/screenshot.js.map +1 -1
  19. package/dist/js/integrations/sdkinfo.js +9 -1
  20. package/dist/js/integrations/sdkinfo.js.map +1 -1
  21. package/dist/js/integrations/viewhierarchy.js +9 -1
  22. package/dist/js/integrations/viewhierarchy.js.map +1 -1
  23. package/dist/js/replay/mobilereplay.js +9 -1
  24. package/dist/js/replay/mobilereplay.js.map +1 -1
  25. package/dist/js/sdk.d.ts.map +1 -1
  26. package/dist/js/sdk.js +19 -22
  27. package/dist/js/sdk.js.map +1 -1
  28. package/dist/js/tools/metroMiddleware.js +11 -3
  29. package/dist/js/tools/metroMiddleware.js.map +1 -1
  30. package/dist/js/tools/metroconfig.d.ts +7 -11
  31. package/dist/js/tools/metroconfig.d.ts.map +1 -1
  32. package/dist/js/tools/metroconfig.js +25 -14
  33. package/dist/js/tools/metroconfig.js.map +1 -1
  34. package/dist/js/tools/sentryBabelTransformer.d.ts +1 -2
  35. package/dist/js/tools/sentryBabelTransformer.d.ts.map +1 -1
  36. package/dist/js/tools/sentryBabelTransformer.js +1 -23
  37. package/dist/js/tools/sentryBabelTransformer.js.map +1 -1
  38. package/dist/js/tools/sentryBabelTransformerUtils.d.ts +18 -0
  39. package/dist/js/tools/sentryBabelTransformerUtils.d.ts.map +1 -1
  40. package/dist/js/tools/sentryBabelTransformerUtils.js +71 -1
  41. package/dist/js/tools/sentryBabelTransformerUtils.js.map +1 -1
  42. package/dist/js/tools/sentryMetroSerializer.d.ts.map +1 -1
  43. package/dist/js/tools/sentryMetroSerializer.js +11 -4
  44. package/dist/js/tools/sentryMetroSerializer.js.map +1 -1
  45. package/dist/js/tools/utils.d.ts +1 -2
  46. package/dist/js/tools/utils.d.ts.map +1 -1
  47. package/dist/js/tools/utils.js.map +1 -1
  48. package/dist/js/tracing/integrations/appStart.js +9 -1
  49. package/dist/js/tracing/integrations/appStart.js.map +1 -1
  50. package/dist/js/tracing/integrations/nativeFrames.js +9 -1
  51. package/dist/js/tracing/integrations/nativeFrames.js.map +1 -1
  52. package/dist/js/utils/worldwide.d.ts +0 -2
  53. package/dist/js/utils/worldwide.d.ts.map +1 -1
  54. package/dist/js/utils/worldwide.js.map +1 -1
  55. package/dist/js/version.d.ts +1 -1
  56. package/dist/js/version.d.ts.map +1 -1
  57. package/dist/js/version.js +1 -1
  58. package/dist/js/version.js.map +1 -1
  59. package/dist/js/wrapper.js +20 -1
  60. package/dist/js/wrapper.js.map +1 -1
  61. package/ios/RNSentry.h +5 -3
  62. package/ios/RNSentry.mm +210 -19
  63. package/ios/RNSentryVersion.m +1 -1
  64. package/package.json +8 -8
  65. package/plugin/build/withSentry.d.ts +2 -0
  66. package/plugin/build/withSentry.js +10 -0
  67. package/plugin/build/withSentryAndroidGradlePlugin.d.ts +15 -0
  68. package/plugin/build/withSentryAndroidGradlePlugin.js +91 -0
  69. package/scripts/collect-modules.sh +5 -5
  70. package/scripts/sentry-xcode.sh +0 -19
  71. package/sentry.gradle +1 -52
  72. package/ts3.8/dist/js/utils/worldwide.d.ts +0 -2
  73. package/ts3.8/dist/js/version.d.ts +1 -1
  74. package/android/src/main/java/io/sentry/react/RNSentryCompositeOptionsConfiguration.java +0 -25
  75. package/android/src/main/java/io/sentry/react/RNSentryJsonConverter.java +0 -76
  76. package/android/src/main/java/io/sentry/react/RNSentryJsonUtils.java +0 -41
  77. package/android/src/main/java/io/sentry/react/RNSentrySDK.java +0 -68
  78. package/android/src/main/java/io/sentry/react/RNSentryStart.java +0 -365
  79. package/dist/js/tools/sentryOptionsSerializer.d.ts +0 -6
  80. package/dist/js/tools/sentryOptionsSerializer.d.ts.map +0 -1
  81. package/dist/js/tools/sentryOptionsSerializer.js +0 -91
  82. package/dist/js/tools/sentryOptionsSerializer.js.map +0 -1
  83. package/ios/RNSentrySDK.h +0 -31
  84. package/ios/RNSentrySDK.m +0 -71
  85. package/ios/RNSentryStart.h +0 -26
  86. package/ios/RNSentryStart.m +0 -222
@@ -1,76 +0,0 @@
1
- package io.sentry.react;
2
-
3
- import com.facebook.react.bridge.JavaOnlyArray;
4
- import com.facebook.react.bridge.JavaOnlyMap;
5
- import com.facebook.react.bridge.WritableArray;
6
- import com.facebook.react.bridge.WritableMap;
7
- import io.sentry.ILogger;
8
- import io.sentry.SentryLevel;
9
- import io.sentry.android.core.AndroidLogger;
10
- import java.util.Iterator;
11
- import org.jetbrains.annotations.NotNull;
12
- import org.jetbrains.annotations.Nullable;
13
- import org.json.JSONArray;
14
- import org.json.JSONException;
15
- import org.json.JSONObject;
16
-
17
- final class RNSentryJsonConverter {
18
- public static final String NAME = "RNSentry.RNSentryJsonConverter";
19
-
20
- private static final ILogger logger = new AndroidLogger(NAME);
21
-
22
- private RNSentryJsonConverter() {
23
- throw new AssertionError("Utility class should not be instantiated");
24
- }
25
-
26
- @Nullable
27
- static WritableMap convertToWritable(@NotNull JSONObject jsonObject) {
28
- try {
29
- WritableMap writableMap = new JavaOnlyMap();
30
- Iterator<String> iterator = jsonObject.keys();
31
- while (iterator.hasNext()) {
32
- String key = iterator.next();
33
- Object value = jsonObject.get(key);
34
- if (value instanceof Float || value instanceof Double) {
35
- writableMap.putDouble(key, jsonObject.getDouble(key));
36
- } else if (value instanceof Number) {
37
- writableMap.putInt(key, jsonObject.getInt(key));
38
- } else if (value instanceof String) {
39
- writableMap.putString(key, jsonObject.getString(key));
40
- } else if (value instanceof JSONObject) {
41
- writableMap.putMap(key, convertToWritable(jsonObject.getJSONObject(key)));
42
- } else if (value instanceof JSONArray) {
43
- writableMap.putArray(key, convertToWritable(jsonObject.getJSONArray(key)));
44
- } else if (value == JSONObject.NULL) {
45
- writableMap.putNull(key);
46
- }
47
- }
48
- return writableMap;
49
- } catch (JSONException e) {
50
- logger.log(SentryLevel.ERROR, "Error parsing json object:" + e.getMessage());
51
- return null;
52
- }
53
- }
54
-
55
- @NotNull
56
- static WritableArray convertToWritable(@NotNull JSONArray jsonArray) throws JSONException {
57
- WritableArray writableArray = new JavaOnlyArray();
58
- for (int i = 0; i < jsonArray.length(); i++) {
59
- Object value = jsonArray.get(i);
60
- if (value instanceof Float || value instanceof Double) {
61
- writableArray.pushDouble(jsonArray.getDouble(i));
62
- } else if (value instanceof Number) {
63
- writableArray.pushInt(jsonArray.getInt(i));
64
- } else if (value instanceof String) {
65
- writableArray.pushString(jsonArray.getString(i));
66
- } else if (value instanceof JSONObject) {
67
- writableArray.pushMap(convertToWritable(jsonArray.getJSONObject(i)));
68
- } else if (value instanceof JSONArray) {
69
- writableArray.pushArray(convertToWritable(jsonArray.getJSONArray(i)));
70
- } else if (value == JSONObject.NULL) {
71
- writableArray.pushNull();
72
- }
73
- }
74
- return writableArray;
75
- }
76
- }
@@ -1,41 +0,0 @@
1
- package io.sentry.react;
2
-
3
- import android.content.Context;
4
- import io.sentry.ILogger;
5
- import io.sentry.SentryLevel;
6
- import java.io.BufferedReader;
7
- import java.io.InputStream;
8
- import java.io.InputStreamReader;
9
- import org.jetbrains.annotations.NotNull;
10
- import org.jetbrains.annotations.Nullable;
11
- import org.json.JSONObject;
12
-
13
- final class RNSentryJsonUtils {
14
- private RNSentryJsonUtils() {
15
- throw new AssertionError("Utility class should not be instantiated");
16
- }
17
-
18
- static @Nullable JSONObject getOptionsFromConfigurationFile(
19
- @NotNull Context context, @NotNull String fileName, @NotNull ILogger logger) {
20
- try (InputStream inputStream = context.getAssets().open(fileName);
21
- BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
22
-
23
- StringBuilder stringBuilder = new StringBuilder();
24
- String line;
25
- while ((line = reader.readLine()) != null) {
26
- stringBuilder.append(line);
27
- }
28
- String configFileContent = stringBuilder.toString();
29
- return new JSONObject(configFileContent);
30
-
31
- } catch (Exception e) {
32
- logger.log(
33
- SentryLevel.ERROR,
34
- "Failed to read configuration file. Please make sure "
35
- + fileName
36
- + " exists in the root of your project.",
37
- e);
38
- return null;
39
- }
40
- }
41
- }
@@ -1,68 +0,0 @@
1
- package io.sentry.react;
2
-
3
- import android.content.Context;
4
- import com.facebook.react.bridge.ReadableMap;
5
- import io.sentry.ILogger;
6
- import io.sentry.Sentry;
7
- import io.sentry.SentryLevel;
8
- import io.sentry.android.core.AndroidLogger;
9
- import io.sentry.android.core.SentryAndroidOptions;
10
- import org.jetbrains.annotations.NotNull;
11
- import org.json.JSONObject;
12
-
13
- public final class RNSentrySDK {
14
- private static final String CONFIGURATION_FILE = "sentry.options.json";
15
- private static final String NAME = "RNSentrySDK";
16
-
17
- private static final ILogger logger = new AndroidLogger(NAME);
18
-
19
- private RNSentrySDK() {
20
- throw new AssertionError("Utility class should not be instantiated");
21
- }
22
-
23
- static void init(
24
- @NotNull final Context context,
25
- @NotNull Sentry.OptionsConfiguration<SentryAndroidOptions> configuration,
26
- @NotNull String configurationFile,
27
- @NotNull ILogger logger) {
28
- try {
29
- JSONObject jsonObject =
30
- RNSentryJsonUtils.getOptionsFromConfigurationFile(context, configurationFile, logger);
31
- if (jsonObject == null) {
32
- RNSentryStart.startWithConfiguration(context, configuration);
33
- return;
34
- }
35
- ReadableMap rnOptions = RNSentryJsonConverter.convertToWritable(jsonObject);
36
- if (rnOptions == null) {
37
- RNSentryStart.startWithConfiguration(context, configuration);
38
- return;
39
- }
40
- RNSentryStart.startWithOptions(context, rnOptions, configuration, logger);
41
- } catch (Exception e) {
42
- logger.log(
43
- SentryLevel.ERROR, "Failed to start Sentry with options from configuration file.", e);
44
- throw new RuntimeException("Failed to initialize Sentry's React Native SDK", e);
45
- }
46
- }
47
-
48
- /**
49
- * @experimental Start the Native Android SDK with the provided configuration options. Uses as a
50
- * base configurations the `sentry.options.json` configuration file if it exists.
51
- * @param context Android Context
52
- * @param configuration configuration options
53
- */
54
- public static void init(
55
- @NotNull final Context context,
56
- @NotNull Sentry.OptionsConfiguration<SentryAndroidOptions> configuration) {
57
- init(context, configuration, CONFIGURATION_FILE, logger);
58
- }
59
-
60
- /**
61
- * @experimental Start the Native Android SDK with options from `sentry.options.json`
62
- * configuration file.
63
- * @param context Android Context
64
- */
65
- public static void init(@NotNull final Context context) {
66
- init(context, options -> {}, CONFIGURATION_FILE, logger);
67
- }
68
- }
@@ -1,365 +0,0 @@
1
- package io.sentry.react;
2
-
3
- import android.app.Activity;
4
- import android.content.Context;
5
- import com.facebook.react.bridge.ReadableMap;
6
- import com.facebook.react.bridge.ReadableType;
7
- import com.facebook.react.common.JavascriptException;
8
- import io.sentry.ILogger;
9
- import io.sentry.Integration;
10
- import io.sentry.Sentry;
11
- import io.sentry.SentryEvent;
12
- import io.sentry.SentryLevel;
13
- import io.sentry.SentryOptions.BeforeSendCallback;
14
- import io.sentry.SentryReplayOptions;
15
- import io.sentry.UncaughtExceptionHandlerIntegration;
16
- import io.sentry.android.core.AnrIntegration;
17
- import io.sentry.android.core.BuildConfig;
18
- import io.sentry.android.core.CurrentActivityHolder;
19
- import io.sentry.android.core.NdkIntegration;
20
- import io.sentry.android.core.SentryAndroid;
21
- import io.sentry.android.core.SentryAndroidOptions;
22
- import io.sentry.protocol.SdkVersion;
23
- import io.sentry.protocol.SentryPackage;
24
- import io.sentry.react.replay.RNSentryReplayMask;
25
- import io.sentry.react.replay.RNSentryReplayUnmask;
26
- import java.net.URI;
27
- import java.net.URISyntaxException;
28
- import java.util.List;
29
- import org.jetbrains.annotations.NotNull;
30
- import org.jetbrains.annotations.Nullable;
31
-
32
- final class RNSentryStart {
33
-
34
- private RNSentryStart() {
35
- throw new AssertionError("Utility class should not be instantiated");
36
- }
37
-
38
- static void startWithConfiguration(
39
- @NotNull final Context context,
40
- @NotNull Sentry.OptionsConfiguration<SentryAndroidOptions> configuration) {
41
- Sentry.OptionsConfiguration<SentryAndroidOptions> defaults =
42
- options -> updateWithReactDefaults(options, null);
43
- RNSentryCompositeOptionsConfiguration compositeConfiguration =
44
- new RNSentryCompositeOptionsConfiguration(
45
- defaults, configuration, RNSentryStart::updateWithReactFinals);
46
- SentryAndroid.init(context, compositeConfiguration);
47
- }
48
-
49
- static void startWithOptions(
50
- @NotNull final Context context,
51
- @NotNull final ReadableMap rnOptions,
52
- @NotNull Sentry.OptionsConfiguration<SentryAndroidOptions> configuration,
53
- @NotNull ILogger logger) {
54
- Sentry.OptionsConfiguration<SentryAndroidOptions> defaults =
55
- options -> updateWithReactDefaults(options, null);
56
- Sentry.OptionsConfiguration<SentryAndroidOptions> rnConfigurationOptions =
57
- options -> getSentryAndroidOptions(options, rnOptions, logger);
58
- RNSentryCompositeOptionsConfiguration compositeConfiguration =
59
- new RNSentryCompositeOptionsConfiguration(
60
- rnConfigurationOptions, defaults, configuration, RNSentryStart::updateWithReactFinals);
61
- SentryAndroid.init(context, compositeConfiguration);
62
- }
63
-
64
- static void startWithOptions(
65
- @NotNull final Context context,
66
- @NotNull final ReadableMap rnOptions,
67
- @Nullable Activity currentActivity,
68
- @NotNull ILogger logger) {
69
- Sentry.OptionsConfiguration<SentryAndroidOptions> defaults =
70
- options -> updateWithReactDefaults(options, currentActivity);
71
- Sentry.OptionsConfiguration<SentryAndroidOptions> rnConfigurationOptions =
72
- options -> getSentryAndroidOptions(options, rnOptions, logger);
73
- RNSentryCompositeOptionsConfiguration compositeConfiguration =
74
- new RNSentryCompositeOptionsConfiguration(
75
- rnConfigurationOptions, defaults, RNSentryStart::updateWithReactFinals);
76
- SentryAndroid.init(context, compositeConfiguration);
77
- }
78
-
79
- static void getSentryAndroidOptions(
80
- @NotNull SentryAndroidOptions options,
81
- @NotNull ReadableMap rnOptions,
82
- @NotNull ILogger logger) {
83
- if (rnOptions.hasKey("debug") && rnOptions.getBoolean("debug")) {
84
- options.setDebug(true);
85
- }
86
- if (rnOptions.hasKey("dsn") && rnOptions.getString("dsn") != null) {
87
- String dsn = rnOptions.getString("dsn");
88
- logger.log(SentryLevel.INFO, String.format("Starting with DSN: '%s'", dsn));
89
- options.setDsn(dsn);
90
- } else {
91
- // SentryAndroid needs an empty string fallback for the dsn.
92
- options.setDsn("");
93
- }
94
- if (rnOptions.hasKey("sampleRate")) {
95
- options.setSampleRate(rnOptions.getDouble("sampleRate"));
96
- }
97
- if (rnOptions.hasKey("sendClientReports")) {
98
- options.setSendClientReports(rnOptions.getBoolean("sendClientReports"));
99
- }
100
- if (rnOptions.hasKey("maxBreadcrumbs")) {
101
- options.setMaxBreadcrumbs(rnOptions.getInt("maxBreadcrumbs"));
102
- }
103
- if (rnOptions.hasKey("maxCacheItems")) {
104
- options.setMaxCacheItems(rnOptions.getInt("maxCacheItems"));
105
- }
106
- if (rnOptions.hasKey("environment") && rnOptions.getString("environment") != null) {
107
- options.setEnvironment(rnOptions.getString("environment"));
108
- }
109
- if (rnOptions.hasKey("release") && rnOptions.getString("release") != null) {
110
- options.setRelease(rnOptions.getString("release"));
111
- }
112
- if (rnOptions.hasKey("dist") && rnOptions.getString("dist") != null) {
113
- options.setDist(rnOptions.getString("dist"));
114
- }
115
- if (rnOptions.hasKey("enableAutoSessionTracking")) {
116
- options.setEnableAutoSessionTracking(rnOptions.getBoolean("enableAutoSessionTracking"));
117
- }
118
- if (rnOptions.hasKey("sessionTrackingIntervalMillis")) {
119
- options.setSessionTrackingIntervalMillis(rnOptions.getInt("sessionTrackingIntervalMillis"));
120
- }
121
- if (rnOptions.hasKey("shutdownTimeout")) {
122
- options.setShutdownTimeoutMillis(rnOptions.getInt("shutdownTimeout"));
123
- }
124
- if (rnOptions.hasKey("enableNdkScopeSync")) {
125
- options.setEnableScopeSync(rnOptions.getBoolean("enableNdkScopeSync"));
126
- }
127
- if (rnOptions.hasKey("attachStacktrace")) {
128
- options.setAttachStacktrace(rnOptions.getBoolean("attachStacktrace"));
129
- }
130
- if (rnOptions.hasKey("attachThreads")) {
131
- // JS use top level stacktrace and android attaches Threads which hides them so
132
- // by default we hide.
133
- options.setAttachThreads(rnOptions.getBoolean("attachThreads"));
134
- }
135
- if (rnOptions.hasKey("attachScreenshot")) {
136
- options.setAttachScreenshot(rnOptions.getBoolean("attachScreenshot"));
137
- }
138
- if (rnOptions.hasKey("attachViewHierarchy")) {
139
- options.setAttachViewHierarchy(rnOptions.getBoolean("attachViewHierarchy"));
140
- }
141
- if (rnOptions.hasKey("sendDefaultPii")) {
142
- options.setSendDefaultPii(rnOptions.getBoolean("sendDefaultPii"));
143
- }
144
- if (rnOptions.hasKey("maxQueueSize")) {
145
- options.setMaxQueueSize(rnOptions.getInt("maxQueueSize"));
146
- }
147
- if (rnOptions.hasKey("enableNdk")) {
148
- options.setEnableNdk(rnOptions.getBoolean("enableNdk"));
149
- }
150
- if (rnOptions.hasKey("spotlight")) {
151
- if (rnOptions.getType("spotlight") == ReadableType.Boolean) {
152
- options.setEnableSpotlight(rnOptions.getBoolean("spotlight"));
153
- options.setSpotlightConnectionUrl(rnOptions.getString("defaultSidecarUrl"));
154
- } else if (rnOptions.getType("spotlight") == ReadableType.String) {
155
- options.setEnableSpotlight(true);
156
- options.setSpotlightConnectionUrl(rnOptions.getString("spotlight"));
157
- }
158
- }
159
-
160
- SentryReplayOptions replayOptions = getReplayOptions(rnOptions);
161
- options.setSessionReplay(replayOptions);
162
- if (isReplayEnabled(replayOptions)) {
163
- options.getReplayController().setBreadcrumbConverter(new RNSentryReplayBreadcrumbConverter());
164
- }
165
-
166
- // Exclude Dev Server and Sentry Dsn request from Breadcrumbs
167
- String dsn = getURLFromDSN(rnOptions.getString("dsn"));
168
- String devServerUrl = rnOptions.getString("devServerUrl");
169
- options.setBeforeBreadcrumb(
170
- (breadcrumb, hint) -> {
171
- Object urlObject = breadcrumb.getData("url");
172
- String url = urlObject instanceof String ? (String) urlObject : "";
173
- if ("http".equals(breadcrumb.getType())
174
- && ((dsn != null && url.startsWith(dsn))
175
- || (devServerUrl != null && url.startsWith(devServerUrl)))) {
176
- return null;
177
- }
178
- return breadcrumb;
179
- });
180
-
181
- if (rnOptions.hasKey("enableNativeCrashHandling")
182
- && !rnOptions.getBoolean("enableNativeCrashHandling")) {
183
- final List<Integration> integrations = options.getIntegrations();
184
- for (final Integration integration : integrations) {
185
- if (integration instanceof UncaughtExceptionHandlerIntegration
186
- || integration instanceof AnrIntegration
187
- || integration instanceof NdkIntegration) {
188
- integrations.remove(integration);
189
- }
190
- }
191
- }
192
- logger.log(
193
- SentryLevel.INFO, String.format("Native Integrations '%s'", options.getIntegrations()));
194
- }
195
-
196
- /**
197
- * This function updates the options with RNSentry defaults. These default can be overwritten by
198
- * users during manual native initialization.
199
- */
200
- static void updateWithReactDefaults(
201
- @NotNull SentryAndroidOptions options, @Nullable Activity currentActivity) {
202
- @Nullable SdkVersion sdkVersion = options.getSdkVersion();
203
- if (sdkVersion == null) {
204
- sdkVersion = new SdkVersion(RNSentryVersion.ANDROID_SDK_NAME, BuildConfig.VERSION_NAME);
205
- } else {
206
- sdkVersion.setName(RNSentryVersion.ANDROID_SDK_NAME);
207
- }
208
- sdkVersion.addPackage(
209
- RNSentryVersion.REACT_NATIVE_SDK_PACKAGE_NAME,
210
- RNSentryVersion.REACT_NATIVE_SDK_PACKAGE_VERSION);
211
-
212
- options.setSentryClientName(sdkVersion.getName() + "/" + sdkVersion.getVersion());
213
- options.setNativeSdkName(RNSentryVersion.NATIVE_SDK_NAME);
214
- options.setSdkVersion(sdkVersion);
215
-
216
- // Tracing is only enabled in JS to avoid duplicate navigation spans
217
- options.setTracesSampleRate(null);
218
- options.setTracesSampler(null);
219
- options.setEnableTracing(false);
220
-
221
- // React native internally throws a JavascriptException.
222
- // we want to ignore it on the native side to avoid sending it twice.
223
- options.addIgnoredExceptionForType(JavascriptException.class);
224
-
225
- setCurrentActivity(currentActivity);
226
- }
227
-
228
- /**
229
- * This function updates options with changes RNSentry users should not change and so this is
230
- * applied after the configureOptions callback during manual native initialization.
231
- */
232
- static void updateWithReactFinals(@NotNull SentryAndroidOptions options) {
233
- BeforeSendCallback userBeforeSend = options.getBeforeSend();
234
- options.setBeforeSend(
235
- (event, hint) -> {
236
- setEventOriginTag(event);
237
- addPackages(event, options.getSdkVersion());
238
- if (userBeforeSend != null) {
239
- return userBeforeSend.execute(event, hint);
240
- }
241
- return event;
242
- });
243
- }
244
-
245
- private static void setCurrentActivity(Activity currentActivity) {
246
- final CurrentActivityHolder currentActivityHolder = CurrentActivityHolder.getInstance();
247
- if (currentActivity != null) {
248
- currentActivityHolder.setActivity(currentActivity);
249
- }
250
- }
251
-
252
- private static boolean isReplayEnabled(SentryReplayOptions replayOptions) {
253
- return replayOptions.getSessionSampleRate() != null
254
- || replayOptions.getOnErrorSampleRate() != null;
255
- }
256
-
257
- private static SentryReplayOptions getReplayOptions(@NotNull ReadableMap rnOptions) {
258
- final SdkVersion replaySdkVersion =
259
- new SdkVersion(
260
- RNSentryVersion.REACT_NATIVE_SDK_NAME,
261
- RNSentryVersion.REACT_NATIVE_SDK_PACKAGE_VERSION);
262
- @NotNull
263
- final SentryReplayOptions androidReplayOptions =
264
- new SentryReplayOptions(false, replaySdkVersion);
265
-
266
- if (!(rnOptions.hasKey("replaysSessionSampleRate")
267
- || rnOptions.hasKey("replaysOnErrorSampleRate"))) {
268
- return androidReplayOptions;
269
- }
270
-
271
- androidReplayOptions.setSessionSampleRate(
272
- rnOptions.hasKey("replaysSessionSampleRate")
273
- ? rnOptions.getDouble("replaysSessionSampleRate")
274
- : null);
275
- androidReplayOptions.setOnErrorSampleRate(
276
- rnOptions.hasKey("replaysOnErrorSampleRate")
277
- ? rnOptions.getDouble("replaysOnErrorSampleRate")
278
- : null);
279
-
280
- if (!rnOptions.hasKey("mobileReplayOptions")) {
281
- return androidReplayOptions;
282
- }
283
- @Nullable final ReadableMap rnMobileReplayOptions = rnOptions.getMap("mobileReplayOptions");
284
- if (rnMobileReplayOptions == null) {
285
- return androidReplayOptions;
286
- }
287
-
288
- androidReplayOptions.setMaskAllText(
289
- !rnMobileReplayOptions.hasKey("maskAllText")
290
- || rnMobileReplayOptions.getBoolean("maskAllText"));
291
- androidReplayOptions.setMaskAllImages(
292
- !rnMobileReplayOptions.hasKey("maskAllImages")
293
- || rnMobileReplayOptions.getBoolean("maskAllImages"));
294
-
295
- final boolean redactVectors =
296
- !rnMobileReplayOptions.hasKey("maskAllVectors")
297
- || rnMobileReplayOptions.getBoolean("maskAllVectors");
298
- if (redactVectors) {
299
- androidReplayOptions.addMaskViewClass("com.horcrux.svg.SvgView"); // react-native-svg
300
- }
301
-
302
- androidReplayOptions.setMaskViewContainerClass(RNSentryReplayMask.class.getName());
303
- androidReplayOptions.setUnmaskViewContainerClass(RNSentryReplayUnmask.class.getName());
304
-
305
- return androidReplayOptions;
306
- }
307
-
308
- private static void setEventOriginTag(SentryEvent event) {
309
- // We hardcode native-java as only java events are processed by the Android SDK.
310
- SdkVersion sdk = event.getSdk();
311
- if (sdk != null) {
312
- switch (sdk.getName()) {
313
- case RNSentryVersion.NATIVE_SDK_NAME:
314
- setEventEnvironmentTag(event, "native");
315
- break;
316
- case RNSentryVersion.ANDROID_SDK_NAME:
317
- setEventEnvironmentTag(event, "java");
318
- break;
319
- default:
320
- break;
321
- }
322
- }
323
- }
324
-
325
- private static void setEventEnvironmentTag(SentryEvent event, String environment) {
326
- event.setTag("event.origin", "android");
327
- event.setTag("event.environment", environment);
328
- }
329
-
330
- private static void addPackages(SentryEvent event, SdkVersion sdk) {
331
- SdkVersion eventSdk = event.getSdk();
332
- if (eventSdk != null
333
- && "sentry.javascript.react-native".equals(eventSdk.getName())
334
- && sdk != null) {
335
- List<SentryPackage> sentryPackages = sdk.getPackages();
336
- if (sentryPackages != null) {
337
- for (SentryPackage sentryPackage : sentryPackages) {
338
- eventSdk.addPackage(sentryPackage.getName(), sentryPackage.getVersion());
339
- }
340
- }
341
-
342
- List<String> integrations = sdk.getIntegrations();
343
- if (integrations != null) {
344
- for (String integration : integrations) {
345
- eventSdk.addIntegration(integration);
346
- }
347
- }
348
-
349
- event.setSdk(eventSdk);
350
- }
351
- }
352
-
353
- private static @Nullable String getURLFromDSN(@Nullable String dsn) {
354
- if (dsn == null) {
355
- return null;
356
- }
357
- URI uri = null;
358
- try {
359
- uri = new URI(dsn);
360
- } catch (URISyntaxException e) {
361
- return null;
362
- }
363
- return uri.getScheme() + "://" + uri.getHost();
364
- }
365
- }
@@ -1,6 +0,0 @@
1
- import type { MetroConfig } from 'metro';
2
- /**
3
- * Loads Sentry options from a file in
4
- */
5
- export declare function withSentryOptionsFromFile(config: MetroConfig, optionsFile: string | boolean): MetroConfig;
6
- //# sourceMappingURL=sentryOptionsSerializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentryOptionsSerializer.d.ts","sourceRoot":"","sources":["../../../src/js/tools/sentryOptionsSerializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAU,MAAM,OAAO,CAAC;AAUjD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CA6CzG"}
@@ -1,91 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.withSentryOptionsFromFile = void 0;
3
- const core_1 = require("@sentry/core");
4
- const fs = require("fs");
5
- // eslint-disable-next-line import/no-extraneous-dependencies
6
- const countLines = require("metro/src/lib/countLines");
7
- const path = require("path");
8
- const utils_1 = require("./utils");
9
- const DEFAULT_OPTIONS_FILE_NAME = 'sentry.options.json';
10
- /**
11
- * Loads Sentry options from a file in
12
- */
13
- function withSentryOptionsFromFile(config, optionsFile) {
14
- var _a;
15
- if (optionsFile === false) {
16
- return config;
17
- }
18
- const { projectRoot } = config;
19
- if (!projectRoot) {
20
- // eslint-disable-next-line no-console
21
- console.error('[@sentry/react-native/metro] Project root is required to load Sentry options from a file');
22
- return config;
23
- }
24
- let optionsPath = path.join(projectRoot, DEFAULT_OPTIONS_FILE_NAME);
25
- if (typeof optionsFile === 'string' && path.isAbsolute(optionsFile)) {
26
- optionsPath = optionsFile;
27
- }
28
- else if (typeof optionsFile === 'string') {
29
- optionsPath = path.join(projectRoot, optionsFile);
30
- }
31
- const originalSerializer = (_a = config.serializer) === null || _a === void 0 ? void 0 : _a.customSerializer;
32
- if (!originalSerializer) {
33
- // It's okay to bail here because we don't expose this for direct usage, but as part of `withSentryConfig`
34
- // If used directly in RN, the user is responsible for providing a custom serializer first, Expo provides serializer in default config
35
- // eslint-disable-next-line no-console
36
- console.error('[@sentry/react-native/metro] `config.serializer.customSerializer` is required to load Sentry options from a file');
37
- return config;
38
- }
39
- const sentryOptionsSerializer = (entryPoint, preModules, graph, options) => {
40
- const sentryOptionsModule = createSentryOptionsModule(optionsPath);
41
- if (sentryOptionsModule) {
42
- preModules.push(sentryOptionsModule);
43
- }
44
- return originalSerializer(entryPoint, preModules, graph, options);
45
- };
46
- return Object.assign(Object.assign({}, config), { serializer: Object.assign(Object.assign({}, config.serializer), { customSerializer: sentryOptionsSerializer }) });
47
- }
48
- exports.withSentryOptionsFromFile = withSentryOptionsFromFile;
49
- function createSentryOptionsModule(filePath) {
50
- let content;
51
- try {
52
- content = fs.readFileSync(filePath, 'utf8');
53
- }
54
- catch (error) {
55
- if (error.code === 'ENOENT') {
56
- core_1.logger.debug(`[@sentry/react-native/metro] Sentry options file does not exist at ${filePath}`);
57
- }
58
- else {
59
- core_1.logger.error(`[@sentry/react-native/metro] Failed to read Sentry options file at ${filePath}`);
60
- }
61
- return null;
62
- }
63
- let parsedContent;
64
- try {
65
- parsedContent = JSON.parse(content);
66
- }
67
- catch (error) {
68
- core_1.logger.error(`[@sentry/react-native/metro] Failed to parse Sentry options file at ${filePath}`);
69
- return null;
70
- }
71
- const minifiedContent = JSON.stringify(parsedContent);
72
- const optionsCode = `var __SENTRY_OPTIONS__=${minifiedContent};`;
73
- core_1.logger.debug(`[@sentry/react-native/metro] Sentry options added to the bundle from file at ${filePath}`);
74
- return {
75
- dependencies: new Map(),
76
- getSource: () => Buffer.from(optionsCode),
77
- inverseDependencies: (0, utils_1.createSet)(),
78
- path: '__sentry-options__',
79
- output: [
80
- {
81
- type: 'js/script/virtual',
82
- data: {
83
- code: optionsCode,
84
- lineCount: countLines(optionsCode),
85
- map: [],
86
- },
87
- },
88
- ],
89
- };
90
- }
91
- //# sourceMappingURL=sentryOptionsSerializer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentryOptionsSerializer.js","sourceRoot":"","sources":["../../../src/js/tools/sentryOptionsSerializer.ts"],"names":[],"mappings":";;AAAA,uCAAsC;AACtC,yBAAyB;AAEzB,6DAA6D;AAC7D,uDAAuD;AACvD,6BAA6B;AAG7B,mCAAoC;AAEpC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAExD;;GAEG;AACH,SAAgB,yBAAyB,CAAC,MAAmB,EAAE,WAA6B;;IAC1F,IAAI,WAAW,KAAK,KAAK,EAAE;QACzB,OAAO,MAAM,CAAC;KACf;IAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,WAAW,EAAE;QAChB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAC1G,OAAO,MAAM,CAAC;KACf;IAED,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACpE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QACnE,WAAW,GAAG,WAAW,CAAC;KAC3B;SAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QAC1C,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;KACnD;IAED,MAAM,kBAAkB,GAAG,MAAA,MAAM,CAAC,UAAU,0CAAE,gBAAgB,CAAC;IAC/D,IAAI,CAAC,kBAAkB,EAAE;QACvB,0GAA0G;QAC1G,sIAAsI;QACtI,sCAAsC;QACtC,OAAO,CAAC,KAAK,CACX,kHAAkH,CACnH,CAAC;QACF,OAAO,MAAM,CAAC;KACf;IAED,MAAM,uBAAuB,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChG,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,mBAAmB,EAAE;YACtB,UAAuB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;SACpD;QACD,OAAO,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,uCACK,MAAM,KACT,UAAU,kCACL,MAAM,CAAC,UAAU,KACpB,gBAAgB,EAAE,uBAAuB,OAE3C;AACJ,CAAC;AA7CD,8DA6CC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IACjD,IAAI,OAAe,CAAC;IACpB,IAAI;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KAC7C;IAAC,OAAO,KAAK,EAAE;QACd,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE;YACtD,aAAM,CAAC,KAAK,CAAC,sEAAsE,QAAQ,EAAE,CAAC,CAAC;SAChG;aAAM;YACL,aAAM,CAAC,KAAK,CAAC,sEAAsE,QAAQ,EAAE,CAAC,CAAC;SAChG;QACD,OAAO,IAAI,CAAC;KACb;IAED,IAAI,aAAsC,CAAC;IAC3C,IAAI;QACF,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KACrC;IAAC,OAAO,KAAK,EAAE;QACd,aAAM,CAAC,KAAK,CAAC,uEAAuE,QAAQ,EAAE,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;KACb;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,0BAA0B,eAAe,GAAG,CAAC;IAEjE,aAAM,CAAC,KAAK,CAAC,gFAAgF,QAAQ,EAAE,CAAC,CAAC;IACzG,OAAO;QACL,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACzC,mBAAmB,EAAE,IAAA,iBAAS,GAAE;QAChC,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE;oBACJ,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC;oBAClC,GAAG,EAAE,EAAE;iBACR;aACF;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { logger } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { MetroConfig, Module } from 'metro';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as countLines from 'metro/src/lib/countLines';\nimport * as path from 'path';\n\nimport type { MetroCustomSerializer, VirtualJSOutput } from './utils';\nimport { createSet } from './utils';\n\nconst DEFAULT_OPTIONS_FILE_NAME = 'sentry.options.json';\n\n/**\n * Loads Sentry options from a file in\n */\nexport function withSentryOptionsFromFile(config: MetroConfig, optionsFile: string | boolean): MetroConfig {\n if (optionsFile === false) {\n return config;\n }\n\n const { projectRoot } = config;\n if (!projectRoot) {\n // eslint-disable-next-line no-console\n console.error('[@sentry/react-native/metro] Project root is required to load Sentry options from a file');\n return config;\n }\n\n let optionsPath = path.join(projectRoot, DEFAULT_OPTIONS_FILE_NAME);\n if (typeof optionsFile === 'string' && path.isAbsolute(optionsFile)) {\n optionsPath = optionsFile;\n } else if (typeof optionsFile === 'string') {\n optionsPath = path.join(projectRoot, optionsFile);\n }\n\n const originalSerializer = config.serializer?.customSerializer;\n if (!originalSerializer) {\n // It's okay to bail here because we don't expose this for direct usage, but as part of `withSentryConfig`\n // If used directly in RN, the user is responsible for providing a custom serializer first, Expo provides serializer in default config\n // eslint-disable-next-line no-console\n console.error(\n '[@sentry/react-native/metro] `config.serializer.customSerializer` is required to load Sentry options from a file',\n );\n return config;\n }\n\n const sentryOptionsSerializer: MetroCustomSerializer = (entryPoint, preModules, graph, options) => {\n const sentryOptionsModule = createSentryOptionsModule(optionsPath);\n if (sentryOptionsModule) {\n (preModules as Module[]).push(sentryOptionsModule);\n }\n return originalSerializer(entryPoint, preModules, graph, options);\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n customSerializer: sentryOptionsSerializer,\n },\n };\n}\n\nfunction createSentryOptionsModule(filePath: string): Module<VirtualJSOutput> | null {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n logger.debug(`[@sentry/react-native/metro] Sentry options file does not exist at ${filePath}`);\n } else {\n logger.error(`[@sentry/react-native/metro] Failed to read Sentry options file at ${filePath}`);\n }\n return null;\n }\n\n let parsedContent: Record<string, unknown>;\n try {\n parsedContent = JSON.parse(content);\n } catch (error) {\n logger.error(`[@sentry/react-native/metro] Failed to parse Sentry options file at ${filePath}`);\n return null;\n }\n\n const minifiedContent = JSON.stringify(parsedContent);\n const optionsCode = `var __SENTRY_OPTIONS__=${minifiedContent};`;\n\n logger.debug(`[@sentry/react-native/metro] Sentry options added to the bundle from file at ${filePath}`);\n return {\n dependencies: new Map(),\n getSource: () => Buffer.from(optionsCode),\n inverseDependencies: createSet(),\n path: '__sentry-options__',\n output: [\n {\n type: 'js/script/virtual',\n data: {\n code: optionsCode,\n lineCount: countLines(optionsCode),\n map: [],\n },\n },\n ],\n };\n}\n"]}