@sentry/wizard 6.3.0 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/e2e-tests/tests/expo.test.js +9 -2
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +9 -2
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/tests/{sveltekit.test.js → sveltekit-hooks.test.js} +10 -6
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -0
- package/dist/e2e-tests/tests/sveltekit-tracing.test.d.ts +1 -0
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +203 -0
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -0
- package/dist/src/android/android-wizard.js +9 -1
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/android/manifest.d.ts +1 -1
- package/dist/src/android/manifest.js +2 -2
- package/dist/src/android/manifest.js.map +1 -1
- package/dist/src/android/templates.d.ts +1 -1
- package/dist/src/android/templates.js +4 -1
- package/dist/src/android/templates.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +6 -4
- package/dist/src/react-native/javascript.js +11 -7
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +12 -3
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +2 -2
- package/dist/src/react-native/xcode.js +11 -4
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/sveltekit/sdk-example.d.ts +2 -2
- package/dist/src/sveltekit/sdk-example.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/setup.d.ts +3 -0
- package/dist/src/sveltekit/{sdk-setup.js → sdk-setup/setup.js} +113 -157
- package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -0
- package/dist/src/sveltekit/sdk-setup/svelte-config.d.ts +25 -0
- package/dist/src/sveltekit/sdk-setup/svelte-config.js +291 -0
- package/dist/src/sveltekit/sdk-setup/svelte-config.js.map +1 -0
- package/dist/src/sveltekit/sdk-setup/types.d.ts +7 -0
- package/dist/src/sveltekit/sdk-setup/types.js +3 -0
- package/dist/src/sveltekit/sdk-setup/types.js.map +1 -0
- package/dist/src/sveltekit/sdk-setup/utils.d.ts +6 -0
- package/dist/src/sveltekit/sdk-setup/utils.js +45 -0
- package/dist/src/sveltekit/sdk-setup/utils.js.map +1 -0
- package/dist/src/sveltekit/sdk-setup/vite.d.ts +2 -0
- package/dist/src/sveltekit/sdk-setup/vite.js +120 -0
- package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -0
- package/dist/src/sveltekit/sveltekit-wizard.js +45 -5
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/sveltekit/templates.d.ts +4 -0
- package/dist/src/sveltekit/templates.js +33 -10
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/sveltekit/utils.d.ts +2 -1
- package/dist/src/sveltekit/utils.js +7 -2
- package/dist/src/sveltekit/utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +225 -0
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/xcode.test.js +21 -4
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/dist/test/sveltekit/sdk-setup/svelte-config.test.d.ts +1 -0
- package/dist/test/sveltekit/sdk-setup/svelte-config.test.js +529 -0
- package/dist/test/sveltekit/sdk-setup/svelte-config.test.js.map +1 -0
- package/dist/test/sveltekit/templates.test.js +103 -10
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/e2e-tests/tests/sveltekit.test.js.map +0 -1
- package/dist/src/sveltekit/sdk-setup.d.ts +0 -21
- package/dist/src/sveltekit/sdk-setup.js.map +0 -1
- /package/dist/e2e-tests/tests/{sveltekit.test.d.ts → sveltekit-hooks.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/android/manifest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,uCAAyB;AACzB,+EAA+E;AAC/E,sDAAwC;AACxC,qDAAuC;AACvC,2CAAuC;AACvC,oDAAyD;AACzD,kDAA0B;AAE1B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/android/manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as fs from 'fs';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport { manifest } from './templates';\nimport xml, { Attributes, ElementCompact } from 'xml-js';\nimport chalk from 'chalk';\n\n/**\n * Looks for the closing </application> tag in the manifest and adds the Sentry config after it.\n *\n * For example:\n * ```xml\n * <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n * xmlns:tools=\"http://schemas.android.com/tools\">\n *\n * <application>\n * ...\n * // this is what we add and more\n * <meta-data android:name=\"io.sentry.dsn\" android:value=\"__dsn__\" />\n * </application> <!-- we are looking for this one\n * </manifest>\n * ```\n *\n * @param manifestFile the path to the main AndroidManifest.xml file\n * @param dsn\n * @returns true if successfully patched the manifest, false otherwise\n */\nexport function addManifestSnippet(\n manifestFile: string,\n dsn: string,\n enableLogs: boolean,\n): boolean {\n if (!fs.existsSync(manifestFile)) {\n clack.log.warn('AndroidManifest.xml not found.');\n Sentry.captureException('No AndroidManifest file');\n return false;\n }\n\n const manifestContent = fs.readFileSync(manifestFile, 'utf8');\n\n if (/android:name=\"io\\.sentry[^\"]*\"/i.test(manifestContent)) {\n // sentry is already configured\n clack.log.success(chalk.greenBright('Sentry SDK is already configured.'));\n return true;\n }\n\n const applicationMatch = /<\\/application>/i.exec(manifestContent);\n if (!applicationMatch) {\n clack.log.warn('<application> tag not found within the manifest.');\n Sentry.captureException('No <application> tag');\n return false;\n }\n\n const insertionIndex = applicationMatch.index;\n const newContent =\n manifestContent.slice(0, insertionIndex) +\n manifest(dsn, enableLogs) +\n manifestContent.slice(insertionIndex);\n fs.writeFileSync(manifestFile, newContent, 'utf8');\n\n clack.log.success(\n chalk.greenBright(\n `Updated ${chalk.bold(\n 'AndroidManifest.xml',\n )} with the Sentry SDK configuration.`,\n ),\n );\n\n return true;\n}\n\n/**\n * There might be multiple <activity> in the manifest, as well as multiple <activity-alias> with category LAUNCHER,\n * but only one main activity with action MAIN. We are looking for this one by parsing xml and walking it.\n *\n * In addition, older Android versions required to specify the packag name in the manifest,\n * while the new ones - in the Gradle config. So we are just sanity checking if the package name\n * is in the manifest and returning it as well.\n *\n * For example:\n *\n * ```xml\n * <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n * xmlns:tools=\"http://schemas.android.com/tools\"\n * package=\"com.example.sample\">\n *\n * <application>\n * <activity\n * android:name=\"ui.MainActivity\"\n * ...other props>\n * <intent-filter>\n * <action android:name=\"android.intent.action.MAIN\" /> <!-- we are looking for this one\n *\n * <category android:name=\"android.intent.category.LAUNCHER\" />\n * </intent-filter>\n * </activity>\n * </application>\n * </manifest>\n * ```\n *\n * @param manifestFile path to the AndroidManifest.xml file\n * @returns package name (if available in the manifest) + the main activity name\n */\nexport function getMainActivity(manifestFile: string): {\n packageName?: string;\n activityName?: string;\n} {\n if (!fs.existsSync(manifestFile)) {\n clack.log.warn('AndroidManifest.xml not found.');\n Sentry.captureException('No AndroidManifest file');\n return {};\n }\n\n const manifestContent = fs.readFileSync(manifestFile, 'utf8');\n const converted: ElementCompact = xml.xml2js(manifestContent, {\n compact: true,\n });\n const activities: ElementCompact[] | ElementCompact | undefined =\n converted.manifest?.application?.activity;\n const packageName: string | undefined =\n converted.manifest?._attributes?.['package'];\n\n if (!activities) {\n clack.log.warn('No activity found in AndroidManifest.');\n Sentry.captureException('No Activity');\n return {};\n }\n\n let mainActivity;\n if (Array.isArray(activities)) {\n const withIntentFilter = activities.filter((a) => !!a['intent-filter']);\n mainActivity = withIntentFilter.find((a) => isMainActivity(a));\n } else if (isMainActivity(activities)) {\n mainActivity = activities;\n }\n\n if (!mainActivity) {\n clack.log.warn('No main activity found in AndroidManifest.');\n Sentry.captureException('No Main Activity');\n return {};\n }\n\n const attrs = mainActivity._attributes;\n const activityName = attrs?.['android:name'] as string | undefined;\n return { packageName: packageName, activityName: activityName };\n}\n\nfunction isMainActivity(activity: ElementCompact): boolean {\n const intentFilters: ElementCompact[] | ElementCompact =\n activity['intent-filter'];\n if (Array.isArray(intentFilters)) {\n return intentFilters.some((i) => {\n const action: ElementCompact[] | ElementCompact | undefined = i.action;\n return hasMainAction(action);\n });\n } else {\n const action: ElementCompact[] | ElementCompact | undefined =\n intentFilters.action;\n return hasMainAction(action);\n }\n}\n\nfunction hasMainAction(\n action: ElementCompact[] | ElementCompact | undefined,\n): boolean {\n if (!action) {\n return false;\n }\n\n function isMain(attrs?: Attributes): boolean {\n return attrs?.['android:name'] === 'android.intent.action.MAIN';\n }\n\n if (Array.isArray(action)) {\n return action.some((c) => {\n return isMain(c._attributes);\n });\n } else {\n return isMain(action._attributes);\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ export declare const pluginsBlock: (version?: string) => string;
|
|
|
2
2
|
export declare const pluginsBlockKts: (version?: string) => string;
|
|
3
3
|
export declare const plugin: (version?: string) => string;
|
|
4
4
|
export declare const pluginKts: (version?: string) => string;
|
|
5
|
-
export declare const manifest: (dsn: string) => string;
|
|
5
|
+
export declare const manifest: (dsn: string, enableLogs: boolean) => string;
|
|
6
6
|
export declare const sentryImport = "import io.sentry.Sentry;\n";
|
|
7
7
|
export declare const sentryImportKt = "import io.sentry.Sentry\n";
|
|
8
8
|
export declare const testErrorSnippet = "\n // waiting for view to draw to better represent a captured error with a screenshot\n findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalLayoutListener(() -> {\n try {\n throw new Exception(\"This app uses Sentry! :)\");\n } catch (Exception e) {\n Sentry.captureException(e);\n }\n });\n";
|
|
@@ -23,7 +23,7 @@ const pluginKts = (version = '3.12.0') => `
|
|
|
23
23
|
id("io.sentry.android.gradle") version "${version}"
|
|
24
24
|
`;
|
|
25
25
|
exports.pluginKts = pluginKts;
|
|
26
|
-
const manifest = (dsn) => `
|
|
26
|
+
const manifest = (dsn, enableLogs) => `
|
|
27
27
|
<!-- Required: set your sentry.io project identifier (DSN) -->
|
|
28
28
|
<meta-data android:name="io.sentry.dsn" android:value="${dsn}" />
|
|
29
29
|
<!-- Add data like request headers, user ip address and device name, see https://docs.sentry.io/platforms/android/data-management/data-collected/ for more info -->
|
|
@@ -38,6 +38,9 @@ const manifest = (dsn) => `
|
|
|
38
38
|
|
|
39
39
|
<!-- enable the performance API by setting a sample-rate, adjust in production env -->
|
|
40
40
|
<meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" />
|
|
41
|
+
${enableLogs
|
|
42
|
+
? ' <!-- enable Sentry Logs -->\n <meta-data android:name="io.sentry.logs.enabled" android:value="true" />'
|
|
43
|
+
: ''}
|
|
41
44
|
`;
|
|
42
45
|
exports.manifest = manifest;
|
|
43
46
|
exports.sentryImport = `import io.sentry.Sentry;\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/android/templates.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;6CAEP,OAAO;;;CAGnD,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEK,MAAM,eAAe,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;8CAET,OAAO;;;CAGpD,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;6CACD,OAAO;CACnD,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;8CACH,OAAO;CACpD,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEK,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC;;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/android/templates.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;6CAEP,OAAO;;;CAGnD,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEK,MAAM,eAAe,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;8CAET,OAAO;;;CAGpD,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;6CACD,OAAO;CACnD,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;8CACH,OAAO;CACpD,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEK,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,UAAmB,EAAE,EAAE,CAAC;;6DAED,GAAG;;;;;;;;;;;;;EAc9D,UAAU;IACR,CAAC,CAAC,+GAA+G;IACjH,CAAC,CAAC,EACN;CACC,CAAC;AApBW,QAAA,QAAQ,YAoBnB;AAEW,QAAA,YAAY,GAAG,4BAA4B,CAAC;AAE5C,QAAA,cAAc,GAAG,2BAA2B,CAAC;AAE7C,QAAA,gBAAgB,GAAG;;;;;;;;;CAS/B,CAAC;AAEW,QAAA,kBAAkB,GAAG;;;;;;;;;CASjC,CAAC;AAEK,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,EAAE,CAAC;;;aAG1D,OAAO;qBACC,WAAW;;;;;;CAM/B,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAEK,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,EAAE,CAAC;;;eAG3D,OAAO;uBACC,WAAW;;;;;;CAMjC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B","sourcesContent":["export const pluginsBlock = (version = '3.12.0') => `\nplugins {\n id 'io.sentry.android.gradle' version '${version}'\n}\n\n`;\n\nexport const pluginsBlockKts = (version = '3.12.0') => `\nplugins {\n id(\"io.sentry.android.gradle\") version \"${version}\"\n}\n\n`;\n\nexport const plugin = (version = '3.12.0') => `\n id 'io.sentry.android.gradle' version '${version}'\n`;\n\nexport const pluginKts = (version = '3.12.0') => `\n id(\"io.sentry.android.gradle\") version \"${version}\"\n`;\n\nexport const manifest = (dsn: string, enableLogs: boolean) => `\n <!-- Required: set your sentry.io project identifier (DSN) -->\n <meta-data android:name=\"io.sentry.dsn\" android:value=\"${dsn}\" />\n <!-- Add data like request headers, user ip address and device name, see https://docs.sentry.io/platforms/android/data-management/data-collected/ for more info -->\n <meta-data android:name=\"io.sentry.send-default-pii\" android:value=\"true\" />\n\n <!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) -->\n <meta-data android:name=\"io.sentry.traces.user-interaction.enable\" android:value=\"true\" />\n <!-- enable screenshot for crashes (could contain sensitive/PII data) -->\n <meta-data android:name=\"io.sentry.attach-screenshot\" android:value=\"true\" />\n <!-- enable view hierarchy for crashes -->\n <meta-data android:name=\"io.sentry.attach-view-hierarchy\" android:value=\"true\" />\n\n <!-- enable the performance API by setting a sample-rate, adjust in production env -->\n <meta-data android:name=\"io.sentry.traces.sample-rate\" android:value=\"1.0\" />\n${\n enableLogs\n ? ' <!-- enable Sentry Logs -->\\n <meta-data android:name=\"io.sentry.logs.enabled\" android:value=\"true\" />'\n : ''\n}\n`;\n\nexport const sentryImport = `import io.sentry.Sentry;\\n`;\n\nexport const sentryImportKt = `import io.sentry.Sentry\\n`;\n\nexport const testErrorSnippet = `\n // waiting for view to draw to better represent a captured error with a screenshot\n findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalLayoutListener(() -> {\n try {\n throw new Exception(\"This app uses Sentry! :)\");\n } catch (Exception e) {\n Sentry.captureException(e);\n }\n });\n`;\n\nexport const testErrorSnippetKt = `\n // waiting for view to draw to better represent a captured error with a screenshot\n findViewById<android.view.View>(android.R.id.content).viewTreeObserver.addOnGlobalLayoutListener {\n try {\n throw Exception(\"This app uses Sentry! :)\")\n } catch (e: Exception) {\n Sentry.captureException(e)\n }\n }\n`;\n\nexport const sourceContext = (orgSlug: string, projectSlug: string) => `\n\nsentry {\n org = \"${orgSlug}\"\n projectName = \"${projectSlug}\"\n\n // this will upload your source code to Sentry to show it as part of the stack traces\n // disable if you don't want to expose your sources\n includeSourceContext = true\n}\n`;\n\nexport const sourceContextKts = (orgSlug: string, projectSlug: string) => `\n\nsentry {\n org.set(\"${orgSlug}\")\n projectName.set(\"${projectSlug}\")\n\n // this will upload your source code to Sentry to show it as part of the stack traces\n // disable if you don't want to expose your sources\n includeSourceContext.set(true)\n}\n`;\n"]}
|
|
@@ -2,21 +2,23 @@ import { ProxifiedModule } from 'magicast';
|
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
3
|
export declare const sessionReplaySampleRate = 0.1;
|
|
4
4
|
export declare const sessionReplayOnErrorSampleRate = 1;
|
|
5
|
-
export declare function addSentryInit({ dsn, enableSessionReplay, enableFeedbackWidget, }: {
|
|
5
|
+
export declare function addSentryInit({ dsn, enableSessionReplay, enableFeedbackWidget, enableLogs, }: {
|
|
6
6
|
dsn: string;
|
|
7
7
|
enableSessionReplay?: boolean;
|
|
8
8
|
enableFeedbackWidget?: boolean;
|
|
9
|
+
enableLogs?: boolean;
|
|
9
10
|
}): Promise<void>;
|
|
10
|
-
export declare function addSentryInitWithSdkImport(js: string, { dsn, enableSessionReplay, enableFeedbackWidget, }: {
|
|
11
|
+
export declare function addSentryInitWithSdkImport(js: string, { dsn, enableSessionReplay, enableFeedbackWidget, enableLogs, }: {
|
|
11
12
|
dsn: string;
|
|
12
13
|
enableSessionReplay?: boolean;
|
|
13
14
|
enableFeedbackWidget?: boolean;
|
|
15
|
+
enableLogs?: boolean;
|
|
14
16
|
}): string;
|
|
15
17
|
export declare function doesJsCodeIncludeSdkSentryImport(js: string, { sdkPackageName }: {
|
|
16
18
|
sdkPackageName: string;
|
|
17
19
|
}): boolean;
|
|
18
|
-
export declare function getSentryInitColoredCodeSnippet(dsn: string, enableSessionReplay?: boolean, enableFeedbackWidget?: boolean): string;
|
|
19
|
-
export declare function getSentryInitPlainTextSnippet(dsn: string, enableSessionReplay?: boolean, enableFeedbackWidget?: boolean): string;
|
|
20
|
+
export declare function getSentryInitColoredCodeSnippet(dsn: string, enableSessionReplay?: boolean, enableFeedbackWidget?: boolean, enableLogs?: boolean): string;
|
|
21
|
+
export declare function getSentryInitPlainTextSnippet(dsn: string, enableSessionReplay?: boolean, enableFeedbackWidget?: boolean, enableLogs?: boolean): string;
|
|
20
22
|
export declare function getSentryIntegrationsPlainTextSnippet(enableSessionReplay?: boolean, enableFeedbackWidget?: boolean): string;
|
|
21
23
|
/**
|
|
22
24
|
* This step should be executed after `addSentryInit`
|
|
@@ -44,7 +44,7 @@ const magicast_1 = require("magicast");
|
|
|
44
44
|
const t = __importStar(require("@babel/types"));
|
|
45
45
|
exports.sessionReplaySampleRate = 0.1;
|
|
46
46
|
exports.sessionReplayOnErrorSampleRate = 1.0;
|
|
47
|
-
async function addSentryInit({ dsn, enableSessionReplay = false, enableFeedbackWidget = false, }) {
|
|
47
|
+
async function addSentryInit({ dsn, enableSessionReplay = false, enableFeedbackWidget = false, enableLogs = false, }) {
|
|
48
48
|
const jsPath = getMainAppFilePath();
|
|
49
49
|
Sentry.setTag('app-js-file-status', jsPath ? 'found' : 'not-found');
|
|
50
50
|
if (!jsPath) {
|
|
@@ -52,7 +52,7 @@ async function addSentryInit({ dsn, enableSessionReplay = false, enableFeedbackW
|
|
|
52
52
|
Sentry.captureException('Could not find main App file.');
|
|
53
53
|
await (0, clack_1.showCopyPasteInstructions)({
|
|
54
54
|
filename: 'App.js or _layout.tsx',
|
|
55
|
-
codeSnippet: getSentryInitColoredCodeSnippet(dsn, enableSessionReplay, enableFeedbackWidget),
|
|
55
|
+
codeSnippet: getSentryInitColoredCodeSnippet(dsn, enableSessionReplay, enableFeedbackWidget, enableLogs),
|
|
56
56
|
hint: 'This ensures the Sentry SDK is ready to capture errors.',
|
|
57
57
|
});
|
|
58
58
|
return;
|
|
@@ -72,6 +72,7 @@ async function addSentryInit({ dsn, enableSessionReplay = false, enableFeedbackW
|
|
|
72
72
|
dsn,
|
|
73
73
|
enableSessionReplay,
|
|
74
74
|
enableFeedbackWidget,
|
|
75
|
+
enableLogs,
|
|
75
76
|
});
|
|
76
77
|
try {
|
|
77
78
|
fs.writeFileSync(jsPath, newContent, 'utf-8');
|
|
@@ -86,22 +87,22 @@ async function addSentryInit({ dsn, enableSessionReplay = false, enableFeedbackW
|
|
|
86
87
|
prompts_1.default.log.success(chalk_1.default.green(`${chalk_1.default.cyan(jsRelativePath)} changes saved.`));
|
|
87
88
|
}
|
|
88
89
|
exports.addSentryInit = addSentryInit;
|
|
89
|
-
function addSentryInitWithSdkImport(js, { dsn, enableSessionReplay = false, enableFeedbackWidget = false, }) {
|
|
90
|
+
function addSentryInitWithSdkImport(js, { dsn, enableSessionReplay = false, enableFeedbackWidget = false, enableLogs = false, }) {
|
|
90
91
|
return js.replace(/^([^]*)(import\s+[^;]*?;$)/m, (match) => `${match}
|
|
91
|
-
${getSentryInitPlainTextSnippet(dsn, enableSessionReplay, enableFeedbackWidget)}`);
|
|
92
|
+
${getSentryInitPlainTextSnippet(dsn, enableSessionReplay, enableFeedbackWidget, enableLogs)}`);
|
|
92
93
|
}
|
|
93
94
|
exports.addSentryInitWithSdkImport = addSentryInitWithSdkImport;
|
|
94
95
|
function doesJsCodeIncludeSdkSentryImport(js, { sdkPackageName }) {
|
|
95
96
|
return !!js.match(sdkPackageName);
|
|
96
97
|
}
|
|
97
98
|
exports.doesJsCodeIncludeSdkSentryImport = doesJsCodeIncludeSdkSentryImport;
|
|
98
|
-
function getSentryInitColoredCodeSnippet(dsn, enableSessionReplay = false, enableFeedbackWidget = false) {
|
|
99
|
+
function getSentryInitColoredCodeSnippet(dsn, enableSessionReplay = false, enableFeedbackWidget = false, enableLogs = false) {
|
|
99
100
|
return (0, clack_1.makeCodeSnippet)(true, (_unchanged, plus, _minus) => {
|
|
100
|
-
return plus(getSentryInitPlainTextSnippet(dsn, enableSessionReplay, enableFeedbackWidget));
|
|
101
|
+
return plus(getSentryInitPlainTextSnippet(dsn, enableSessionReplay, enableFeedbackWidget, enableLogs));
|
|
101
102
|
});
|
|
102
103
|
}
|
|
103
104
|
exports.getSentryInitColoredCodeSnippet = getSentryInitColoredCodeSnippet;
|
|
104
|
-
function getSentryInitPlainTextSnippet(dsn, enableSessionReplay = false, enableFeedbackWidget = false) {
|
|
105
|
+
function getSentryInitPlainTextSnippet(dsn, enableSessionReplay = false, enableFeedbackWidget = false, enableLogs = false) {
|
|
105
106
|
return `import * as Sentry from '@sentry/react-native';
|
|
106
107
|
|
|
107
108
|
Sentry.init({
|
|
@@ -110,6 +111,9 @@ Sentry.init({
|
|
|
110
111
|
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
111
112
|
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
112
113
|
sendDefaultPii: true,
|
|
114
|
+
|
|
115
|
+
// Enable Logs
|
|
116
|
+
enableLogs: ${enableLogs ? 'true' : 'false'},
|
|
113
117
|
${enableSessionReplay
|
|
114
118
|
? `
|
|
115
119
|
// Configure Session Replay
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/react-native/javascript.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport * as process from 'process';\nimport * as fs from 'fs';\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep } from '../telemetry';\nimport { makeCodeSnippet, showCopyPasteInstructions } from '../utils/clack';\nimport { getFirstMatchedPath } from './glob';\nimport { RN_SDK_PACKAGE } from './react-native-wizard';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, ProxifiedModule, parseModule } from 'magicast';\nimport * as t from '@babel/types';\n\nexport const sessionReplaySampleRate = 0.1;\nexport const sessionReplayOnErrorSampleRate = 1.0;\n\nexport async function addSentryInit({\n dsn,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n}: {\n dsn: string;\n enableSessionReplay?: boolean;\n enableFeedbackWidget?: boolean;\n}) {\n const jsPath = getMainAppFilePath();\n Sentry.setTag('app-js-file-status', jsPath ? 'found' : 'not-found');\n if (!jsPath) {\n clack.log.warn(\n `Could not find main App file. Place the following code snippet close to the Apps Root component.`,\n );\n Sentry.captureException('Could not find main App file.');\n await showCopyPasteInstructions({\n filename: 'App.js or _layout.tsx',\n codeSnippet: getSentryInitColoredCodeSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n ),\n hint: 'This ensures the Sentry SDK is ready to capture errors.',\n });\n return;\n }\n const jsRelativePath = path.relative(process.cwd(), jsPath);\n\n const js = fs.readFileSync(jsPath, 'utf-8');\n const includesSentry = doesJsCodeIncludeSdkSentryImport(js, {\n sdkPackageName: RN_SDK_PACKAGE,\n });\n if (includesSentry) {\n Sentry.setTag('app-js-file-status', 'already-includes-sentry');\n clack.log.warn(\n `${chalk.cyan(\n jsRelativePath,\n )} already includes Sentry. We wont't add it again.`,\n );\n return;\n }\n\n traceStep('add-sentry-init', () => {\n const newContent = addSentryInitWithSdkImport(js, {\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n });\n\n try {\n fs.writeFileSync(jsPath, newContent, 'utf-8');\n clack.log.success(\n `Added ${chalk.cyan('Sentry.init')} to ${chalk.cyan(jsRelativePath)}.`,\n );\n } catch (error) {\n clack.log.error(`Error while writing ${jsPath}`);\n Sentry.captureException('Error while writing app.js');\n }\n });\n\n Sentry.setTag('app-js-file-status', 'added-sentry-init');\n clack.log.success(\n chalk.green(`${chalk.cyan(jsRelativePath)} changes saved.`),\n );\n}\n\nexport function addSentryInitWithSdkImport(\n js: string,\n {\n dsn,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n }: {\n dsn: string;\n enableSessionReplay?: boolean;\n enableFeedbackWidget?: boolean;\n },\n): string {\n return js.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n (match: string) => `${match}\n${getSentryInitPlainTextSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n)}`,\n );\n}\n\nexport function doesJsCodeIncludeSdkSentryImport(\n js: string,\n { sdkPackageName }: { sdkPackageName: string },\n): boolean {\n return !!js.match(sdkPackageName);\n}\n\nexport function getSentryInitColoredCodeSnippet(\n dsn: string,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n) {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(\n getSentryInitPlainTextSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n ),\n );\n });\n}\n\nexport function getSentryInitPlainTextSnippet(\n dsn: string,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n) {\n return `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '${dsn}',\n\n // Adds more context data to events (IP address, cookies, user, etc.)\n // For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/\n sendDefaultPii: true,\n${\n enableSessionReplay\n ? `\n // Configure Session Replay\n replaysSessionSampleRate: ${sessionReplaySampleRate},\n replaysOnErrorSampleRate: ${sessionReplayOnErrorSampleRate},\n`\n : ''\n}${getSentryIntegrationsPlainTextSnippet(\n enableSessionReplay,\n enableFeedbackWidget,\n )}\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: __DEV__,\n});`;\n}\n\nexport function getSentryIntegrationsPlainTextSnippet(\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n) {\n if (!enableSessionReplay && !enableFeedbackWidget) {\n return '';\n }\n return ` integrations: [${\n enableSessionReplay ? 'Sentry.mobileReplayIntegration()' : ''\n }${enableSessionReplay && enableFeedbackWidget ? ', ' : ''}${\n enableFeedbackWidget ? 'Sentry.feedbackIntegration()' : ''\n }],\n`;\n}\n\nfunction getMainAppFilePath(): string | undefined {\n const prefixGlob = '{.,./src,./app}';\n const suffixGlob = '@(j|t|cj|mj)s?(x)';\n const universalGlob = `@(App|_layout).${suffixGlob}`;\n const jsFileGlob = `${prefixGlob}/+(${universalGlob})`;\n const jsPath = traceStep('find-app-js-file', () =>\n getFirstMatchedPath(jsFileGlob),\n );\n return jsPath;\n}\n\n/**\n * This step should be executed after `addSentryInit`\n */\nexport async function wrapRootComponent() {\n const showInstructions = () =>\n showCopyPasteInstructions({\n filename: 'App.js or _layout.tsx',\n codeSnippet: getSentryWrapColoredCodeSnippet(),\n });\n\n const jsPath = getMainAppFilePath();\n Sentry.setTag('app-js-file-status', jsPath ? 'found' : 'not-found');\n if (!jsPath) {\n clack.log.warn(\n `Could not find main App file. Please wrap your App's Root component.`,\n );\n await showInstructions();\n return;\n }\n\n const jsRelativePath = path.relative(process.cwd(), jsPath);\n\n const js = fs.readFileSync(jsPath, 'utf-8');\n\n const mod = parseModule(js);\n const result = checkAndWrapRootComponent(mod);\n\n if (result === SentryWrapResult.AlreadyWrapped) {\n Sentry.setTag('app-js-file-status', 'already-includes-sentry-wrap');\n clack.log.warn(\n `${chalk.cyan(\n jsRelativePath,\n )} already includes Sentry.wrap. We wont't add it again.`,\n );\n return;\n }\n\n if (result === SentryWrapResult.NotFound) {\n clack.log.warn(\n `Could not find your App's Root component. Please wrap your App's Root component manually.`,\n );\n await showInstructions();\n return;\n }\n\n traceStep('add-sentry-wrap', () => {\n try {\n fs.writeFileSync(jsPath, generateCode(mod.$ast).code, 'utf-8');\n clack.log.success(\n `Added ${chalk.cyan('Sentry.wrap')} to ${chalk.cyan(jsRelativePath)}.`,\n );\n } catch (error) {\n clack.log.error(`Error while writing ${jsPath}`);\n Sentry.captureException('Error while writing app.js');\n return;\n }\n });\n\n Sentry.setTag('app-js-file-status', 'added-sentry-wrap');\n clack.log.success(\n chalk.green(`${chalk.cyan(jsRelativePath)} changes saved.`),\n );\n}\n\nexport enum SentryWrapResult {\n NotFound = 'RootComponentNotFound',\n AlreadyWrapped = 'AlreadyWrapped',\n Success = 'Success',\n}\n\nexport function checkAndWrapRootComponent(\n mod: ProxifiedModule,\n): SentryWrapResult {\n if (doesContainSentryWrap(mod.$ast as t.Program)) {\n return SentryWrapResult.AlreadyWrapped;\n }\n\n const defaultExport = getDefaultExport(mod.$ast as t.Program);\n if (!defaultExport) {\n return SentryWrapResult.NotFound;\n }\n\n const wrappedConfig = wrapWithSentry(defaultExport);\n\n const replacedDefaultExport = replaceDefaultExport(\n mod.$ast as t.Program,\n wrappedConfig,\n );\n\n if (!replacedDefaultExport) {\n return SentryWrapResult.NotFound;\n }\n\n return SentryWrapResult.Success;\n}\n\nexport function getDefaultExport(\n program: t.Program,\n):\n | t.Identifier\n | t.CallExpression\n | t.ObjectExpression\n | t.FunctionDeclaration\n | t.ArrowFunctionExpression\n | t.ClassDeclaration\n | undefined {\n for (const node of program.body) {\n if (\n t.isExportDefaultDeclaration(node) &&\n (t.isIdentifier(node.declaration) ||\n t.isCallExpression(node.declaration) ||\n t.isObjectExpression(node.declaration) ||\n t.isFunctionDeclaration(node.declaration) ||\n t.isArrowFunctionExpression(node.declaration) ||\n t.isClassDeclaration(node.declaration))\n ) {\n Sentry.setTag('app-js-file-status', 'default-export');\n return node.declaration;\n }\n }\n\n Sentry.setTag('app-js-file-status', 'default-export-not-found');\n return undefined;\n}\n\nexport function wrapWithSentry(\n configObj:\n | t.Identifier\n | t.CallExpression\n | t.ObjectExpression\n | t.FunctionDeclaration\n | t.ArrowFunctionExpression\n | t.ClassDeclaration,\n): t.CallExpression {\n if (t.isFunctionDeclaration(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [\n t.functionExpression(\n configObj.id,\n configObj.params,\n configObj.body,\n configObj.generator,\n configObj.async,\n ),\n ],\n );\n }\n\n if (t.isArrowFunctionExpression(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [configObj],\n );\n }\n\n if (t.isClassDeclaration(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [\n t.classExpression(\n configObj.id,\n configObj.superClass,\n configObj.body,\n configObj.decorators,\n ),\n ],\n );\n }\n\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [configObj],\n );\n}\n\nexport function replaceDefaultExport(\n program: t.Program,\n wrappedDefaultExport: t.CallExpression,\n): boolean {\n for (const node of program.body) {\n if (t.isExportDefaultDeclaration(node)) {\n node.declaration = wrappedDefaultExport;\n return true;\n }\n }\n return false;\n}\n\nexport function doesContainSentryWrap(program: t.Program): boolean {\n for (const node of program.body) {\n if (t.isExportDefaultDeclaration(node)) {\n const declaration = node.declaration;\n if (t.isCallExpression(declaration)) {\n const callExpr = declaration;\n if (t.isMemberExpression(callExpr.callee)) {\n const callee = callExpr.callee;\n if (\n t.isIdentifier(callee.object) &&\n callee.object.name === 'Sentry' &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'wrap'\n ) {\n return true;\n }\n }\n }\n }\n }\n return false;\n}\n\nfunction getSentryWrapColoredCodeSnippet() {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(`import * as Sentry from '@sentry/react-native';\n\nexport default Sentry.wrap(App);`);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/react-native/javascript.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport * as process from 'process';\nimport * as fs from 'fs';\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep } from '../telemetry';\nimport { makeCodeSnippet, showCopyPasteInstructions } from '../utils/clack';\nimport { getFirstMatchedPath } from './glob';\nimport { RN_SDK_PACKAGE } from './react-native-wizard';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, ProxifiedModule, parseModule } from 'magicast';\nimport * as t from '@babel/types';\n\nexport const sessionReplaySampleRate = 0.1;\nexport const sessionReplayOnErrorSampleRate = 1.0;\n\nexport async function addSentryInit({\n dsn,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n enableLogs = false,\n}: {\n dsn: string;\n enableSessionReplay?: boolean;\n enableFeedbackWidget?: boolean;\n enableLogs?: boolean;\n}) {\n const jsPath = getMainAppFilePath();\n Sentry.setTag('app-js-file-status', jsPath ? 'found' : 'not-found');\n if (!jsPath) {\n clack.log.warn(\n `Could not find main App file. Place the following code snippet close to the Apps Root component.`,\n );\n Sentry.captureException('Could not find main App file.');\n await showCopyPasteInstructions({\n filename: 'App.js or _layout.tsx',\n codeSnippet: getSentryInitColoredCodeSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n enableLogs,\n ),\n hint: 'This ensures the Sentry SDK is ready to capture errors.',\n });\n return;\n }\n const jsRelativePath = path.relative(process.cwd(), jsPath);\n\n const js = fs.readFileSync(jsPath, 'utf-8');\n const includesSentry = doesJsCodeIncludeSdkSentryImport(js, {\n sdkPackageName: RN_SDK_PACKAGE,\n });\n if (includesSentry) {\n Sentry.setTag('app-js-file-status', 'already-includes-sentry');\n clack.log.warn(\n `${chalk.cyan(\n jsRelativePath,\n )} already includes Sentry. We wont't add it again.`,\n );\n return;\n }\n\n traceStep('add-sentry-init', () => {\n const newContent = addSentryInitWithSdkImport(js, {\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n enableLogs,\n });\n\n try {\n fs.writeFileSync(jsPath, newContent, 'utf-8');\n clack.log.success(\n `Added ${chalk.cyan('Sentry.init')} to ${chalk.cyan(jsRelativePath)}.`,\n );\n } catch (error) {\n clack.log.error(`Error while writing ${jsPath}`);\n Sentry.captureException('Error while writing app.js');\n }\n });\n\n Sentry.setTag('app-js-file-status', 'added-sentry-init');\n clack.log.success(\n chalk.green(`${chalk.cyan(jsRelativePath)} changes saved.`),\n );\n}\n\nexport function addSentryInitWithSdkImport(\n js: string,\n {\n dsn,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n enableLogs = false,\n }: {\n dsn: string;\n enableSessionReplay?: boolean;\n enableFeedbackWidget?: boolean;\n enableLogs?: boolean;\n },\n): string {\n return js.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n (match: string) => `${match}\n${getSentryInitPlainTextSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n enableLogs,\n)}`,\n );\n}\n\nexport function doesJsCodeIncludeSdkSentryImport(\n js: string,\n { sdkPackageName }: { sdkPackageName: string },\n): boolean {\n return !!js.match(sdkPackageName);\n}\n\nexport function getSentryInitColoredCodeSnippet(\n dsn: string,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n enableLogs = false,\n) {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(\n getSentryInitPlainTextSnippet(\n dsn,\n enableSessionReplay,\n enableFeedbackWidget,\n enableLogs,\n ),\n );\n });\n}\n\nexport function getSentryInitPlainTextSnippet(\n dsn: string,\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n enableLogs = false,\n) {\n return `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '${dsn}',\n\n // Adds more context data to events (IP address, cookies, user, etc.)\n // For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/\n sendDefaultPii: true,\n\n // Enable Logs\n enableLogs: ${enableLogs ? 'true' : 'false'},\n${\n enableSessionReplay\n ? `\n // Configure Session Replay\n replaysSessionSampleRate: ${sessionReplaySampleRate},\n replaysOnErrorSampleRate: ${sessionReplayOnErrorSampleRate},\n`\n : ''\n}${getSentryIntegrationsPlainTextSnippet(\n enableSessionReplay,\n enableFeedbackWidget,\n )}\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: __DEV__,\n});`;\n}\n\nexport function getSentryIntegrationsPlainTextSnippet(\n enableSessionReplay = false,\n enableFeedbackWidget = false,\n) {\n if (!enableSessionReplay && !enableFeedbackWidget) {\n return '';\n }\n return ` integrations: [${\n enableSessionReplay ? 'Sentry.mobileReplayIntegration()' : ''\n }${enableSessionReplay && enableFeedbackWidget ? ', ' : ''}${\n enableFeedbackWidget ? 'Sentry.feedbackIntegration()' : ''\n }],\n`;\n}\n\nfunction getMainAppFilePath(): string | undefined {\n const prefixGlob = '{.,./src,./app}';\n const suffixGlob = '@(j|t|cj|mj)s?(x)';\n const universalGlob = `@(App|_layout).${suffixGlob}`;\n const jsFileGlob = `${prefixGlob}/+(${universalGlob})`;\n const jsPath = traceStep('find-app-js-file', () =>\n getFirstMatchedPath(jsFileGlob),\n );\n return jsPath;\n}\n\n/**\n * This step should be executed after `addSentryInit`\n */\nexport async function wrapRootComponent() {\n const showInstructions = () =>\n showCopyPasteInstructions({\n filename: 'App.js or _layout.tsx',\n codeSnippet: getSentryWrapColoredCodeSnippet(),\n });\n\n const jsPath = getMainAppFilePath();\n Sentry.setTag('app-js-file-status', jsPath ? 'found' : 'not-found');\n if (!jsPath) {\n clack.log.warn(\n `Could not find main App file. Please wrap your App's Root component.`,\n );\n await showInstructions();\n return;\n }\n\n const jsRelativePath = path.relative(process.cwd(), jsPath);\n\n const js = fs.readFileSync(jsPath, 'utf-8');\n\n const mod = parseModule(js);\n const result = checkAndWrapRootComponent(mod);\n\n if (result === SentryWrapResult.AlreadyWrapped) {\n Sentry.setTag('app-js-file-status', 'already-includes-sentry-wrap');\n clack.log.warn(\n `${chalk.cyan(\n jsRelativePath,\n )} already includes Sentry.wrap. We wont't add it again.`,\n );\n return;\n }\n\n if (result === SentryWrapResult.NotFound) {\n clack.log.warn(\n `Could not find your App's Root component. Please wrap your App's Root component manually.`,\n );\n await showInstructions();\n return;\n }\n\n traceStep('add-sentry-wrap', () => {\n try {\n fs.writeFileSync(jsPath, generateCode(mod.$ast).code, 'utf-8');\n clack.log.success(\n `Added ${chalk.cyan('Sentry.wrap')} to ${chalk.cyan(jsRelativePath)}.`,\n );\n } catch (error) {\n clack.log.error(`Error while writing ${jsPath}`);\n Sentry.captureException('Error while writing app.js');\n return;\n }\n });\n\n Sentry.setTag('app-js-file-status', 'added-sentry-wrap');\n clack.log.success(\n chalk.green(`${chalk.cyan(jsRelativePath)} changes saved.`),\n );\n}\n\nexport enum SentryWrapResult {\n NotFound = 'RootComponentNotFound',\n AlreadyWrapped = 'AlreadyWrapped',\n Success = 'Success',\n}\n\nexport function checkAndWrapRootComponent(\n mod: ProxifiedModule,\n): SentryWrapResult {\n if (doesContainSentryWrap(mod.$ast as t.Program)) {\n return SentryWrapResult.AlreadyWrapped;\n }\n\n const defaultExport = getDefaultExport(mod.$ast as t.Program);\n if (!defaultExport) {\n return SentryWrapResult.NotFound;\n }\n\n const wrappedConfig = wrapWithSentry(defaultExport);\n\n const replacedDefaultExport = replaceDefaultExport(\n mod.$ast as t.Program,\n wrappedConfig,\n );\n\n if (!replacedDefaultExport) {\n return SentryWrapResult.NotFound;\n }\n\n return SentryWrapResult.Success;\n}\n\nexport function getDefaultExport(\n program: t.Program,\n):\n | t.Identifier\n | t.CallExpression\n | t.ObjectExpression\n | t.FunctionDeclaration\n | t.ArrowFunctionExpression\n | t.ClassDeclaration\n | undefined {\n for (const node of program.body) {\n if (\n t.isExportDefaultDeclaration(node) &&\n (t.isIdentifier(node.declaration) ||\n t.isCallExpression(node.declaration) ||\n t.isObjectExpression(node.declaration) ||\n t.isFunctionDeclaration(node.declaration) ||\n t.isArrowFunctionExpression(node.declaration) ||\n t.isClassDeclaration(node.declaration))\n ) {\n Sentry.setTag('app-js-file-status', 'default-export');\n return node.declaration;\n }\n }\n\n Sentry.setTag('app-js-file-status', 'default-export-not-found');\n return undefined;\n}\n\nexport function wrapWithSentry(\n configObj:\n | t.Identifier\n | t.CallExpression\n | t.ObjectExpression\n | t.FunctionDeclaration\n | t.ArrowFunctionExpression\n | t.ClassDeclaration,\n): t.CallExpression {\n if (t.isFunctionDeclaration(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [\n t.functionExpression(\n configObj.id,\n configObj.params,\n configObj.body,\n configObj.generator,\n configObj.async,\n ),\n ],\n );\n }\n\n if (t.isArrowFunctionExpression(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [configObj],\n );\n }\n\n if (t.isClassDeclaration(configObj)) {\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [\n t.classExpression(\n configObj.id,\n configObj.superClass,\n configObj.body,\n configObj.decorators,\n ),\n ],\n );\n }\n\n return t.callExpression(\n t.memberExpression(t.identifier('Sentry'), t.identifier('wrap')),\n [configObj],\n );\n}\n\nexport function replaceDefaultExport(\n program: t.Program,\n wrappedDefaultExport: t.CallExpression,\n): boolean {\n for (const node of program.body) {\n if (t.isExportDefaultDeclaration(node)) {\n node.declaration = wrappedDefaultExport;\n return true;\n }\n }\n return false;\n}\n\nexport function doesContainSentryWrap(program: t.Program): boolean {\n for (const node of program.body) {\n if (t.isExportDefaultDeclaration(node)) {\n const declaration = node.declaration;\n if (t.isCallExpression(declaration)) {\n const callExpr = declaration;\n if (t.isMemberExpression(callExpr.callee)) {\n const callee = callExpr.callee;\n if (\n t.isIdentifier(callee.object) &&\n callee.object.name === 'Sentry' &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'wrap'\n ) {\n return true;\n }\n }\n }\n }\n }\n return false;\n}\n\nfunction getSentryWrapColoredCodeSnippet() {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(`import * as Sentry from '@sentry/react-native';\n\nexport default Sentry.wrap(App);`);\n });\n}\n"]}
|
|
@@ -155,10 +155,19 @@ Or setup using ${chalk_1.default.cyan('https://docs.sentry.io/platforms/react-na
|
|
|
155
155
|
if (enableFeedbackWidget) {
|
|
156
156
|
prompts_1.default.log.info(`The Feedback Widget will be enabled with default settings. You can show the widget by calling Sentry.showFeedbackWidget() in your code.`);
|
|
157
157
|
}
|
|
158
|
+
// Ask if user wants to enable Logs
|
|
159
|
+
const enableLogs = await (0, clack_1.abortIfCancelled)(prompts_1.default.confirm({
|
|
160
|
+
message: 'Do you want to enable Logs? (See https://docs.sentry.io/platforms/react-native/logs/)',
|
|
161
|
+
}));
|
|
162
|
+
Sentry.setTag('enable-logs', enableLogs);
|
|
163
|
+
if (enableLogs) {
|
|
164
|
+
prompts_1.default.log.info(`Logs will be enabled with default settings. You can send logs using the Sentry.logger APIs.`);
|
|
165
|
+
}
|
|
158
166
|
await (0, telemetry_1.traceStep)('patch-app-js', () => (0, javascript_1.addSentryInit)({
|
|
159
167
|
dsn: selectedProject.keys[0].dsn.public,
|
|
160
168
|
enableSessionReplay,
|
|
161
169
|
enableFeedbackWidget,
|
|
170
|
+
enableLogs,
|
|
162
171
|
}));
|
|
163
172
|
await (0, telemetry_1.traceStep)('patch-app-js-wrap', () => (0, javascript_1.wrapRootComponent)());
|
|
164
173
|
if (isExpo) {
|
|
@@ -173,7 +182,7 @@ Or setup using ${chalk_1.default.cyan('https://docs.sentry.io/platforms/react-na
|
|
|
173
182
|
}
|
|
174
183
|
if (fs.existsSync('ios')) {
|
|
175
184
|
Sentry.setTag('patch-ios', true);
|
|
176
|
-
await (0, telemetry_1.traceStep)('patch-xcode-files', () => patchXcodeFiles(cliConfig));
|
|
185
|
+
await (0, telemetry_1.traceStep)('patch-xcode-files', () => patchXcodeFiles(cliConfig, rnVersion));
|
|
177
186
|
}
|
|
178
187
|
if (fs.existsSync('android')) {
|
|
179
188
|
Sentry.setTag('patch-android', true);
|
|
@@ -213,7 +222,7 @@ ${chalk_1.default.cyan(issuesStreamUrl)}`);
|
|
|
213
222
|
});
|
|
214
223
|
return firstErrorConfirmed;
|
|
215
224
|
}
|
|
216
|
-
async function patchXcodeFiles(config) {
|
|
225
|
+
async function patchXcodeFiles(config, rnVersion) {
|
|
217
226
|
await (0, clack_1.addSentryCliConfig)(config, {
|
|
218
227
|
...clack_1.propertiesCliSetupConfig,
|
|
219
228
|
name: 'source maps and iOS debug files',
|
|
@@ -242,7 +251,7 @@ async function patchXcodeFiles(config) {
|
|
|
242
251
|
await (0, telemetry_1.traceStep)('patch-bundle-phase', async () => {
|
|
243
252
|
const bundlePhase = (0, xcode_1.findBundlePhase)(buildPhasesMap);
|
|
244
253
|
Sentry.setTag('xcode-bundle-phase-status', bundlePhase ? 'found' : 'not-found');
|
|
245
|
-
await (0, xcode_1.patchBundlePhase)(bundlePhase, xcode_1.addSentryWithBundledScriptsToBundleShellScript);
|
|
254
|
+
await (0, xcode_1.patchBundlePhase)(bundlePhase, rnVersion, xcode_1.addSentryWithBundledScriptsToBundleShellScript);
|
|
246
255
|
Sentry.setTag('xcode-bundle-phase-status', 'patched');
|
|
247
256
|
});
|
|
248
257
|
(0, telemetry_1.traceStep)('add-debug-files-upload-phase', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n\nimport * as Sentry from '@sentry/node';\nimport { platform } from 'os';\nimport { podInstall } from '../apple/cocoapod';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport {\n CliSetupConfigContent,\n abort,\n abortIfCancelled,\n addSentryCliConfig,\n confirmContinueIfNoOrDirtyGitRepo,\n confirmContinueIfPackageVersionNotSupported,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n printWelcome,\n propertiesCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getIssueStreamUrl } from '../utils/url';\nimport { patchExpoAppConfig, printSentryExpoMigrationOutro } from './expo';\nimport { addExpoEnvLocal } from './expo-env-file';\nimport { addSentryToExpoMetroConfig } from './expo-metro';\nimport { APP_BUILD_GRADLE, XCODE_PROJECT, getFirstMatchedPath } from './glob';\nimport {\n addRNSentryGradlePlugin,\n doesAppBuildGradleIncludeRNSentryGradlePlugin,\n writeAppBuildGradle,\n} from './gradle';\nimport {\n addSentryInit,\n sessionReplayOnErrorSampleRate,\n sessionReplaySampleRate,\n wrapRootComponent,\n} from './javascript';\nimport { patchMetroWithSentryConfig } from './metro';\nimport { ReactNativeWizardOptions } from './options';\nimport {\n addDebugFilesUploadPhaseWithBundledScripts,\n addSentryWithBundledScriptsToBundleShellScript,\n findBundlePhase,\n findDebugFilesUploadPhase,\n getValidExistingBuildPhases,\n patchBundlePhase,\n writeXcodeProject,\n} from './xcode';\n\nimport xcode from 'xcode';\n\nexport const RN_SDK_PACKAGE = '@sentry/react-native';\nexport const RN_SDK_SUPPORTED_RANGE = '>=6.12.0';\n\nexport const RN_PACKAGE = 'react-native';\nexport const RN_HUMAN_NAME = 'React Native';\n\nexport const SUPPORTED_RN_RANGE = '>=0.69.0';\nexport const SUPPORTED_EXPO_RANGE = '>=50.0.0';\n\nexport type RNCliSetupConfigContent = Pick<\n Required<CliSetupConfigContent>,\n 'authToken' | 'org' | 'project' | 'url'\n>;\n\nexport async function runReactNativeWizard(\n params: ReactNativeWizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: params.telemetryEnabled,\n integration: 'react-native',\n wizardOptions: params,\n },\n () => runReactNativeWizardWithTelemetry(params),\n );\n}\n\nexport async function runReactNativeWizardWithTelemetry(\n options: ReactNativeWizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry React Native Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n const hasInstalled = (dep: string) => hasPackageInstalled(dep, packageJson);\n\n if (hasInstalled('sentry-expo')) {\n Sentry.setTag('has-sentry-expo-installed', true);\n printSentryExpoMigrationOutro();\n return;\n }\n\n await ensurePackageIsInstalled(packageJson, RN_PACKAGE, RN_HUMAN_NAME);\n\n const rnVersion = getPackageVersion(RN_PACKAGE, packageJson);\n if (rnVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: RN_HUMAN_NAME,\n packageVersion: rnVersion,\n packageId: RN_PACKAGE,\n acceptableVersions: SUPPORTED_RN_RANGE,\n note: `Please upgrade to ${SUPPORTED_RN_RANGE} if you wish to use the Sentry Wizard.\nOr setup using ${chalk.cyan(\n 'https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/',\n )}`,\n });\n }\n\n await installPackage({\n packageName: RN_SDK_PACKAGE,\n alreadyInstalled: hasPackageInstalled(RN_SDK_PACKAGE, packageJson),\n forceInstall,\n });\n const sdkVersion = getPackageVersion(\n RN_SDK_PACKAGE,\n await getPackageDotJson(),\n );\n if (sdkVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: 'Sentry React Native SDK',\n packageVersion: sdkVersion,\n packageId: RN_SDK_PACKAGE,\n acceptableVersions: RN_SDK_SUPPORTED_RANGE,\n note: `Please upgrade to ${RN_SDK_SUPPORTED_RANGE} to continue with the wizard in this project.`,\n });\n } else {\n const continueWithoutSdk = await abortIfCancelled(\n clack.confirm({\n message:\n 'Could not detect Sentry React Native SDK version. Do you want to continue anyway?',\n }),\n );\n if (!continueWithoutSdk) {\n await abort(undefined, 0);\n }\n }\n Sentry.setTag(`detected-sentry-react-native-sdk-version`, sdkVersion);\n\n const expoVersion = getPackageVersion('expo', packageJson);\n const isExpo = !!expoVersion;\n if (expoVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: 'Expo SDK',\n packageVersion: expoVersion,\n packageId: 'expo',\n acceptableVersions: SUPPORTED_EXPO_RANGE,\n note: `Please upgrade to ${SUPPORTED_EXPO_RANGE} to continue with the wizard in this Expo project.`,\n });\n }\n\n const { selectedProject, authToken, sentryUrl } =\n await getOrAskForProjectData(options, 'react-native');\n const orgSlug = selectedProject.organization.slug;\n const projectSlug = selectedProject.slug;\n const projectId = selectedProject.id;\n const cliConfig: RNCliSetupConfigContent = {\n authToken,\n org: orgSlug,\n project: projectSlug,\n url: sentryUrl,\n };\n\n // Ask if user wants to enable Session Replay\n const enableSessionReplay = await abortIfCancelled(\n clack.confirm({\n message:\n 'Do you want to enable Session Replay to help debug issues? (See https://docs.sentry.io/platforms/react-native/session-replay/)',\n }),\n );\n Sentry.setTag('enable-session-replay', enableSessionReplay);\n\n if (enableSessionReplay) {\n clack.log.info(\n `Session Replay will be enabled with default settings (replaysSessionSampleRate: ${sessionReplaySampleRate}, replaysOnErrorSampleRate: ${sessionReplayOnErrorSampleRate}).`,\n );\n clack.log.message(\n 'By default, all text content, images, and webviews will be masked for privacy. You can customize this in your code later.',\n );\n }\n\n // Ask if user wants to enable the Feedback Widget\n const enableFeedbackWidget = await abortIfCancelled(\n clack.confirm({\n message:\n 'Do you want to enable the Feedback Widget to collect feedback from your users? (See https://docs.sentry.io/platforms/react-native/user-feedback/)',\n }),\n );\n Sentry.setTag('enable-feedback-widget', enableFeedbackWidget);\n\n if (enableFeedbackWidget) {\n clack.log.info(\n `The Feedback Widget will be enabled with default settings. You can show the widget by calling Sentry.showFeedbackWidget() in your code.`,\n );\n }\n\n await traceStep('patch-app-js', () =>\n addSentryInit({\n dsn: selectedProject.keys[0].dsn.public,\n enableSessionReplay,\n enableFeedbackWidget,\n }),\n );\n\n await traceStep('patch-app-js-wrap', () => wrapRootComponent());\n\n if (isExpo) {\n await traceStep('patch-expo-app-config', () =>\n patchExpoAppConfig(cliConfig),\n );\n await traceStep('add-expo-env-local', () => addExpoEnvLocal(cliConfig));\n }\n\n if (isExpo) {\n await traceStep('patch-metro-config', addSentryToExpoMetroConfig);\n } else {\n await traceStep('patch-metro-config', patchMetroWithSentryConfig);\n }\n\n if (fs.existsSync('ios')) {\n Sentry.setTag('patch-ios', true);\n await traceStep('patch-xcode-files', () => patchXcodeFiles(cliConfig));\n }\n\n if (fs.existsSync('android')) {\n Sentry.setTag('patch-android', true);\n await traceStep('patch-android-files', () => patchAndroidFiles(cliConfig));\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n const confirmedFirstException = await confirmFirstSentryException(\n sentryUrl,\n orgSlug,\n projectId,\n );\n\n Sentry.setTag('user-confirmed-first-error', confirmedFirstException);\n\n if (confirmedFirstException) {\n clack.outro(\n `${chalk.green('Everything is set up!')}\n\n ${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-react-native/issues',\n )}`,\n );\n } else {\n clack.outro(\n `${chalk.dim(\n 'Let us know here: https://github.com/getsentry/sentry-react-native/issues',\n )}`,\n );\n }\n}\n\nasync function confirmFirstSentryException(\n url: string,\n orgSlug: string,\n projectId: string,\n) {\n const issuesStreamUrl = getIssueStreamUrl({ url, orgSlug, projectId });\n\n clack.log\n .step(`To make sure everything is set up correctly, put the following code snippet into your application.\nThe snippet will create a button that, when tapped, sends a test event to Sentry.\n\nAfter that check your project issues:\n\n${chalk.cyan(issuesStreamUrl)}`);\n\n // We want the code snippet to be easily copy-pasteable, without any clack artifacts\n // eslint-disable-next-line no-console\n console.log(\n chalk.greenBright(`\n<Button title='Try!' onPress={ () => { Sentry.captureException(new Error('First error')) }}/>\n`),\n );\n\n const firstErrorConfirmed = clack.confirm({\n message: `Have you successfully sent a test event?`,\n });\n\n return firstErrorConfirmed;\n}\n\nasync function patchXcodeFiles(config: RNCliSetupConfigContent) {\n await addSentryCliConfig(config, {\n ...propertiesCliSetupConfig,\n name: 'source maps and iOS debug files',\n filename: 'ios/sentry.properties',\n gitignore: false,\n });\n\n if (platform() === 'darwin' && (await confirmPodInstall())) {\n await traceStep('pod-install', () => podInstall('ios'));\n }\n\n const xcodeProjectPath = traceStep('find-xcode-project', () =>\n getFirstMatchedPath(XCODE_PROJECT),\n );\n Sentry.setTag(\n 'xcode-project-status',\n xcodeProjectPath ? 'found' : 'not-found',\n );\n if (!xcodeProjectPath) {\n clack.log.warn(\n `Could not find Xcode project file using ${chalk.cyan(XCODE_PROJECT)}.`,\n );\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const [xcodeProject, buildPhasesMap] = traceStep(\n 'parse-xcode-project',\n () => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const project = xcode.project(xcodeProjectPath);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n project.parseSync();\n\n const map = getValidExistingBuildPhases(project);\n return [project, map];\n },\n );\n Sentry.setTag('xcode-project-status', 'parsed');\n\n await traceStep('patch-bundle-phase', async () => {\n const bundlePhase = findBundlePhase(buildPhasesMap);\n Sentry.setTag(\n 'xcode-bundle-phase-status',\n bundlePhase ? 'found' : 'not-found',\n );\n\n await patchBundlePhase(\n bundlePhase,\n addSentryWithBundledScriptsToBundleShellScript,\n );\n\n Sentry.setTag('xcode-bundle-phase-status', 'patched');\n });\n\n traceStep('add-debug-files-upload-phase', () => {\n const debugFilesUploadPhaseExists =\n !!findDebugFilesUploadPhase(buildPhasesMap);\n Sentry.setTag(\n 'xcode-debug-files-upload-phase-status',\n debugFilesUploadPhaseExists ? 'already-exists' : undefined,\n );\n\n addDebugFilesUploadPhaseWithBundledScripts(xcodeProject, {\n debugFilesUploadPhaseExists,\n });\n\n Sentry.setTag('xcode-debug-files-upload-phase-status', 'added');\n });\n\n traceStep('write-xcode-project', () => {\n writeXcodeProject(xcodeProjectPath, xcodeProject);\n });\n Sentry.setTag('xcode-project-status', 'patched');\n}\n\nasync function patchAndroidFiles(config: RNCliSetupConfigContent) {\n await addSentryCliConfig(config, {\n ...propertiesCliSetupConfig,\n name: 'source maps and iOS debug files',\n filename: 'android/sentry.properties',\n gitignore: false,\n });\n\n const appBuildGradlePath = traceStep('find-app-build-gradle', () =>\n getFirstMatchedPath(APP_BUILD_GRADLE),\n );\n Sentry.setTag(\n 'app-build-gradle-status',\n appBuildGradlePath ? 'found' : 'not-found',\n );\n if (!appBuildGradlePath) {\n clack.log.warn(\n `Could not find Android ${chalk.cyan(\n 'app/build.gradle',\n )} file using ${chalk.cyan(APP_BUILD_GRADLE)}.`,\n );\n return;\n }\n\n const appBuildGradle = traceStep('read-app-build-gradle', () =>\n fs.readFileSync(appBuildGradlePath, 'utf-8'),\n );\n const includesSentry =\n doesAppBuildGradleIncludeRNSentryGradlePlugin(appBuildGradle);\n if (includesSentry) {\n Sentry.setTag('app-build-gradle-status', 'already-includes-sentry');\n clack.log.warn(\n `Android ${chalk.cyan('app/build.gradle')} file already includes Sentry.`,\n );\n return;\n }\n\n const patchedAppBuildGradle = traceStep('add-rn-sentry-gradle-plugin', () =>\n addRNSentryGradlePlugin(appBuildGradle),\n );\n if (!doesAppBuildGradleIncludeRNSentryGradlePlugin(patchedAppBuildGradle)) {\n Sentry.setTag(\n 'app-build-gradle-status',\n 'failed-to-add-rn-sentry-gradle-plugin',\n );\n clack.log.warn(\n `Could not add Sentry RN Gradle Plugin to ${chalk.cyan(\n 'app/build.gradle',\n )}.`,\n );\n return;\n }\n\n Sentry.setTag('app-build-gradle-status', 'added-rn-sentry-gradle-plugin');\n clack.log.success(\n `Added Sentry RN Gradle Plugin to ${chalk.bold('app/build.gradle')}.`,\n );\n\n traceStep('write-app-build-gradle', () =>\n writeAppBuildGradle(appBuildGradlePath, patchedAppBuildGradle),\n );\n clack.log.success(\n chalk.green(`Android ${chalk.cyan('app/build.gradle')} saved.`),\n );\n}\n\nasync function confirmPodInstall(): Promise<boolean> {\n return traceStep('confirm-pod-install', async () => {\n const continueWithPodInstall = await abortIfCancelled(\n clack.select({\n message: 'Do you want to run `pod install` now?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended for smaller projects, this might take several minutes',\n },\n { value: false, label: `No, I'll do it later` },\n ],\n initialValue: true,\n }),\n );\n Sentry.setTag('continue-with-pod-install', continueWithPodInstall);\n return continueWithPodInstall;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n\nimport * as Sentry from '@sentry/node';\nimport { platform } from 'os';\nimport { podInstall } from '../apple/cocoapod';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport {\n CliSetupConfigContent,\n abort,\n abortIfCancelled,\n addSentryCliConfig,\n confirmContinueIfNoOrDirtyGitRepo,\n confirmContinueIfPackageVersionNotSupported,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n printWelcome,\n propertiesCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getIssueStreamUrl } from '../utils/url';\nimport { patchExpoAppConfig, printSentryExpoMigrationOutro } from './expo';\nimport { addExpoEnvLocal } from './expo-env-file';\nimport { addSentryToExpoMetroConfig } from './expo-metro';\nimport { APP_BUILD_GRADLE, XCODE_PROJECT, getFirstMatchedPath } from './glob';\nimport {\n addRNSentryGradlePlugin,\n doesAppBuildGradleIncludeRNSentryGradlePlugin,\n writeAppBuildGradle,\n} from './gradle';\nimport {\n addSentryInit,\n sessionReplayOnErrorSampleRate,\n sessionReplaySampleRate,\n wrapRootComponent,\n} from './javascript';\nimport { patchMetroWithSentryConfig } from './metro';\nimport { ReactNativeWizardOptions } from './options';\nimport {\n addDebugFilesUploadPhaseWithBundledScripts,\n addSentryWithBundledScriptsToBundleShellScript,\n findBundlePhase,\n findDebugFilesUploadPhase,\n getValidExistingBuildPhases,\n patchBundlePhase,\n writeXcodeProject,\n} from './xcode';\n\nimport xcode from 'xcode';\n\nexport const RN_SDK_PACKAGE = '@sentry/react-native';\nexport const RN_SDK_SUPPORTED_RANGE = '>=6.12.0';\n\nexport const RN_PACKAGE = 'react-native';\nexport const RN_HUMAN_NAME = 'React Native';\n\nexport const SUPPORTED_RN_RANGE = '>=0.69.0';\nexport const SUPPORTED_EXPO_RANGE = '>=50.0.0';\n\nexport type RNCliSetupConfigContent = Pick<\n Required<CliSetupConfigContent>,\n 'authToken' | 'org' | 'project' | 'url'\n>;\n\nexport async function runReactNativeWizard(\n params: ReactNativeWizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: params.telemetryEnabled,\n integration: 'react-native',\n wizardOptions: params,\n },\n () => runReactNativeWizardWithTelemetry(params),\n );\n}\n\nexport async function runReactNativeWizardWithTelemetry(\n options: ReactNativeWizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry React Native Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n const hasInstalled = (dep: string) => hasPackageInstalled(dep, packageJson);\n\n if (hasInstalled('sentry-expo')) {\n Sentry.setTag('has-sentry-expo-installed', true);\n printSentryExpoMigrationOutro();\n return;\n }\n\n await ensurePackageIsInstalled(packageJson, RN_PACKAGE, RN_HUMAN_NAME);\n\n const rnVersion = getPackageVersion(RN_PACKAGE, packageJson);\n if (rnVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: RN_HUMAN_NAME,\n packageVersion: rnVersion,\n packageId: RN_PACKAGE,\n acceptableVersions: SUPPORTED_RN_RANGE,\n note: `Please upgrade to ${SUPPORTED_RN_RANGE} if you wish to use the Sentry Wizard.\nOr setup using ${chalk.cyan(\n 'https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/',\n )}`,\n });\n }\n\n await installPackage({\n packageName: RN_SDK_PACKAGE,\n alreadyInstalled: hasPackageInstalled(RN_SDK_PACKAGE, packageJson),\n forceInstall,\n });\n const sdkVersion = getPackageVersion(\n RN_SDK_PACKAGE,\n await getPackageDotJson(),\n );\n if (sdkVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: 'Sentry React Native SDK',\n packageVersion: sdkVersion,\n packageId: RN_SDK_PACKAGE,\n acceptableVersions: RN_SDK_SUPPORTED_RANGE,\n note: `Please upgrade to ${RN_SDK_SUPPORTED_RANGE} to continue with the wizard in this project.`,\n });\n } else {\n const continueWithoutSdk = await abortIfCancelled(\n clack.confirm({\n message:\n 'Could not detect Sentry React Native SDK version. Do you want to continue anyway?',\n }),\n );\n if (!continueWithoutSdk) {\n await abort(undefined, 0);\n }\n }\n Sentry.setTag(`detected-sentry-react-native-sdk-version`, sdkVersion);\n\n const expoVersion = getPackageVersion('expo', packageJson);\n const isExpo = !!expoVersion;\n if (expoVersion) {\n await confirmContinueIfPackageVersionNotSupported({\n packageName: 'Expo SDK',\n packageVersion: expoVersion,\n packageId: 'expo',\n acceptableVersions: SUPPORTED_EXPO_RANGE,\n note: `Please upgrade to ${SUPPORTED_EXPO_RANGE} to continue with the wizard in this Expo project.`,\n });\n }\n\n const { selectedProject, authToken, sentryUrl } =\n await getOrAskForProjectData(options, 'react-native');\n const orgSlug = selectedProject.organization.slug;\n const projectSlug = selectedProject.slug;\n const projectId = selectedProject.id;\n const cliConfig: RNCliSetupConfigContent = {\n authToken,\n org: orgSlug,\n project: projectSlug,\n url: sentryUrl,\n };\n\n // Ask if user wants to enable Session Replay\n const enableSessionReplay = await abortIfCancelled(\n clack.confirm({\n message:\n 'Do you want to enable Session Replay to help debug issues? (See https://docs.sentry.io/platforms/react-native/session-replay/)',\n }),\n );\n Sentry.setTag('enable-session-replay', enableSessionReplay);\n\n if (enableSessionReplay) {\n clack.log.info(\n `Session Replay will be enabled with default settings (replaysSessionSampleRate: ${sessionReplaySampleRate}, replaysOnErrorSampleRate: ${sessionReplayOnErrorSampleRate}).`,\n );\n clack.log.message(\n 'By default, all text content, images, and webviews will be masked for privacy. You can customize this in your code later.',\n );\n }\n\n // Ask if user wants to enable the Feedback Widget\n const enableFeedbackWidget = await abortIfCancelled(\n clack.confirm({\n message:\n 'Do you want to enable the Feedback Widget to collect feedback from your users? (See https://docs.sentry.io/platforms/react-native/user-feedback/)',\n }),\n );\n Sentry.setTag('enable-feedback-widget', enableFeedbackWidget);\n\n if (enableFeedbackWidget) {\n clack.log.info(\n `The Feedback Widget will be enabled with default settings. You can show the widget by calling Sentry.showFeedbackWidget() in your code.`,\n );\n }\n\n // Ask if user wants to enable Logs\n const enableLogs = await abortIfCancelled(\n clack.confirm({\n message:\n 'Do you want to enable Logs? (See https://docs.sentry.io/platforms/react-native/logs/)',\n }),\n );\n Sentry.setTag('enable-logs', enableLogs);\n\n if (enableLogs) {\n clack.log.info(\n `Logs will be enabled with default settings. You can send logs using the Sentry.logger APIs.`,\n );\n }\n\n await traceStep('patch-app-js', () =>\n addSentryInit({\n dsn: selectedProject.keys[0].dsn.public,\n enableSessionReplay,\n enableFeedbackWidget,\n enableLogs,\n }),\n );\n\n await traceStep('patch-app-js-wrap', () => wrapRootComponent());\n\n if (isExpo) {\n await traceStep('patch-expo-app-config', () =>\n patchExpoAppConfig(cliConfig),\n );\n await traceStep('add-expo-env-local', () => addExpoEnvLocal(cliConfig));\n }\n\n if (isExpo) {\n await traceStep('patch-metro-config', addSentryToExpoMetroConfig);\n } else {\n await traceStep('patch-metro-config', patchMetroWithSentryConfig);\n }\n\n if (fs.existsSync('ios')) {\n Sentry.setTag('patch-ios', true);\n await traceStep('patch-xcode-files', () =>\n patchXcodeFiles(cliConfig, rnVersion),\n );\n }\n\n if (fs.existsSync('android')) {\n Sentry.setTag('patch-android', true);\n await traceStep('patch-android-files', () => patchAndroidFiles(cliConfig));\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n const confirmedFirstException = await confirmFirstSentryException(\n sentryUrl,\n orgSlug,\n projectId,\n );\n\n Sentry.setTag('user-confirmed-first-error', confirmedFirstException);\n\n if (confirmedFirstException) {\n clack.outro(\n `${chalk.green('Everything is set up!')}\n\n ${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-react-native/issues',\n )}`,\n );\n } else {\n clack.outro(\n `${chalk.dim(\n 'Let us know here: https://github.com/getsentry/sentry-react-native/issues',\n )}`,\n );\n }\n}\n\nasync function confirmFirstSentryException(\n url: string,\n orgSlug: string,\n projectId: string,\n) {\n const issuesStreamUrl = getIssueStreamUrl({ url, orgSlug, projectId });\n\n clack.log\n .step(`To make sure everything is set up correctly, put the following code snippet into your application.\nThe snippet will create a button that, when tapped, sends a test event to Sentry.\n\nAfter that check your project issues:\n\n${chalk.cyan(issuesStreamUrl)}`);\n\n // We want the code snippet to be easily copy-pasteable, without any clack artifacts\n // eslint-disable-next-line no-console\n console.log(\n chalk.greenBright(`\n<Button title='Try!' onPress={ () => { Sentry.captureException(new Error('First error')) }}/>\n`),\n );\n\n const firstErrorConfirmed = clack.confirm({\n message: `Have you successfully sent a test event?`,\n });\n\n return firstErrorConfirmed;\n}\n\nasync function patchXcodeFiles(\n config: RNCliSetupConfigContent,\n rnVersion: string | undefined,\n) {\n await addSentryCliConfig(config, {\n ...propertiesCliSetupConfig,\n name: 'source maps and iOS debug files',\n filename: 'ios/sentry.properties',\n gitignore: false,\n });\n\n if (platform() === 'darwin' && (await confirmPodInstall())) {\n await traceStep('pod-install', () => podInstall('ios'));\n }\n\n const xcodeProjectPath = traceStep('find-xcode-project', () =>\n getFirstMatchedPath(XCODE_PROJECT),\n );\n Sentry.setTag(\n 'xcode-project-status',\n xcodeProjectPath ? 'found' : 'not-found',\n );\n if (!xcodeProjectPath) {\n clack.log.warn(\n `Could not find Xcode project file using ${chalk.cyan(XCODE_PROJECT)}.`,\n );\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const [xcodeProject, buildPhasesMap] = traceStep(\n 'parse-xcode-project',\n () => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const project = xcode.project(xcodeProjectPath);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n project.parseSync();\n\n const map = getValidExistingBuildPhases(project);\n return [project, map];\n },\n );\n Sentry.setTag('xcode-project-status', 'parsed');\n\n await traceStep('patch-bundle-phase', async () => {\n const bundlePhase = findBundlePhase(buildPhasesMap);\n Sentry.setTag(\n 'xcode-bundle-phase-status',\n bundlePhase ? 'found' : 'not-found',\n );\n\n await patchBundlePhase(\n bundlePhase,\n rnVersion,\n addSentryWithBundledScriptsToBundleShellScript,\n );\n\n Sentry.setTag('xcode-bundle-phase-status', 'patched');\n });\n\n traceStep('add-debug-files-upload-phase', () => {\n const debugFilesUploadPhaseExists =\n !!findDebugFilesUploadPhase(buildPhasesMap);\n Sentry.setTag(\n 'xcode-debug-files-upload-phase-status',\n debugFilesUploadPhaseExists ? 'already-exists' : undefined,\n );\n\n addDebugFilesUploadPhaseWithBundledScripts(xcodeProject, {\n debugFilesUploadPhaseExists,\n });\n\n Sentry.setTag('xcode-debug-files-upload-phase-status', 'added');\n });\n\n traceStep('write-xcode-project', () => {\n writeXcodeProject(xcodeProjectPath, xcodeProject);\n });\n Sentry.setTag('xcode-project-status', 'patched');\n}\n\nasync function patchAndroidFiles(config: RNCliSetupConfigContent) {\n await addSentryCliConfig(config, {\n ...propertiesCliSetupConfig,\n name: 'source maps and iOS debug files',\n filename: 'android/sentry.properties',\n gitignore: false,\n });\n\n const appBuildGradlePath = traceStep('find-app-build-gradle', () =>\n getFirstMatchedPath(APP_BUILD_GRADLE),\n );\n Sentry.setTag(\n 'app-build-gradle-status',\n appBuildGradlePath ? 'found' : 'not-found',\n );\n if (!appBuildGradlePath) {\n clack.log.warn(\n `Could not find Android ${chalk.cyan(\n 'app/build.gradle',\n )} file using ${chalk.cyan(APP_BUILD_GRADLE)}.`,\n );\n return;\n }\n\n const appBuildGradle = traceStep('read-app-build-gradle', () =>\n fs.readFileSync(appBuildGradlePath, 'utf-8'),\n );\n const includesSentry =\n doesAppBuildGradleIncludeRNSentryGradlePlugin(appBuildGradle);\n if (includesSentry) {\n Sentry.setTag('app-build-gradle-status', 'already-includes-sentry');\n clack.log.warn(\n `Android ${chalk.cyan('app/build.gradle')} file already includes Sentry.`,\n );\n return;\n }\n\n const patchedAppBuildGradle = traceStep('add-rn-sentry-gradle-plugin', () =>\n addRNSentryGradlePlugin(appBuildGradle),\n );\n if (!doesAppBuildGradleIncludeRNSentryGradlePlugin(patchedAppBuildGradle)) {\n Sentry.setTag(\n 'app-build-gradle-status',\n 'failed-to-add-rn-sentry-gradle-plugin',\n );\n clack.log.warn(\n `Could not add Sentry RN Gradle Plugin to ${chalk.cyan(\n 'app/build.gradle',\n )}.`,\n );\n return;\n }\n\n Sentry.setTag('app-build-gradle-status', 'added-rn-sentry-gradle-plugin');\n clack.log.success(\n `Added Sentry RN Gradle Plugin to ${chalk.bold('app/build.gradle')}.`,\n );\n\n traceStep('write-app-build-gradle', () =>\n writeAppBuildGradle(appBuildGradlePath, patchedAppBuildGradle),\n );\n clack.log.success(\n chalk.green(`Android ${chalk.cyan('app/build.gradle')} saved.`),\n );\n}\n\nasync function confirmPodInstall(): Promise<boolean> {\n return traceStep('confirm-pod-install', async () => {\n const continueWithPodInstall = await abortIfCancelled(\n clack.select({\n message: 'Do you want to run `pod install` now?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended for smaller projects, this might take several minutes',\n },\n { value: false, label: `No, I'll do it later` },\n ],\n initialValue: true,\n }),\n );\n Sentry.setTag('continue-with-pod-install', continueWithPodInstall);\n return continueWithPodInstall;\n });\n}\n"]}
|
|
@@ -8,10 +8,10 @@ export declare class ErrorPatchSnippet {
|
|
|
8
8
|
snippet: string;
|
|
9
9
|
constructor(snippet: string);
|
|
10
10
|
}
|
|
11
|
-
export declare function patchBundlePhase(bundlePhase: BuildPhase | undefined, patch: (script: string) => string | ErrorPatchSnippet): Promise<void>;
|
|
11
|
+
export declare function patchBundlePhase(bundlePhase: BuildPhase | undefined, rnVersion: string | undefined, patch: (script: string, rnVersion: string | undefined) => string | ErrorPatchSnippet): Promise<void>;
|
|
12
12
|
export declare function findBundlePhase(buildPhases: BuildPhaseMap): BuildPhase | undefined;
|
|
13
13
|
export declare function doesBundlePhaseIncludeSentry(buildPhase: BuildPhase): boolean;
|
|
14
|
-
export declare function addSentryWithBundledScriptsToBundleShellScript(script: string): string | ErrorPatchSnippet;
|
|
14
|
+
export declare function addSentryWithBundledScriptsToBundleShellScript(script: string, rnVersion: string | undefined): string | ErrorPatchSnippet;
|
|
15
15
|
export declare function addDebugFilesUploadPhaseWithBundledScripts(xcodeProject: any, { debugFilesUploadPhaseExists }: {
|
|
16
16
|
debugFilesUploadPhaseExists: boolean;
|
|
17
17
|
}): void;
|
|
@@ -36,6 +36,7 @@ const clack = __importStar(require("@clack/prompts"));
|
|
|
36
36
|
const chalk_1 = __importDefault(require("chalk"));
|
|
37
37
|
const clack_1 = require("../utils/clack");
|
|
38
38
|
const Sentry = __importStar(require("@sentry/node"));
|
|
39
|
+
const semver_1 = require("../utils/semver");
|
|
39
40
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
41
|
function getValidExistingBuildPhases(xcodeProject) {
|
|
41
42
|
const map = {};
|
|
@@ -54,7 +55,7 @@ class ErrorPatchSnippet {
|
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
57
|
exports.ErrorPatchSnippet = ErrorPatchSnippet;
|
|
57
|
-
async function patchBundlePhase(bundlePhase, patch) {
|
|
58
|
+
async function patchBundlePhase(bundlePhase, rnVersion, patch) {
|
|
58
59
|
if (!bundlePhase) {
|
|
59
60
|
clack.log.warn(`Could not find ${chalk_1.default.cyan('Bundle React Native code and images')} build phase.`);
|
|
60
61
|
return;
|
|
@@ -65,7 +66,7 @@ async function patchBundlePhase(bundlePhase, patch) {
|
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
68
|
const script = JSON.parse(bundlePhase.shellScript);
|
|
68
|
-
const patchedScript = patch(script);
|
|
69
|
+
const patchedScript = patch(script, rnVersion);
|
|
69
70
|
if (patchedScript instanceof ErrorPatchSnippet) {
|
|
70
71
|
await (0, clack_1.showCopyPasteInstructions)({
|
|
71
72
|
filename: 'Xcode project',
|
|
@@ -88,13 +89,19 @@ function doesBundlePhaseIncludeSentry(buildPhase) {
|
|
|
88
89
|
return containsSentryCliRNCommand || containsBundledScript;
|
|
89
90
|
}
|
|
90
91
|
exports.doesBundlePhaseIncludeSentry = doesBundlePhaseIncludeSentry;
|
|
91
|
-
function addSentryWithBundledScriptsToBundleShellScript(script) {
|
|
92
|
+
function addSentryWithBundledScriptsToBundleShellScript(script, rnVersion) {
|
|
93
|
+
const useQuotes = (0, semver_1.fulfillsVersionRange)({
|
|
94
|
+
version: rnVersion || 'latest',
|
|
95
|
+
acceptableVersions: '<0.81.1',
|
|
96
|
+
canBeLatest: false,
|
|
97
|
+
});
|
|
98
|
+
const quoteChar = useQuotes ? '\\"' : '';
|
|
92
99
|
let patchedScript = script;
|
|
93
100
|
const isLikelyPlainReactNativeScript = script.includes('$REACT_NATIVE_XCODE');
|
|
94
101
|
if (isLikelyPlainReactNativeScript) {
|
|
95
102
|
patchedScript = script.replace('$REACT_NATIVE_XCODE',
|
|
96
103
|
// eslint-disable-next-line no-useless-escape
|
|
97
|
-
|
|
104
|
+
`${quoteChar}/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh $REACT_NATIVE_XCODE${quoteChar}`);
|
|
98
105
|
}
|
|
99
106
|
const isLikelyExpoScript = script.includes('expo');
|
|
100
107
|
if (isLikelyExpoScript) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcode.js","sourceRoot":"","sources":["../../../src/react-native/xcode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4DAA4D;AAC5D,sDAAsD;AACtD,+DAA+D;AAC/D,4CAA8B;AAC9B,+EAA+E;AAC/E,sDAAwC;AACxC,kDAA0B;AAC1B,0CAA4E;AAE5E,qDAAuC;AAKvC,8DAA8D;AAC9D,SAAgB,2BAA2B,CAAC,YAAiB;IAC3D,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,IAAI,EAAE,CAAC;IAC7E,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;KAC7B;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AATD,kEASC;AAED,MAAa,iBAAiB;IACT;IAAnB,YAAmB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;CACvC;AAFD,8CAEC;AAEM,KAAK,UAAU,gBAAgB,CACpC,WAAmC,EACnC,KAAqD;IAErD,IAAI,CAAC,WAAW,EAAE;QAChB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,kBAAkB,eAAK,CAAC,IAAI,CAC1B,qCAAqC,CACtC,eAAe,CACjB,CAAC;QACF,OAAO;KACR;IAED,MAAM,yBAAyB,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IAC5E,IAAI,yBAAyB,EAAE;QAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAe,eAAK,CAAC,IAAI,CACvB,qCAAqC,CACtC,2BAA2B,CAC7B,CAAC;QACF,OAAO;KACR;IAED,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,aAAa,YAAY,iBAAiB,EAAE;QAC9C,MAAM,IAAA,iCAAyB,EAAC;YAC9B,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,aAAa,CAAC,OAAO;YAClC,IAAI,EAAE,gEAAgE;SACvE,CAAC,CAAC;QACH,OAAO;KACR;IACD,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACxD,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,uBAAuB,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,GAAG,CAC5E,CAAC;AACJ,CAAC;AArCD,4CAqCC;AAED,SAAgB,eAAe,CAAC,WAA0B;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACpD,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,oCAAoC,CAAC,CACnE,CAAC;AACJ,CAAC;AAJD,0CAIC;AAED,SAAgB,4BAA4B,CAAC,UAAsB;IACjE,MAAM,0BAA0B,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAC/D,oCAAoC,CACrC,CAAC;IACF,MAAM,qBAAqB,GACzB,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACrD,OAAO,0BAA0B,IAAI,qBAAqB,CAAC;AAC7D,CAAC;AAPD,oEAOC;AAED,SAAgB,8CAA8C,CAC5D,MAAc;IAEd,IAAI,aAAa,GAAG,MAAM,CAAC;IAC3B,MAAM,8BAA8B,GAAG,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC9E,IAAI,8BAA8B,EAAE;QAClC,aAAa,GAAG,MAAM,CAAC,OAAO,CAC5B,qBAAqB;QACrB,6CAA6C;QAC7C,gGAAgG,CACjG,CAAC;KACH;IAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,kBAAkB,EAAE;QACtB,MAAM,8BAA8B,GAClC,2IAA2I,CAAC;QAC9I,aAAa,GAAG,MAAM,CAAC,OAAO,CAC5B,+DAA+D;QAC/D,6CAA6C;QAC7C,CAAC,KAAa,EAAE,EAAE,CAAC,WAAW,8BAA8B,IAAI,KAAK,EAAE,CACxE,CAAC;KACH;IAED,IAAI,aAAa,KAAK,MAAM,EAAE;QAC5B,uBAAuB;QACvB,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,mBAAmB,eAAK,CAAC,IAAI,CAC3B,qCAAqC,CACtC,eAAe,CACjB,CAAC;QACF,MAAM,CAAC,gBAAgB,CACrB,oEAAoE,CACrE,CAAC;QACF,IAAI,kBAAkB,EAAE;YACtB,OAAO,IAAI,iBAAiB,CAC1B,IAAA,uBAAe,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;gBAChD,OAAO,SAAS,CACd,GAAG,IAAI,CACL,iJAAiJ,CAClJ,wIAAwI,CAC1I,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,qBAAqB;YACrB,OAAO,IAAI,iBAAiB,CAC1B,IAAA,uBAAe,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;gBAChD,OAAO,SAAS,CAAC;;;gCAGK,IAAI,CACxB,0EAA0E,CAC3E,sBAAsB,IAAI,CAAC,KAAK,CAAC;CAC3C,CAAC,CAAC;YACK,CAAC,CAAC,CACH,CAAC;SACH;KACF;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AA7DD,wGA6DC;AAED,SAAgB,0CAA0C;AACxD,8DAA8D;AAC9D,YAAiB,EACjB,EAAE,2BAA2B,EAA4C;IAEzE,IAAI,2BAA2B,EAAE;QAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAe,eAAK,CAAC,IAAI,CACvB,gCAAgC,CACjC,kBAAkB,CACpB,CAAC;QACF,OAAO;KACR;IAED,YAAY,CAAC,aAAa,CACxB,EAAE,EACF,0BAA0B,EAC1B,gCAAgC,EAChC,IAAI,EACJ;QACE,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,kFAAkF;KAChG,CACF,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,qBAAqB,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,GAAG,CACrE,CAAC;AACJ,CAAC;AA3BD,gGA2BC;AAED,SAAgB,yBAAyB,CACvC,cAA0C;IAE1C,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE;QAC7D,MAAM,sBAAsB,GAC1B,OAAO,UAAU,KAAK,QAAQ;YAC9B,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAC5B,iDAAiD,CAClD,CAAC;QACJ,MAAM,0BAA0B,GAC9B,OAAO,UAAU,KAAK,QAAQ;YAC9B,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QACjE,OAAO,sBAAsB,IAAI,0BAA0B,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAdD,8DAcC;AAED,SAAgB,iBAAiB,CAC/B,gBAAwB,EACxB,YAAqB;IAErB,IAAI;QACF,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,UAAU,KAAK,cAAc,EAAE;YACjC,OAAO;SACR;QAED,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACxD,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,eAAK,CAAC,KAAK,CACT,iBAAiB,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAC/D,CACF,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,qCAAqC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CACpE,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAAC;KAC9D;AACH,CAAC;AAvBD,8CAuBC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport * as fs from 'node:fs';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { makeCodeSnippet, showCopyPasteInstructions } from '../utils/clack';\nimport { Project } from 'xcode';\nimport * as Sentry from '@sentry/node';\n\ntype BuildPhase = { shellScript: string };\ntype BuildPhaseMap = Record<string, BuildPhase>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getValidExistingBuildPhases(xcodeProject: any): BuildPhaseMap {\n const map: BuildPhaseMap = {};\n const raw = xcodeProject.hash.project.objects.PBXShellScriptBuildPhase || {};\n for (const key in raw) {\n const val = raw[key];\n val.isa && (map[key] = val);\n }\n\n return map;\n}\n\nexport class ErrorPatchSnippet {\n constructor(public snippet: string) {}\n}\n\nexport async function patchBundlePhase(\n bundlePhase: BuildPhase | undefined,\n patch: (script: string) => string | ErrorPatchSnippet,\n) {\n if (!bundlePhase) {\n clack.log.warn(\n `Could not find ${chalk.cyan(\n 'Bundle React Native code and images',\n )} build phase.`,\n );\n return;\n }\n\n const bundlePhaseIncludesSentry = doesBundlePhaseIncludeSentry(bundlePhase);\n if (bundlePhaseIncludesSentry) {\n clack.log.warn(\n `Build phase ${chalk.cyan(\n 'Bundle React Native code and images',\n )} already includes Sentry.`,\n );\n return;\n }\n\n const script: string = JSON.parse(bundlePhase.shellScript);\n const patchedScript = patch(script);\n if (patchedScript instanceof ErrorPatchSnippet) {\n await showCopyPasteInstructions({\n filename: 'Xcode project',\n codeSnippet: patchedScript.snippet,\n hint: `Apply in the 'Bundle React Native code and images' build phase`,\n });\n return;\n }\n bundlePhase.shellScript = JSON.stringify(patchedScript);\n clack.log.success(\n `Patched Build phase ${chalk.cyan('Bundle React Native code and images')}.`,\n );\n}\n\nexport function findBundlePhase(buildPhases: BuildPhaseMap) {\n return Object.values(buildPhases).find((buildPhase) =>\n buildPhase.shellScript.match(/\\/scripts\\/react-native-xcode\\.sh/i),\n );\n}\n\nexport function doesBundlePhaseIncludeSentry(buildPhase: BuildPhase) {\n const containsSentryCliRNCommand = !!buildPhase.shellScript.match(\n /sentry-cli\\s+react-native\\s+xcode/i,\n );\n const containsBundledScript =\n buildPhase.shellScript.includes('sentry-xcode.sh');\n return containsSentryCliRNCommand || containsBundledScript;\n}\n\nexport function addSentryWithBundledScriptsToBundleShellScript(\n script: string,\n): string | ErrorPatchSnippet {\n let patchedScript = script;\n const isLikelyPlainReactNativeScript = script.includes('$REACT_NATIVE_XCODE');\n if (isLikelyPlainReactNativeScript) {\n patchedScript = script.replace(\n '$REACT_NATIVE_XCODE',\n // eslint-disable-next-line no-useless-escape\n '\\\\\"/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh $REACT_NATIVE_XCODE\\\\\"',\n );\n }\n\n const isLikelyExpoScript = script.includes('expo');\n if (isLikelyExpoScript) {\n const SENTRY_REACT_NATIVE_XCODE_PATH =\n \"`\\\"$NODE_BINARY\\\" --print \\\"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\\\"`\";\n patchedScript = script.replace(\n /^.*?(packager|scripts)\\/react-native-xcode\\.sh\\s*(\\\\'\\\\\\\\\")?/m,\n // eslint-disable-next-line no-useless-escape\n (match: string) => `/bin/sh ${SENTRY_REACT_NATIVE_XCODE_PATH} ${match}`,\n );\n }\n\n if (patchedScript === script) {\n // No changes were made\n clack.log.error(\n `Failed to patch ${chalk.cyan(\n 'Bundle React Native code and images',\n )} build phase.`,\n );\n Sentry.captureException(\n `Failed to patch 'Bundle React Native code and images' build phase.`,\n );\n if (isLikelyExpoScript) {\n return new ErrorPatchSnippet(\n makeCodeSnippet(true, (unchanged, plus, _minus) => {\n return unchanged(\n `${plus(\n `/bin/sh \\`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"\\``,\n )} \\`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"\\``,\n );\n }),\n );\n } else {\n // plain react-native\n return new ErrorPatchSnippet(\n makeCodeSnippet(true, (unchanged, plus, _minus) => {\n return unchanged(`WITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT ${plus(\n `\\\\\"/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh `,\n )}$REACT_NATIVE_XCODE${plus(`\\\\\"`)}\"\n`);\n }),\n );\n }\n }\n\n return patchedScript;\n}\n\nexport function addDebugFilesUploadPhaseWithBundledScripts(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n xcodeProject: any,\n { debugFilesUploadPhaseExists }: { debugFilesUploadPhaseExists: boolean },\n) {\n if (debugFilesUploadPhaseExists) {\n clack.log.warn(\n `Build phase ${chalk.cyan(\n 'Upload Debug Symbols to Sentry',\n )} already exists.`,\n );\n return;\n }\n\n xcodeProject.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript: `/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh`,\n },\n );\n clack.log.success(\n `Added Build phase ${chalk.cyan('Upload Debug Symbols to Sentry')}.`,\n );\n}\n\nexport function findDebugFilesUploadPhase(\n buildPhasesMap: Record<string, BuildPhase>,\n): [key: string, buildPhase: BuildPhase] | undefined {\n return Object.entries(buildPhasesMap).find(([_, buildPhase]) => {\n const containsCliDebugUpload =\n typeof buildPhase !== 'string' &&\n !!buildPhase.shellScript.match(\n /sentry-cli\\s+(upload-dsym|debug-files upload)\\b/,\n );\n const containsBundledDebugUpload =\n typeof buildPhase !== 'string' &&\n buildPhase.shellScript.includes('sentry-xcode-debug-files.sh');\n return containsCliDebugUpload || containsBundledDebugUpload;\n });\n}\n\nexport function writeXcodeProject(\n xcodeProjectPath: string,\n xcodeProject: Project,\n) {\n try {\n const newContent = xcodeProject.writeSync();\n const currentContent = fs.readFileSync(xcodeProjectPath, 'utf-8');\n if (newContent === currentContent) {\n return;\n }\n\n fs.writeFileSync(xcodeProjectPath, newContent, 'utf-8');\n clack.log.success(\n chalk.green(\n `Xcode project ${chalk.cyan(xcodeProjectPath)} changes saved.`,\n ),\n );\n } catch (error) {\n clack.log.error(\n `Error while writing Xcode project ${chalk.cyan(xcodeProjectPath)}`,\n );\n Sentry.captureException('Error while writing Xcode project');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"xcode.js","sourceRoot":"","sources":["../../../src/react-native/xcode.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport * as fs from 'node:fs';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { makeCodeSnippet, showCopyPasteInstructions } from '../utils/clack';\nimport { Project } from 'xcode';\nimport * as Sentry from '@sentry/node';\nimport { fulfillsVersionRange } from '../utils/semver';\n\ntype BuildPhase = { shellScript: string };\ntype BuildPhaseMap = Record<string, BuildPhase>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getValidExistingBuildPhases(xcodeProject: any): BuildPhaseMap {\n const map: BuildPhaseMap = {};\n const raw = xcodeProject.hash.project.objects.PBXShellScriptBuildPhase || {};\n for (const key in raw) {\n const val = raw[key];\n val.isa && (map[key] = val);\n }\n\n return map;\n}\n\nexport class ErrorPatchSnippet {\n constructor(public snippet: string) {}\n}\n\nexport async function patchBundlePhase(\n bundlePhase: BuildPhase | undefined,\n rnVersion: string | undefined,\n patch: (\n script: string,\n rnVersion: string | undefined,\n ) => string | ErrorPatchSnippet,\n) {\n if (!bundlePhase) {\n clack.log.warn(\n `Could not find ${chalk.cyan(\n 'Bundle React Native code and images',\n )} build phase.`,\n );\n return;\n }\n\n const bundlePhaseIncludesSentry = doesBundlePhaseIncludeSentry(bundlePhase);\n if (bundlePhaseIncludesSentry) {\n clack.log.warn(\n `Build phase ${chalk.cyan(\n 'Bundle React Native code and images',\n )} already includes Sentry.`,\n );\n return;\n }\n\n const script: string = JSON.parse(bundlePhase.shellScript);\n const patchedScript = patch(script, rnVersion);\n if (patchedScript instanceof ErrorPatchSnippet) {\n await showCopyPasteInstructions({\n filename: 'Xcode project',\n codeSnippet: patchedScript.snippet,\n hint: `Apply in the 'Bundle React Native code and images' build phase`,\n });\n return;\n }\n bundlePhase.shellScript = JSON.stringify(patchedScript);\n clack.log.success(\n `Patched Build phase ${chalk.cyan('Bundle React Native code and images')}.`,\n );\n}\n\nexport function findBundlePhase(buildPhases: BuildPhaseMap) {\n return Object.values(buildPhases).find((buildPhase) =>\n buildPhase.shellScript.match(/\\/scripts\\/react-native-xcode\\.sh/i),\n );\n}\n\nexport function doesBundlePhaseIncludeSentry(buildPhase: BuildPhase) {\n const containsSentryCliRNCommand = !!buildPhase.shellScript.match(\n /sentry-cli\\s+react-native\\s+xcode/i,\n );\n const containsBundledScript =\n buildPhase.shellScript.includes('sentry-xcode.sh');\n return containsSentryCliRNCommand || containsBundledScript;\n}\n\nexport function addSentryWithBundledScriptsToBundleShellScript(\n script: string,\n rnVersion: string | undefined,\n): string | ErrorPatchSnippet {\n const useQuotes = fulfillsVersionRange({\n version: rnVersion || 'latest',\n acceptableVersions: '<0.81.1',\n canBeLatest: false,\n });\n\n const quoteChar = useQuotes ? '\\\\\"' : '';\n let patchedScript = script;\n const isLikelyPlainReactNativeScript = script.includes('$REACT_NATIVE_XCODE');\n if (isLikelyPlainReactNativeScript) {\n patchedScript = script.replace(\n '$REACT_NATIVE_XCODE',\n // eslint-disable-next-line no-useless-escape\n `${quoteChar}/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh $REACT_NATIVE_XCODE${quoteChar}`,\n );\n }\n\n const isLikelyExpoScript = script.includes('expo');\n if (isLikelyExpoScript) {\n const SENTRY_REACT_NATIVE_XCODE_PATH =\n \"`\\\"$NODE_BINARY\\\" --print \\\"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\\\"`\";\n patchedScript = script.replace(\n /^.*?(packager|scripts)\\/react-native-xcode\\.sh\\s*(\\\\'\\\\\\\\\")?/m,\n // eslint-disable-next-line no-useless-escape\n (match: string) => `/bin/sh ${SENTRY_REACT_NATIVE_XCODE_PATH} ${match}`,\n );\n }\n\n if (patchedScript === script) {\n // No changes were made\n clack.log.error(\n `Failed to patch ${chalk.cyan(\n 'Bundle React Native code and images',\n )} build phase.`,\n );\n Sentry.captureException(\n `Failed to patch 'Bundle React Native code and images' build phase.`,\n );\n if (isLikelyExpoScript) {\n return new ErrorPatchSnippet(\n makeCodeSnippet(true, (unchanged, plus, _minus) => {\n return unchanged(\n `${plus(\n `/bin/sh \\`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"\\``,\n )} \\`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"\\``,\n );\n }),\n );\n } else {\n // plain react-native\n return new ErrorPatchSnippet(\n makeCodeSnippet(true, (unchanged, plus, _minus) => {\n return unchanged(`WITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT ${plus(\n `\\\\\"/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh `,\n )}$REACT_NATIVE_XCODE${plus(`\\\\\"`)}\"\n`);\n }),\n );\n }\n }\n\n return patchedScript;\n}\n\nexport function addDebugFilesUploadPhaseWithBundledScripts(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n xcodeProject: any,\n { debugFilesUploadPhaseExists }: { debugFilesUploadPhaseExists: boolean },\n) {\n if (debugFilesUploadPhaseExists) {\n clack.log.warn(\n `Build phase ${chalk.cyan(\n 'Upload Debug Symbols to Sentry',\n )} already exists.`,\n );\n return;\n }\n\n xcodeProject.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript: `/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh`,\n },\n );\n clack.log.success(\n `Added Build phase ${chalk.cyan('Upload Debug Symbols to Sentry')}.`,\n );\n}\n\nexport function findDebugFilesUploadPhase(\n buildPhasesMap: Record<string, BuildPhase>,\n): [key: string, buildPhase: BuildPhase] | undefined {\n return Object.entries(buildPhasesMap).find(([_, buildPhase]) => {\n const containsCliDebugUpload =\n typeof buildPhase !== 'string' &&\n !!buildPhase.shellScript.match(\n /sentry-cli\\s+(upload-dsym|debug-files upload)\\b/,\n );\n const containsBundledDebugUpload =\n typeof buildPhase !== 'string' &&\n buildPhase.shellScript.includes('sentry-xcode-debug-files.sh');\n return containsCliDebugUpload || containsBundledDebugUpload;\n });\n}\n\nexport function writeXcodeProject(\n xcodeProjectPath: string,\n xcodeProject: Project,\n) {\n try {\n const newContent = xcodeProject.writeSync();\n const currentContent = fs.readFileSync(xcodeProjectPath, 'utf-8');\n if (newContent === currentContent) {\n return;\n }\n\n fs.writeFileSync(xcodeProjectPath, newContent, 'utf-8');\n clack.log.success(\n chalk.green(\n `Xcode project ${chalk.cyan(xcodeProjectPath)} changes saved.`,\n ),\n );\n } catch (error) {\n clack.log.error(\n `Error while writing Xcode project ${chalk.cyan(xcodeProjectPath)}`,\n );\n Sentry.captureException('Error while writing Xcode project');\n }\n}\n"]}
|