@sentry/wizard 3.16.5 → 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.
- package/CHANGELOG.md +7 -0
- package/dist/package.json +2 -2
- package/dist/src/apple/cocoapod.js +2 -0
- package/dist/src/apple/cocoapod.js.map +1 -1
- package/dist/src/react-native/metro.d.ts +13 -0
- package/dist/src/react-native/metro.js +398 -0
- package/dist/src/react-native/metro.js.map +1 -0
- package/dist/src/react-native/react-native-wizard.d.ts +2 -0
- package/dist/src/react-native/react-native-wizard.js +139 -38
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/uninstall.js +4 -0
- package/dist/src/react-native/uninstall.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +7 -3
- package/dist/src/react-native/xcode.js +43 -11
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +80 -37
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/remix/sdk-setup.d.ts +1 -0
- package/dist/src/remix/sdk-setup.js +21 -1
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/utils/ast-utils.d.ts +14 -0
- package/dist/src/utils/ast-utils.js +49 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/test/react-native/metro.test.d.ts +1 -0
- package/dist/test/react-native/metro.test.js +125 -0
- package/dist/test/react-native/metro.test.js.map +1 -0
- package/dist/test/react-native/xcode.test.js +40 -2
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/package.json +2 -2
- package/src/apple/cocoapod.ts +2 -0
- package/src/react-native/metro.ts +409 -0
- package/src/react-native/react-native-wizard.ts +103 -7
- package/src/react-native/uninstall.ts +3 -0
- package/src/react-native/xcode.ts +70 -12
- package/src/remix/remix-wizard.ts +51 -15
- package/src/remix/sdk-setup.ts +31 -0
- package/src/utils/ast-utils.ts +52 -0
- package/test/react-native/metro.test.ts +283 -0
- package/test/react-native/xcode.test.ts +76 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
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
|
+
|
|
3
10
|
## 3.16.5
|
|
4
11
|
|
|
5
12
|
- fix(wizard): Update wizard API data type and issue stream url creation (#500)
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/wizard",
|
|
3
|
-
"version": "3.
|
|
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.
|
|
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;;;;
|
|
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>;
|