@sentry/react-native 5.0.0-alpha.8 → 5.0.0-beta.1

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 (161) hide show
  1. package/CHANGELOG.md +155 -3
  2. package/README.md +1 -1
  3. package/RNSentry.podspec +5 -5
  4. package/android/build.gradle +1 -1
  5. package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +124 -20
  6. package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +10 -0
  7. package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +10 -0
  8. package/dist/js/NativeRNSentry.d.ts +37 -3
  9. package/dist/js/NativeRNSentry.d.ts.map +1 -1
  10. package/dist/js/NativeRNSentry.js.map +1 -1
  11. package/dist/js/breadcrumb.d.ts +11 -0
  12. package/dist/js/breadcrumb.d.ts.map +1 -0
  13. package/dist/js/breadcrumb.js +34 -0
  14. package/dist/js/breadcrumb.js.map +1 -0
  15. package/dist/js/client.d.ts +4 -5
  16. package/dist/js/client.d.ts.map +1 -1
  17. package/dist/js/client.js +22 -35
  18. package/dist/js/client.js.map +1 -1
  19. package/dist/js/index.d.ts +1 -0
  20. package/dist/js/index.d.ts.map +1 -1
  21. package/dist/js/index.js +1 -0
  22. package/dist/js/index.js.map +1 -1
  23. package/dist/js/integrations/debugsymbolicator.d.ts +1 -1
  24. package/dist/js/integrations/debugsymbolicator.d.ts.map +1 -1
  25. package/dist/js/integrations/debugsymbolicator.js.map +1 -1
  26. package/dist/js/integrations/devicecontext.d.ts +2 -2
  27. package/dist/js/integrations/devicecontext.d.ts.map +1 -1
  28. package/dist/js/integrations/devicecontext.js +45 -11
  29. package/dist/js/integrations/devicecontext.js.map +1 -1
  30. package/dist/js/integrations/eventorigin.d.ts +1 -1
  31. package/dist/js/integrations/eventorigin.d.ts.map +1 -1
  32. package/dist/js/integrations/eventorigin.js.map +1 -1
  33. package/dist/js/integrations/index.d.ts +1 -0
  34. package/dist/js/integrations/index.d.ts.map +1 -1
  35. package/dist/js/integrations/index.js +1 -0
  36. package/dist/js/integrations/index.js.map +1 -1
  37. package/dist/js/integrations/modulesloader.d.ts +17 -0
  38. package/dist/js/integrations/modulesloader.d.ts.map +1 -0
  39. package/dist/js/integrations/modulesloader.js +39 -0
  40. package/dist/js/integrations/modulesloader.js.map +1 -0
  41. package/dist/js/integrations/reactnativeerrorhandlers.d.ts +1 -1
  42. package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
  43. package/dist/js/integrations/reactnativeerrorhandlers.js +4 -3
  44. package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
  45. package/dist/js/integrations/reactnativeinfo.d.ts +1 -1
  46. package/dist/js/integrations/reactnativeinfo.d.ts.map +1 -1
  47. package/dist/js/integrations/reactnativeinfo.js.map +1 -1
  48. package/dist/js/integrations/release.d.ts +1 -1
  49. package/dist/js/integrations/release.d.ts.map +1 -1
  50. package/dist/js/integrations/release.js.map +1 -1
  51. package/dist/js/integrations/screenshot.d.ts +23 -0
  52. package/dist/js/integrations/screenshot.d.ts.map +1 -0
  53. package/dist/js/integrations/screenshot.js +39 -0
  54. package/dist/js/integrations/screenshot.js.map +1 -0
  55. package/dist/js/integrations/sdkinfo.d.ts +1 -1
  56. package/dist/js/integrations/sdkinfo.d.ts.map +1 -1
  57. package/dist/js/integrations/sdkinfo.js.map +1 -1
  58. package/dist/js/measurements.d.ts +4 -0
  59. package/dist/js/measurements.d.ts.map +1 -1
  60. package/dist/js/measurements.js +11 -0
  61. package/dist/js/measurements.js.map +1 -1
  62. package/dist/js/misc.d.ts +1 -1
  63. package/dist/js/misc.d.ts.map +1 -1
  64. package/dist/js/misc.js.map +1 -1
  65. package/dist/js/options.d.ts +18 -11
  66. package/dist/js/options.d.ts.map +1 -1
  67. package/dist/js/options.js.map +1 -1
  68. package/dist/js/scope.d.ts +1 -1
  69. package/dist/js/scope.d.ts.map +1 -1
  70. package/dist/js/scope.js +4 -2
  71. package/dist/js/scope.js.map +1 -1
  72. package/dist/js/sdk.d.ts +4 -3
  73. package/dist/js/sdk.d.ts.map +1 -1
  74. package/dist/js/sdk.js +13 -7
  75. package/dist/js/sdk.js.map +1 -1
  76. package/dist/js/tools/ModulesCollector.d.ts +17 -0
  77. package/dist/js/tools/ModulesCollector.d.ts.map +1 -0
  78. package/dist/js/tools/ModulesCollector.js +110 -0
  79. package/dist/js/tools/ModulesCollector.js.map +1 -0
  80. package/dist/js/tools/collectModules.d.ts +2 -0
  81. package/dist/js/tools/collectModules.d.ts.map +1 -0
  82. package/dist/js/tools/collectModules.js +11 -0
  83. package/dist/js/tools/collectModules.js.map +1 -0
  84. package/dist/js/touchevents.d.ts +4 -0
  85. package/dist/js/touchevents.d.ts.map +1 -1
  86. package/dist/js/touchevents.js +10 -5
  87. package/dist/js/touchevents.js.map +1 -1
  88. package/dist/js/tracing/nativeframes.d.ts +2 -2
  89. package/dist/js/tracing/nativeframes.d.ts.map +1 -1
  90. package/dist/js/tracing/nativeframes.js.map +1 -1
  91. package/dist/js/tracing/reactnativenavigation.d.ts +4 -3
  92. package/dist/js/tracing/reactnativenavigation.d.ts.map +1 -1
  93. package/dist/js/tracing/reactnativenavigation.js +1 -1
  94. package/dist/js/tracing/reactnativenavigation.js.map +1 -1
  95. package/dist/js/tracing/reactnativetracing.d.ts +5 -5
  96. package/dist/js/tracing/reactnativetracing.d.ts.map +1 -1
  97. package/dist/js/tracing/reactnativetracing.js +1 -1
  98. package/dist/js/tracing/reactnativetracing.js.map +1 -1
  99. package/dist/js/tracing/reactnavigation.d.ts +3 -2
  100. package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
  101. package/dist/js/tracing/reactnavigation.js +1 -1
  102. package/dist/js/tracing/reactnavigation.js.map +1 -1
  103. package/dist/js/tracing/reactnavigationv4.d.ts +4 -3
  104. package/dist/js/tracing/reactnavigationv4.d.ts.map +1 -1
  105. package/dist/js/tracing/reactnavigationv4.js +1 -1
  106. package/dist/js/tracing/reactnavigationv4.js.map +1 -1
  107. package/dist/js/tracing/routingInstrumentation.d.ts +3 -3
  108. package/dist/js/tracing/routingInstrumentation.d.ts.map +1 -1
  109. package/dist/js/tracing/routingInstrumentation.js.map +1 -1
  110. package/dist/js/tracing/stalltracking.d.ts +2 -2
  111. package/dist/js/tracing/stalltracking.d.ts.map +1 -1
  112. package/dist/js/tracing/stalltracking.js.map +1 -1
  113. package/dist/js/tracing/types.d.ts +1 -1
  114. package/dist/js/tracing/types.d.ts.map +1 -1
  115. package/dist/js/tracing/types.js.map +1 -1
  116. package/dist/js/tracing/utils.d.ts +2 -2
  117. package/dist/js/tracing/utils.d.ts.map +1 -1
  118. package/dist/js/tracing/utils.js.map +1 -1
  119. package/dist/js/transports/TextEncoder.d.ts +1 -1
  120. package/dist/js/transports/TextEncoder.d.ts.map +1 -1
  121. package/dist/js/transports/TextEncoder.js.map +1 -1
  122. package/dist/js/transports/native.d.ts +7 -3
  123. package/dist/js/transports/native.d.ts.map +1 -1
  124. package/dist/js/transports/native.js +10 -1
  125. package/dist/js/transports/native.js.map +1 -1
  126. package/dist/js/user.d.ts +1 -1
  127. package/dist/js/user.d.ts.map +1 -1
  128. package/dist/js/user.js.map +1 -1
  129. package/dist/js/utils/envelope.d.ts +1 -1
  130. package/dist/js/utils/envelope.d.ts.map +1 -1
  131. package/dist/js/utils/envelope.js.map +1 -1
  132. package/dist/js/utils/ignorerequirecyclelogs.d.ts +6 -0
  133. package/dist/js/utils/ignorerequirecyclelogs.d.ts.map +1 -0
  134. package/dist/js/utils/ignorerequirecyclelogs.js +15 -0
  135. package/dist/js/utils/ignorerequirecyclelogs.js.map +1 -0
  136. package/dist/js/utils/outcome.d.ts +1 -1
  137. package/dist/js/utils/outcome.d.ts.map +1 -1
  138. package/dist/js/utils/outcome.js.map +1 -1
  139. package/dist/js/utils/safe.d.ts +1 -1
  140. package/dist/js/utils/safe.d.ts.map +1 -1
  141. package/dist/js/utils/safe.js.map +1 -1
  142. package/dist/js/utils/worldwide.d.ts +1 -1
  143. package/dist/js/utils/worldwide.d.ts.map +1 -1
  144. package/dist/js/utils/worldwide.js.map +1 -1
  145. package/dist/js/version.d.ts +1 -1
  146. package/dist/js/version.d.ts.map +1 -1
  147. package/dist/js/version.js +1 -1
  148. package/dist/js/version.js.map +1 -1
  149. package/dist/js/wrapper.d.ts +10 -3
  150. package/dist/js/wrapper.d.ts.map +1 -1
  151. package/dist/js/wrapper.js +42 -6
  152. package/dist/js/wrapper.js.map +1 -1
  153. package/ios/RNSentry.h +5 -0
  154. package/ios/RNSentry.mm +90 -49
  155. package/package.json +28 -25
  156. package/scripts/collect-modules.sh +43 -0
  157. package/sentry.gradle +84 -6
  158. package/src/js/NativeRNSentry.ts +94 -0
  159. package/ios/RNSentry.xcodeproj/project.pbxproj +0 -472
  160. package/ios/RNSentry.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  161. package/ios/RNSentry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
package/sentry.gradle CHANGED
@@ -34,13 +34,18 @@ gradle.projectsEvaluated {
34
34
  // separately we then hook into the bundle task of react native to inject
35
35
  // sourcemap generation parameters. In case for whatever reason no release
36
36
  // was found for the asset folder we just bail.
37
- def bundleTasks = tasks.findAll { task -> task.name.startsWith("bundle") && task.name.endsWith("JsAndAssets") && !task.name.contains("Debug") && task.enabled }
37
+ def bundleTasks = tasks.findAll { task -> (task.name.startsWith("createBundle") || task.name.startsWith("bundle")) && task.name.endsWith("JsAndAssets") && !task.name.contains("Debug") && task.enabled }
38
38
  bundleTasks.each { bundleTask ->
39
39
  def shouldCleanUp
40
40
  def sourcemapOutput
41
41
  def bundleOutput
42
42
  def props = bundleTask.getProperties()
43
43
  def reactRoot = props.get("workingDir")
44
+ if (reactRoot == null) {
45
+ reactRoot = props.get("root").get() // RN 0.71 and above
46
+ }
47
+ def modulesOutput = "$reactRoot/android/app/src/main/assets/modules.json"
48
+ def modulesTask = null
44
49
 
45
50
  (shouldCleanUp, bundleOutput, sourcemapOutput) = forceSourceMapOutputFromBundleTask(bundleTask)
46
51
 
@@ -60,6 +65,7 @@ gradle.projectsEvaluated {
60
65
  def previousCliTask = null
61
66
 
62
67
  def nameCleanup = "${bundleTask.name}_SentryUploadCleanUp"
68
+ def nameModulesCleanup = "${bundleTask.name}_SentryCollectModulesCleanUp"
63
69
  // Upload the source map several times if necessary: once for each release and versionCode.
64
70
  currentVariants.each { key, currentVariant ->
65
71
  variant = currentVariant[0]
@@ -79,6 +85,7 @@ gradle.projectsEvaluated {
79
85
  // below) and distribution identifier (`--dist` below). Give the task a unique name
80
86
  // based on where we're uploading to.
81
87
  def nameCliTask = "${bundleTask.name}_SentryUpload_${releaseName}_${versionCode}"
88
+ def nameModulesTask = "${bundleTask.name}_SentryCollectModules_${releaseName}_${versionCode}"
82
89
 
83
90
  // If several outputs have the same releaseName and versionCode, we'd do the exact same
84
91
  // upload for each of them. No need to repeat.
@@ -153,6 +160,34 @@ gradle.projectsEvaluated {
153
160
  enabled true
154
161
  }
155
162
 
163
+ modulesTask = tasks.create(nameModulesTask, Exec) {
164
+ description = "collect javascript modules from bundle source map"
165
+ group = 'sentry.io'
166
+
167
+ workingDir reactRoot
168
+
169
+ def collectModulesScript = config.collectModulesScript
170
+ ? file(config.collectModulesScript).getAbsolutePath()
171
+ : "$reactRoot/node_modules/@sentry/react-native/dist/js/tools/collectModules.js"
172
+ def modulesPaths = config.modulesPaths
173
+ ? config.modulesPaths.join(',')
174
+ : "$reactRoot/node_modules"
175
+ def args = ["node",
176
+ collectModulesScript,
177
+ sourcemapOutput,
178
+ modulesOutput,
179
+ modulesPaths
180
+ ]
181
+
182
+ project.logger.info("Sentry-CollectModules arguments: ${args}")
183
+ commandLine(*args)
184
+
185
+ def skip = config.skipCollectModules
186
+ ? config.skipCollectModules == true
187
+ : false
188
+ enabled !skip
189
+ }
190
+
156
191
  // chain the upload tasks so they run sequentially in order to run
157
192
  // the cliCleanUpTask after the final upload task is run
158
193
  if (previousCliTask != null) {
@@ -161,6 +196,25 @@ gradle.projectsEvaluated {
161
196
  bundleTask.finalizedBy cliTask
162
197
  }
163
198
  previousCliTask = cliTask
199
+ cliTask.finalizedBy modulesTask
200
+ }
201
+
202
+ def modulesCleanUpTask = tasks.create(name: nameModulesCleanup, type: Delete) {
203
+ description = "clean up collected modules generated file"
204
+ group = 'sentry.io'
205
+
206
+ delete modulesOutput
207
+ }
208
+
209
+ def variantTaskName = variant.replaceAll("[\\s\\-()]", "") // variant is dev-release beta-release etc.
210
+ // task.name could be packageDev-debugRelease but in that case currentVariants == null
211
+ // because of the regex in `extractCurrentVariants` and this code doesn't run
212
+ def packageTasks = tasks.findAll {
213
+ task -> "package${variantTaskName}".equalsIgnoreCase(task.name) && task.enabled
214
+ }
215
+ packageTasks.each { packageTask ->
216
+ packageTask.dependsOn modulesTask
217
+ packageTask.finalizedBy modulesCleanUpTask
164
218
  }
165
219
 
166
220
  /** Delete sourcemap files */
@@ -169,7 +223,8 @@ gradle.projectsEvaluated {
169
223
  group = 'sentry.io'
170
224
 
171
225
  delete sourcemapOutput
172
- delete "$buildDir/intermediates/assets/release/index.android.bundle.map" // react native default bundle dir
226
+ delete "$buildDir/intermediates/assets/release/index.android.bundle.map"
227
+ // react native default bundle dir
173
228
  }
174
229
 
175
230
  // register clean task extension
@@ -204,7 +259,7 @@ def extractReleasesInfo() {
204
259
  }
205
260
 
206
261
  /** Extract from arguments collection bundle and sourcemap files output names. */
207
- static extractBundleTaskArguments(cmdArgs, Project project) {
262
+ static extractBundleTaskArgumentsLegacy(cmdArgs, Project project) {
208
263
  def bundleOutput = null
209
264
  def sourcemapOutput = null
210
265
 
@@ -248,6 +303,26 @@ static extractBundleTaskArguments(cmdArgs, Project project) {
248
303
  return [bundleOutput, sourcemapOutput]
249
304
  }
250
305
 
306
+ /** Extract bundle and sourcemap paths from bundle task props.
307
+ * Based on https://github.dev/facebook/react-native/blob/473eb1dd870a4f62c4ebcba27e12bde1e99e3d07/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/BundleHermesCTask.kt#L109
308
+ * Output source map path is the same for both Hermes and JSC.
309
+ */
310
+ static extractBundleTaskArgumentsRN71AndAbove(bundleTask, logger) {
311
+ def props = bundleTask.getProperties()
312
+ def bundleAssetName = props.bundleAssetName?.get()
313
+
314
+ if (bundleAssetName == null) {
315
+ return [null, null]
316
+ }
317
+
318
+ def bundleFile = new File(props.jsBundleDir.get().asFile.absolutePath, bundleAssetName)
319
+ def outputSourceMap = new File(props.jsSourceMapsDir.get().asFile.absolutePath, "${bundleAssetName}.map")
320
+
321
+ logger.info("bundleFile: `${bundleFile}`")
322
+ logger.info("outputSourceMap: `${outputSourceMap}`")
323
+ return [bundleFile, outputSourceMap]
324
+ }
325
+
251
326
  /** Force Bundle task to produce sourcemap files if they are not pre-configured by user yet. */
252
327
  def forceSourceMapOutputFromBundleTask(bundleTask) {
253
328
  def props = bundleTask.getProperties()
@@ -257,7 +332,10 @@ def forceSourceMapOutputFromBundleTask(bundleTask) {
257
332
  def bundleOutput = null
258
333
  def sourcemapOutput = null
259
334
 
260
- (bundleOutput, sourcemapOutput) = extractBundleTaskArguments(cmdArgs, project)
335
+ (bundleOutput, sourcemapOutput) = extractBundleTaskArgumentsRN71AndAbove(bundleTask, logger)
336
+ if (bundleOutput == null) {
337
+ (bundleOutput, sourcemapOutput) = extractBundleTaskArgumentsLegacy(cmdArgs, project)
338
+ }
261
339
 
262
340
  if (sourcemapOutput == null) {
263
341
  sourcemapOutput = bundleOutput + ".map"
@@ -280,8 +358,8 @@ def forceSourceMapOutputFromBundleTask(bundleTask) {
280
358
 
281
359
  /** compose array with one item - current build flavor name */
282
360
  static extractCurrentVariants(bundleTask, releases) {
283
- // examples: bundleLocalReleaseJsAndAssets, bundleYellowDebugJsAndAssets
284
- def pattern = Pattern.compile("bundle([A-Z][A-Za-z0-9_]+)JsAndAssets")
361
+ // examples: bundleLocalReleaseJsAndAssets, createBundleYellowDebugJsAndAssets
362
+ def pattern = Pattern.compile("(?:create)?(?:B|b)undle([A-Z][A-Za-z0-9_]+)JsAndAssets")
285
363
 
286
364
  def currentRelease = ""
287
365
 
@@ -0,0 +1,94 @@
1
+ import type { Package } from '@sentry/types';
2
+ import type { TurboModule} from 'react-native';
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ import type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';
5
+
6
+ // There has to be only one interface and it has to be named `Spec`
7
+ // Only extra allowed definitions are types (probably codegen bug)
8
+ export interface Spec extends TurboModule {
9
+ addBreadcrumb(breadcrumb: UnsafeObject): void;
10
+ captureEnvelope(
11
+ bytes: number[],
12
+ options: {
13
+ store: boolean,
14
+ },
15
+ ): Promise<boolean>;
16
+ captureScreenshot(): Promise<NativeScreenshot[]>;
17
+ clearBreadcrumbs(): void;
18
+ crash(): void;
19
+ closeNativeSdk(): Promise<void>;
20
+ disableNativeFramesTracking(): void;
21
+ fetchNativeRelease(): Promise<NativeReleaseResponse>;
22
+ fetchNativeSdkInfo(): Promise<Package>;
23
+ fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse>;
24
+ fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;
25
+ fetchNativeFrames(): Promise<NativeFramesResponse | null>;
26
+ initNativeSdk(options: UnsafeObject): Promise<boolean>;
27
+ setUser(
28
+ defaultUserKeys: UnsafeObject | null,
29
+ otherUserKeys: UnsafeObject | null
30
+ ): void;
31
+ setContext(key: string, value: UnsafeObject | null): void;
32
+ setExtra(key: string, value: string): void;
33
+ setTag(key: string, value: string): void;
34
+ enableNativeFramesTracking(): void;
35
+ fetchModules(): Promise<string | undefined | null>;
36
+ }
37
+
38
+ export type NativeAppStartResponse = {
39
+ isColdStart: boolean;
40
+ appStartTime: number;
41
+ didFetchAppStart: boolean;
42
+ };
43
+
44
+ export type NativeFramesResponse = {
45
+ totalFrames: number;
46
+ slowFrames: number;
47
+ frozenFrames: number;
48
+ };
49
+
50
+ export type NativeReleaseResponse = {
51
+ build: string;
52
+ id: string;
53
+ version: string;
54
+ };
55
+
56
+ /**
57
+ * This type describes serialized scope from sentry-cocoa. (This is not used for Android)
58
+ * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m
59
+ */
60
+ export type NativeDeviceContextsResponse = {
61
+ [key: string]: unknown;
62
+ tags?: Record<string, string>;
63
+ extra?: Record<string, unknown>;
64
+ context?: Record<string, Record<string, unknown>>;
65
+ user?: {
66
+ userId?: string;
67
+ email?: string;
68
+ username?: string;
69
+ ipAddress?: string;
70
+ segment?: string;
71
+ data?: Record<string, unknown>;
72
+ };
73
+ dist?: string;
74
+ environment?: string;
75
+ fingerprint?: string[];
76
+ level?: string;
77
+ breadcrumbs?: {
78
+ level?: string;
79
+ timestamp?: string;
80
+ category?: string;
81
+ type?: string;
82
+ message?: string;
83
+ data?: Record<string, unknown>;
84
+ }[];
85
+ };
86
+
87
+ export type NativeScreenshot = {
88
+ data: number[];
89
+ contentType: string;
90
+ filename: string;
91
+ }
92
+
93
+ // The export must be here to pass codegen even if not used
94
+ export default TurboModuleRegistry.getEnforcing<Spec>('RNSentry');