@sentry/react-native 5.25.0 → 5.26.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 +107 -3
- package/RNSentry.podspec +1 -1
- package/android/build.gradle +1 -1
- package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +63 -2
- package/android/src/main/java/io/sentry/react/RNSentryReplayBreadcrumbConverter.java +187 -0
- package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +10 -0
- package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +10 -0
- package/dist/js/NativeRNSentry.d.ts +2 -0
- package/dist/js/NativeRNSentry.d.ts.map +1 -1
- package/dist/js/NativeRNSentry.js.map +1 -1
- package/dist/js/client.d.ts +4 -0
- package/dist/js/client.d.ts.map +1 -1
- package/dist/js/client.js +12 -2
- package/dist/js/client.js.map +1 -1
- package/dist/js/integrations/default.d.ts.map +1 -1
- package/dist/js/integrations/default.js +9 -1
- package/dist/js/integrations/default.js.map +1 -1
- package/dist/js/integrations/exports.d.ts +2 -1
- package/dist/js/integrations/exports.d.ts.map +1 -1
- package/dist/js/integrations/exports.js +2 -1
- package/dist/js/integrations/exports.js.map +1 -1
- package/dist/js/integrations/index.d.ts +1 -0
- package/dist/js/integrations/index.d.ts.map +1 -1
- package/dist/js/integrations/index.js +1 -0
- package/dist/js/integrations/index.js.map +1 -1
- package/dist/js/options.d.ts +24 -2
- package/dist/js/options.d.ts.map +1 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/replay/mobilereplay.d.ts +47 -0
- package/dist/js/replay/mobilereplay.d.ts.map +1 -0
- package/dist/js/replay/mobilereplay.js +100 -0
- package/dist/js/replay/mobilereplay.js.map +1 -0
- package/dist/js/replay/networkUtils.d.ts +8 -0
- package/dist/js/replay/networkUtils.d.ts.map +1 -0
- package/dist/js/replay/networkUtils.js +52 -0
- package/dist/js/replay/networkUtils.js.map +1 -0
- package/dist/js/replay/xhrUtils.d.ts +6 -0
- package/dist/js/replay/xhrUtils.d.ts.map +1 -0
- package/dist/js/replay/xhrUtils.js +31 -0
- package/dist/js/replay/xhrUtils.js.map +1 -0
- package/dist/js/tools/enableLogger.d.ts +5 -0
- package/dist/js/tools/enableLogger.d.ts.map +1 -0
- package/dist/js/tools/enableLogger.js +13 -0
- package/dist/js/tools/enableLogger.js.map +1 -0
- package/dist/js/tools/metroconfig.d.ts +19 -4
- package/dist/js/tools/metroconfig.d.ts.map +1 -1
- package/dist/js/tools/metroconfig.js +38 -3
- package/dist/js/tools/metroconfig.js.map +1 -1
- package/dist/js/tools/sentryBabelTransformer.d.ts +4 -0
- package/dist/js/tools/sentryBabelTransformer.d.ts.map +1 -0
- package/dist/js/tools/sentryBabelTransformer.js +28 -0
- package/dist/js/tools/sentryBabelTransformer.js.map +1 -0
- package/dist/js/tools/sentryBabelTransformerUtils.d.ts +18 -0
- package/dist/js/tools/sentryBabelTransformerUtils.d.ts.map +1 -0
- package/dist/js/tools/sentryBabelTransformerUtils.js +67 -0
- package/dist/js/tools/sentryBabelTransformerUtils.js.map +1 -0
- package/dist/js/tools/vendor/metro/metroBabelTransformer.d.ts +35 -0
- package/dist/js/tools/vendor/metro/metroBabelTransformer.d.ts.map +1 -0
- package/dist/js/tools/vendor/metro/metroBabelTransformer.js +3 -0
- package/dist/js/tools/vendor/metro/metroBabelTransformer.js.map +1 -0
- package/dist/js/touchevents.d.ts.map +1 -1
- package/dist/js/touchevents.js +57 -30
- package/dist/js/touchevents.js.map +1 -1
- package/dist/js/utils/clientutils.d.ts +10 -0
- package/dist/js/utils/clientutils.d.ts.map +1 -0
- package/dist/js/utils/clientutils.js +9 -0
- package/dist/js/utils/clientutils.js.map +1 -0
- package/dist/js/utils/environment.d.ts +4 -0
- package/dist/js/utils/environment.d.ts.map +1 -1
- package/dist/js/utils/environment.js +8 -0
- package/dist/js/utils/environment.js.map +1 -1
- package/dist/js/utils/worldwide.d.ts +6 -0
- 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.d.ts.map +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/dist/js/wrapper.d.ts +7 -1
- package/dist/js/wrapper.d.ts.map +1 -1
- package/dist/js/wrapper.js +24 -0
- package/dist/js/wrapper.js.map +1 -1
- package/ios/RNSentry.mm +33 -1
- package/ios/RNSentryReplay.h +8 -0
- package/ios/RNSentryReplay.m +72 -0
- package/ios/RNSentryReplayBreadcrumbConverter.h +16 -0
- package/ios/RNSentryReplayBreadcrumbConverter.m +168 -0
- package/package.json +2 -1
- package/src/js/NativeRNSentry.ts +2 -0
- package/ts3.8/dist/js/NativeRNSentry.d.ts +2 -0
- package/ts3.8/dist/js/client.d.ts +4 -0
- package/ts3.8/dist/js/integrations/exports.d.ts +2 -1
- package/ts3.8/dist/js/integrations/index.d.ts +1 -0
- package/ts3.8/dist/js/options.d.ts +24 -2
- package/ts3.8/dist/js/replay/mobilereplay.d.ts +47 -0
- package/ts3.8/dist/js/replay/networkUtils.d.ts +8 -0
- package/ts3.8/dist/js/replay/xhrUtils.d.ts +6 -0
- package/ts3.8/dist/js/utils/clientutils.d.ts +10 -0
- package/ts3.8/dist/js/utils/environment.d.ts +4 -0
- package/ts3.8/dist/js/utils/worldwide.d.ts +6 -0
- package/ts3.8/dist/js/version.d.ts +1 -1
- package/ts3.8/dist/js/wrapper.d.ts +7 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableLogger.d.ts","sourceRoot":"","sources":["../../../src/js/tools/enableLogger.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
exports.enableLogger = void 0;
|
|
3
|
+
const utils_1 = require("@sentry/utils");
|
|
4
|
+
/**
|
|
5
|
+
* Enables debug logger when SENTRY_LOG_LEVEL=debug.
|
|
6
|
+
*/
|
|
7
|
+
function enableLogger() {
|
|
8
|
+
if (process.env.SENTRY_LOG_LEVEL === 'debug') {
|
|
9
|
+
utils_1.logger.enable();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.enableLogger = enableLogger;
|
|
13
|
+
//# sourceMappingURL=enableLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableLogger.js","sourceRoot":"","sources":["../../../src/js/tools/enableLogger.ts"],"names":[],"mappings":";;AAAA,yCAAuC;AAEvC;;GAEG;AACH,SAAgB,YAAY;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO,EAAE;QAC5C,cAAM,CAAC,MAAM,EAAE,CAAC;KACjB;AACH,CAAC;AAJD,oCAIC","sourcesContent":["import { logger } from '@sentry/utils';\n\n/**\n * Enables debug logger when SENTRY_LOG_LEVEL=debug.\n */\nexport function enableLogger(): void {\n if (process.env.SENTRY_LOG_LEVEL === 'debug') {\n logger.enable();\n }\n}\n"]}
|
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
import type { MetroConfig } from 'metro';
|
|
2
2
|
import type { DefaultConfigOptions } from './vendor/expo/expoconfig';
|
|
3
3
|
export * from './sentryMetroSerializer';
|
|
4
|
+
export interface SentryMetroConfigOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Annotates React components with Sentry data.
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
annotateReactComponents?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface SentryExpoConfigOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Pass a custom `getDefaultConfig` function to override the default Expo configuration getter.
|
|
14
|
+
*/
|
|
15
|
+
getDefaultConfig?: typeof getSentryExpoConfig;
|
|
16
|
+
}
|
|
4
17
|
/**
|
|
5
18
|
* Adds Sentry to the Metro config.
|
|
6
19
|
*
|
|
7
20
|
* Adds Debug ID to the output bundle and source maps.
|
|
8
21
|
* Collapses Sentry frames from the stack trace view in LogBox.
|
|
9
22
|
*/
|
|
10
|
-
export declare function withSentryConfig(config: MetroConfig): MetroConfig;
|
|
23
|
+
export declare function withSentryConfig(config: MetroConfig, { annotateReactComponents }?: SentryMetroConfigOptions): MetroConfig;
|
|
11
24
|
/**
|
|
12
25
|
* This function returns Default Expo configuration with Sentry plugins.
|
|
13
26
|
*/
|
|
14
|
-
export declare function getSentryExpoConfig(projectRoot: string, options?: DefaultConfigOptions &
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
export declare function getSentryExpoConfig(projectRoot: string, options?: DefaultConfigOptions & SentryExpoConfigOptions & SentryMetroConfigOptions): MetroConfig;
|
|
28
|
+
/**
|
|
29
|
+
* Adds Sentry Babel transformer to the Metro config.
|
|
30
|
+
*/
|
|
31
|
+
export declare function withSentryBabelTransformer(config: MetroConfig): MetroConfig;
|
|
17
32
|
/**
|
|
18
33
|
* Collapses Sentry internal frames from the stack trace view in LogBox.
|
|
19
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metroconfig.d.ts","sourceRoot":"","sources":["../../../src/js/tools/metroconfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metroconfig.d.ts","sourceRoot":"","sources":["../../../src/js/tools/metroconfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAsC,MAAM,OAAO,CAAC;AAO7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,cAAc,yBAAyB,CAAC;AAIxC,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,mBAAmB,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,EAAE,uBAA+B,EAAE,GAAE,wBAA6B,GACjE,WAAW,CAYb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAoB,GAAG,uBAAuB,GAAG,wBAA6B,GACtF,WAAW,CAkBb;AAsBD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CA2B3E;AA0BD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAiC1E"}
|
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
-
exports.withSentryFramesCollapsed = exports.getSentryExpoConfig = exports.withSentryConfig = void 0;
|
|
2
|
+
exports.withSentryFramesCollapsed = exports.withSentryBabelTransformer = exports.getSentryExpoConfig = exports.withSentryConfig = void 0;
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
+
const utils_1 = require("@sentry/utils");
|
|
5
|
+
const process = require("process");
|
|
4
6
|
const process_1 = require("process");
|
|
7
|
+
const enableLogger_1 = require("./enableLogger");
|
|
8
|
+
const sentryBabelTransformerUtils_1 = require("./sentryBabelTransformerUtils");
|
|
5
9
|
const sentryMetroSerializer_1 = require("./sentryMetroSerializer");
|
|
6
10
|
tslib_1.__exportStar(require("./sentryMetroSerializer"), exports);
|
|
11
|
+
(0, enableLogger_1.enableLogger)();
|
|
7
12
|
/**
|
|
8
13
|
* Adds Sentry to the Metro config.
|
|
9
14
|
*
|
|
10
15
|
* Adds Debug ID to the output bundle and source maps.
|
|
11
16
|
* Collapses Sentry frames from the stack trace view in LogBox.
|
|
12
17
|
*/
|
|
13
|
-
function withSentryConfig(config) {
|
|
18
|
+
function withSentryConfig(config, { annotateReactComponents = false } = {}) {
|
|
14
19
|
setSentryMetroDevServerEnvFlag();
|
|
15
20
|
let newConfig = config;
|
|
16
21
|
newConfig = withSentryDebugId(newConfig);
|
|
17
22
|
newConfig = withSentryFramesCollapsed(newConfig);
|
|
23
|
+
if (annotateReactComponents) {
|
|
24
|
+
newConfig = withSentryBabelTransformer(newConfig);
|
|
25
|
+
}
|
|
18
26
|
return newConfig;
|
|
19
27
|
}
|
|
20
28
|
exports.withSentryConfig = withSentryConfig;
|
|
@@ -28,7 +36,11 @@ function getSentryExpoConfig(projectRoot, options = {}) {
|
|
|
28
36
|
...(options.unstable_beforeAssetSerializationPlugins || []),
|
|
29
37
|
sentryMetroSerializer_1.unstable_beforeAssetSerializationPlugin,
|
|
30
38
|
] }));
|
|
31
|
-
|
|
39
|
+
let newConfig = withSentryFramesCollapsed(config);
|
|
40
|
+
if (options.annotateReactComponents) {
|
|
41
|
+
newConfig = withSentryBabelTransformer(newConfig);
|
|
42
|
+
}
|
|
43
|
+
return newConfig;
|
|
32
44
|
}
|
|
33
45
|
exports.getSentryExpoConfig = getSentryExpoConfig;
|
|
34
46
|
function loadExpoMetroConfigModule() {
|
|
@@ -40,6 +52,29 @@ function loadExpoMetroConfigModule() {
|
|
|
40
52
|
throw new Error('Unable to load `expo/metro-config`. Make sure you have Expo installed.');
|
|
41
53
|
}
|
|
42
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Adds Sentry Babel transformer to the Metro config.
|
|
57
|
+
*/
|
|
58
|
+
function withSentryBabelTransformer(config) {
|
|
59
|
+
const defaultBabelTransformerPath = config.transformer && config.transformer.babelTransformerPath;
|
|
60
|
+
utils_1.logger.debug('Default Babel transformer path from `config.transformer`:', defaultBabelTransformerPath);
|
|
61
|
+
if (!defaultBabelTransformerPath) {
|
|
62
|
+
// This has to be console.warn because the options is enabled but won't be used
|
|
63
|
+
// eslint-disable-next-line no-console
|
|
64
|
+
console.warn('`transformer.babelTransformerPath` is undefined.');
|
|
65
|
+
// eslint-disable-next-line no-console
|
|
66
|
+
console.warn('Sentry Babel transformer cannot be used. Not adding it...');
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
if (defaultBabelTransformerPath) {
|
|
70
|
+
(0, sentryBabelTransformerUtils_1.saveDefaultBabelTransformerPath)(defaultBabelTransformerPath);
|
|
71
|
+
process.on('exit', () => {
|
|
72
|
+
(0, sentryBabelTransformerUtils_1.cleanDefaultBabelTransformerPath)();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return Object.assign(Object.assign({}, config), { transformer: Object.assign(Object.assign({}, config.transformer), { babelTransformerPath: require.resolve('./sentryBabelTransformer') }) });
|
|
76
|
+
}
|
|
77
|
+
exports.withSentryBabelTransformer = withSentryBabelTransformer;
|
|
43
78
|
function withSentryDebugId(config) {
|
|
44
79
|
var _a;
|
|
45
80
|
const customSerializer = (0, sentryMetroSerializer_1.createSentryMetroSerializer)(((_a = config.serializer) === null || _a === void 0 ? void 0 : _a.customSerializer) || undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metroconfig.js","sourceRoot":"","sources":["../../../src/js/tools/metroconfig.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"metroconfig.js","sourceRoot":"","sources":["../../../src/js/tools/metroconfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '@sentry/utils';\nimport type { MetroConfig, MixedOutput, Module, ReadOnlyGraph } from 'metro';\nimport * as process from 'process';\nimport { env } from 'process';\n\nimport { enableLogger } from './enableLogger';\nimport { cleanDefaultBabelTransformerPath, saveDefaultBabelTransformerPath } from './sentryBabelTransformerUtils';\nimport { createSentryMetroSerializer, unstable_beforeAssetSerializationPlugin } from './sentryMetroSerializer';\nimport type { DefaultConfigOptions } from './vendor/expo/expoconfig';\n\nexport * from './sentryMetroSerializer';\n\nenableLogger();\n\nexport interface SentryMetroConfigOptions {\n /**\n * Annotates React components with Sentry data.\n * @default false\n */\n annotateReactComponents?: boolean;\n}\n\nexport interface SentryExpoConfigOptions {\n /**\n * Pass a custom `getDefaultConfig` function to override the default Expo configuration getter.\n */\n getDefaultConfig?: typeof getSentryExpoConfig;\n}\n\n/**\n * Adds Sentry to the Metro config.\n *\n * Adds Debug ID to the output bundle and source maps.\n * Collapses Sentry frames from the stack trace view in LogBox.\n */\nexport function withSentryConfig(\n config: MetroConfig,\n { annotateReactComponents = false }: SentryMetroConfigOptions = {},\n): MetroConfig {\n setSentryMetroDevServerEnvFlag();\n\n let newConfig = config;\n\n newConfig = withSentryDebugId(newConfig);\n newConfig = withSentryFramesCollapsed(newConfig);\n if (annotateReactComponents) {\n newConfig = withSentryBabelTransformer(newConfig);\n }\n\n return newConfig;\n}\n\n/**\n * This function returns Default Expo configuration with Sentry plugins.\n */\nexport function getSentryExpoConfig(\n projectRoot: string,\n options: DefaultConfigOptions & SentryExpoConfigOptions & SentryMetroConfigOptions = {},\n): MetroConfig {\n setSentryMetroDevServerEnvFlag();\n\n const getDefaultConfig = options.getDefaultConfig || loadExpoMetroConfigModule().getDefaultConfig;\n const config = getDefaultConfig(projectRoot, {\n ...options,\n unstable_beforeAssetSerializationPlugins: [\n ...(options.unstable_beforeAssetSerializationPlugins || []),\n unstable_beforeAssetSerializationPlugin,\n ],\n });\n\n let newConfig = withSentryFramesCollapsed(config);\n if (options.annotateReactComponents) {\n newConfig = withSentryBabelTransformer(newConfig);\n }\n\n return newConfig;\n}\n\nfunction loadExpoMetroConfigModule(): {\n getDefaultConfig: (\n projectRoot: string,\n options: {\n unstable_beforeAssetSerializationPlugins?: ((serializationInput: {\n graph: ReadOnlyGraph<MixedOutput>;\n premodules: Module[];\n debugId?: string;\n }) => Module[])[];\n },\n ) => MetroConfig;\n} {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return require('expo/metro-config');\n } catch (e) {\n throw new Error('Unable to load `expo/metro-config`. Make sure you have Expo installed.');\n }\n}\n\n/**\n * Adds Sentry Babel transformer to the Metro config.\n */\nexport function withSentryBabelTransformer(config: MetroConfig): MetroConfig {\n const defaultBabelTransformerPath = config.transformer && config.transformer.babelTransformerPath;\n logger.debug('Default Babel transformer path from `config.transformer`:', defaultBabelTransformerPath);\n\n if (!defaultBabelTransformerPath) {\n // This has to be console.warn because the options is enabled but won't be used\n // eslint-disable-next-line no-console\n console.warn('`transformer.babelTransformerPath` is undefined.');\n // eslint-disable-next-line no-console\n console.warn('Sentry Babel transformer cannot be used. Not adding it...');\n return config;\n }\n\n if (defaultBabelTransformerPath) {\n saveDefaultBabelTransformerPath(defaultBabelTransformerPath);\n process.on('exit', () => {\n cleanDefaultBabelTransformerPath();\n });\n }\n\n return {\n ...config,\n transformer: {\n ...config.transformer,\n babelTransformerPath: require.resolve('./sentryBabelTransformer'),\n },\n };\n}\n\ntype MetroCustomSerializer = Required<Required<MetroConfig>['serializer']>['customSerializer'] | undefined;\n\nfunction withSentryDebugId(config: MetroConfig): MetroConfig {\n const customSerializer = createSentryMetroSerializer(\n config.serializer?.customSerializer || undefined,\n ) as MetroCustomSerializer;\n // MetroConfig types customSerializers as async only, but sync returns are also supported\n // The default serializer is sync\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n customSerializer,\n },\n };\n}\n\ntype MetroFrame = Parameters<Required<Required<MetroConfig>['symbolicator']>['customizeFrame']>[0];\ntype MetroCustomizeFrame = { readonly collapse?: boolean };\ntype MetroCustomizeFrameReturnValue =\n | ReturnType<Required<Required<MetroConfig>['symbolicator']>['customizeFrame']>\n | undefined;\n\n/**\n * Collapses Sentry internal frames from the stack trace view in LogBox.\n */\nexport function withSentryFramesCollapsed(config: MetroConfig): MetroConfig {\n const originalCustomizeFrame = config.symbolicator?.customizeFrame;\n const collapseSentryInternalFrames = (frame: MetroFrame): boolean =>\n typeof frame.file === 'string' &&\n (frame.file.includes('node_modules/@sentry/utils/cjs/instrument.js') ||\n frame.file.includes('node_modules/@sentry/utils/cjs/logger.js'));\n\n const customizeFrame = (frame: MetroFrame): MetroCustomizeFrameReturnValue => {\n const originalOrSentryCustomizeFrame = (\n originalCustomization: MetroCustomizeFrame | undefined,\n ): MetroCustomizeFrame => ({\n ...originalCustomization,\n collapse: (originalCustomization && originalCustomization.collapse) || collapseSentryInternalFrames(frame),\n });\n\n const maybePromiseCustomization = (originalCustomizeFrame && originalCustomizeFrame(frame)) || undefined;\n\n if (maybePromiseCustomization !== undefined && 'then' in maybePromiseCustomization) {\n return maybePromiseCustomization.then<MetroCustomizeFrame>(originalCustomization =>\n originalOrSentryCustomizeFrame(originalCustomization),\n );\n }\n\n return originalOrSentryCustomizeFrame(maybePromiseCustomization);\n };\n\n return {\n ...config,\n symbolicator: {\n ...config.symbolicator,\n customizeFrame,\n },\n };\n}\n\n/**\n * Sets the `___SENTRY_METRO_DEV_SERVER___` environment flag.\n * This is used to determine if the SDK is running in Node in Metro Dev Server.\n * For example during static routes generation in `expo-router`.\n */\nfunction setSentryMetroDevServerEnvFlag(): void {\n env.___SENTRY_METRO_DEV_SERVER___ = 'true';\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentryBabelTransformer.d.ts","sourceRoot":"","sources":["../../../src/js/tools/sentryBabelTransformer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,sCAAsC,CAAC;AAmCnG,QAAA,MAAM,sBAAsB,kBAAiC,CAAC;AAG9D,SAAS,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const babel_plugin_component_annotate_1 = require("@sentry/babel-plugin-component-annotate");
|
|
2
|
+
const enableLogger_1 = require("./enableLogger");
|
|
3
|
+
const sentryBabelTransformerUtils_1 = require("./sentryBabelTransformerUtils");
|
|
4
|
+
(0, enableLogger_1.enableLogger)();
|
|
5
|
+
/**
|
|
6
|
+
* Creates a Babel transformer with Sentry component annotation plugin.
|
|
7
|
+
*/
|
|
8
|
+
function createSentryBabelTransformer() {
|
|
9
|
+
const defaultTransformer = (0, sentryBabelTransformerUtils_1.loadDefaultBabelTransformer)();
|
|
10
|
+
// Using spread operator to avoid any conflicts with the default transformer
|
|
11
|
+
const transform = (...args) => {
|
|
12
|
+
const transformerArgs = args[0];
|
|
13
|
+
addSentryComponentAnnotatePlugin(transformerArgs);
|
|
14
|
+
return defaultTransformer.transform(...args);
|
|
15
|
+
};
|
|
16
|
+
return Object.assign(Object.assign({}, defaultTransformer), { transform });
|
|
17
|
+
}
|
|
18
|
+
function addSentryComponentAnnotatePlugin(args) {
|
|
19
|
+
if (!args || typeof args.filename !== 'string' || !Array.isArray(args.plugins)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (!args.filename.includes('node_modules')) {
|
|
23
|
+
args.plugins.push(babel_plugin_component_annotate_1.default);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const sentryBabelTransformer = createSentryBabelTransformer();
|
|
27
|
+
module.exports = sentryBabelTransformer;
|
|
28
|
+
//# sourceMappingURL=sentryBabelTransformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentryBabelTransformer.js","sourceRoot":"","sources":["../../../src/js/tools/sentryBabelTransformer.ts"],"names":[],"mappings":"AAAA,6FAA8E;AAE9E,iDAA8C;AAC9C,+EAA4E;AAG5E,IAAA,2BAAY,GAAE,CAAC;AAEf;;GAEG;AACH,SAAS,4BAA4B;IACnC,MAAM,kBAAkB,GAAG,IAAA,yDAA2B,GAAE,CAAC;IAEzD,4EAA4E;IAC5E,MAAM,SAAS,GAAkC,CAAC,GAAG,IAAI,EAAE,EAAE;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,gCAAgC,CAAC,eAAe,CAAC,CAAC;QAElD,OAAO,kBAAkB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,uCACK,kBAAkB,KACrB,SAAS,IACT;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,IAAsC;IAC9E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAC9E,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;QAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,yCAAuB,CAAC,CAAC;KAC5C;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,4BAA4B,EAAE,CAAC;AAG9D,iBAAS,sBAAsB,CAAC","sourcesContent":["import componentAnnotatePlugin from '@sentry/babel-plugin-component-annotate';\n\nimport { enableLogger } from './enableLogger';\nimport { loadDefaultBabelTransformer } from './sentryBabelTransformerUtils';\nimport type { BabelTransformer, BabelTransformerArgs } from './vendor/metro/metroBabelTransformer';\n\nenableLogger();\n\n/**\n * Creates a Babel transformer with Sentry component annotation plugin.\n */\nfunction createSentryBabelTransformer(): BabelTransformer {\n const defaultTransformer = loadDefaultBabelTransformer();\n\n // Using spread operator to avoid any conflicts with the default transformer\n const transform: BabelTransformer['transform'] = (...args) => {\n const transformerArgs = args[0];\n\n addSentryComponentAnnotatePlugin(transformerArgs);\n\n return defaultTransformer.transform(...args);\n };\n\n return {\n ...defaultTransformer,\n transform,\n };\n}\n\nfunction addSentryComponentAnnotatePlugin(args: BabelTransformerArgs | undefined): void {\n if (!args || typeof args.filename !== 'string' || !Array.isArray(args.plugins)) {\n return undefined;\n }\n\n if (!args.filename.includes('node_modules')) {\n args.plugins.push(componentAnnotatePlugin);\n }\n}\n\nconst sentryBabelTransformer = createSentryBabelTransformer();\n// With TS set to `commonjs` this will be translated to `module.exports = sentryBabelTransformer;`\n// which will be correctly picked up by Metro\nexport = sentryBabelTransformer;\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BabelTransformer } from './vendor/metro/metroBabelTransformer';
|
|
2
|
+
/**
|
|
3
|
+
* Saves default Babel transformer path to the project root.
|
|
4
|
+
*/
|
|
5
|
+
export declare function saveDefaultBabelTransformerPath(defaultBabelTransformerPath: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Reads default Babel transformer path from the project root.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readDefaultBabelTransformerPath(): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Cleans default Babel transformer path from the project root.
|
|
12
|
+
*/
|
|
13
|
+
export declare function cleanDefaultBabelTransformerPath(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Loads default Babel transformer from `@react-native/metro-config` -> `@react-native/metro-babel-transformer`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadDefaultBabelTransformer(): BabelTransformer;
|
|
18
|
+
//# sourceMappingURL=sentryBabelTransformerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentryBabelTransformerUtils.d.ts","sourceRoot":"","sources":["../../../src/js/tools/sentryBabelTransformerUtils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,2BAA2B,EAAE,MAAM,GAAG,IAAI,CASzF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,GAAG,SAAS,CAQpE;AAED;;GAEG;AACH,wBAAgB,gCAAgC,IAAI,IAAI,CASvD;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,gBAAgB,CAS9D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
exports.loadDefaultBabelTransformer = exports.cleanDefaultBabelTransformerPath = exports.readDefaultBabelTransformerPath = exports.saveDefaultBabelTransformerPath = void 0;
|
|
3
|
+
const utils_1 = require("@sentry/utils");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const process = require("process");
|
|
7
|
+
/**
|
|
8
|
+
* Saves default Babel transformer path to the project root.
|
|
9
|
+
*/
|
|
10
|
+
function saveDefaultBabelTransformerPath(defaultBabelTransformerPath) {
|
|
11
|
+
try {
|
|
12
|
+
fs.mkdirSync(path.join(process.cwd(), '.sentry'), { recursive: true });
|
|
13
|
+
fs.writeFileSync(getDefaultBabelTransformerPath(), defaultBabelTransformerPath);
|
|
14
|
+
utils_1.logger.debug('Saved default Babel transformer path');
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.error('[Sentry] Failed to save default Babel transformer path:', e);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.saveDefaultBabelTransformerPath = saveDefaultBabelTransformerPath;
|
|
22
|
+
/**
|
|
23
|
+
* Reads default Babel transformer path from the project root.
|
|
24
|
+
*/
|
|
25
|
+
function readDefaultBabelTransformerPath() {
|
|
26
|
+
try {
|
|
27
|
+
return fs.readFileSync(getDefaultBabelTransformerPath()).toString();
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
// eslint-disable-next-line no-console
|
|
31
|
+
console.error('[Sentry] Failed to read default Babel transformer path:', e);
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
exports.readDefaultBabelTransformerPath = readDefaultBabelTransformerPath;
|
|
36
|
+
/**
|
|
37
|
+
* Cleans default Babel transformer path from the project root.
|
|
38
|
+
*/
|
|
39
|
+
function cleanDefaultBabelTransformerPath() {
|
|
40
|
+
try {
|
|
41
|
+
fs.unlinkSync(getDefaultBabelTransformerPath());
|
|
42
|
+
utils_1.logger.debug('Cleaned default Babel transformer path');
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
// We don't want to fail the build if we can't clean the file
|
|
46
|
+
// eslint-disable-next-line no-console
|
|
47
|
+
console.error('[Sentry] Failed to clean default Babel transformer path:', e);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.cleanDefaultBabelTransformerPath = cleanDefaultBabelTransformerPath;
|
|
51
|
+
function getDefaultBabelTransformerPath() {
|
|
52
|
+
return path.join(process.cwd(), '.sentry/.defaultBabelTransformerPath');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Loads default Babel transformer from `@react-native/metro-config` -> `@react-native/metro-babel-transformer`.
|
|
56
|
+
*/
|
|
57
|
+
function loadDefaultBabelTransformer() {
|
|
58
|
+
const defaultBabelTransformerPath = readDefaultBabelTransformerPath();
|
|
59
|
+
if (!defaultBabelTransformerPath) {
|
|
60
|
+
throw new Error('Default Babel Transformer Path not found in `.sentry` directory.');
|
|
61
|
+
}
|
|
62
|
+
utils_1.logger.debug(`Loading default Babel transformer from ${defaultBabelTransformerPath}`);
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
64
|
+
return require(defaultBabelTransformerPath);
|
|
65
|
+
}
|
|
66
|
+
exports.loadDefaultBabelTransformer = loadDefaultBabelTransformer;
|
|
67
|
+
//# sourceMappingURL=sentryBabelTransformerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentryBabelTransformerUtils.js","sourceRoot":"","sources":["../../../src/js/tools/sentryBabelTransformerUtils.ts"],"names":[],"mappings":";;AAAA,yCAAuC;AACvC,yBAAyB;AACzB,6BAA6B;AAC7B,mCAAmC;AAInC;;GAEG;AACH,SAAgB,+BAA+B,CAAC,2BAAmC;IACjF,IAAI;QACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,EAAE,CAAC,aAAa,CAAC,8BAA8B,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAChF,cAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;KACtD;IAAC,OAAO,CAAC,EAAE;QACV,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,CAAC,CAAC;KAC7E;AACH,CAAC;AATD,0EASC;AAED;;GAEG;AACH,SAAgB,+BAA+B;IAC7C,IAAI;QACF,OAAO,EAAE,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;KACrE;IAAC,OAAO,CAAC,EAAE;QACV,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,CAAC,CAAC;KAC7E;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AARD,0EAQC;AAED;;GAEG;AACH,SAAgB,gCAAgC;IAC9C,IAAI;QACF,EAAE,CAAC,UAAU,CAAC,8BAA8B,EAAE,CAAC,CAAC;QAChD,cAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;KACxD;IAAC,OAAO,CAAC,EAAE;QACV,6DAA6D;QAC7D,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,0DAA0D,EAAE,CAAC,CAAC,CAAC;KAC9E;AACH,CAAC;AATD,4EASC;AAED,SAAS,8BAA8B;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sCAAsC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B;IACzC,MAAM,2BAA2B,GAAG,+BAA+B,EAAE,CAAC;IACtE,IAAI,CAAC,2BAA2B,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;KACrF;IAED,cAAM,CAAC,KAAK,CAAC,0CAA0C,2BAA2B,EAAE,CAAC,CAAC;IACtF,8DAA8D;IAC9D,OAAO,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAC9C,CAAC;AATD,kEASC","sourcesContent":["import { logger } from '@sentry/utils';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as process from 'process';\n\nimport type { BabelTransformer } from './vendor/metro/metroBabelTransformer';\n\n/**\n * Saves default Babel transformer path to the project root.\n */\nexport function saveDefaultBabelTransformerPath(defaultBabelTransformerPath: string): void {\n try {\n fs.mkdirSync(path.join(process.cwd(), '.sentry'), { recursive: true });\n fs.writeFileSync(getDefaultBabelTransformerPath(), defaultBabelTransformerPath);\n logger.debug('Saved default Babel transformer path');\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('[Sentry] Failed to save default Babel transformer path:', e);\n }\n}\n\n/**\n * Reads default Babel transformer path from the project root.\n */\nexport function readDefaultBabelTransformerPath(): string | undefined {\n try {\n return fs.readFileSync(getDefaultBabelTransformerPath()).toString();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('[Sentry] Failed to read default Babel transformer path:', e);\n }\n return undefined;\n}\n\n/**\n * Cleans default Babel transformer path from the project root.\n */\nexport function cleanDefaultBabelTransformerPath(): void {\n try {\n fs.unlinkSync(getDefaultBabelTransformerPath());\n logger.debug('Cleaned default Babel transformer path');\n } catch (e) {\n // We don't want to fail the build if we can't clean the file\n // eslint-disable-next-line no-console\n console.error('[Sentry] Failed to clean default Babel transformer path:', e);\n }\n}\n\nfunction getDefaultBabelTransformerPath(): string {\n return path.join(process.cwd(), '.sentry/.defaultBabelTransformerPath');\n}\n\n/**\n * Loads default Babel transformer from `@react-native/metro-config` -> `@react-native/metro-babel-transformer`.\n */\nexport function loadDefaultBabelTransformer(): BabelTransformer {\n const defaultBabelTransformerPath = readDefaultBabelTransformerPath();\n if (!defaultBabelTransformerPath) {\n throw new Error('Default Babel Transformer Path not found in `.sentry` directory.');\n }\n\n logger.debug(`Loading default Babel transformer from ${defaultBabelTransformerPath}`);\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return require(defaultBabelTransformerPath);\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface CustomTransformOptions {
|
|
2
|
+
[key: string]: unknown;
|
|
3
|
+
}
|
|
4
|
+
export type TransformProfile = 'default' | 'hermes-stable' | 'hermes-canary';
|
|
5
|
+
export interface BabelTransformerOptions {
|
|
6
|
+
readonly customTransformOptions?: CustomTransformOptions;
|
|
7
|
+
readonly dev: boolean;
|
|
8
|
+
readonly enableBabelRCLookup?: boolean;
|
|
9
|
+
readonly enableBabelRuntime: boolean | string;
|
|
10
|
+
readonly extendsBabelConfigPath?: string;
|
|
11
|
+
readonly experimentalImportSupport?: boolean;
|
|
12
|
+
readonly hermesParser?: boolean;
|
|
13
|
+
readonly hot: boolean;
|
|
14
|
+
readonly minify: boolean;
|
|
15
|
+
readonly unstable_disableES6Transforms?: boolean;
|
|
16
|
+
readonly platform: string | null;
|
|
17
|
+
readonly projectRoot: string;
|
|
18
|
+
readonly publicPath: string;
|
|
19
|
+
readonly unstable_transformProfile?: TransformProfile;
|
|
20
|
+
readonly globalPrefix: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BabelTransformerArgs {
|
|
23
|
+
readonly filename: string;
|
|
24
|
+
readonly options: BabelTransformerOptions;
|
|
25
|
+
readonly plugins?: unknown;
|
|
26
|
+
readonly src: string;
|
|
27
|
+
}
|
|
28
|
+
export interface BabelTransformer {
|
|
29
|
+
transform: (args: BabelTransformerArgs) => {
|
|
30
|
+
ast: unknown;
|
|
31
|
+
metadata: unknown;
|
|
32
|
+
};
|
|
33
|
+
getCacheKey?: () => string;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=metroBabelTransformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metroBabelTransformer.d.ts","sourceRoot":"","sources":["../../../../../src/js/tools/vendor/metro/metroBabelTransformer.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,sBAAsB;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,eAAe,GAAG,eAAe,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IACzD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,gBAAgB,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK;QACzC,GAAG,EAAE,OAAO,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metroBabelTransformer.js","sourceRoot":"","sources":["../../../../../src/js/tools/vendor/metro/metroBabelTransformer.ts"],"names":[],"mappings":"AAAA,2CAA2C","sourcesContent":["// Vendored / modified from @facebook/metro\n\n// https://github.com/facebook/metro/blob/9b295e5f7ecd9cb6332a199bf9cdc1bd8fddf6d9/packages/metro-babel-transformer/types/index.d.ts\n\n// MIT License\n\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nexport interface CustomTransformOptions {\n [key: string]: unknown;\n}\n\nexport type TransformProfile = 'default' | 'hermes-stable' | 'hermes-canary';\n\nexport interface BabelTransformerOptions {\n readonly customTransformOptions?: CustomTransformOptions;\n readonly dev: boolean;\n readonly enableBabelRCLookup?: boolean;\n readonly enableBabelRuntime: boolean | string;\n readonly extendsBabelConfigPath?: string;\n readonly experimentalImportSupport?: boolean;\n readonly hermesParser?: boolean;\n readonly hot: boolean;\n readonly minify: boolean;\n readonly unstable_disableES6Transforms?: boolean;\n readonly platform: string | null;\n readonly projectRoot: string;\n readonly publicPath: string;\n readonly unstable_transformProfile?: TransformProfile;\n readonly globalPrefix: string;\n}\n\nexport interface BabelTransformerArgs {\n readonly filename: string;\n readonly options: BabelTransformerOptions;\n readonly plugins?: unknown;\n readonly src: string;\n}\n\nexport interface BabelTransformer {\n transform: (args: BabelTransformerArgs) => {\n ast: unknown;\n metadata: unknown;\n };\n getCacheKey?: () => string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touchevents.d.ts","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAqCF;;GAEG;AACH,cAAM,kBAAmB,SAAQ,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC;IACvE,OAAc,WAAW,EAAE,MAAM,CAAiC;IAClE,OAAc,YAAY,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAK1D;IAEF,SAAgB,IAAI,EAAE,MAAM,CAAwB;IAEpD,OAAO,CAAC,mBAAmB,CAAmC;IAE9D;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAQhC;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAYhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;OAGG;IAEH,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"touchevents.d.ts","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAqCF;;GAEG;AACH,cAAM,kBAAmB,SAAQ,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC;IACvE,OAAc,WAAW,EAAE,MAAM,CAAiC;IAClE,OAAc,YAAY,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAK1D;IAEF,SAAgB,IAAI,EAAE,MAAM,CAAwB;IAEpD,OAAO,CAAC,mBAAmB,CAAmC;IAE9D;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAQhC;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAYhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;OAGG;IAEH,OAAO,CAAC,aAAa;IAsCrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAuB1B;AA0DD;;;;GAIG;AACH,QAAA,MAAM,sBAAsB,mBAEV,MAAM,aAAa,CAAC,GAAG,CAAC,kBACxB,uBAAuB,KACtC,MAAM,iBAUR,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/js/touchevents.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { addBreadcrumb, getCurrentHub } from '@sentry/core';
|
|
2
|
-
import { logger } from '@sentry/utils';
|
|
2
|
+
import { dropUndefinedKeys, logger } from '@sentry/utils';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { StyleSheet, View } from 'react-native';
|
|
5
5
|
import { createIntegration } from './integrations/factory';
|
|
@@ -85,7 +85,7 @@ class TouchEventBoundary extends React.Component {
|
|
|
85
85
|
*/
|
|
86
86
|
// eslint-disable-next-line complexity
|
|
87
87
|
_onTouchStart(e) {
|
|
88
|
-
var _a, _b, _c
|
|
88
|
+
var _a, _b, _c;
|
|
89
89
|
if (!e._targetInst) {
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
@@ -100,40 +100,15 @@ class TouchEventBoundary extends React.Component {
|
|
|
100
100
|
((_a = currentInst.elementType) === null || _a === void 0 ? void 0 : _a.displayName) === TouchEventBoundary.displayName) {
|
|
101
101
|
break;
|
|
102
102
|
}
|
|
103
|
-
const
|
|
104
|
-
const info = {};
|
|
105
|
-
// provided by @sentry/babel-plugin-component-annotate
|
|
106
|
-
if (typeof props[SENTRY_COMPONENT_PROP_KEY] === 'string' && props[SENTRY_COMPONENT_PROP_KEY].length > 0 && props[SENTRY_COMPONENT_PROP_KEY] !== 'unknown') {
|
|
107
|
-
info.name = props[SENTRY_COMPONENT_PROP_KEY];
|
|
108
|
-
}
|
|
109
|
-
if (typeof props[SENTRY_ELEMENT_PROP_KEY] === 'string' && props[SENTRY_ELEMENT_PROP_KEY].length > 0 && props[SENTRY_ELEMENT_PROP_KEY] !== 'unknown') {
|
|
110
|
-
info.element = props[SENTRY_ELEMENT_PROP_KEY];
|
|
111
|
-
}
|
|
112
|
-
if (typeof props[SENTRY_FILE_PROP_KEY] === 'string' && props[SENTRY_FILE_PROP_KEY].length > 0 && props[SENTRY_FILE_PROP_KEY] !== 'unknown') {
|
|
113
|
-
info.file = props[SENTRY_FILE_PROP_KEY];
|
|
114
|
-
}
|
|
115
|
-
// use custom label if provided by the user, or displayName if available
|
|
116
|
-
const labelValue = typeof props[SENTRY_LABEL_PROP_KEY] === 'string'
|
|
117
|
-
? props[SENTRY_LABEL_PROP_KEY]
|
|
118
|
-
: // For some reason type narrowing doesn't work as expected with indexing when checking it all in one go in
|
|
119
|
-
// the "check-label" if sentence, so we have to assign it to a variable here first
|
|
120
|
-
typeof this.props.labelName === 'string'
|
|
121
|
-
? props[this.props.labelName]
|
|
122
|
-
: undefined;
|
|
123
|
-
if (typeof labelValue === 'string' && labelValue.length > 0) {
|
|
124
|
-
info.label = labelValue;
|
|
125
|
-
}
|
|
126
|
-
if (!info.name && ((_c = currentInst.elementType) === null || _c === void 0 ? void 0 : _c.displayName)) {
|
|
127
|
-
info.name = (_d = currentInst.elementType) === null || _d === void 0 ? void 0 : _d.displayName;
|
|
128
|
-
}
|
|
103
|
+
const info = getTouchedComponentInfo(currentInst, this.props.labelName);
|
|
129
104
|
this._pushIfNotIgnored(touchPath, info);
|
|
130
105
|
currentInst = currentInst.return;
|
|
131
106
|
}
|
|
132
|
-
const label = (
|
|
107
|
+
const label = (_b = touchPath.find(info => info.label)) === null || _b === void 0 ? void 0 : _b.label;
|
|
133
108
|
if (touchPath.length > 0) {
|
|
134
109
|
this._logTouchEvent(touchPath, label);
|
|
135
110
|
}
|
|
136
|
-
(
|
|
111
|
+
(_c = this._tracingIntegration) === null || _c === void 0 ? void 0 : _c.startUserInteractionTransaction({
|
|
137
112
|
elementId: label,
|
|
138
113
|
op: UI_ACTION_TOUCH,
|
|
139
114
|
});
|
|
@@ -142,6 +117,9 @@ class TouchEventBoundary extends React.Component {
|
|
|
142
117
|
* Pushes the name to the componentTreeNames array if it is not ignored.
|
|
143
118
|
*/
|
|
144
119
|
_pushIfNotIgnored(touchPath, value) {
|
|
120
|
+
if (!value) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
145
123
|
if (!value.name && !value.label) {
|
|
146
124
|
return false;
|
|
147
125
|
}
|
|
@@ -166,6 +144,55 @@ TouchEventBoundary.defaultProps = {
|
|
|
166
144
|
ignoreNames: [],
|
|
167
145
|
maxComponentTreeSize: DEFAULT_MAX_COMPONENT_TREE_SIZE,
|
|
168
146
|
};
|
|
147
|
+
function getTouchedComponentInfo(currentInst, labelKey) {
|
|
148
|
+
var _a;
|
|
149
|
+
const displayName = (_a = currentInst.elementType) === null || _a === void 0 ? void 0 : _a.displayName;
|
|
150
|
+
const props = currentInst.memoizedProps;
|
|
151
|
+
if (!props) {
|
|
152
|
+
// Early return if no props are available, as we can't extract any useful information
|
|
153
|
+
if (displayName) {
|
|
154
|
+
return {
|
|
155
|
+
name: displayName,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
return dropUndefinedKeys({
|
|
161
|
+
// provided by @sentry/babel-plugin-component-annotate
|
|
162
|
+
name: getComponentName(props) || displayName,
|
|
163
|
+
element: getElementName(props),
|
|
164
|
+
file: getFileName(props),
|
|
165
|
+
// `sentry-label` or user defined label key
|
|
166
|
+
label: getLabelValue(props, labelKey),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function getComponentName(props) {
|
|
170
|
+
return typeof props[SENTRY_COMPONENT_PROP_KEY] === 'string' &&
|
|
171
|
+
props[SENTRY_COMPONENT_PROP_KEY].length > 0 &&
|
|
172
|
+
props[SENTRY_COMPONENT_PROP_KEY] !== 'unknown' &&
|
|
173
|
+
props[SENTRY_COMPONENT_PROP_KEY] || undefined;
|
|
174
|
+
}
|
|
175
|
+
function getElementName(props) {
|
|
176
|
+
return typeof props[SENTRY_ELEMENT_PROP_KEY] === 'string' &&
|
|
177
|
+
props[SENTRY_ELEMENT_PROP_KEY].length > 0 &&
|
|
178
|
+
props[SENTRY_ELEMENT_PROP_KEY] !== 'unknown' &&
|
|
179
|
+
props[SENTRY_ELEMENT_PROP_KEY] || undefined;
|
|
180
|
+
}
|
|
181
|
+
function getFileName(props) {
|
|
182
|
+
return typeof props[SENTRY_FILE_PROP_KEY] === 'string' &&
|
|
183
|
+
props[SENTRY_FILE_PROP_KEY].length > 0 &&
|
|
184
|
+
props[SENTRY_FILE_PROP_KEY] !== 'unknown' &&
|
|
185
|
+
props[SENTRY_FILE_PROP_KEY] || undefined;
|
|
186
|
+
}
|
|
187
|
+
function getLabelValue(props, labelKey) {
|
|
188
|
+
return typeof props[SENTRY_LABEL_PROP_KEY] === 'string' && props[SENTRY_LABEL_PROP_KEY].length > 0
|
|
189
|
+
? props[SENTRY_LABEL_PROP_KEY]
|
|
190
|
+
// For some reason type narrowing doesn't work as expected with indexing when checking it all in one go in
|
|
191
|
+
// the "check-label" if sentence, so we have to assign it to a variable here first
|
|
192
|
+
: typeof labelKey === 'string' && typeof props[labelKey] == 'string' && props[labelKey].length > 0
|
|
193
|
+
? props[labelKey]
|
|
194
|
+
: undefined;
|
|
195
|
+
}
|
|
169
196
|
/**
|
|
170
197
|
* Convenience Higher-Order-Component for TouchEventBoundary
|
|
171
198
|
* @param WrappedComponent any React Component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touchevents.js","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"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","sourcesContent":["import { addBreadcrumb, getCurrentHub } from '@sentry/core';\nimport type { SeverityLevel } from '@sentry/types';\nimport { logger } from '@sentry/utils';\nimport * as React from 'react';\nimport type { GestureResponderEvent } from 'react-native';\nimport { StyleSheet, View } from 'react-native';\n\nimport { createIntegration } from './integrations/factory';\nimport { ReactNativeTracing } from './tracing';\nimport { UI_ACTION_TOUCH } from './tracing/ops';\n\nexport type TouchEventBoundaryProps = {\n /**\n * The category assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbCategory?: string;\n /**\n * The type assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbType?: string;\n /**\n * The max number of components to display when logging a touch's component tree.\n */\n maxComponentTreeSize?: number;\n /**\n * Component name(s) to ignore when logging the touch event. This prevents unhelpful logs such as\n * \"Touch event within element: View\" where you still can't tell which View it occurred in.\n */\n ignoreNames?: Array<string | RegExp>;\n /**\n * Deprecated, use ignoreNames instead\n * @deprecated\n */\n ignoredDisplayNames?: Array<string | RegExp>;\n /**\n * React Node wrapped by TouchEventBoundary.\n */\n children?: React.ReactNode;\n /**\n * Label Name used to identify the touched element.\n */\n labelName?: string;\n};\n\nconst touchEventStyles = StyleSheet.create({\n wrapperView: {\n flex: 1,\n },\n});\n\nconst DEFAULT_BREADCRUMB_CATEGORY = 'touch';\nconst DEFAULT_BREADCRUMB_TYPE = 'user';\nconst DEFAULT_MAX_COMPONENT_TREE_SIZE = 20;\n\nconst SENTRY_LABEL_PROP_KEY = 'sentry-label';\nconst SENTRY_COMPONENT_PROP_KEY = 'data-sentry-component';\nconst SENTRY_ELEMENT_PROP_KEY = 'data-sentry-element';\nconst SENTRY_FILE_PROP_KEY = 'data-sentry-source-file';\n\ninterface ElementInstance {\n elementType?: {\n displayName?: string;\n name?: string;\n };\n memoizedProps?: Record<string, unknown>;\n return?: ElementInstance;\n}\n\ninterface TouchedComponentInfo {\n name?: string;\n label?: string;\n element?: string;\n file?: string;\n}\n\ninterface PrivateGestureResponderEvent extends GestureResponderEvent {\n _targetInst?: ElementInstance;\n}\n\n/**\n * Boundary to log breadcrumbs for interaction events.\n */\nclass TouchEventBoundary extends React.Component<TouchEventBoundaryProps> {\n public static displayName: string = '__Sentry.TouchEventBoundary';\n public static defaultProps: Partial<TouchEventBoundaryProps> = {\n breadcrumbCategory: DEFAULT_BREADCRUMB_CATEGORY,\n breadcrumbType: DEFAULT_BREADCRUMB_TYPE,\n ignoreNames: [],\n maxComponentTreeSize: DEFAULT_MAX_COMPONENT_TREE_SIZE,\n };\n\n public readonly name: string = 'TouchEventBoundary';\n\n private _tracingIntegration: ReactNativeTracing | null = null;\n\n /**\n * Registers the TouchEventBoundary as a Sentry Integration.\n */\n public componentDidMount(): void {\n const client = getCurrentHub().getClient();\n client?.addIntegration?.(createIntegration(this.name));\n if (!this._tracingIntegration && client) {\n this._tracingIntegration = client.getIntegration(ReactNativeTracing);\n }\n }\n\n /**\n *\n */\n public render(): React.ReactNode {\n return (\n <View\n style={touchEventStyles.wrapperView}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onTouchStart={this._onTouchStart.bind(this) as any}\n >\n {this.props.children}\n </View>\n );\n }\n\n /**\n * Logs the touch event given the component tree names and a label.\n */\n private _logTouchEvent(touchPath: TouchedComponentInfo[], label?: string): void {\n const level = 'info' as SeverityLevel;\n\n const root = touchPath[0];\n const detail = label ? label : `${root.name}${root.file ? ` (${root.file})` : ''}`;\n\n const crumb = {\n category: this.props.breadcrumbCategory,\n data: { path: touchPath },\n level: level,\n message: `Touch event within element: ${detail}`,\n type: this.props.breadcrumbType,\n };\n addBreadcrumb(crumb);\n\n logger.log(`[TouchEvents] ${crumb.message}`);\n }\n\n /**\n * Checks if the name is supposed to be ignored.\n */\n private _isNameIgnored(name: string): boolean {\n let ignoreNames = this.props.ignoreNames || [];\n // eslint-disable-next-line deprecation/deprecation\n if (this.props.ignoredDisplayNames) {\n // This is to make it compatible with prior version.\n // eslint-disable-next-line deprecation/deprecation\n ignoreNames = [...ignoreNames, ...this.props.ignoredDisplayNames];\n }\n\n return ignoreNames.some(\n (ignoreName: string | RegExp) =>\n (typeof ignoreName === 'string' && name === ignoreName) ||\n (ignoreName instanceof RegExp && name.match(ignoreName)),\n );\n }\n\n // Originally was going to clean the names of any HOCs as well but decided that it might hinder debugging effectively. Will leave here in case\n // private readonly _cleanName = (name: string): string =>\n // name.replace(/.*\\(/g, \"\").replace(/\\)/g, \"\");\n\n /**\n * Traverses through the component tree when a touch happens and logs it.\n * @param e\n */\n // eslint-disable-next-line complexity\n private _onTouchStart(e: PrivateGestureResponderEvent): void {\n if (!e._targetInst) {\n return;\n }\n\n let currentInst: ElementInstance | undefined = e._targetInst;\n const touchPath: TouchedComponentInfo[] = [];\n\n while (\n currentInst &&\n // maxComponentTreeSize will always be defined as we have a defaultProps. But ts needs a check so this is here.\n this.props.maxComponentTreeSize &&\n touchPath.length < this.props.maxComponentTreeSize\n ) {\n if (\n // If the loop gets to the boundary itself, break.\n currentInst.elementType?.displayName === TouchEventBoundary.displayName\n ) {\n break;\n }\n\n const props = currentInst.memoizedProps ?? {};\n const info: TouchedComponentInfo = {};\n\n // provided by @sentry/babel-plugin-component-annotate\n if (typeof props[SENTRY_COMPONENT_PROP_KEY] === 'string' && props[SENTRY_COMPONENT_PROP_KEY].length > 0 && props[SENTRY_COMPONENT_PROP_KEY] !== 'unknown') {\n info.name = props[SENTRY_COMPONENT_PROP_KEY];\n }\n if (typeof props[SENTRY_ELEMENT_PROP_KEY] === 'string' && props[SENTRY_ELEMENT_PROP_KEY].length > 0 && props[SENTRY_ELEMENT_PROP_KEY] !== 'unknown') {\n info.element = props[SENTRY_ELEMENT_PROP_KEY];\n }\n if (typeof props[SENTRY_FILE_PROP_KEY] === 'string' && props[SENTRY_FILE_PROP_KEY].length > 0 && props[SENTRY_FILE_PROP_KEY] !== 'unknown') {\n info.file = props[SENTRY_FILE_PROP_KEY];\n }\n\n // use custom label if provided by the user, or displayName if available\n const labelValue =\n typeof props[SENTRY_LABEL_PROP_KEY] === 'string'\n ? props[SENTRY_LABEL_PROP_KEY]\n : // For some reason type narrowing doesn't work as expected with indexing when checking it all in one go in\n // the \"check-label\" if sentence, so we have to assign it to a variable here first\n typeof this.props.labelName === 'string'\n ? props[this.props.labelName]\n : undefined;\n\n if (typeof labelValue === 'string' && labelValue.length > 0) {\n info.label = labelValue;\n }\n\n if (!info.name && currentInst.elementType?.displayName) {\n info.name = currentInst.elementType?.displayName;\n }\n\n this._pushIfNotIgnored(touchPath, info);\n\n currentInst = currentInst.return;\n }\n\n const label = touchPath.find(info => info.label)?.label;\n if (touchPath.length > 0) {\n this._logTouchEvent(touchPath, label);\n }\n\n this._tracingIntegration?.startUserInteractionTransaction({\n elementId: label,\n op: UI_ACTION_TOUCH,\n });\n }\n\n /**\n * Pushes the name to the componentTreeNames array if it is not ignored.\n */\n private _pushIfNotIgnored(touchPath: TouchedComponentInfo[], value: TouchedComponentInfo): boolean {\n if (!value.name && !value.label) {\n return false;\n }\n if (value.name && this._isNameIgnored(value.name)) {\n return false;\n }\n if (value.label && this._isNameIgnored(value.label)) {\n return false;\n }\n\n // Deduplicate same subsequent items.\n if (touchPath.length > 0 && JSON.stringify(touchPath[touchPath.length - 1]) === JSON.stringify(value)) {\n return false;\n }\n\n touchPath.push(value);\n return true;\n }\n}\n\n/**\n * Convenience Higher-Order-Component for TouchEventBoundary\n * @param WrappedComponent any React Component\n * @param boundaryProps TouchEventBoundaryProps\n */\nconst withTouchEventBoundary = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InnerComponent: React.ComponentType<any>,\n boundaryProps?: TouchEventBoundaryProps,\n): React.FunctionComponent => {\n const WrappedComponent: React.FunctionComponent = props => (\n <TouchEventBoundary {...(boundaryProps ?? {})}>\n <InnerComponent {...props} />\n </TouchEventBoundary>\n );\n\n WrappedComponent.displayName = 'WithTouchEventBoundary';\n\n return WrappedComponent;\n};\n\nexport { TouchEventBoundary, withTouchEventBoundary };\n"]}
|
|
1
|
+
{"version":3,"file":"touchevents.js","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"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","sourcesContent":["import { addBreadcrumb, getCurrentHub } from '@sentry/core';\nimport type { SeverityLevel } from '@sentry/types';\nimport { dropUndefinedKeys, logger } from '@sentry/utils';\nimport * as React from 'react';\nimport type { GestureResponderEvent } from 'react-native';\nimport { StyleSheet, View } from 'react-native';\n\nimport { createIntegration } from './integrations/factory';\nimport { ReactNativeTracing } from './tracing';\nimport { UI_ACTION_TOUCH } from './tracing/ops';\n\nexport type TouchEventBoundaryProps = {\n /**\n * The category assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbCategory?: string;\n /**\n * The type assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbType?: string;\n /**\n * The max number of components to display when logging a touch's component tree.\n */\n maxComponentTreeSize?: number;\n /**\n * Component name(s) to ignore when logging the touch event. This prevents unhelpful logs such as\n * \"Touch event within element: View\" where you still can't tell which View it occurred in.\n */\n ignoreNames?: Array<string | RegExp>;\n /**\n * Deprecated, use ignoreNames instead\n * @deprecated\n */\n ignoredDisplayNames?: Array<string | RegExp>;\n /**\n * React Node wrapped by TouchEventBoundary.\n */\n children?: React.ReactNode;\n /**\n * Label Name used to identify the touched element.\n */\n labelName?: string;\n};\n\nconst touchEventStyles = StyleSheet.create({\n wrapperView: {\n flex: 1,\n },\n});\n\nconst DEFAULT_BREADCRUMB_CATEGORY = 'touch';\nconst DEFAULT_BREADCRUMB_TYPE = 'user';\nconst DEFAULT_MAX_COMPONENT_TREE_SIZE = 20;\n\nconst SENTRY_LABEL_PROP_KEY = 'sentry-label';\nconst SENTRY_COMPONENT_PROP_KEY = 'data-sentry-component';\nconst SENTRY_ELEMENT_PROP_KEY = 'data-sentry-element';\nconst SENTRY_FILE_PROP_KEY = 'data-sentry-source-file';\n\ninterface ElementInstance {\n elementType?: {\n displayName?: string;\n name?: string;\n };\n memoizedProps?: Record<string, unknown>;\n return?: ElementInstance;\n}\n\ninterface TouchedComponentInfo {\n name?: string;\n label?: string;\n element?: string;\n file?: string;\n}\n\ninterface PrivateGestureResponderEvent extends GestureResponderEvent {\n _targetInst?: ElementInstance;\n}\n\n/**\n * Boundary to log breadcrumbs for interaction events.\n */\nclass TouchEventBoundary extends React.Component<TouchEventBoundaryProps> {\n public static displayName: string = '__Sentry.TouchEventBoundary';\n public static defaultProps: Partial<TouchEventBoundaryProps> = {\n breadcrumbCategory: DEFAULT_BREADCRUMB_CATEGORY,\n breadcrumbType: DEFAULT_BREADCRUMB_TYPE,\n ignoreNames: [],\n maxComponentTreeSize: DEFAULT_MAX_COMPONENT_TREE_SIZE,\n };\n\n public readonly name: string = 'TouchEventBoundary';\n\n private _tracingIntegration: ReactNativeTracing | null = null;\n\n /**\n * Registers the TouchEventBoundary as a Sentry Integration.\n */\n public componentDidMount(): void {\n const client = getCurrentHub().getClient();\n client?.addIntegration?.(createIntegration(this.name));\n if (!this._tracingIntegration && client) {\n this._tracingIntegration = client.getIntegration(ReactNativeTracing);\n }\n }\n\n /**\n *\n */\n public render(): React.ReactNode {\n return (\n <View\n style={touchEventStyles.wrapperView}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onTouchStart={this._onTouchStart.bind(this) as any}\n >\n {this.props.children}\n </View>\n );\n }\n\n /**\n * Logs the touch event given the component tree names and a label.\n */\n private _logTouchEvent(touchPath: TouchedComponentInfo[], label?: string): void {\n const level = 'info' as SeverityLevel;\n\n const root = touchPath[0];\n const detail = label ? label : `${root.name}${root.file ? ` (${root.file})` : ''}`;\n\n const crumb = {\n category: this.props.breadcrumbCategory,\n data: { path: touchPath },\n level: level,\n message: `Touch event within element: ${detail}`,\n type: this.props.breadcrumbType,\n };\n addBreadcrumb(crumb);\n\n logger.log(`[TouchEvents] ${crumb.message}`);\n }\n\n /**\n * Checks if the name is supposed to be ignored.\n */\n private _isNameIgnored(name: string): boolean {\n let ignoreNames = this.props.ignoreNames || [];\n // eslint-disable-next-line deprecation/deprecation\n if (this.props.ignoredDisplayNames) {\n // This is to make it compatible with prior version.\n // eslint-disable-next-line deprecation/deprecation\n ignoreNames = [...ignoreNames, ...this.props.ignoredDisplayNames];\n }\n\n return ignoreNames.some(\n (ignoreName: string | RegExp) =>\n (typeof ignoreName === 'string' && name === ignoreName) ||\n (ignoreName instanceof RegExp && name.match(ignoreName)),\n );\n }\n\n // Originally was going to clean the names of any HOCs as well but decided that it might hinder debugging effectively. Will leave here in case\n // private readonly _cleanName = (name: string): string =>\n // name.replace(/.*\\(/g, \"\").replace(/\\)/g, \"\");\n\n /**\n * Traverses through the component tree when a touch happens and logs it.\n * @param e\n */\n // eslint-disable-next-line complexity\n private _onTouchStart(e: PrivateGestureResponderEvent): void {\n if (!e._targetInst) {\n return;\n }\n\n let currentInst: ElementInstance | undefined = e._targetInst;\n const touchPath: TouchedComponentInfo[] = [];\n\n while (\n currentInst &&\n // maxComponentTreeSize will always be defined as we have a defaultProps. But ts needs a check so this is here.\n this.props.maxComponentTreeSize &&\n touchPath.length < this.props.maxComponentTreeSize\n ) {\n if (\n // If the loop gets to the boundary itself, break.\n currentInst.elementType?.displayName === TouchEventBoundary.displayName\n ) {\n break;\n }\n\n const info = getTouchedComponentInfo(currentInst, this.props.labelName);\n this._pushIfNotIgnored(touchPath, info);\n\n currentInst = currentInst.return;\n }\n\n const label = touchPath.find(info => info.label)?.label;\n if (touchPath.length > 0) {\n this._logTouchEvent(touchPath, label);\n }\n\n this._tracingIntegration?.startUserInteractionTransaction({\n elementId: label,\n op: UI_ACTION_TOUCH,\n });\n }\n\n /**\n * Pushes the name to the componentTreeNames array if it is not ignored.\n */\n private _pushIfNotIgnored(touchPath: TouchedComponentInfo[], value: TouchedComponentInfo | undefined): boolean {\n if (!value) {\n return false;\n }\n\n if (!value.name && !value.label) {\n return false;\n }\n if (value.name && this._isNameIgnored(value.name)) {\n return false;\n }\n if (value.label && this._isNameIgnored(value.label)) {\n return false;\n }\n\n // Deduplicate same subsequent items.\n if (touchPath.length > 0 && JSON.stringify(touchPath[touchPath.length - 1]) === JSON.stringify(value)) {\n return false;\n }\n\n touchPath.push(value);\n return true;\n }\n}\n\nfunction getTouchedComponentInfo(currentInst: ElementInstance, labelKey: string | undefined): TouchedComponentInfo | undefined {\n const displayName = currentInst.elementType?.displayName;\n\n const props = currentInst.memoizedProps;\n if (!props) {\n // Early return if no props are available, as we can't extract any useful information\n if (displayName) {\n return {\n name: displayName,\n };\n }\n return undefined;\n }\n\n return dropUndefinedKeys<TouchedComponentInfo>({\n // provided by @sentry/babel-plugin-component-annotate\n name: getComponentName(props) || displayName,\n element: getElementName(props),\n file: getFileName(props),\n\n // `sentry-label` or user defined label key\n label: getLabelValue(props, labelKey),\n });\n}\n\nfunction getComponentName(props: Record<string, unknown>): string | undefined {\n return typeof props[SENTRY_COMPONENT_PROP_KEY] === 'string' &&\n props[SENTRY_COMPONENT_PROP_KEY].length > 0 &&\n props[SENTRY_COMPONENT_PROP_KEY] !== 'unknown' &&\n props[SENTRY_COMPONENT_PROP_KEY] || undefined;\n}\n\nfunction getElementName(props: Record<string, unknown>): string | undefined {\n return typeof props[SENTRY_ELEMENT_PROP_KEY] === 'string' &&\n props[SENTRY_ELEMENT_PROP_KEY].length > 0 &&\n props[SENTRY_ELEMENT_PROP_KEY] !== 'unknown' &&\n props[SENTRY_ELEMENT_PROP_KEY] || undefined;\n}\n\nfunction getFileName(props: Record<string, unknown>): string | undefined {\n return typeof props[SENTRY_FILE_PROP_KEY] === 'string' &&\n props[SENTRY_FILE_PROP_KEY].length > 0 &&\n props[SENTRY_FILE_PROP_KEY] !== 'unknown' &&\n props[SENTRY_FILE_PROP_KEY] || undefined;\n}\n\nfunction getLabelValue(props: Record<string, unknown>, labelKey: string | undefined): string | undefined {\n return typeof props[SENTRY_LABEL_PROP_KEY] === 'string' && props[SENTRY_LABEL_PROP_KEY].length > 0\n ? props[SENTRY_LABEL_PROP_KEY] as string\n // For some reason type narrowing doesn't work as expected with indexing when checking it all in one go in\n // the \"check-label\" if sentence, so we have to assign it to a variable here first\n : typeof labelKey === 'string' && typeof props[labelKey] == 'string' && (props[labelKey] as string).length > 0\n ? props[labelKey] as string\n : undefined;\n}\n\n/**\n * Convenience Higher-Order-Component for TouchEventBoundary\n * @param WrappedComponent any React Component\n * @param boundaryProps TouchEventBoundaryProps\n */\nconst withTouchEventBoundary = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InnerComponent: React.ComponentType<any>,\n boundaryProps?: TouchEventBoundaryProps,\n): React.FunctionComponent => {\n const WrappedComponent: React.FunctionComponent = props => (\n <TouchEventBoundary {...(boundaryProps ?? {})}>\n <InnerComponent {...props} />\n </TouchEventBoundary>\n );\n\n WrappedComponent.displayName = 'WithTouchEventBoundary';\n\n return WrappedComponent;\n};\n\nexport { TouchEventBoundary, withTouchEventBoundary };\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Client } from '@sentry/types';
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the provided Sentry client has hooks implemented.
|
|
4
|
+
* @param client The Sentry client object to check.
|
|
5
|
+
* @returns True if the client has hooks, false otherwise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function hasHooks(client: Client): client is Client & {
|
|
8
|
+
on: Required<Client>['on'];
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=clientutils.d.ts.map
|