@sentry/wizard 3.16.4 → 3.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/apple/cocoapod.js +2 -0
  4. package/dist/src/apple/cocoapod.js.map +1 -1
  5. package/dist/src/react-native/metro.d.ts +13 -0
  6. package/dist/src/react-native/metro.js +398 -0
  7. package/dist/src/react-native/metro.js.map +1 -0
  8. package/dist/src/react-native/react-native-wizard.d.ts +2 -0
  9. package/dist/src/react-native/react-native-wizard.js +145 -42
  10. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  11. package/dist/src/react-native/uninstall.js +4 -0
  12. package/dist/src/react-native/uninstall.js.map +1 -1
  13. package/dist/src/react-native/xcode.d.ts +7 -3
  14. package/dist/src/react-native/xcode.js +43 -11
  15. package/dist/src/react-native/xcode.js.map +1 -1
  16. package/dist/src/remix/remix-wizard.js +80 -37
  17. package/dist/src/remix/remix-wizard.js.map +1 -1
  18. package/dist/src/remix/sdk-setup.d.ts +1 -0
  19. package/dist/src/remix/sdk-setup.js +21 -1
  20. package/dist/src/remix/sdk-setup.js.map +1 -1
  21. package/dist/src/sourcemaps/sourcemaps-wizard.js +2 -6
  22. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  23. package/dist/src/utils/ast-utils.d.ts +14 -0
  24. package/dist/src/utils/ast-utils.js +49 -1
  25. package/dist/src/utils/ast-utils.js.map +1 -1
  26. package/dist/src/utils/clack-utils.js +0 -1
  27. package/dist/src/utils/clack-utils.js.map +1 -1
  28. package/dist/src/utils/types.d.ts +8 -4
  29. package/dist/src/utils/types.js.map +1 -1
  30. package/dist/src/utils/url.d.ts +10 -0
  31. package/dist/src/utils/url.js +19 -0
  32. package/dist/src/utils/url.js.map +1 -0
  33. package/dist/test/react-native/metro.test.d.ts +1 -0
  34. package/dist/test/react-native/metro.test.js +125 -0
  35. package/dist/test/react-native/metro.test.js.map +1 -0
  36. package/dist/test/react-native/xcode.test.js +40 -2
  37. package/dist/test/react-native/xcode.test.js.map +1 -1
  38. package/package.json +2 -2
  39. package/src/apple/cocoapod.ts +2 -0
  40. package/src/react-native/metro.ts +409 -0
  41. package/src/react-native/react-native-wizard.ts +115 -12
  42. package/src/react-native/uninstall.ts +3 -0
  43. package/src/react-native/xcode.ts +70 -12
  44. package/src/remix/remix-wizard.ts +51 -15
  45. package/src/remix/sdk-setup.ts +31 -0
  46. package/src/sourcemaps/sourcemaps-wizard.ts +2 -7
  47. package/src/utils/ast-utils.ts +52 -0
  48. package/src/utils/clack-utils.ts +0 -1
  49. package/src/utils/types.ts +8 -5
  50. package/src/utils/url.ts +23 -0
  51. package/test/react-native/metro.test.ts +283 -0
  52. package/test/react-native/xcode.test.ts +76 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.17.0
4
+
5
+ - feat(reactnative): Use Xcode scripts bundled with Sentry RN SDK (#499)
6
+ - feat(reactnative): Make `pod install` step optional (#501)
7
+ - feat(remix): Add Vite support (#495)
8
+ - feat(reactnative): Add Sentry Metro serializer (#502)
9
+
10
+ ## 3.16.5
11
+
12
+ - fix(wizard): Update wizard API data type and issue stream url creation (#500)
13
+
3
14
  ## 3.16.4
4
15
 
5
16
  - feat(nextjs): Add instructions for custom \_error page (#496)
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "3.16.4",
3
+ "version": "3.17.0",
4
4
  "homepage": "https://github.com/getsentry/sentry-wizard",
5
5
  "repository": "https://github.com/getsentry/sentry-wizard",
6
6
  "description": "Sentry wizard helping you to configure your project",
@@ -27,7 +27,7 @@
27
27
  "@clack/prompts": "0.7.0",
28
28
  "@sentry/cli": "^1.72.0",
29
29
  "@sentry/node": "^7.69.0",
30
- "axios": "1.3.5",
30
+ "axios": "1.6.0",
31
31
  "chalk": "^2.4.1",
32
32
  "glob": "^7.1.3",
33
33
  "inquirer": "^6.2.0",
@@ -130,10 +130,12 @@ function podInstall(dir) {
130
130
  case 3:
131
131
  _a.sent();
132
132
  installSpinner.stop('Pods installed.');
133
+ Sentry.setTag('pods-installed', true);
133
134
  return [3 /*break*/, 5];
134
135
  case 4:
135
136
  e_1 = _a.sent();
136
137
  installSpinner.stop('Failed to install pods.');
138
+ Sentry.setTag('pods-installed', false);
137
139
  clack.log.error("".concat(chalk_1.default.red('Encountered the following error during pods installation:'), "\n\n").concat(e_1, "\n\n").concat(chalk_1.default.dim('If you think this issue is caused by the Sentry wizard, let us know here:\nhttps://github.com/getsentry/sentry-wizard/issues')));
138
140
  Sentry.captureException('Sentry pod install failed.');
139
141
  return [3 /*break*/, 5];
@@ -1 +1 @@
1
- {"version":3,"file":"cocoapod.js","sourceRoot":"","sources":["../../../src/apple/cocoapod.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAyB;AACzB,yCAA6B;AAC7B,kDAAsC;AACtC,mDAAuC;AACvC,yEAAyE;AACzE,oDAAwC;AACxC,gDAA0B;AAE1B,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAFD,oCAEC;AAED,SAAsB,YAAY,CAAC,QAAgB;;;;;;oBAC3C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAEzC,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAEpD,IACE,wDAAwD,CAAC,IAAI,CAAC,UAAU,CAAC,EACzE;wBACA,0BAA0B;wBAC1B,sBAAO,IAAI,EAAC;qBACb;oBAEG,QAAQ,GAAG,+BAA+B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAChE,IAAI,CAAC,QAAQ,EAAE;wBAEP,cAAc,GAAG,iCAAiC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC1E,IAAI,CAAC,cAAc,EAAE;4BACnB,sBAAO,KAAK,EAAC;yBACd;wBACD,QAAQ,GAAG,cAAc,CAAC;qBAC3B;oBAEK,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClD,cAAc,GAClB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;wBAChC,IAAI;wBACJ,QAAQ,CAAC,CAAC,CAAC;wBACX,gBAAgB;wBAChB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAChC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;oBAElD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBAE3D,qBAAM,UAAU,EAAE,EAAA;;oBAAlB,SAAkB,CAAC;oBAEnB,sBAAO,IAAI,EAAC;;;;CACb;AApCD,oCAoCC;AAED,SAAsB,UAAU,CAAC,GAAS;IAAT,oBAAA,EAAA,SAAS;;;;;;oBAClC,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBACvC,cAAc,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;;;;oBAG5E,qBAAM,IAAI,CAAC,OAAO,CAAC,aAAM,GAAG,wBAAqB,CAAC,EAAA;;oBAAlD,SAAkD,CAAC;oBACnD,qBAAM,IAAI,CAAC,OAAO,CAAC,aAAM,GAAG,6BAA0B,CAAC,EAAA;;oBAAvD,SAAuD,CAAC;oBACxD,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;;;;oBAEvC,cAAc,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,UAAG,eAAK,CAAC,GAAG,CACV,2DAA2D,CAE5D,iBAAO,GAAC,iBAAO,eAAK,CAAC,GAAG,CACvB,8HAA8H,CAC/H,CAAE,CACJ,CAAC;oBACF,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;;;;;;CAEzD;AApBD,gCAoBC","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as bash from '../utils/bash';\nimport * as Sentry from '@sentry/node';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nexport function usesCocoaPod(projPath: string): boolean {\n return fs.existsSync(path.join(projPath, 'Podfile'));\n}\n\nexport async function addCocoaPods(projPath: string): Promise<boolean> {\n const podfile = path.join(projPath, 'Podfile');\n\n const podContent = fs.readFileSync(podfile, 'utf8');\n\n if (\n /^\\s*pod\\s+(['\"]Sentry['\"]|['\"]SentrySwiftUI['\"])\\s*$/im.test(podContent)\n ) {\n // Already have Sentry pod\n return true;\n }\n\n let podMatch = /^( *)pod\\s+['\"](\\w+)['\"] *$/im.exec(podContent);\n if (!podMatch) {\n // No Podfile is empty, will try to add Sentry pod after \"use_frameworks!\"\n const frameworkMatch = /^( *)use_frameworks![^\\n]* *$/im.exec(podContent);\n if (!frameworkMatch) {\n return false;\n }\n podMatch = frameworkMatch;\n }\n\n const insertIndex = podMatch.index + podMatch[0].length;\n const newFileContent =\n podContent.slice(0, insertIndex) +\n '\\n' +\n podMatch[1] +\n \"pod 'Sentry'\\n\" +\n podContent.slice(insertIndex);\n fs.writeFileSync(podfile, newFileContent, 'utf8');\n\n clack.log.step('Sentry pod added to the project podFile.');\n\n await podInstall();\n\n return true;\n}\n\nexport async function podInstall(dir = '.') {\n const installSpinner = clack.spinner();\n installSpinner.start(\"Running 'pod install'. This may take a few minutes...\");\n\n try {\n await bash.execute(`cd ${dir} && pod repo update`);\n await bash.execute(`cd ${dir} && pod install --silent`);\n installSpinner.stop('Pods installed.');\n } catch (e) {\n installSpinner.stop('Failed to install pods.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during pods installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n 'If you think this issue is caused by the Sentry wizard, let us know here:\\nhttps://github.com/getsentry/sentry-wizard/issues',\n )}`,\n );\n Sentry.captureException('Sentry pod install failed.');\n }\n}\n"]}
1
+ {"version":3,"file":"cocoapod.js","sourceRoot":"","sources":["../../../src/apple/cocoapod.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAyB;AACzB,yCAA6B;AAC7B,kDAAsC;AACtC,mDAAuC;AACvC,yEAAyE;AACzE,oDAAwC;AACxC,gDAA0B;AAE1B,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAFD,oCAEC;AAED,SAAsB,YAAY,CAAC,QAAgB;;;;;;oBAC3C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAEzC,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAEpD,IACE,wDAAwD,CAAC,IAAI,CAAC,UAAU,CAAC,EACzE;wBACA,0BAA0B;wBAC1B,sBAAO,IAAI,EAAC;qBACb;oBAEG,QAAQ,GAAG,+BAA+B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAChE,IAAI,CAAC,QAAQ,EAAE;wBAEP,cAAc,GAAG,iCAAiC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC1E,IAAI,CAAC,cAAc,EAAE;4BACnB,sBAAO,KAAK,EAAC;yBACd;wBACD,QAAQ,GAAG,cAAc,CAAC;qBAC3B;oBAEK,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClD,cAAc,GAClB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;wBAChC,IAAI;wBACJ,QAAQ,CAAC,CAAC,CAAC;wBACX,gBAAgB;wBAChB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAChC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;oBAElD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBAE3D,qBAAM,UAAU,EAAE,EAAA;;oBAAlB,SAAkB,CAAC;oBAEnB,sBAAO,IAAI,EAAC;;;;CACb;AApCD,oCAoCC;AAED,SAAsB,UAAU,CAAC,GAAS;IAAT,oBAAA,EAAA,SAAS;;;;;;oBAClC,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBACvC,cAAc,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;;;;oBAG5E,qBAAM,IAAI,CAAC,OAAO,CAAC,aAAM,GAAG,wBAAqB,CAAC,EAAA;;oBAAlD,SAAkD,CAAC;oBACnD,qBAAM,IAAI,CAAC,OAAO,CAAC,aAAM,GAAG,6BAA0B,CAAC,EAAA;;oBAAvD,SAAuD,CAAC;oBACxD,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBACvC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;;;;oBAEtC,cAAc,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;oBACvC,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,UAAG,eAAK,CAAC,GAAG,CACV,2DAA2D,CAE5D,iBAAO,GAAC,iBAAO,eAAK,CAAC,GAAG,CACvB,8HAA8H,CAC/H,CAAE,CACJ,CAAC;oBACF,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;;;;;;CAEzD;AAtBD,gCAsBC","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as bash from '../utils/bash';\nimport * as Sentry from '@sentry/node';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nexport function usesCocoaPod(projPath: string): boolean {\n return fs.existsSync(path.join(projPath, 'Podfile'));\n}\n\nexport async function addCocoaPods(projPath: string): Promise<boolean> {\n const podfile = path.join(projPath, 'Podfile');\n\n const podContent = fs.readFileSync(podfile, 'utf8');\n\n if (\n /^\\s*pod\\s+(['\"]Sentry['\"]|['\"]SentrySwiftUI['\"])\\s*$/im.test(podContent)\n ) {\n // Already have Sentry pod\n return true;\n }\n\n let podMatch = /^( *)pod\\s+['\"](\\w+)['\"] *$/im.exec(podContent);\n if (!podMatch) {\n // No Podfile is empty, will try to add Sentry pod after \"use_frameworks!\"\n const frameworkMatch = /^( *)use_frameworks![^\\n]* *$/im.exec(podContent);\n if (!frameworkMatch) {\n return false;\n }\n podMatch = frameworkMatch;\n }\n\n const insertIndex = podMatch.index + podMatch[0].length;\n const newFileContent =\n podContent.slice(0, insertIndex) +\n '\\n' +\n podMatch[1] +\n \"pod 'Sentry'\\n\" +\n podContent.slice(insertIndex);\n fs.writeFileSync(podfile, newFileContent, 'utf8');\n\n clack.log.step('Sentry pod added to the project podFile.');\n\n await podInstall();\n\n return true;\n}\n\nexport async function podInstall(dir = '.') {\n const installSpinner = clack.spinner();\n installSpinner.start(\"Running 'pod install'. This may take a few minutes...\");\n\n try {\n await bash.execute(`cd ${dir} && pod repo update`);\n await bash.execute(`cd ${dir} && pod install --silent`);\n installSpinner.stop('Pods installed.');\n Sentry.setTag('pods-installed', true);\n } catch (e) {\n installSpinner.stop('Failed to install pods.');\n Sentry.setTag('pods-installed', false);\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during pods installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n 'If you think this issue is caused by the Sentry wizard, let us know here:\\nhttps://github.com/getsentry/sentry-wizard/issues',\n )}`,\n );\n Sentry.captureException('Sentry pod install failed.');\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import * as recast from 'recast';
2
+ import x = recast.types;
3
+ import t = x.namedTypes;
4
+ export declare function patchMetroConfig(): Promise<void>;
5
+ export declare function unPatchMetroConfig(): Promise<void>;
6
+ export declare function removeSentrySerializerFromMetroConfig(program: t.Program): boolean;
7
+ export declare function removeSentryRequire(program: t.Program): boolean;
8
+ export declare function addSentrySerializerToMetroConfig(configObj: t.ObjectExpression): boolean;
9
+ export declare function addSentrySerializerRequireToMetroConfig(program: t.Program): boolean;
10
+ /**
11
+ * Returns value from `module.exports = value` or `const config = value`
12
+ */
13
+ export declare function getMetroConfigObject(program: t.Program): t.ObjectExpression | undefined;
@@ -0,0 +1,398 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ var __importDefault = (this && this.__importDefault) || function (mod) {
62
+ return (mod && mod.__esModule) ? mod : { "default": mod };
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.getMetroConfigObject = exports.addSentrySerializerRequireToMetroConfig = exports.addSentrySerializerToMetroConfig = exports.removeSentryRequire = exports.removeSentrySerializerFromMetroConfig = exports.unPatchMetroConfig = exports.patchMetroConfig = void 0;
66
+ // @ts-ignore - clack is ESM and TS complains about that. It works though
67
+ var clack = __importStar(require("@clack/prompts"));
68
+ // @ts-ignore - magicast is ESM and TS complains about that. It works though
69
+ var magicast_1 = require("magicast");
70
+ var fs = __importStar(require("fs"));
71
+ var Sentry = __importStar(require("@sentry/node"));
72
+ var ast_utils_1 = require("../utils/ast-utils");
73
+ var clack_utils_1 = require("../utils/clack-utils");
74
+ var recast = __importStar(require("recast"));
75
+ var chalk_1 = __importDefault(require("chalk"));
76
+ var b = recast.types.builders;
77
+ var metroConfigPath = 'metro.config.js';
78
+ function patchMetroConfig() {
79
+ return __awaiter(this, void 0, void 0, function () {
80
+ var mod, showInstructions, shouldContinue, configObj, addedSentrySerializer, addedSentrySerializerImport, saved;
81
+ return __generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0: return [4 /*yield*/, parseMetroConfig()];
84
+ case 1:
85
+ mod = _a.sent();
86
+ showInstructions = function () {
87
+ return (0, clack_utils_1.showCopyPasteInstructions)(metroConfigPath, getMetroConfigSnippet(true));
88
+ };
89
+ if (!(0, ast_utils_1.hasSentryContent)(mod.$ast)) return [3 /*break*/, 4];
90
+ return [4 /*yield*/, confirmPathMetroConfig()];
91
+ case 2:
92
+ shouldContinue = _a.sent();
93
+ if (!!shouldContinue) return [3 /*break*/, 4];
94
+ return [4 /*yield*/, showInstructions()];
95
+ case 3: return [2 /*return*/, _a.sent()];
96
+ case 4:
97
+ configObj = getMetroConfigObject(mod.$ast);
98
+ if (!configObj) {
99
+ clack.log.warn('Could not find Metro config object, please follow the manual steps.');
100
+ return [2 /*return*/, showInstructions()];
101
+ }
102
+ addedSentrySerializer = addSentrySerializerToMetroConfig(configObj);
103
+ if (!!addedSentrySerializer) return [3 /*break*/, 6];
104
+ clack.log.warn('Could not add Sentry serializer to Metro config, please follow the manual steps.');
105
+ return [4 /*yield*/, showInstructions()];
106
+ case 5: return [2 /*return*/, _a.sent()];
107
+ case 6:
108
+ addedSentrySerializerImport = addSentrySerializerRequireToMetroConfig(mod.$ast);
109
+ if (!!addedSentrySerializerImport) return [3 /*break*/, 8];
110
+ clack.log.warn('Could not add Sentry serializer import to Metro config, please follow the manual steps.');
111
+ return [4 /*yield*/, showInstructions()];
112
+ case 7: return [2 /*return*/, _a.sent()];
113
+ case 8:
114
+ clack.log.success("Added Sentry Metro plugin to ".concat(chalk_1.default.cyan(metroConfigPath), "."));
115
+ return [4 /*yield*/, writeMetroConfig(mod)];
116
+ case 9:
117
+ saved = _a.sent();
118
+ if (!saved) return [3 /*break*/, 10];
119
+ clack.log.success(chalk_1.default.green("".concat(chalk_1.default.cyan(metroConfigPath), " changes saved.")));
120
+ return [3 /*break*/, 12];
121
+ case 10:
122
+ clack.log.warn("Could not save changes to ".concat(chalk_1.default.cyan(metroConfigPath), ", please follow the manual steps."));
123
+ return [4 /*yield*/, showInstructions()];
124
+ case 11: return [2 /*return*/, _a.sent()];
125
+ case 12: return [2 /*return*/];
126
+ }
127
+ });
128
+ });
129
+ }
130
+ exports.patchMetroConfig = patchMetroConfig;
131
+ function unPatchMetroConfig() {
132
+ return __awaiter(this, void 0, void 0, function () {
133
+ var mod, removedAtLeastOneRequire, removedSerializerConfig, saved;
134
+ return __generator(this, function (_a) {
135
+ switch (_a.label) {
136
+ case 0: return [4 /*yield*/, parseMetroConfig()];
137
+ case 1:
138
+ mod = _a.sent();
139
+ removedAtLeastOneRequire = removeSentryRequire(mod.$ast);
140
+ removedSerializerConfig = removeSentrySerializerFromMetroConfig(mod.$ast);
141
+ if (!(removedAtLeastOneRequire || removedSerializerConfig)) return [3 /*break*/, 3];
142
+ return [4 /*yield*/, writeMetroConfig(mod)];
143
+ case 2:
144
+ saved = _a.sent();
145
+ if (saved) {
146
+ clack.log.success("Removed Sentry Metro plugin from ".concat(chalk_1.default.cyan(metroConfigPath), "."));
147
+ }
148
+ return [3 /*break*/, 4];
149
+ case 3:
150
+ clack.log.warn("No Sentry Metro plugin found in ".concat(chalk_1.default.cyan(metroConfigPath), "."));
151
+ _a.label = 4;
152
+ case 4: return [2 /*return*/];
153
+ }
154
+ });
155
+ });
156
+ }
157
+ exports.unPatchMetroConfig = unPatchMetroConfig;
158
+ function removeSentrySerializerFromMetroConfig(program) {
159
+ var configObject = getMetroConfigObject(program);
160
+ if (!configObject) {
161
+ return false;
162
+ }
163
+ var serializerProp = getSerializerProp(configObject);
164
+ if ('invalid' === serializerProp || 'undefined' === serializerProp) {
165
+ return false;
166
+ }
167
+ var customSerializerProp = getCustomSerializerProp(serializerProp);
168
+ if ('invalid' === customSerializerProp ||
169
+ 'undefined' === customSerializerProp) {
170
+ return false;
171
+ }
172
+ if (serializerProp.value.type === 'ObjectExpression' &&
173
+ customSerializerProp.value.type === 'CallExpression' &&
174
+ customSerializerProp.value.callee.type === 'Identifier' &&
175
+ customSerializerProp.value.callee.name === 'createSentryMetroSerializer') {
176
+ if (customSerializerProp.value.arguments.length === 0) {
177
+ // FROM serializer: { customSerializer: createSentryMetroSerializer() }
178
+ // TO serializer: {}
179
+ var removed_1 = false;
180
+ serializerProp.value.properties = serializerProp.value.properties.filter(function (p) {
181
+ if (p.type === 'ObjectProperty' &&
182
+ p.key.type === 'Identifier' &&
183
+ p.key.name === 'customSerializer') {
184
+ removed_1 = true;
185
+ return false;
186
+ }
187
+ return true;
188
+ });
189
+ if (removed_1) {
190
+ return true;
191
+ }
192
+ }
193
+ else {
194
+ if (customSerializerProp.value.arguments[0].type !== 'SpreadElement') {
195
+ // FROM serializer: { customSerializer: createSentryMetroSerializer(wrapperSerializer) }
196
+ // TO serializer: { customSerializer: wrapperSerializer }
197
+ customSerializerProp.value = customSerializerProp.value.arguments[0];
198
+ return true;
199
+ }
200
+ }
201
+ }
202
+ return false;
203
+ }
204
+ exports.removeSentrySerializerFromMetroConfig = removeSentrySerializerFromMetroConfig;
205
+ function removeSentryRequire(program) {
206
+ return (0, ast_utils_1.removeRequire)(program, '@sentry');
207
+ }
208
+ exports.removeSentryRequire = removeSentryRequire;
209
+ function parseMetroConfig() {
210
+ return __awaiter(this, void 0, void 0, function () {
211
+ var metroConfigContent;
212
+ return __generator(this, function (_a) {
213
+ switch (_a.label) {
214
+ case 0: return [4 /*yield*/, fs.promises.readFile(metroConfigPath)];
215
+ case 1:
216
+ metroConfigContent = (_a.sent()).toString();
217
+ return [2 /*return*/, (0, magicast_1.parseModule)(metroConfigContent)];
218
+ }
219
+ });
220
+ });
221
+ }
222
+ function writeMetroConfig(mod) {
223
+ return __awaiter(this, void 0, void 0, function () {
224
+ var e_1;
225
+ return __generator(this, function (_a) {
226
+ switch (_a.label) {
227
+ case 0:
228
+ _a.trys.push([0, 2, , 3]);
229
+ return [4 /*yield*/, (0, magicast_1.writeFile)(mod.$ast, metroConfigPath)];
230
+ case 1:
231
+ _a.sent();
232
+ return [3 /*break*/, 3];
233
+ case 2:
234
+ e_1 = _a.sent();
235
+ clack.log.error("Failed to write to ".concat(chalk_1.default.cyan(metroConfigPath), ": ").concat(JSON.stringify(e_1)));
236
+ return [2 /*return*/, false];
237
+ case 3: return [2 /*return*/, true];
238
+ }
239
+ });
240
+ });
241
+ }
242
+ function addSentrySerializerToMetroConfig(configObj) {
243
+ var serializerProp = getSerializerProp(configObj);
244
+ if ('invalid' === serializerProp) {
245
+ return false;
246
+ }
247
+ // case 1: serializer property doesn't exist yet, so we can just add it
248
+ if ('undefined' === serializerProp) {
249
+ configObj.properties.push(b.objectProperty(b.identifier('serializer'), b.objectExpression([
250
+ b.objectProperty(b.identifier('customSerializer'), b.callExpression(b.identifier('createSentryMetroSerializer'), [])),
251
+ ])));
252
+ return true;
253
+ }
254
+ var customSerializerProp = getCustomSerializerProp(serializerProp);
255
+ // case 2: serializer.customSerializer property doesn't exist yet, so we just add it
256
+ if ('undefined' === customSerializerProp &&
257
+ serializerProp.value.type === 'ObjectExpression') {
258
+ serializerProp.value.properties.push(b.objectProperty(b.identifier('customSerializer'), b.callExpression(b.identifier('createSentryMetroSerializer'), [])));
259
+ return true;
260
+ }
261
+ return false;
262
+ }
263
+ exports.addSentrySerializerToMetroConfig = addSentrySerializerToMetroConfig;
264
+ function getCustomSerializerProp(prop) {
265
+ var customSerializerProp = prop.value.type === 'ObjectExpression' &&
266
+ prop.value.properties.find(function (p) {
267
+ return p.key.type === 'Identifier' && p.key.name === 'customSerializer';
268
+ });
269
+ if (!customSerializerProp) {
270
+ return 'undefined';
271
+ }
272
+ if (customSerializerProp.type === 'ObjectProperty') {
273
+ return customSerializerProp;
274
+ }
275
+ return 'invalid';
276
+ }
277
+ function getSerializerProp(obj) {
278
+ var serializerProp = obj.properties.find(function (p) {
279
+ return p.key.type === 'Identifier' && p.key.name === 'serializer';
280
+ });
281
+ if (!serializerProp) {
282
+ return 'undefined';
283
+ }
284
+ if (serializerProp.type === 'ObjectProperty') {
285
+ return serializerProp;
286
+ }
287
+ return 'invalid';
288
+ }
289
+ function addSentrySerializerRequireToMetroConfig(program) {
290
+ var lastRequireIndex = (0, ast_utils_1.getLastRequireIndex)(program);
291
+ var sentrySerializerRequire = createSentrySerializerRequire();
292
+ var sentryImportIndex = lastRequireIndex + 1;
293
+ if (sentryImportIndex < program.body.length) {
294
+ // insert after last require
295
+ program.body.splice(lastRequireIndex + 1, 0, sentrySerializerRequire);
296
+ }
297
+ else {
298
+ // insert at the end
299
+ program.body.push(sentrySerializerRequire);
300
+ }
301
+ return true;
302
+ }
303
+ exports.addSentrySerializerRequireToMetroConfig = addSentrySerializerRequireToMetroConfig;
304
+ /**
305
+ * Creates const {createSentryMetroSerializer} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');
306
+ */
307
+ function createSentrySerializerRequire() {
308
+ return b.variableDeclaration('const', [
309
+ b.variableDeclarator(b.objectPattern([
310
+ b.objectProperty.from({
311
+ key: b.identifier('createSentryMetroSerializer'),
312
+ value: b.identifier('createSentryMetroSerializer'),
313
+ shorthand: true,
314
+ }),
315
+ ]), b.callExpression(b.identifier('require'), [
316
+ b.literal('@sentry/react-native/dist/js/tools/sentryMetroSerializer'),
317
+ ])),
318
+ ]);
319
+ }
320
+ function confirmPathMetroConfig() {
321
+ return __awaiter(this, void 0, void 0, function () {
322
+ var shouldContinue;
323
+ return __generator(this, function (_a) {
324
+ switch (_a.label) {
325
+ case 0: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
326
+ message: "Metro Config already contains Sentry-related code. Should the wizard modify it anyway?",
327
+ options: [
328
+ {
329
+ label: 'Yes, add the Sentry Metro plugin',
330
+ value: true,
331
+ },
332
+ {
333
+ label: 'No, show me instructions to manually add the plugin',
334
+ value: false,
335
+ },
336
+ ],
337
+ initialValue: true,
338
+ }))];
339
+ case 1:
340
+ shouldContinue = _a.sent();
341
+ if (!shouldContinue) {
342
+ Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');
343
+ }
344
+ return [2 /*return*/, shouldContinue];
345
+ }
346
+ });
347
+ });
348
+ }
349
+ /**
350
+ * Returns value from `module.exports = value` or `const config = value`
351
+ */
352
+ function getMetroConfigObject(program) {
353
+ var _a;
354
+ // check config variable
355
+ var configVariable = program.body.find(function (s) {
356
+ if (s.type === 'VariableDeclaration' &&
357
+ s.declarations.length === 1 &&
358
+ s.declarations[0].type === 'VariableDeclarator' &&
359
+ s.declarations[0].id.type === 'Identifier' &&
360
+ s.declarations[0].id.name === 'config') {
361
+ return true;
362
+ }
363
+ return false;
364
+ });
365
+ if ((configVariable === null || configVariable === void 0 ? void 0 : configVariable.declarations[0].type) === 'VariableDeclarator' &&
366
+ ((_a = configVariable === null || configVariable === void 0 ? void 0 : configVariable.declarations[0].init) === null || _a === void 0 ? void 0 : _a.type) === 'ObjectExpression') {
367
+ Sentry.setTag('metro-config', 'config-variable');
368
+ return configVariable.declarations[0].init;
369
+ }
370
+ // check module.exports
371
+ var moduleExports = program.body.find(function (s) {
372
+ if (s.type === 'ExpressionStatement' &&
373
+ s.expression.type === 'AssignmentExpression' &&
374
+ s.expression.left.type === 'MemberExpression' &&
375
+ s.expression.left.object.type === 'Identifier' &&
376
+ s.expression.left.object.name === 'module' &&
377
+ s.expression.left.property.type === 'Identifier' &&
378
+ s.expression.left.property.name === 'exports') {
379
+ return true;
380
+ }
381
+ return false;
382
+ });
383
+ if ((moduleExports === null || moduleExports === void 0 ? void 0 : moduleExports.expression).right.type ===
384
+ 'ObjectExpression') {
385
+ Sentry.setTag('metro-config', 'module-exports');
386
+ return (moduleExports === null || moduleExports === void 0 ? void 0 : moduleExports.expression)
387
+ .right;
388
+ }
389
+ Sentry.setTag('metro-config', 'not-found');
390
+ return undefined;
391
+ }
392
+ exports.getMetroConfigObject = getMetroConfigObject;
393
+ function getMetroConfigSnippet(colors) {
394
+ return (0, clack_utils_1.makeCodeSnippet)(colors, function (unchanged, plus, _) {
395
+ return unchanged("const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');\";\n".concat(plus("const {createSentryMetroSerializer} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');"), "\n\nconst config = {\n ").concat(plus("serializer: {\n customSerializer: createSentryMetroSerializer(),\n },"), "\n};\n\nmodule.exports = mergeConfig(getDefaultConfig(__dirname), config);\n"));
396
+ });
397
+ }
398
+ //# sourceMappingURL=metro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro.js","sourceRoot":"","sources":["../../../src/react-native/metro.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yEAAyE;AACzE,oDAAwC;AACxC,4EAA4E;AAC5E,qCAAmE;AACnE,qCAAyB;AACzB,mDAAuC;AAEvC,gDAI4B;AAC5B,oDAI8B;AAE9B,6CAAiC;AAGjC,gDAA0B;AAE1B,IAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAEhC,IAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C,SAAsB,gBAAgB;;;;;wBACxB,qBAAM,gBAAgB,EAAE,EAAA;;oBAA9B,GAAG,GAAG,SAAwB;oBAE9B,gBAAgB,GAAG;wBACvB,OAAA,IAAA,uCAAyB,EAAC,eAAe,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;oBAAvE,CAAuE,CAAC;yBAEtE,IAAA,4BAAgB,EAAC,GAAG,CAAC,IAAiB,CAAC,EAAvC,wBAAuC;oBAClB,qBAAM,sBAAsB,EAAE,EAAA;;oBAA/C,cAAc,GAAG,SAA8B;yBACjD,CAAC,cAAc,EAAf,wBAAe;oBACV,qBAAM,gBAAgB,EAAE,EAAA;wBAA/B,sBAAO,SAAwB,EAAC;;oBAI9B,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAiB,CAAC,CAAC;oBAC9D,IAAI,CAAC,SAAS,EAAE;wBACd,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,qEAAqE,CACtE,CAAC;wBACF,sBAAO,gBAAgB,EAAE,EAAC;qBAC3B;oBAEK,qBAAqB,GAAG,gCAAgC,CAAC,SAAS,CAAC,CAAC;yBACtE,CAAC,qBAAqB,EAAtB,wBAAsB;oBACxB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,kFAAkF,CACnF,CAAC;oBACK,qBAAM,gBAAgB,EAAE,EAAA;wBAA/B,sBAAO,SAAwB,EAAC;;oBAG5B,2BAA2B,GAAG,uCAAuC,CACzE,GAAG,CAAC,IAAiB,CACtB,CAAC;yBACE,CAAC,2BAA2B,EAA5B,wBAA4B;oBAC9B,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,yFAAyF,CAC1F,CAAC;oBACK,qBAAM,gBAAgB,EAAE,EAAA;wBAA/B,sBAAO,SAAwB,EAAC;;oBAGlC,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,uCAAgC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAG,CAC/D,CAAC;oBAEY,qBAAM,gBAAgB,CAAC,GAAG,CAAC,EAAA;;oBAAnC,KAAK,GAAG,SAA2B;yBACrC,KAAK,EAAL,yBAAK;oBACP,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,eAAK,CAAC,KAAK,CAAC,UAAG,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAiB,CAAC,CAC7D,CAAC;;;oBAEF,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,oCAA6B,eAAK,CAAC,IAAI,CACrC,eAAe,CAChB,sCAAmC,CACrC,CAAC;oBACK,qBAAM,gBAAgB,EAAE,EAAA;yBAA/B,sBAAO,SAAwB,EAAC;;;;;CAEnC;AAxDD,4CAwDC;AAED,SAAsB,kBAAkB;;;;;wBAC1B,qBAAM,gBAAgB,EAAE,EAAA;;oBAA9B,GAAG,GAAG,SAAwB;oBAE9B,wBAAwB,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAiB,CAAC,CAAC;oBACtE,uBAAuB,GAAG,qCAAqC,CACnE,GAAG,CAAC,IAAiB,CACtB,CAAC;yBAEE,CAAA,wBAAwB,IAAI,uBAAuB,CAAA,EAAnD,wBAAmD;oBACvC,qBAAM,gBAAgB,CAAC,GAAG,CAAC,EAAA;;oBAAnC,KAAK,GAAG,SAA2B;oBACzC,IAAI,KAAK,EAAE;wBACT,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2CAAoC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAG,CACnE,CAAC;qBACH;;;oBAED,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,0CAAmC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAG,CAClE,CAAC;;;;;;CAEL;AApBD,gDAoBC;AAED,SAAgB,qCAAqC,CACnD,OAAkB;IAElB,IAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,KAAK,CAAC;KACd;IAED,IAAM,cAAc,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,cAAc,IAAI,WAAW,KAAK,cAAc,EAAE;QAClE,OAAO,KAAK,CAAC;KACd;IAED,IAAM,oBAAoB,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACrE,IACE,SAAS,KAAK,oBAAoB;QAClC,WAAW,KAAK,oBAAoB,EACpC;QACA,OAAO,KAAK,CAAC;KACd;IAED,IACE,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB;QAChD,oBAAoB,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB;QACpD,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;QACvD,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,6BAA6B,EACxE;QACA,IAAI,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACrD,uEAAuE;YACvE,oBAAoB;YACpB,IAAI,SAAO,GAAG,KAAK,CAAC;YACpB,cAAc,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CACtE,UAAC,CAAC;gBACA,IACE,CAAC,CAAC,IAAI,KAAK,gBAAgB;oBAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;oBAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB,EACjC;oBACA,SAAO,GAAG,IAAI,CAAC;oBACf,OAAO,KAAK,CAAC;iBACd;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CACF,CAAC;YAEF,IAAI,SAAO,EAAE;gBACX,OAAO,IAAI,CAAC;aACb;SACF;aAAM;YACL,IAAI,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE;gBACpE,wFAAwF;gBACxF,yDAAyD;gBACzD,oBAAoB,CAAC,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrE,OAAO,IAAI,CAAC;aACb;SACF;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AA3DD,sFA2DC;AAED,SAAgB,mBAAmB,CAAC,OAAkB;IACpD,OAAO,IAAA,yBAAa,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAFD,kDAEC;AAED,SAAe,gBAAgB;;;;;wBAE3B,qBAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAA;;oBADvC,kBAAkB,GAAG,CACzB,SAA2C,CAC5C,CAAC,QAAQ,EAAE;oBAEZ,sBAAO,IAAA,sBAAW,EAAC,kBAAkB,CAAC,EAAC;;;;CACxC;AAED,SAAe,gBAAgB,CAAC,GAAoB;;;;;;;oBAEhD,qBAAM,IAAA,oBAAS,EAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,EAAA;;oBAA1C,SAA0C,CAAC;;;;oBAE3C,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,6BAAsB,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,eAAK,IAAI,CAAC,SAAS,CAAC,GAAC,CAAC,CAAE,CAC1E,CAAC;oBACF,sBAAO,KAAK,EAAC;wBAEf,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAgB,gCAAgC,CAC9C,SAA6B;IAE7B,IAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,SAAS,KAAK,cAAc,EAAE;QAChC,OAAO,KAAK,CAAC;KACd;IAED,uEAAuE;IACvE,IAAI,WAAW,KAAK,cAAc,EAAE;QAClC,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,EAC1B,CAAC,CAAC,gBAAgB,CAAC;YACjB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAChC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,EAAE,CAAC,CAClE;SACF,CAAC,CACH,CACF,CAAC;QACF,OAAO,IAAI,CAAC;KACb;IAED,IAAM,oBAAoB,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACrE,oFAAoF;IACpF,IACE,WAAW,KAAK,oBAAoB;QACpC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAChD;QACA,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAClC,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAChC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,EAAE,CAAC,CAClE,CACF,CAAC;QACF,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAxCD,4EAwCC;AAED,SAAS,uBAAuB,CAC9B,IAAsB;IAEtB,IAAM,oBAAoB,GACxB,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB;QACtC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CACxB,UAAC,CAAmB;YAClB,OAAA,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB;QAAhE,CAAgE,CACnE,CAAC;IAEJ,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,WAAW,CAAC;KACpB;IAED,IAAI,oBAAoB,CAAC,IAAI,KAAK,gBAAgB,EAAE;QAClD,OAAO,oBAAoB,CAAC;KAC7B;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAuB;IAEvB,IAAM,cAAc,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CACxC,UAAC,CAAmB;QAClB,OAAA,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;IAA1D,CAA0D,CAC7D,CAAC;IAEF,IAAI,CAAC,cAAc,EAAE;QACnB,OAAO,WAAW,CAAC;KACpB;IAED,IAAI,cAAc,CAAC,IAAI,KAAK,gBAAgB,EAAE;QAC5C,OAAO,cAAc,CAAC;KACvB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,uCAAuC,CACrD,OAAkB;IAElB,IAAM,gBAAgB,GAAG,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC;IACtD,IAAM,uBAAuB,GAAG,6BAA6B,EAAE,CAAC;IAChE,IAAM,iBAAiB,GAAG,gBAAgB,GAAG,CAAC,CAAC;IAC/C,IAAI,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;QAC3C,4BAA4B;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;KACvE;SAAM;QACL,oBAAoB;QACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;KAC5C;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAdD,0FAcC;AAED;;GAEG;AACH,SAAS,6BAA6B;IACpC,OAAO,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QACpC,CAAC,CAAC,kBAAkB,CAClB,CAAC,CAAC,aAAa,CAAC;YACd,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;gBACpB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC;gBAChD,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC;gBAClD,SAAS,EAAE,IAAI;aAChB,CAAC;SACH,CAAC,EACF,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YACxC,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC;SACtE,CAAC,CACH;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAe,sBAAsB;;;;;wBACZ,qBAAM,IAAA,8BAAgB,EAC3C,KAAK,CAAC,MAAM,CAAC;wBACX,OAAO,EAAE,wFAAwF;wBACjG,OAAO,EAAE;4BACP;gCACE,KAAK,EAAE,kCAAkC;gCACzC,KAAK,EAAE,IAAI;6BACZ;4BACD;gCACE,KAAK,EAAE,qDAAqD;gCAC5D,KAAK,EAAE,KAAK;6BACb;yBACF;wBACD,YAAY,EAAE,IAAI;qBACnB,CAAC,CACH,EAAA;;oBAfK,cAAc,GAAG,SAetB;oBAED,IAAI,CAAC,cAAc,EAAE;wBACnB,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;qBAC5D;oBAED,sBAAO,cAAc,EAAC;;;;CACvB;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,OAAkB;;IAElB,wBAAwB;IACxB,IAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAC,CAAC;QACzC,IACE,CAAC,CAAC,IAAI,KAAK,qBAAqB;YAChC,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC3B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB;YAC/C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;YAC1C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,EACtC;YACA,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAsC,CAAC;IAExC,IACE,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC,CAAC,EAAE,IAAI,MAAK,oBAAoB;QAC7D,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC,CAAC,EAAE,IAAI,0CAAE,IAAI,MAAK,kBAAkB,EACjE;QACA,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QACjD,OAAO,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC5C;IAED,uBAAuB;IACvB,IAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAC,CAAC;QACxC,IACE,CAAC,CAAC,IAAI,KAAK,qBAAqB;YAChC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,sBAAsB;YAC5C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAC7C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;YAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC1C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;YAChD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAC7C;YACA,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAsC,CAAC;IAExC,IACE,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAqC,CAAA,CAAC,KAAK,CAAC,IAAI;QAChE,kBAAkB,EAClB;QACA,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAChD,OAAO,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAqC,CAAA;aACzD,KAA2B,CAAC;KAChC;IAED,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,SAAS,CAAC;AACnB,CAAC;AApDD,oDAoDC;AAED,SAAS,qBAAqB,CAAC,MAAe;IAC5C,OAAO,IAAA,6BAAe,EAAC,MAAM,EAAE,UAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,OAAA,SAAS,CAAC,6FACZ,IAAI,CACJ,4GAA4G,CAC7G,qCAGG,IAAI,CAAC,2EAEJ,CAAC,iFAIL,CAAC;IAZE,CAYF,CACC,CAAC;AACJ,CAAC","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { ProxifiedModule, parseModule, writeFile } from 'magicast';\nimport * as fs from 'fs';\nimport * as Sentry from '@sentry/node';\n\nimport {\n getLastRequireIndex,\n hasSentryContent,\n removeRequire,\n} from '../utils/ast-utils';\nimport {\n abortIfCancelled,\n makeCodeSnippet,\n showCopyPasteInstructions,\n} from '../utils/clack-utils';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\nimport chalk from 'chalk';\n\nconst b = recast.types.builders;\n\nconst metroConfigPath = 'metro.config.js';\n\nexport async function patchMetroConfig() {\n const mod = await parseMetroConfig();\n\n const showInstructions = () =>\n showCopyPasteInstructions(metroConfigPath, getMetroConfigSnippet(true));\n\n if (hasSentryContent(mod.$ast as t.Program)) {\n const shouldContinue = await confirmPathMetroConfig();\n if (!shouldContinue) {\n return await showInstructions();\n }\n }\n\n const configObj = getMetroConfigObject(mod.$ast as t.Program);\n if (!configObj) {\n clack.log.warn(\n 'Could not find Metro config object, please follow the manual steps.',\n );\n return showInstructions();\n }\n\n const addedSentrySerializer = addSentrySerializerToMetroConfig(configObj);\n if (!addedSentrySerializer) {\n clack.log.warn(\n 'Could not add Sentry serializer to Metro config, please follow the manual steps.',\n );\n return await showInstructions();\n }\n\n const addedSentrySerializerImport = addSentrySerializerRequireToMetroConfig(\n mod.$ast as t.Program,\n );\n if (!addedSentrySerializerImport) {\n clack.log.warn(\n 'Could not add Sentry serializer import to Metro config, please follow the manual steps.',\n );\n return await showInstructions();\n }\n\n clack.log.success(\n `Added Sentry Metro plugin to ${chalk.cyan(metroConfigPath)}.`,\n );\n\n const saved = await writeMetroConfig(mod);\n if (saved) {\n clack.log.success(\n chalk.green(`${chalk.cyan(metroConfigPath)} changes saved.`),\n );\n } else {\n clack.log.warn(\n `Could not save changes to ${chalk.cyan(\n metroConfigPath,\n )}, please follow the manual steps.`,\n );\n return await showInstructions();\n }\n}\n\nexport async function unPatchMetroConfig() {\n const mod = await parseMetroConfig();\n\n const removedAtLeastOneRequire = removeSentryRequire(mod.$ast as t.Program);\n const removedSerializerConfig = removeSentrySerializerFromMetroConfig(\n mod.$ast as t.Program,\n );\n\n if (removedAtLeastOneRequire || removedSerializerConfig) {\n const saved = await writeMetroConfig(mod);\n if (saved) {\n clack.log.success(\n `Removed Sentry Metro plugin from ${chalk.cyan(metroConfigPath)}.`,\n );\n }\n } else {\n clack.log.warn(\n `No Sentry Metro plugin found in ${chalk.cyan(metroConfigPath)}.`,\n );\n }\n}\n\nexport function removeSentrySerializerFromMetroConfig(\n program: t.Program,\n): boolean {\n const configObject = getMetroConfigObject(program);\n if (!configObject) {\n return false;\n }\n\n const serializerProp = getSerializerProp(configObject);\n if ('invalid' === serializerProp || 'undefined' === serializerProp) {\n return false;\n }\n\n const customSerializerProp = getCustomSerializerProp(serializerProp);\n if (\n 'invalid' === customSerializerProp ||\n 'undefined' === customSerializerProp\n ) {\n return false;\n }\n\n if (\n serializerProp.value.type === 'ObjectExpression' &&\n customSerializerProp.value.type === 'CallExpression' &&\n customSerializerProp.value.callee.type === 'Identifier' &&\n customSerializerProp.value.callee.name === 'createSentryMetroSerializer'\n ) {\n if (customSerializerProp.value.arguments.length === 0) {\n // FROM serializer: { customSerializer: createSentryMetroSerializer() }\n // TO serializer: {}\n let removed = false;\n serializerProp.value.properties = serializerProp.value.properties.filter(\n (p) => {\n if (\n p.type === 'ObjectProperty' &&\n p.key.type === 'Identifier' &&\n p.key.name === 'customSerializer'\n ) {\n removed = true;\n return false;\n }\n return true;\n },\n );\n\n if (removed) {\n return true;\n }\n } else {\n if (customSerializerProp.value.arguments[0].type !== 'SpreadElement') {\n // FROM serializer: { customSerializer: createSentryMetroSerializer(wrapperSerializer) }\n // TO serializer: { customSerializer: wrapperSerializer }\n customSerializerProp.value = customSerializerProp.value.arguments[0];\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function removeSentryRequire(program: t.Program): boolean {\n return removeRequire(program, '@sentry');\n}\n\nasync function parseMetroConfig(): Promise<ProxifiedModule> {\n const metroConfigContent = (\n await fs.promises.readFile(metroConfigPath)\n ).toString();\n\n return parseModule(metroConfigContent);\n}\n\nasync function writeMetroConfig(mod: ProxifiedModule): Promise<boolean> {\n try {\n await writeFile(mod.$ast, metroConfigPath);\n } catch (e) {\n clack.log.error(\n `Failed to write to ${chalk.cyan(metroConfigPath)}: ${JSON.stringify(e)}`,\n );\n return false;\n }\n return true;\n}\n\nexport function addSentrySerializerToMetroConfig(\n configObj: t.ObjectExpression,\n): boolean {\n const serializerProp = getSerializerProp(configObj);\n if ('invalid' === serializerProp) {\n return false;\n }\n\n // case 1: serializer property doesn't exist yet, so we can just add it\n if ('undefined' === serializerProp) {\n configObj.properties.push(\n b.objectProperty(\n b.identifier('serializer'),\n b.objectExpression([\n b.objectProperty(\n b.identifier('customSerializer'),\n b.callExpression(b.identifier('createSentryMetroSerializer'), []),\n ),\n ]),\n ),\n );\n return true;\n }\n\n const customSerializerProp = getCustomSerializerProp(serializerProp);\n // case 2: serializer.customSerializer property doesn't exist yet, so we just add it\n if (\n 'undefined' === customSerializerProp &&\n serializerProp.value.type === 'ObjectExpression'\n ) {\n serializerProp.value.properties.push(\n b.objectProperty(\n b.identifier('customSerializer'),\n b.callExpression(b.identifier('createSentryMetroSerializer'), []),\n ),\n );\n return true;\n }\n\n return false;\n}\n\nfunction getCustomSerializerProp(\n prop: t.ObjectProperty,\n): t.ObjectProperty | 'undefined' | 'invalid' {\n const customSerializerProp =\n prop.value.type === 'ObjectExpression' &&\n prop.value.properties.find(\n (p: t.ObjectProperty) =>\n p.key.type === 'Identifier' && p.key.name === 'customSerializer',\n );\n\n if (!customSerializerProp) {\n return 'undefined';\n }\n\n if (customSerializerProp.type === 'ObjectProperty') {\n return customSerializerProp;\n }\n\n return 'invalid';\n}\n\nfunction getSerializerProp(\n obj: t.ObjectExpression,\n): t.ObjectProperty | 'undefined' | 'invalid' {\n const serializerProp = obj.properties.find(\n (p: t.ObjectProperty) =>\n p.key.type === 'Identifier' && p.key.name === 'serializer',\n );\n\n if (!serializerProp) {\n return 'undefined';\n }\n\n if (serializerProp.type === 'ObjectProperty') {\n return serializerProp;\n }\n\n return 'invalid';\n}\n\nexport function addSentrySerializerRequireToMetroConfig(\n program: t.Program,\n): boolean {\n const lastRequireIndex = getLastRequireIndex(program);\n const sentrySerializerRequire = createSentrySerializerRequire();\n const sentryImportIndex = lastRequireIndex + 1;\n if (sentryImportIndex < program.body.length) {\n // insert after last require\n program.body.splice(lastRequireIndex + 1, 0, sentrySerializerRequire);\n } else {\n // insert at the end\n program.body.push(sentrySerializerRequire);\n }\n return true;\n}\n\n/**\n * Creates const {createSentryMetroSerializer} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');\n */\nfunction createSentrySerializerRequire() {\n return b.variableDeclaration('const', [\n b.variableDeclarator(\n b.objectPattern([\n b.objectProperty.from({\n key: b.identifier('createSentryMetroSerializer'),\n value: b.identifier('createSentryMetroSerializer'),\n shorthand: true,\n }),\n ]),\n b.callExpression(b.identifier('require'), [\n b.literal('@sentry/react-native/dist/js/tools/sentryMetroSerializer'),\n ]),\n ),\n ]);\n}\n\nasync function confirmPathMetroConfig() {\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: `Metro Config already contains Sentry-related code. Should the wizard modify it anyway?`,\n options: [\n {\n label: 'Yes, add the Sentry Metro plugin',\n value: true,\n },\n {\n label: 'No, show me instructions to manually add the plugin',\n value: false,\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldContinue) {\n Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');\n }\n\n return shouldContinue;\n}\n\n/**\n * Returns value from `module.exports = value` or `const config = value`\n */\nexport function getMetroConfigObject(\n program: t.Program,\n): t.ObjectExpression | undefined {\n // check config variable\n const configVariable = program.body.find((s) => {\n if (\n s.type === 'VariableDeclaration' &&\n s.declarations.length === 1 &&\n s.declarations[0].type === 'VariableDeclarator' &&\n s.declarations[0].id.type === 'Identifier' &&\n s.declarations[0].id.name === 'config'\n ) {\n return true;\n }\n return false;\n }) as t.VariableDeclaration | undefined;\n\n if (\n configVariable?.declarations[0].type === 'VariableDeclarator' &&\n configVariable?.declarations[0].init?.type === 'ObjectExpression'\n ) {\n Sentry.setTag('metro-config', 'config-variable');\n return configVariable.declarations[0].init;\n }\n\n // check module.exports\n const moduleExports = program.body.find((s) => {\n if (\n s.type === 'ExpressionStatement' &&\n s.expression.type === 'AssignmentExpression' &&\n s.expression.left.type === 'MemberExpression' &&\n s.expression.left.object.type === 'Identifier' &&\n s.expression.left.object.name === 'module' &&\n s.expression.left.property.type === 'Identifier' &&\n s.expression.left.property.name === 'exports'\n ) {\n return true;\n }\n return false;\n }) as t.ExpressionStatement | undefined;\n\n if (\n (moduleExports?.expression as t.AssignmentExpression).right.type ===\n 'ObjectExpression'\n ) {\n Sentry.setTag('metro-config', 'module-exports');\n return (moduleExports?.expression as t.AssignmentExpression)\n .right as t.ObjectExpression;\n }\n\n Sentry.setTag('metro-config', 'not-found');\n return undefined;\n}\n\nfunction getMetroConfigSnippet(colors: boolean) {\n return makeCodeSnippet(colors, (unchanged, plus, _) =>\n unchanged(`const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');\";\n${plus(\n \"const {createSentryMetroSerializer} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');\",\n)}\n\nconst config = {\n ${plus(`serializer: {\n customSerializer: createSentryMetroSerializer(),\n },`)}\n};\n\nmodule.exports = mergeConfig(getDefaultConfig(__dirname), config);\n`),\n );\n}\n"]}
@@ -4,6 +4,8 @@ export declare const RN_SDK_PACKAGE = "@sentry/react-native";
4
4
  export declare const RN_PACKAGE = "react-native";
5
5
  export declare const RN_HUMAN_NAME = "React Native";
6
6
  export declare const SUPPORTED_RN_RANGE = ">=0.69.0";
7
+ export declare const SDK_XCODE_SCRIPTS_SUPPORTED_SDK_RANGE = ">=5.11.0";
8
+ export declare const SDK_SENTRY_METRO_PLUGIN_SUPPORTED_SDK_RANGE = ">=5.11.0";
7
9
  export type RNCliSetupConfigContent = Pick<Required<CliSetupConfigContent>, 'authToken' | 'org' | 'project' | 'url'>;
8
10
  export declare function runReactNativeWizard(params: ReactNativeWizardOptions): Promise<void>;
9
11
  export declare function runReactNativeWizardWithTelemetry(options: ReactNativeWizardOptions): Promise<void>;