@sentry/react-native 5.16.0-alpha.1 → 5.16.0-alpha.3
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.
- package/CHANGELOG.md +82 -0
- package/dist/js/NativeRNSentry.d.ts +1 -1
- package/dist/js/NativeRNSentry.d.ts.map +1 -1
- package/dist/js/NativeRNSentry.js.map +1 -1
- package/dist/js/index.js +1 -1
- package/dist/js/index.js.map +1 -1
- package/dist/js/integrations/debugsymbolicator.d.ts.map +1 -1
- package/dist/js/integrations/debugsymbolicator.js +12 -10
- package/dist/js/integrations/debugsymbolicator.js.map +1 -1
- package/dist/js/integrations/default.d.ts +11 -0
- package/dist/js/integrations/default.d.ts.map +1 -0
- package/dist/js/integrations/default.js +79 -0
- package/dist/js/integrations/default.js.map +1 -0
- package/dist/js/integrations/expocontext.d.ts +17 -0
- package/dist/js/integrations/expocontext.d.ts.map +1 -0
- package/dist/js/integrations/expocontext.js +68 -0
- package/dist/js/integrations/expocontext.js.map +1 -0
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js +9 -6
- package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
- package/dist/js/integrations/reactnativeinfo.d.ts +3 -1
- package/dist/js/integrations/reactnativeinfo.d.ts.map +1 -1
- package/dist/js/integrations/reactnativeinfo.js +9 -1
- package/dist/js/integrations/reactnativeinfo.js.map +1 -1
- package/dist/js/integrations/sdkinfo.d.ts.map +1 -1
- package/dist/js/integrations/sdkinfo.js +5 -2
- package/dist/js/integrations/sdkinfo.js.map +1 -1
- package/dist/js/measurements.d.ts +0 -7
- package/dist/js/measurements.d.ts.map +1 -1
- package/dist/js/measurements.js +0 -56
- package/dist/js/measurements.js.map +1 -1
- package/dist/js/options.d.ts +6 -0
- package/dist/js/options.d.ts.map +1 -1
- package/dist/js/options.js +23 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/sdk.d.ts.map +1 -1
- package/dist/js/sdk.js +13 -55
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/tools/sentryMetroSerializer.d.ts +6 -0
- package/dist/js/tools/sentryMetroSerializer.d.ts.map +1 -1
- package/dist/js/tools/sentryMetroSerializer.js +34 -1
- package/dist/js/tools/sentryMetroSerializer.js.map +1 -1
- package/dist/js/tools/vendor/expo/expoconfig.d.ts +24 -0
- package/dist/js/tools/vendor/expo/expoconfig.d.ts.map +1 -0
- package/dist/js/tools/vendor/expo/expoconfig.js +3 -0
- package/dist/js/tools/vendor/expo/expoconfig.js.map +1 -0
- package/dist/js/tracing/addTracingExtensions.d.ts +8 -0
- package/dist/js/tracing/addTracingExtensions.d.ts.map +1 -0
- package/dist/js/tracing/addTracingExtensions.js +58 -0
- package/dist/js/tracing/addTracingExtensions.js.map +1 -0
- package/dist/js/tracing/reactnativenavigation.d.ts +1 -1
- package/dist/js/tracing/reactnativenavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnativenavigation.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +6 -4
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/reactnavigationv4.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigationv4.js +4 -3
- package/dist/js/tracing/reactnavigationv4.js.map +1 -1
- package/dist/js/utils/environment.d.ts +9 -1
- package/dist/js/utils/environment.d.ts.map +1 -1
- package/dist/js/utils/environment.js +28 -1
- package/dist/js/utils/environment.js.map +1 -1
- package/dist/js/utils/expoglobalobject.d.ts +51 -0
- package/dist/js/utils/expoglobalobject.d.ts.map +1 -0
- package/dist/js/utils/expoglobalobject.js +2 -0
- package/dist/js/utils/expoglobalobject.js.map +1 -0
- package/dist/js/utils/expomodules.d.ts +10 -0
- package/dist/js/utils/expomodules.d.ts.map +1 -0
- package/dist/js/utils/expomodules.js +14 -0
- package/dist/js/utils/expomodules.js.map +1 -0
- package/dist/js/utils/rnlibraries.d.ts +3 -0
- package/dist/js/utils/rnlibraries.d.ts.map +1 -0
- package/dist/js/utils/rnlibraries.js +29 -0
- package/dist/js/utils/rnlibraries.js.map +1 -0
- package/dist/js/utils/rnlibraries.web.d.ts +3 -0
- package/dist/js/utils/rnlibraries.web.d.ts.map +1 -0
- package/dist/js/utils/rnlibraries.web.js +2 -0
- package/dist/js/utils/rnlibraries.web.js.map +1 -0
- package/dist/js/utils/rnlibrariesinterface.d.ts +19 -0
- package/dist/js/utils/rnlibrariesinterface.d.ts.map +1 -0
- package/dist/js/utils/rnlibrariesinterface.js +8 -0
- package/dist/js/utils/rnlibrariesinterface.js.map +1 -0
- package/dist/js/utils/worldwide.d.ts +2 -1
- package/dist/js/utils/worldwide.d.ts.map +1 -1
- package/dist/js/utils/worldwide.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/package.json +14 -6
- package/samples/react-native/react-native.config.js +5 -0
- package/scripts/expo-upload-sourcemaps.js +160 -0
- package/src/js/NativeRNSentry.ts +2 -1
- package/ts3.8/dist/js/NativeRNSentry.d.ts +1 -1
- package/ts3.8/dist/js/integrations/default.d.ts +11 -0
- package/ts3.8/dist/js/integrations/expocontext.d.ts +17 -0
- package/ts3.8/dist/js/integrations/reactnativeinfo.d.ts +3 -1
- package/ts3.8/dist/js/measurements.d.ts +0 -7
- package/ts3.8/dist/js/options.d.ts +6 -0
- package/ts3.8/dist/js/tracing/addTracingExtensions.d.ts +8 -0
- package/ts3.8/dist/js/tracing/reactnativenavigation.d.ts +1 -1
- package/ts3.8/dist/js/utils/environment.d.ts +9 -1
- package/ts3.8/dist/js/utils/expoglobalobject.d.ts +51 -0
- package/ts3.8/dist/js/utils/expomodules.d.ts +10 -0
- package/ts3.8/dist/js/utils/rnlibraries.d.ts +3 -0
- package/ts3.8/dist/js/utils/rnlibraries.web.d.ts +3 -0
- package/ts3.8/dist/js/utils/rnlibrariesinterface.d.ts +19 -0
- package/ts3.8/dist/js/utils/worldwide.d.ts +2 -1
- package/ts3.8/dist/js/version.d.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,87 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.16.0-alpha.3
|
|
4
|
+
|
|
5
|
+
This release is compatible with `expo@50.0.0-preview.6` and newer.
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- `withSentryExpoSerializers` changes to `getSentryExpoConfig` ([#3501](https://github.com/getsentry/sentry-react-native/pull/3501))
|
|
10
|
+
- `getSentryExpoConfig` accepts the same parameters as `getDefaultConfig` from `expo/metro-config` and returns Metro configuration
|
|
11
|
+
- This also works for EAS Updates (and expo export). Debug ID is generated by `expo/metro-config` and used by Sentry.
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
const { getSentryExpoConfig } = require("@sentry/react-native/metro");
|
|
15
|
+
const config = getSentryExpoConfig(config);
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- Add `npx sentry-expo-upload-sourcemaps` for simple EAS Update (expo export) source maps upload to Sentry ([#3491](https://github.com/getsentry/sentry-react-native/pull/3491), [#3510](https://github.com/getsentry/sentry-react-native/pull/3510))
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
SENTRY_PROJECT=project-slug \
|
|
22
|
+
SENTRY_ORG=org-slug \
|
|
23
|
+
SENTRY_AUTH_TOKEN=super-secret-token \
|
|
24
|
+
npx sentry-expo-upload-sourcemaps dist
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- Sentry CLI binary path in `scripts/expo-upload-sourcemaps.js` is resolved dynamically ([#3507](https://github.com/getsentry/sentry-react-native/pull/3507))
|
|
28
|
+
- Or can be overwritten by `SENTRY_CLI_EXECUTABLE` env
|
|
29
|
+
|
|
30
|
+
- Resolve Default Integrations based on current platform ([#3465](https://github.com/getsentry/sentry-react-native/pull/3465))
|
|
31
|
+
- Native Integrations are only added if Native Module is available
|
|
32
|
+
- Web Integrations only for React Native Web builds
|
|
33
|
+
- Remove Native Modules warning from platform where the absence is expected ([#3466](https://github.com/getsentry/sentry-react-native/pull/3466))
|
|
34
|
+
- Add Expo Context information using Expo Native Modules ([#3466](https://github.com/getsentry/sentry-react-native/pull/3466))
|
|
35
|
+
|
|
36
|
+
### Fixes
|
|
37
|
+
|
|
38
|
+
- Includes fixes from version 5.15.2
|
|
39
|
+
|
|
40
|
+
## 5.15.2
|
|
41
|
+
|
|
42
|
+
### Fixes
|
|
43
|
+
|
|
44
|
+
- Stop sending navigation route params for auto-generated transactions, as they may contain PII or other sensitive data ([#3487](https://github.com/getsentry/sentry-react-native/pull/3487))
|
|
45
|
+
- Further details and other strategies to mitigate this issue can be found on our [trouble shooting guide page](https://docs.sentry.io/platforms/react-native/troubleshooting/#routing-transaction-data-contains-sensitive-information)
|
|
46
|
+
|
|
47
|
+
## 5.16.0-alpha.2
|
|
48
|
+
|
|
49
|
+
### Features
|
|
50
|
+
|
|
51
|
+
- Add `withSentryExpoSerializers` for easy configurable `metro.config.js` ([#3454](https://github.com/getsentry/sentry-react-native/pull/3454))
|
|
52
|
+
|
|
53
|
+
This Serializer doesn't support EAS Updates (and expo export) commands yet. Debug IDs needed for source maps resolution in Sentry
|
|
54
|
+
are generated only during native builds.
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
const { getDefaultConfig } = require('expo/metro-config');
|
|
58
|
+
const { withSentryExpoSerializers } = require("@sentry/react-native/metro");
|
|
59
|
+
|
|
60
|
+
const config = getDefaultConfig(__dirname);
|
|
61
|
+
module.exports = withSentryExpoSerializers(config);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Note that this will remove any existing `customSerializer`. Guide for advanced setups [can be found here](https://docs.sentry.io/platforms/react-native/manual-setup/metro).
|
|
65
|
+
|
|
66
|
+
### Fixes
|
|
67
|
+
|
|
68
|
+
- Expo SDK minimum version is 49 ([#3453](https://github.com/getsentry/sentry-react-native/pull/3453))
|
|
69
|
+
- Remove RN Internal imports for RN Web builds ([#3462](https://github.com/getsentry/sentry-react-native/pull/3462))
|
|
70
|
+
- Remove circular dependencies inside of the SDK ([#3464](https://github.com/getsentry/sentry-react-native/pull/3464))
|
|
71
|
+
- Includes fixes from version 5.15.1
|
|
72
|
+
|
|
73
|
+
## 5.15.1
|
|
74
|
+
|
|
75
|
+
### Fixes
|
|
76
|
+
|
|
77
|
+
- Sentry CLI upgrade resolves Xcode Could timeout during source maps upload [#3390](https://github.com/getsentry/sentry-react-native/pull/3390)
|
|
78
|
+
|
|
79
|
+
### Dependencies
|
|
80
|
+
|
|
81
|
+
- Bump CLI from v2.21.3 to v2.23.0 ([#3390](https://github.com/getsentry/sentry-react-native/pull/3390))
|
|
82
|
+
- [changelog](https://github.com/getsentry/sentry-cli/blob/master/CHANGELOG.md#2230)
|
|
83
|
+
- [diff](https://github.com/getsentry/sentry-cli/compare/2.21.3...2.23.0)
|
|
84
|
+
|
|
3
85
|
## 5.16.0-alpha.1
|
|
4
86
|
|
|
5
87
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Package } from '@sentry/types';
|
|
2
2
|
import type { TurboModule } from 'react-native';
|
|
3
|
-
import type { UnsafeObject } from '
|
|
3
|
+
import type { UnsafeObject } from './utils/rnlibrariesinterface';
|
|
4
4
|
export interface Spec extends TurboModule {
|
|
5
5
|
addBreadcrumb(breadcrumb: UnsafeObject): void;
|
|
6
6
|
captureEnvelope(bytes: string, options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAyInD,2DAA2D;AAC3D,eAAe,mBAAmB,CAAC,YAAY,CAAO,UAAU,CAAC,CAAC","sourcesContent":["import type { Package } from '@sentry/types';\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\n\nimport type { UnsafeObject } from './utils/rnlibrariesinterface';\n\n// There has to be only one interface and it has to be named `Spec`\n// Only extra allowed definitions are types (probably codegen bug)\nexport interface Spec extends TurboModule {\n addBreadcrumb(breadcrumb: UnsafeObject): void;\n captureEnvelope(\n bytes: string,\n options: {\n store: boolean;\n },\n ): Promise<boolean>;\n captureScreenshot(): Promise<NativeScreenshot[] | undefined | null>;\n clearBreadcrumbs(): void;\n crash(): void;\n closeNativeSdk(): Promise<void>;\n disableNativeFramesTracking(): void;\n fetchNativeRelease(): Promise<NativeReleaseResponse>;\n fetchNativeSdkInfo(): Promise<Package | null>;\n fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse | null>;\n fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;\n fetchNativeFrames(): Promise<NativeFramesResponse | null>;\n initNativeSdk(options: UnsafeObject): Promise<boolean>;\n setUser(defaultUserKeys: UnsafeObject | null, otherUserKeys: UnsafeObject | null): void;\n setContext(key: string, value: UnsafeObject | null): void;\n setExtra(key: string, value: string): void;\n setTag(key: string, value: string): void;\n enableNativeFramesTracking(): void;\n fetchModules(): Promise<string | undefined | null>;\n fetchViewHierarchy(): Promise<number[] | undefined | null>;\n startProfiling(): { started?: boolean; error?: string };\n stopProfiling(): { profile?: string; nativeProfile?: UnsafeObject; error?: string };\n fetchNativePackageName(): Promise<string | undefined | null>;\n fetchNativeStackFramesBy(instructionsAddr: number[]): Promise<NativeStackFrames | undefined | null>;\n}\n\nexport type NativeStackFrame = {\n platform: string;\n /**\n * The instruction address of this frame.\n * Formatted as hex with 0x prefix.\n */\n instruction_addr: string;\n package?: string;\n /**\n * The debug image address of this frame.\n * Formatted as hex with 0x prefix.\n */\n image_addr?: string;\n in_app?: boolean;\n /**\n * The symbol name of this frame.\n * If symbolicated locally.\n */\n function?: string;\n /**\n * The symbol address of this frame.\n * If symbolicated locally.\n * Formatted as hex with 0x prefix.\n */\n symbol_addr?: string;\n};\n\nexport type NativeDebugImage = {\n name?: string;\n type?: string;\n uuid?: string;\n debug_id?: string;\n image_addr?: string;\n image_size?: number;\n code_file?: string;\n image_vmaddr?: string;\n};\n\nexport type NativeStackFrames = {\n frames: NativeStackFrame[];\n debugMetaImages?: NativeDebugImage[];\n};\n\nexport type NativeAppStartResponse = {\n isColdStart: boolean;\n appStartTime: number;\n didFetchAppStart: boolean;\n};\n\nexport type NativeFramesResponse = {\n totalFrames: number;\n slowFrames: number;\n frozenFrames: number;\n};\n\nexport type NativeReleaseResponse = {\n build: string;\n id: string;\n version: string;\n};\n\n/**\n * This type describes serialized scope from sentry-cocoa and sentry-android\n * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m\n * https://github.com/getsentry/sentry-java/blob/a461f7e125b65240004e6162b341f383ce2e1394/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java#L32\n */\nexport type NativeDeviceContextsResponse = {\n [key: string]: unknown;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n user?: {\n userId?: string;\n email?: string;\n username?: string;\n ipAddress?: string;\n segment?: string;\n data?: Record<string, unknown>;\n };\n dist?: string;\n environment?: string;\n fingerprint?: string[];\n level?: string;\n breadcrumbs?: {\n level?: string;\n timestamp?: string;\n category?: string;\n type?: string;\n message?: string;\n data?: Record<string, unknown>;\n }[];\n};\n\nexport type NativeScreenshot = {\n data: number[];\n contentType: string;\n filename: string;\n};\n\n// The export must be here to pass codegen even if not used\nexport default TurboModuleRegistry.getEnforcing<Spec>('RNSentry');\n"]}
|
package/dist/js/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, getHubFromCarrier, getCurrentHub, Hub, Scope, setContext, setExtra, setExtras, setTag, setTags, setUser, startTransaction, startInactiveSpan, startSpan, startSpanManual, getActiveSpan, } from '@sentry/core';
|
|
2
|
-
import { _addTracingExtensions } from './
|
|
2
|
+
import { _addTracingExtensions } from './tracing/addTracingExtensions';
|
|
3
3
|
_addTracingExtensions();
|
|
4
4
|
export { Integrations as BrowserIntegrations, ErrorBoundary, withErrorBoundary, createReduxEnhancer, Profiler, useProfiler, withProfiler, } from '@sentry/react';
|
|
5
5
|
export { lastEventId } from '@sentry/browser';
|
package/dist/js/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/js/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,GAAG,EACH,KAAK,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/js/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,GAAG,EACH,KAAK,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,qBAAqB,EAAE,CAAC;AAExB,OAAO,EACL,YAAY,IAAI,mBAAmB,EACnC,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EACL,IAAI,EACJ,IAAI;AACJ,mDAAmD;AACnD,OAAO;AACP,mDAAmD;AACnD,UAAU,EACV,WAAW,EACX,KAAK,EACL,KAAK,EACL,mBAAmB,EACnB,SAAS,EACT,cAAc,GACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EACL,kBAAkB,EAClB,gCAAgC;AAChC,mDAAmD;AACnD,gCAAgC,EAChC,8BAA8B,EAC9B,oCAAoC,EACpC,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC","sourcesContent":["export type {\n Breadcrumb,\n Request,\n SdkInfo,\n Event,\n Exception,\n StackFrame,\n Stacktrace,\n Thread,\n User,\n UserFeedback,\n} from '@sentry/types';\n\nexport {\n addGlobalEventProcessor,\n addBreadcrumb,\n captureException,\n captureEvent,\n captureMessage,\n getHubFromCarrier,\n getCurrentHub,\n Hub,\n Scope,\n setContext,\n setExtra,\n setExtras,\n setTag,\n setTags,\n setUser,\n startTransaction,\n startInactiveSpan,\n startSpan,\n startSpanManual,\n getActiveSpan,\n} from '@sentry/core';\n\nimport { _addTracingExtensions } from './tracing/addTracingExtensions';\n_addTracingExtensions();\n\nexport {\n Integrations as BrowserIntegrations,\n ErrorBoundary,\n withErrorBoundary,\n createReduxEnhancer,\n Profiler,\n useProfiler,\n withProfiler,\n} from '@sentry/react';\n\nexport { lastEventId } from '@sentry/browser';\n\nimport * as Integrations from './integrations';\nimport { SDK_NAME, SDK_VERSION } from './version';\nexport type { ReactNativeOptions } from './options';\nexport { ReactNativeClient } from './client';\n\nexport {\n init,\n wrap,\n // eslint-disable-next-line deprecation/deprecation\n setDist,\n // eslint-disable-next-line deprecation/deprecation\n setRelease,\n nativeCrash,\n flush,\n close,\n captureUserFeedback,\n withScope,\n configureScope,\n} from './sdk';\nexport { TouchEventBoundary, withTouchEventBoundary } from './touchevents';\n\nexport {\n ReactNativeTracing,\n ReactNavigationV4Instrumentation,\n // eslint-disable-next-line deprecation/deprecation\n ReactNavigationV5Instrumentation,\n ReactNavigationInstrumentation,\n ReactNativeNavigationInstrumentation,\n RoutingInstrumentation,\n sentryTraceGesture,\n} from './tracing';\nexport type { ReactNavigationTransactionContext } from './tracing';\nexport { Integrations, SDK_NAME, SDK_VERSION };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debugsymbolicator.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/debugsymbolicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,cAAc,EAAE,GAAG,EAAE,WAAW,EAAkC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"debugsymbolicator.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/debugsymbolicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,cAAc,EAAE,GAAG,EAAE,WAAW,EAAkC,MAAM,eAAe,CAAC;AASxH;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,6DAA6D;AAC7D,qBAAa,iBAAkB,YAAW,WAAW;IACnD;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAAuB;IAC/C;;OAEG;IACI,IAAI,EAAE,MAAM,CAAwB;IAE3C;;OAEG;IACI,SAAS,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,GAAG,IAAI;IAmC7G;;;OAGG;YACW,YAAY;IAiC1B;;;OAGG;YACW,uCAAuC;IA2BrD;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAWtC;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;;;;OAKG;YACW,iBAAiB;IA6B/B;;OAEG;YACW,mBAAmB;IAWjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;IACH,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import { addContextToFrame, logger } from '@sentry/utils';
|
|
3
3
|
import { getFramesToPop, isErrorLike } from '../utils/error';
|
|
4
|
+
import { ReactNativeLibraries } from '../utils/rnlibraries';
|
|
4
5
|
const INTERNAL_CALLSITES_REGEX = new RegExp(['ReactNativeRenderer-dev\\.js$', 'MessageQueue\\.js$'].join('|'));
|
|
5
6
|
/** Tries to symbolicate the JS stack trace on the device. */
|
|
6
7
|
export class DebugSymbolicator {
|
|
@@ -45,8 +46,8 @@ export class DebugSymbolicator {
|
|
|
45
46
|
*/
|
|
46
47
|
_symbolicate(rawStack, skipFirstFrames = 0) {
|
|
47
48
|
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
const parsedStack = this._parseErrorStack(rawStack);
|
|
49
49
|
try {
|
|
50
|
+
const parsedStack = this._parseErrorStack(rawStack);
|
|
50
51
|
const prettyStack = yield this._symbolicateStackTrace(parsedStack);
|
|
51
52
|
if (!prettyStack) {
|
|
52
53
|
logger.error('React Native DevServer could not symbolicate the stack trace.');
|
|
@@ -170,26 +171,27 @@ export class DebugSymbolicator {
|
|
|
170
171
|
* Loads and calls RN Core Devtools parseErrorStack function.
|
|
171
172
|
*/
|
|
172
173
|
_parseErrorStack(errorStack) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
if (!ReactNativeLibraries.Devtools) {
|
|
175
|
+
throw new Error('React Native Devtools not available.');
|
|
176
|
+
}
|
|
177
|
+
return ReactNativeLibraries.Devtools.parseErrorStack(errorStack);
|
|
176
178
|
}
|
|
177
179
|
/**
|
|
178
180
|
* Loads and calls RN Core Devtools symbolicateStackTrace function.
|
|
179
181
|
*/
|
|
180
182
|
_symbolicateStackTrace(stack, extraData) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
183
|
+
if (!ReactNativeLibraries.Devtools) {
|
|
184
|
+
throw new Error('React Native Devtools not available.');
|
|
185
|
+
}
|
|
186
|
+
return ReactNativeLibraries.Devtools.symbolicateStackTrace(stack, extraData);
|
|
184
187
|
}
|
|
185
188
|
/**
|
|
186
189
|
* Loads and returns the RN DevServer URL.
|
|
187
190
|
*/
|
|
188
191
|
_getDevServer() {
|
|
192
|
+
var _a;
|
|
189
193
|
try {
|
|
190
|
-
|
|
191
|
-
const getDevServer = require('react-native/Libraries/Core/Devtools/getDevServer');
|
|
192
|
-
return getDevServer();
|
|
194
|
+
return (_a = ReactNativeLibraries.Devtools) === null || _a === void 0 ? void 0 : _a.getDevServer();
|
|
193
195
|
}
|
|
194
196
|
catch (_oO) {
|
|
195
197
|
// We can't load devserver URL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debugsymbolicator.js","sourceRoot":"","sources":["../../../src/js/integrations/debugsymbolicator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Event, EventHint, EventProcessor, Hub, Integration, StackFrame as SentryStackFrame } from '@sentry/types';\nimport { addContextToFrame, logger } from '@sentry/utils';\n\nimport { getFramesToPop, isErrorLike } from '../utils/error';\nimport type * as ReactNative from '../vendor/react-native';\n\nconst INTERNAL_CALLSITES_REGEX = new RegExp(['ReactNativeRenderer-dev\\\\.js$', 'MessageQueue\\\\.js$'].join('|'));\n\n/**\n * React Native Error\n */\nexport type ReactNativeError = Error & {\n framesToPop?: number;\n jsEngine?: string;\n preventSymbolication?: boolean;\n componentStack?: string;\n};\n\n/** Tries to symbolicate the JS stack trace on the device. */\nexport class DebugSymbolicator implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'DebugSymbolicator';\n /**\n * @inheritDoc\n */\n public name: string = DebugSymbolicator.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n addGlobalEventProcessor(async (event: Event, hint: EventHint) => {\n const self = getCurrentHub().getIntegration(DebugSymbolicator);\n\n if (!self) {\n return event;\n }\n\n if (event.exception && isErrorLike(hint.originalException)) {\n // originalException is ErrorLike object\n const symbolicatedFrames = await this._symbolicate(\n hint.originalException.stack,\n getFramesToPop(hint.originalException as Error),\n );\n symbolicatedFrames && this._replaceExceptionFramesInEvent(event, symbolicatedFrames);\n } else if (hint.syntheticException && isErrorLike(hint.syntheticException)) {\n // syntheticException is Error object\n const symbolicatedFrames = await this._symbolicate(\n hint.syntheticException.stack,\n getFramesToPop(hint.syntheticException),\n );\n\n if (event.exception) {\n symbolicatedFrames && this._replaceExceptionFramesInEvent(event, symbolicatedFrames);\n } else if (event.threads) {\n // RN JS doesn't have threads\n // syntheticException is used for Sentry.captureMessage() threads\n symbolicatedFrames && this._replaceThreadFramesInEvent(event, symbolicatedFrames);\n }\n }\n\n return event;\n });\n }\n\n /**\n * Symbolicates the stack on the device talking to local dev server.\n * Mutates the passed event.\n */\n private async _symbolicate(rawStack: string, skipFirstFrames: number = 0): Promise<SentryStackFrame[] | null> {\n const parsedStack = this._parseErrorStack(rawStack);\n\n try {\n const prettyStack = await this._symbolicateStackTrace(parsedStack);\n if (!prettyStack) {\n logger.error('React Native DevServer could not symbolicate the stack trace.');\n return null;\n }\n\n // This has been changed in an react-native version so stack is contained in here\n const newStack = prettyStack.stack || prettyStack;\n\n // https://github.com/getsentry/sentry-javascript/blob/739d904342aaf9327312f409952f14ceff4ae1ab/packages/utils/src/stacktrace.ts#L23\n // Match SentryParser which counts lines of stack (-1 for first line with the Error message)\n const skipFirstAdjustedToSentryStackParser = Math.max(skipFirstFrames - 1, 0);\n const stackWithoutPoppedFrames = skipFirstAdjustedToSentryStackParser\n ? newStack.slice(skipFirstAdjustedToSentryStackParser)\n : newStack;\n\n const stackWithoutInternalCallsites = stackWithoutPoppedFrames.filter(\n (frame: { file?: string }) => frame.file && frame.file.match(INTERNAL_CALLSITES_REGEX) === null,\n );\n\n return await this._convertReactNativeFramesToSentryFrames(stackWithoutInternalCallsites);\n } catch (error) {\n if (error instanceof Error) {\n logger.warn(`Unable to symbolicate stack trace: ${error.message}`);\n }\n return null;\n }\n }\n\n /**\n * Converts ReactNativeFrames to frames in the Sentry format\n * @param frames ReactNativeFrame[]\n */\n private async _convertReactNativeFramesToSentryFrames(frames: ReactNative.StackFrame[]): Promise<SentryStackFrame[]> {\n return Promise.all(\n frames.map(async (frame: ReactNative.StackFrame): Promise<SentryStackFrame> => {\n let inApp = !!frame.column && !!frame.lineNumber;\n inApp =\n inApp &&\n frame.file !== undefined &&\n !frame.file.includes('node_modules') &&\n !frame.file.includes('native code');\n\n const newFrame: SentryStackFrame = {\n lineno: frame.lineNumber,\n colno: frame.column,\n filename: frame.file,\n function: frame.methodName,\n in_app: inApp,\n };\n\n if (inApp) {\n await this._addSourceContext(newFrame);\n }\n\n return newFrame;\n }),\n );\n }\n\n /**\n * Replaces the frames in the exception of a error.\n * @param event Event\n * @param frames StackFrame[]\n */\n private _replaceExceptionFramesInEvent(event: Event, frames: SentryStackFrame[]): void {\n if (\n event.exception &&\n event.exception.values &&\n event.exception.values[0] &&\n event.exception.values[0].stacktrace\n ) {\n event.exception.values[0].stacktrace.frames = frames.reverse();\n }\n }\n\n /**\n * Replaces the frames in the thread of a message.\n * @param event Event\n * @param frames StackFrame[]\n */\n private _replaceThreadFramesInEvent(event: Event, frames: SentryStackFrame[]): void {\n if (event.threads && event.threads.values && event.threads.values[0] && event.threads.values[0].stacktrace) {\n event.threads.values[0].stacktrace.frames = frames.reverse();\n }\n }\n\n /**\n * This tries to add source context for in_app Frames\n *\n * @param frame StackFrame\n * @param getDevServer function from RN to get DevServer URL\n */\n private async _addSourceContext(frame: SentryStackFrame): Promise<void> {\n let sourceContext: string | null = null;\n\n const segments = frame.filename?.split('/') ?? [];\n\n const serverUrl = this._getDevServer()?.url;\n if (!serverUrl) {\n return;\n }\n\n for (const idx in segments) {\n if (!Object.prototype.hasOwnProperty.call(segments, idx)) {\n continue;\n }\n\n sourceContext = await this._fetchSourceContext(serverUrl, segments, -idx);\n if (sourceContext) {\n break;\n }\n }\n\n if (!sourceContext) {\n return;\n }\n\n const lines = sourceContext.split('\\n');\n addContextToFrame(lines, frame);\n }\n\n /**\n * Get source context for segment\n */\n private async _fetchSourceContext(url: string, segments: Array<string>, start: number): Promise<string | null> {\n const response = await fetch(`${url}${segments.slice(start).join('/')}`, {\n method: 'GET',\n });\n\n if (response.ok) {\n return response.text();\n }\n return null;\n }\n\n /**\n * Loads and calls RN Core Devtools parseErrorStack function.\n */\n private _parseErrorStack(errorStack: string): Array<ReactNative.StackFrame> {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const parseErrorStack = require('react-native/Libraries/Core/Devtools/parseErrorStack');\n return parseErrorStack(errorStack);\n }\n\n /**\n * Loads and calls RN Core Devtools symbolicateStackTrace function.\n */\n private _symbolicateStackTrace(\n stack: Array<ReactNative.StackFrame>,\n extraData?: Record<string, unknown>,\n ): Promise<ReactNative.SymbolicatedStackTrace> {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const symbolicateStackTrace = require('react-native/Libraries/Core/Devtools/symbolicateStackTrace');\n return symbolicateStackTrace(stack, extraData);\n }\n\n /**\n * Loads and returns the RN DevServer URL.\n */\n private _getDevServer(): ReactNative.DevServerInfo | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const getDevServer = require('react-native/Libraries/Core/Devtools/getDevServer');\n return getDevServer();\n } catch (_oO) {\n // We can't load devserver URL\n }\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"debugsymbolicator.js","sourceRoot":"","sources":["../../../src/js/integrations/debugsymbolicator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Event, EventHint, EventProcessor, Hub, Integration, StackFrame as SentryStackFrame } from '@sentry/types';\nimport { addContextToFrame, logger } from '@sentry/utils';\n\nimport { getFramesToPop, isErrorLike } from '../utils/error';\nimport { ReactNativeLibraries } from '../utils/rnlibraries';\nimport type * as ReactNative from '../vendor/react-native';\n\nconst INTERNAL_CALLSITES_REGEX = new RegExp(['ReactNativeRenderer-dev\\\\.js$', 'MessageQueue\\\\.js$'].join('|'));\n\n/**\n * React Native Error\n */\nexport type ReactNativeError = Error & {\n framesToPop?: number;\n jsEngine?: string;\n preventSymbolication?: boolean;\n componentStack?: string;\n};\n\n/** Tries to symbolicate the JS stack trace on the device. */\nexport class DebugSymbolicator implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'DebugSymbolicator';\n /**\n * @inheritDoc\n */\n public name: string = DebugSymbolicator.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n addGlobalEventProcessor(async (event: Event, hint: EventHint) => {\n const self = getCurrentHub().getIntegration(DebugSymbolicator);\n\n if (!self) {\n return event;\n }\n\n if (event.exception && isErrorLike(hint.originalException)) {\n // originalException is ErrorLike object\n const symbolicatedFrames = await this._symbolicate(\n hint.originalException.stack,\n getFramesToPop(hint.originalException as Error),\n );\n symbolicatedFrames && this._replaceExceptionFramesInEvent(event, symbolicatedFrames);\n } else if (hint.syntheticException && isErrorLike(hint.syntheticException)) {\n // syntheticException is Error object\n const symbolicatedFrames = await this._symbolicate(\n hint.syntheticException.stack,\n getFramesToPop(hint.syntheticException),\n );\n\n if (event.exception) {\n symbolicatedFrames && this._replaceExceptionFramesInEvent(event, symbolicatedFrames);\n } else if (event.threads) {\n // RN JS doesn't have threads\n // syntheticException is used for Sentry.captureMessage() threads\n symbolicatedFrames && this._replaceThreadFramesInEvent(event, symbolicatedFrames);\n }\n }\n\n return event;\n });\n }\n\n /**\n * Symbolicates the stack on the device talking to local dev server.\n * Mutates the passed event.\n */\n private async _symbolicate(rawStack: string, skipFirstFrames: number = 0): Promise<SentryStackFrame[] | null> {\n try {\n const parsedStack = this._parseErrorStack(rawStack);\n\n const prettyStack = await this._symbolicateStackTrace(parsedStack);\n if (!prettyStack) {\n logger.error('React Native DevServer could not symbolicate the stack trace.');\n return null;\n }\n\n // This has been changed in an react-native version so stack is contained in here\n const newStack = prettyStack.stack || prettyStack;\n\n // https://github.com/getsentry/sentry-javascript/blob/739d904342aaf9327312f409952f14ceff4ae1ab/packages/utils/src/stacktrace.ts#L23\n // Match SentryParser which counts lines of stack (-1 for first line with the Error message)\n const skipFirstAdjustedToSentryStackParser = Math.max(skipFirstFrames - 1, 0);\n const stackWithoutPoppedFrames = skipFirstAdjustedToSentryStackParser\n ? newStack.slice(skipFirstAdjustedToSentryStackParser)\n : newStack;\n\n const stackWithoutInternalCallsites = stackWithoutPoppedFrames.filter(\n (frame: { file?: string }) => frame.file && frame.file.match(INTERNAL_CALLSITES_REGEX) === null,\n );\n\n return await this._convertReactNativeFramesToSentryFrames(stackWithoutInternalCallsites);\n } catch (error) {\n if (error instanceof Error) {\n logger.warn(`Unable to symbolicate stack trace: ${error.message}`);\n }\n return null;\n }\n }\n\n /**\n * Converts ReactNativeFrames to frames in the Sentry format\n * @param frames ReactNativeFrame[]\n */\n private async _convertReactNativeFramesToSentryFrames(frames: ReactNative.StackFrame[]): Promise<SentryStackFrame[]> {\n return Promise.all(\n frames.map(async (frame: ReactNative.StackFrame): Promise<SentryStackFrame> => {\n let inApp = !!frame.column && !!frame.lineNumber;\n inApp =\n inApp &&\n frame.file !== undefined &&\n !frame.file.includes('node_modules') &&\n !frame.file.includes('native code');\n\n const newFrame: SentryStackFrame = {\n lineno: frame.lineNumber,\n colno: frame.column,\n filename: frame.file,\n function: frame.methodName,\n in_app: inApp,\n };\n\n if (inApp) {\n await this._addSourceContext(newFrame);\n }\n\n return newFrame;\n }),\n );\n }\n\n /**\n * Replaces the frames in the exception of a error.\n * @param event Event\n * @param frames StackFrame[]\n */\n private _replaceExceptionFramesInEvent(event: Event, frames: SentryStackFrame[]): void {\n if (\n event.exception &&\n event.exception.values &&\n event.exception.values[0] &&\n event.exception.values[0].stacktrace\n ) {\n event.exception.values[0].stacktrace.frames = frames.reverse();\n }\n }\n\n /**\n * Replaces the frames in the thread of a message.\n * @param event Event\n * @param frames StackFrame[]\n */\n private _replaceThreadFramesInEvent(event: Event, frames: SentryStackFrame[]): void {\n if (event.threads && event.threads.values && event.threads.values[0] && event.threads.values[0].stacktrace) {\n event.threads.values[0].stacktrace.frames = frames.reverse();\n }\n }\n\n /**\n * This tries to add source context for in_app Frames\n *\n * @param frame StackFrame\n * @param getDevServer function from RN to get DevServer URL\n */\n private async _addSourceContext(frame: SentryStackFrame): Promise<void> {\n let sourceContext: string | null = null;\n\n const segments = frame.filename?.split('/') ?? [];\n\n const serverUrl = this._getDevServer()?.url;\n if (!serverUrl) {\n return;\n }\n\n for (const idx in segments) {\n if (!Object.prototype.hasOwnProperty.call(segments, idx)) {\n continue;\n }\n\n sourceContext = await this._fetchSourceContext(serverUrl, segments, -idx);\n if (sourceContext) {\n break;\n }\n }\n\n if (!sourceContext) {\n return;\n }\n\n const lines = sourceContext.split('\\n');\n addContextToFrame(lines, frame);\n }\n\n /**\n * Get source context for segment\n */\n private async _fetchSourceContext(url: string, segments: Array<string>, start: number): Promise<string | null> {\n const response = await fetch(`${url}${segments.slice(start).join('/')}`, {\n method: 'GET',\n });\n\n if (response.ok) {\n return response.text();\n }\n return null;\n }\n\n /**\n * Loads and calls RN Core Devtools parseErrorStack function.\n */\n private _parseErrorStack(errorStack: string): Array<ReactNative.StackFrame> {\n if (!ReactNativeLibraries.Devtools) {\n throw new Error('React Native Devtools not available.');\n }\n return ReactNativeLibraries.Devtools.parseErrorStack(errorStack);\n }\n\n /**\n * Loads and calls RN Core Devtools symbolicateStackTrace function.\n */\n private _symbolicateStackTrace(\n stack: Array<ReactNative.StackFrame>,\n extraData?: Record<string, unknown>,\n ): Promise<ReactNative.SymbolicatedStackTrace> {\n if (!ReactNativeLibraries.Devtools) {\n throw new Error('React Native Devtools not available.');\n }\n return ReactNativeLibraries.Devtools.symbolicateStackTrace(stack, extraData);\n }\n\n /**\n * Loads and returns the RN DevServer URL.\n */\n private _getDevServer(): ReactNative.DevServerInfo | undefined {\n try {\n return ReactNativeLibraries.Devtools?.getDevServer();\n } catch (_oO) {\n // We can't load devserver URL\n }\n return undefined;\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Integration } from '@sentry/types';
|
|
2
|
+
import type { ReactNativeClientOptions } from '../options';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the default ReactNative integrations based on the current environment.
|
|
5
|
+
*
|
|
6
|
+
* Native integrations are only returned when native is enabled.
|
|
7
|
+
*
|
|
8
|
+
* Web integrations are only returned when running on web.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getDefaultIntegrations(options: ReactNativeClientOptions): Integration[];
|
|
11
|
+
//# sourceMappingURL=default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/default.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAkB3D;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,EAAE,CA6DvF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { hasTracingEnabled } from '@sentry/core';
|
|
2
|
+
import { HttpClient } from '@sentry/integrations';
|
|
3
|
+
import { Integrations as BrowserReactIntegrations } from '@sentry/react';
|
|
4
|
+
import { HermesProfiling } from '../profiling/integration';
|
|
5
|
+
import { ReactNativeTracing } from '../tracing';
|
|
6
|
+
import { isExpoGo, notWeb } from '../utils/environment';
|
|
7
|
+
import { DebugSymbolicator } from './debugsymbolicator';
|
|
8
|
+
import { DeviceContext } from './devicecontext';
|
|
9
|
+
import { EventOrigin } from './eventorigin';
|
|
10
|
+
import { ExpoContext } from './expocontext';
|
|
11
|
+
import { ModulesLoader } from './modulesloader';
|
|
12
|
+
import { NativeLinkedErrors } from './nativelinkederrors';
|
|
13
|
+
import { ReactNativeErrorHandlers } from './reactnativeerrorhandlers';
|
|
14
|
+
import { ReactNativeInfo } from './reactnativeinfo';
|
|
15
|
+
import { Release } from './release';
|
|
16
|
+
import { createReactNativeRewriteFrames } from './rewriteframes';
|
|
17
|
+
import { Screenshot } from './screenshot';
|
|
18
|
+
import { SdkInfo } from './sdkinfo';
|
|
19
|
+
import { ViewHierarchy } from './viewhierarchy';
|
|
20
|
+
/**
|
|
21
|
+
* Returns the default ReactNative integrations based on the current environment.
|
|
22
|
+
*
|
|
23
|
+
* Native integrations are only returned when native is enabled.
|
|
24
|
+
*
|
|
25
|
+
* Web integrations are only returned when running on web.
|
|
26
|
+
*/
|
|
27
|
+
export function getDefaultIntegrations(options) {
|
|
28
|
+
const integrations = [];
|
|
29
|
+
if (notWeb()) {
|
|
30
|
+
integrations.push(new ReactNativeErrorHandlers({
|
|
31
|
+
patchGlobalPromise: options.patchGlobalPromise,
|
|
32
|
+
}));
|
|
33
|
+
integrations.push(new NativeLinkedErrors());
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
integrations.push(new BrowserReactIntegrations.TryCatch());
|
|
37
|
+
integrations.push(new BrowserReactIntegrations.GlobalHandlers());
|
|
38
|
+
integrations.push(new BrowserReactIntegrations.LinkedErrors());
|
|
39
|
+
}
|
|
40
|
+
// @sentry/react default integrations
|
|
41
|
+
integrations.push(new BrowserReactIntegrations.InboundFilters());
|
|
42
|
+
integrations.push(new BrowserReactIntegrations.FunctionToString());
|
|
43
|
+
integrations.push(new BrowserReactIntegrations.Breadcrumbs());
|
|
44
|
+
integrations.push(new BrowserReactIntegrations.Dedupe());
|
|
45
|
+
integrations.push(new BrowserReactIntegrations.HttpContext());
|
|
46
|
+
// end @sentry/react-native default integrations
|
|
47
|
+
integrations.push(new Release());
|
|
48
|
+
integrations.push(new EventOrigin());
|
|
49
|
+
integrations.push(new SdkInfo());
|
|
50
|
+
integrations.push(new ReactNativeInfo());
|
|
51
|
+
if (__DEV__ && notWeb()) {
|
|
52
|
+
integrations.push(new DebugSymbolicator());
|
|
53
|
+
}
|
|
54
|
+
integrations.push(createReactNativeRewriteFrames());
|
|
55
|
+
if (options.enableNative) {
|
|
56
|
+
integrations.push(new DeviceContext());
|
|
57
|
+
integrations.push(new ModulesLoader());
|
|
58
|
+
if (options.attachScreenshot) {
|
|
59
|
+
integrations.push(new Screenshot());
|
|
60
|
+
}
|
|
61
|
+
if (options.attachViewHierarchy) {
|
|
62
|
+
integrations.push(new ViewHierarchy());
|
|
63
|
+
}
|
|
64
|
+
if (options._experiments && typeof options._experiments.profilesSampleRate === 'number') {
|
|
65
|
+
integrations.push(new HermesProfiling());
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (hasTracingEnabled(options) && options.enableAutoPerformanceTracing) {
|
|
69
|
+
integrations.push(new ReactNativeTracing());
|
|
70
|
+
}
|
|
71
|
+
if (options.enableCaptureFailedRequests) {
|
|
72
|
+
integrations.push(new HttpClient());
|
|
73
|
+
}
|
|
74
|
+
if (isExpoGo()) {
|
|
75
|
+
integrations.push(new ExpoContext());
|
|
76
|
+
}
|
|
77
|
+
return integrations;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/js/integrations/default.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasTracingEnabled } from '@sentry/core';\nimport { HttpClient } from '@sentry/integrations';\nimport { Integrations as BrowserReactIntegrations } from '@sentry/react';\nimport type { Integration } from '@sentry/types';\n\nimport type { ReactNativeClientOptions } from '../options';\nimport { HermesProfiling } from '../profiling/integration';\nimport { ReactNativeTracing } from '../tracing';\nimport { isExpoGo, notWeb } from '../utils/environment';\nimport { DebugSymbolicator } from './debugsymbolicator';\nimport { DeviceContext } from './devicecontext';\nimport { EventOrigin } from './eventorigin';\nimport { ExpoContext } from './expocontext';\nimport { ModulesLoader } from './modulesloader';\nimport { NativeLinkedErrors } from './nativelinkederrors';\nimport { ReactNativeErrorHandlers } from './reactnativeerrorhandlers';\nimport { ReactNativeInfo } from './reactnativeinfo';\nimport { Release } from './release';\nimport { createReactNativeRewriteFrames } from './rewriteframes';\nimport { Screenshot } from './screenshot';\nimport { SdkInfo } from './sdkinfo';\nimport { ViewHierarchy } from './viewhierarchy';\n\n/**\n * Returns the default ReactNative integrations based on the current environment.\n *\n * Native integrations are only returned when native is enabled.\n *\n * Web integrations are only returned when running on web.\n */\nexport function getDefaultIntegrations(options: ReactNativeClientOptions): Integration[] {\n const integrations: Integration[] = [];\n\n if (notWeb()) {\n integrations.push(\n new ReactNativeErrorHandlers({\n patchGlobalPromise: options.patchGlobalPromise,\n }),\n );\n integrations.push(new NativeLinkedErrors());\n } else {\n integrations.push(new BrowserReactIntegrations.TryCatch());\n integrations.push(new BrowserReactIntegrations.GlobalHandlers());\n integrations.push(new BrowserReactIntegrations.LinkedErrors());\n }\n\n // @sentry/react default integrations\n integrations.push(new BrowserReactIntegrations.InboundFilters());\n integrations.push(new BrowserReactIntegrations.FunctionToString());\n integrations.push(new BrowserReactIntegrations.Breadcrumbs());\n integrations.push(new BrowserReactIntegrations.Dedupe());\n integrations.push(new BrowserReactIntegrations.HttpContext());\n // end @sentry/react-native default integrations\n\n integrations.push(new Release());\n integrations.push(new EventOrigin());\n integrations.push(new SdkInfo());\n integrations.push(new ReactNativeInfo());\n\n if (__DEV__ && notWeb()) {\n integrations.push(new DebugSymbolicator());\n }\n\n integrations.push(createReactNativeRewriteFrames());\n\n if (options.enableNative) {\n integrations.push(new DeviceContext());\n integrations.push(new ModulesLoader());\n if (options.attachScreenshot) {\n integrations.push(new Screenshot());\n }\n if (options.attachViewHierarchy) {\n integrations.push(new ViewHierarchy());\n }\n if (options._experiments && typeof options._experiments.profilesSampleRate === 'number') {\n integrations.push(new HermesProfiling());\n }\n }\n\n if (hasTracingEnabled(options) && options.enableAutoPerformanceTracing) {\n integrations.push(new ReactNativeTracing());\n }\n if (options.enableCaptureFailedRequests) {\n integrations.push(new HttpClient());\n }\n\n if (isExpoGo()) {\n integrations.push(new ExpoContext());\n }\n\n return integrations;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EventProcessor, Hub, Integration } from '@sentry/types';
|
|
2
|
+
/** Load device context from expo modules. */
|
|
3
|
+
export declare class ExpoContext implements Integration {
|
|
4
|
+
/**
|
|
5
|
+
* @inheritDoc
|
|
6
|
+
*/
|
|
7
|
+
static id: string;
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* @inheritDoc
|
|
14
|
+
*/
|
|
15
|
+
setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=expocontext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expocontext.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/expocontext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,cAAc,EAAE,GAAG,EAAE,WAAW,EAAa,MAAM,eAAe,CAAC;AAIvG,6CAA6C;AAC7C,qBAAa,WAAY,YAAW,WAAW;IAC7C;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAAiB;IAEzC;;OAEG;IACI,IAAI,EAAE,MAAM,CAAkB;IAErC;;OAEG;IACI,SAAS,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,GAAG,IAAI;CAsB9G"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { getExpoDevice } from '../utils/expomodules';
|
|
3
|
+
/** Load device context from expo modules. */
|
|
4
|
+
export class ExpoContext {
|
|
5
|
+
constructor() {
|
|
6
|
+
/**
|
|
7
|
+
* @inheritDoc
|
|
8
|
+
*/
|
|
9
|
+
this.name = ExpoContext.id;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @inheritDoc
|
|
13
|
+
*/
|
|
14
|
+
setupOnce(addGlobalEventProcessor, getCurrentHub) {
|
|
15
|
+
addGlobalEventProcessor((event) => __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
const self = getCurrentHub().getIntegration(ExpoContext);
|
|
17
|
+
if (!self) {
|
|
18
|
+
return event;
|
|
19
|
+
}
|
|
20
|
+
const expoDeviceContext = getExpoDeviceContext();
|
|
21
|
+
if (expoDeviceContext) {
|
|
22
|
+
event.contexts = event.contexts || {};
|
|
23
|
+
event.contexts.device = Object.assign(Object.assign({}, expoDeviceContext), event.contexts.device);
|
|
24
|
+
}
|
|
25
|
+
const expoOsContext = getExpoOsContext();
|
|
26
|
+
if (expoOsContext) {
|
|
27
|
+
event.contexts = event.contexts || {};
|
|
28
|
+
event.contexts.os = Object.assign(Object.assign({}, expoOsContext), event.contexts.os);
|
|
29
|
+
}
|
|
30
|
+
return event;
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @inheritDoc
|
|
36
|
+
*/
|
|
37
|
+
ExpoContext.id = 'ExpoContext';
|
|
38
|
+
/**
|
|
39
|
+
* Returns the Expo Device context if present
|
|
40
|
+
*/
|
|
41
|
+
function getExpoDeviceContext() {
|
|
42
|
+
const expoDevice = getExpoDevice();
|
|
43
|
+
if (!expoDevice) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
name: expoDevice.deviceName,
|
|
48
|
+
simulator: !(expoDevice === null || expoDevice === void 0 ? void 0 : expoDevice.isDevice),
|
|
49
|
+
model: expoDevice.modelName,
|
|
50
|
+
manufacturer: expoDevice.manufacturer,
|
|
51
|
+
memory_size: expoDevice.totalMemory,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns the Expo OS context if present
|
|
56
|
+
*/
|
|
57
|
+
function getExpoOsContext() {
|
|
58
|
+
const expoDevice = getExpoDevice();
|
|
59
|
+
if (!expoDevice) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
build: expoDevice.osBuildId,
|
|
64
|
+
version: expoDevice.osVersion,
|
|
65
|
+
name: expoDevice.osName,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=expocontext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expocontext.js","sourceRoot":"","sources":["../../../src/js/integrations/expocontext.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,6CAA6C;AAC7C,MAAM,OAAO,WAAW;IAAxB;QAME;;WAEG;QACI,SAAI,GAAW,WAAW,CAAC,EAAE,CAAC;IA2BvC,CAAC;IAzBC;;OAEG;IACI,SAAS,CAAC,uBAA2D,EAAE,aAAwB;QACpG,uBAAuB,CAAC,CAAO,KAAY,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE;gBACT,OAAO,KAAK,CAAC;aACd;YAED,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;YACjD,IAAI,iBAAiB,EAAE;gBACrB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACtC,KAAK,CAAC,QAAQ,CAAC,MAAM,mCAAQ,iBAAiB,GAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAE,CAAC;aAC5E;YAED,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;YACzC,IAAI,aAAa,EAAE;gBACjB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACtC,KAAK,CAAC,QAAQ,CAAC,EAAE,mCAAQ,aAAa,GAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC;aAChE;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAA,CAAC,CAAC;IACL,CAAC;;AAlCD;;GAEG;AACW,cAAE,GAAW,aAAa,CAAC;AAkC3C;;GAEG;AACH,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,UAAU;QAC3B,SAAS,EAAE,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,CAAA;QAChC,KAAK,EAAE,UAAU,CAAC,SAAS;QAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,SAAS;QAC3B,OAAO,EAAE,UAAU,CAAC,SAAS;QAC7B,IAAI,EAAE,UAAU,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC","sourcesContent":["import type { DeviceContext, Event, EventProcessor, Hub, Integration, OsContext } from '@sentry/types';\n\nimport { getExpoDevice } from '../utils/expomodules';\n\n/** Load device context from expo modules. */\nexport class ExpoContext implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'ExpoContext';\n\n /**\n * @inheritDoc\n */\n public name: string = ExpoContext.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n addGlobalEventProcessor(async (event: Event) => {\n const self = getCurrentHub().getIntegration(ExpoContext);\n if (!self) {\n return event;\n }\n\n const expoDeviceContext = getExpoDeviceContext();\n if (expoDeviceContext) {\n event.contexts = event.contexts || {};\n event.contexts.device = { ...expoDeviceContext, ...event.contexts.device };\n }\n\n const expoOsContext = getExpoOsContext();\n if (expoOsContext) {\n event.contexts = event.contexts || {};\n event.contexts.os = { ...expoOsContext, ...event.contexts.os };\n }\n\n return event;\n });\n }\n}\n\n/**\n * Returns the Expo Device context if present\n */\nfunction getExpoDeviceContext(): DeviceContext | undefined {\n const expoDevice = getExpoDevice();\n\n if (!expoDevice) {\n return undefined;\n }\n\n return {\n name: expoDevice.deviceName,\n simulator: !expoDevice?.isDevice,\n model: expoDevice.modelName,\n manufacturer: expoDevice.manufacturer,\n memory_size: expoDevice.totalMemory,\n };\n}\n\n/**\n * Returns the Expo OS context if present\n */\nfunction getExpoOsContext(): OsContext | undefined {\n const expoDevice = getExpoDevice();\n\n if (!expoDevice) {\n return undefined;\n }\n\n return {\n build: expoDevice.osBuildId,\n version: expoDevice.osVersion,\n name: expoDevice.osName,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativeerrorhandlers.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,WAAW,EAAiB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"reactnativeerrorhandlers.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,WAAW,EAAiB,MAAM,eAAe,CAAC;AAQ3E,uCAAuC;AACvC,UAAU,+BAA+B;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAOD,2CAA2C;AAC3C,qBAAa,wBAAyB,YAAW,WAAW;IAC1D;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAA8B;IAEtD;;OAEG;IACI,IAAI,EAAE,MAAM,CAA+B;IAElD,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,kBAAkB;gBACC,OAAO,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC;IASrE;;OAEG;IACI,SAAS,IAAI,IAAI;IAKxB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAoCxC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqEtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAO/B"}
|
|
@@ -2,6 +2,7 @@ import { __awaiter } from "tslib";
|
|
|
2
2
|
import { getCurrentHub } from '@sentry/core';
|
|
3
3
|
import { addExceptionMechanism, logger } from '@sentry/utils';
|
|
4
4
|
import { createSyntheticError, isErrorLike } from '../utils/error';
|
|
5
|
+
import { ReactNativeLibraries } from '../utils/rnlibraries';
|
|
5
6
|
import { RN_GLOBAL_OBJ } from '../utils/worldwide';
|
|
6
7
|
/** ReactNativeErrorHandlers Integration */
|
|
7
8
|
export class ReactNativeErrorHandlers {
|
|
@@ -42,14 +43,17 @@ export class ReactNativeErrorHandlers {
|
|
|
42
43
|
* - The package resolution fix no longer works with 0.67 on iOS Hermes.
|
|
43
44
|
*/
|
|
44
45
|
_polyfillPromise() {
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
if (!ReactNativeLibraries.Utilities) {
|
|
47
|
+
logger.warn('Could not polyfill Promise. React Native Libraries Utilities not found.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
47
50
|
const Promise = this._getPromisePolyfill();
|
|
48
51
|
// As of RN 0.67 only done and finally are used
|
|
52
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
49
53
|
require('promise/setimmediate/done');
|
|
54
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
50
55
|
require('promise/setimmediate/finally');
|
|
51
|
-
polyfillGlobal('Promise', () => Promise);
|
|
52
|
-
/* eslint-enable import/no-extraneous-dependencies,@typescript-eslint/no-var-requires */
|
|
56
|
+
ReactNativeLibraries.Utilities.polyfillGlobal('Promise', () => Promise);
|
|
53
57
|
}
|
|
54
58
|
/**
|
|
55
59
|
* Single source of truth for the Promise implementation we want to use.
|
|
@@ -104,8 +108,7 @@ export class ReactNativeErrorHandlers {
|
|
|
104
108
|
// or dependency that uses a different version.
|
|
105
109
|
// We have to check if the React Native Promise and the `promise` package Promise are using the same reference.
|
|
106
110
|
// If they are not, likely there are multiple versions of the `promise` package installed.
|
|
107
|
-
|
|
108
|
-
const ReactNativePromise = require('react-native/Libraries/Promise');
|
|
111
|
+
const ReactNativePromise = ReactNativeLibraries.Promise;
|
|
109
112
|
// eslint-disable-next-line @typescript-eslint/no-var-requires,import/no-extraneous-dependencies
|
|
110
113
|
const PromisePackagePromise = require('promise/setimmediate/es6-extensions');
|
|
111
114
|
const UsedPromisePolyfill = this._getPromisePolyfill();
|