@sentry/wizard 3.20.1 → 3.20.3-beta.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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.20.3-beta.0
4
+
5
+ - ref(wizard): Remove `axios` in favor of `node-fetch` (#526)
6
+
7
+ ## 3.20.2
8
+
9
+ - ref(wizard): Print error object if wizard endpoint API request failed (#524)
10
+
3
11
  ## 3.20.1
4
12
 
5
13
  - fix(nextjs): Replace deprecated Sentry API calls in example page templates (#520)
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "3.20.1",
3
+ "version": "3.20.3-beta.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,12 +27,12 @@
27
27
  "@clack/prompts": "0.7.0",
28
28
  "@sentry/cli": "^1.72.0",
29
29
  "@sentry/node": "^7.69.0",
30
- "axios": "1.6.0",
31
30
  "chalk": "^2.4.1",
32
31
  "glob": "^7.1.3",
33
32
  "inquirer": "^6.2.0",
34
33
  "lodash": "^4.17.15",
35
34
  "magicast": "^0.2.10",
35
+ "node-fetch": "^3.3.2",
36
36
  "opn": "^5.4.0",
37
37
  "r2": "^2.0.1",
38
38
  "read-env": "^1.3.0",
@@ -74,7 +74,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
74
74
  exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = exports.getOrAskForProjectData = exports.isUsingTypeScript = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliConfig = exports.installPackage = exports.confirmContinueIfPackageVersionNotSupported = exports.askForItemSelection = exports.askToInstallSentryCLI = exports.confirmContinueIfNoOrDirtyGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = exports.propertiesCliSetupConfig = exports.rcCliSetupConfig = exports.SENTRY_PROPERTIES_FILE = exports.SENTRY_CLI_RC_FILE = exports.SENTRY_DOT_ENV_FILE = void 0;
75
75
  // @ts-ignore - clack is ESM and TS complains about that. It works though
76
76
  var clack = __importStar(require("@clack/prompts"));
77
- var axios_1 = __importDefault(require("axios"));
78
77
  var chalk_1 = __importDefault(require("chalk"));
79
78
  var childProcess = __importStar(require("child_process"));
80
79
  var fs = __importStar(require("fs"));
@@ -822,43 +821,61 @@ function askForSelfHosted(urlFromArgs) {
822
821
  }
823
822
  function askForWizardLogin(options) {
824
823
  return __awaiter(this, void 0, void 0, function () {
825
- var hasSentryAccount, wizardHash, _a, loginUrl, urlToOpen, loginSpinner, data;
826
- return __generator(this, function (_b) {
827
- switch (_b.label) {
824
+ var hasSentryAccount, nodeFetch, wizardHash, response, data_1, e_2, loginUrl, urlToOpen, loginSpinner, data;
825
+ var _this = this;
826
+ return __generator(this, function (_a) {
827
+ switch (_a.label) {
828
828
  case 0:
829
829
  Sentry.setTag('has-promo-code', !!options.promoCode);
830
830
  return [4 /*yield*/, clack.confirm({
831
831
  message: 'Do you already have a Sentry account?',
832
832
  })];
833
833
  case 1:
834
- hasSentryAccount = _b.sent();
834
+ hasSentryAccount = _a.sent();
835
835
  return [4 /*yield*/, abortIfCancelled(hasSentryAccount)];
836
836
  case 2:
837
- hasSentryAccount = _b.sent();
837
+ hasSentryAccount = _a.sent();
838
838
  Sentry.setTag('already-has-sentry-account', hasSentryAccount);
839
- _b.label = 3;
839
+ return [4 /*yield*/, import('node-fetch').then(function (m) { return m.default; })];
840
840
  case 3:
841
- _b.trys.push([3, 5, , 10]);
842
- return [4 /*yield*/, axios_1.default.get("".concat(options.url, "api/0/wizard/"))];
841
+ nodeFetch = _a.sent();
842
+ _a.label = 4;
843
843
  case 4:
844
- wizardHash = (_b.sent()).data.hash;
845
- return [3 /*break*/, 10];
844
+ _a.trys.push([4, 7, , 12]);
845
+ return [4 /*yield*/, nodeFetch("".concat(options.url, "api/0/wizard/"))];
846
846
  case 5:
847
- _a = _b.sent();
848
- if (!(options.url !== SAAS_URL)) return [3 /*break*/, 7];
849
- clack.log.error('Loading Wizard failed. Did you provide the right URL?');
850
- return [4 /*yield*/, abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'))];
847
+ response = _a.sent();
848
+ return [4 /*yield*/, response.json()];
851
849
  case 6:
852
- _b.sent();
853
- return [3 /*break*/, 9];
850
+ data_1 = (_a.sent());
851
+ wizardHash = data_1 === null || data_1 === void 0 ? void 0 : data_1.hash;
852
+ return [3 /*break*/, 12];
854
853
  case 7:
854
+ e_2 = _a.sent();
855
+ if (!(options.url !== SAAS_URL)) return [3 /*break*/, 9];
856
+ clack.log.error('Loading Wizard failed. Did you provide the right URL?');
857
+ clack.log.info(JSON.stringify(e_2, null, 2));
858
+ return [4 /*yield*/, abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'))];
859
+ case 8:
860
+ _a.sent();
861
+ return [3 /*break*/, 11];
862
+ case 9:
855
863
  clack.log.error('Loading Wizard failed.');
864
+ clack.log.info(JSON.stringify(e_2, null, 2));
856
865
  return [4 /*yield*/, abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'))];
857
- case 8:
858
- _b.sent();
859
- _b.label = 9;
860
- case 9: return [3 /*break*/, 10];
861
866
  case 10:
867
+ _a.sent();
868
+ _a.label = 11;
869
+ case 11: return [3 /*break*/, 12];
870
+ case 12:
871
+ if (!!wizardHash) return [3 /*break*/, 14];
872
+ clack.log.error('Loading Wizard failed.');
873
+ clack.log.info("Didn't receive a wizard hash from the server.");
874
+ return [4 /*yield*/, abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'))];
875
+ case 13:
876
+ _a.sent();
877
+ return [2 /*return*/, Promise.reject()];
878
+ case 14:
862
879
  loginUrl = new url_1.URL("".concat(options.url, "account/settings/wizard/").concat(wizardHash, "/"));
863
880
  if (!hasSentryAccount) {
864
881
  loginUrl.searchParams.set('signup', '1');
@@ -878,18 +895,30 @@ function askForWizardLogin(options) {
878
895
  loginSpinner.start('Waiting for you to log in using the link above');
879
896
  return [4 /*yield*/, new Promise(function (resolve) {
880
897
  var pollingInterval = (0, timers_1.setInterval)(function () {
881
- axios_1.default
882
- .get("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"), {
898
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore
899
+ nodeFetch("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"), {
883
900
  headers: {
884
901
  'Accept-Encoding': 'deflate',
885
902
  },
886
903
  })
887
- .then(function (result) {
888
- resolve(result.data);
889
- clearTimeout(timeout);
890
- clearInterval(pollingInterval);
891
- void axios_1.default.delete("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"));
892
- })
904
+ .then(function (result) { return __awaiter(_this, void 0, void 0, function () {
905
+ var data;
906
+ return __generator(this, function (_a) {
907
+ switch (_a.label) {
908
+ case 0: return [4 /*yield*/, result.json()];
909
+ case 1:
910
+ data = (_a.sent());
911
+ resolve(data);
912
+ clearTimeout(timeout);
913
+ clearInterval(pollingInterval);
914
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore
915
+ void nodeFetch("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"), {
916
+ method: 'DELETE',
917
+ });
918
+ return [2 /*return*/];
919
+ }
920
+ });
921
+ }); })
893
922
  .catch(function () {
894
923
  // noop - just try again
895
924
  });
@@ -901,8 +930,8 @@ function askForWizardLogin(options) {
901
930
  void abort('Please restart the Wizard and log in to complete the setup.');
902
931
  }, 180000);
903
932
  })];
904
- case 11:
905
- data = _b.sent();
933
+ case 15:
934
+ data = _a.sent();
906
935
  loginSpinner.stop('Login complete.');
907
936
  Sentry.setTag('opened-wizard-link', true);
908
937
  return [2 /*return*/, data];
@@ -1082,7 +1111,7 @@ exports.makeCodeSnippet = makeCodeSnippet;
1082
1111
  */
1083
1112
  function createNewConfigFile(filepath, codeSnippet, moreInformation) {
1084
1113
  return __awaiter(this, void 0, void 0, function () {
1085
- var prettyFilename, e_2;
1114
+ var prettyFilename, e_3;
1086
1115
  return __generator(this, function (_a) {
1087
1116
  switch (_a.label) {
1088
1117
  case 0:
@@ -1103,8 +1132,8 @@ function createNewConfigFile(filepath, codeSnippet, moreInformation) {
1103
1132
  }
1104
1133
  return [2 /*return*/, true];
1105
1134
  case 3:
1106
- e_2 = _a.sent();
1107
- (0, debug_1.debug)(e_2);
1135
+ e_3 = _a.sent();
1136
+ (0, debug_1.debug)(e_3);
1108
1137
  clack.log.warn("Could not create a new ".concat(prettyFilename, " file. Please create one manually and follow the instructions below."));
1109
1138
  return [3 /*break*/, 4];
1110
1139
  case 4: return [2 /*return*/, false];
@@ -1 +1 @@
1
- {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yEAAyE;AACzE,oDAAwC;AACxC,gDAA0B;AAC1B,gDAA0B;AAC1B,0DAA8C;AAC9C,qCAAyB;AACzB,yCAA6B;AAC7B,qCAAyB;AACzB,iCAAqC;AACrC,2BAA0B;AAC1B,mDAAuC;AACvC,+CAAqE;AAErE,0CAAyC;AACzC,qDAK2B;AAC3B,iCAAgC;AAChC,mCAAgD;AAEhD,IAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAEc,CAAC;AAE3B,QAAA,mBAAmB,GAAG,0BAA0B,CAAC;AACjD,QAAA,kBAAkB,GAAG,cAAc,CAAC;AACpC,QAAA,sBAAsB,GAAG,mBAAmB,CAAC;AAE1D,IAAM,QAAQ,GAAG,oBAAoB,CAAC;AA+BzB,QAAA,gBAAgB,GAAmB;IAC9C,QAAQ,EAAE,0BAAkB;IAC5B,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,IAAI;IACf,yBAAyB,EAAE,UAAU,QAAgB;QACnD,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,YAAY,EAAE,UAAU,SAAiB;QACvC,OAAO,wBAAiB,SAAS,CAAE,CAAC;IACtC,CAAC;IACD,6BAA6B,EAAE,UAAU,QAAgB;QACvD,OAAO,CAAC,CAAC,CACP,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/B,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAC7B,CAAC;IACJ,CAAC;IACD,iBAAiB,EAAE,UAAU,GAAW,EAAE,OAAe;QACvD,OAAO,0BAAmB,GAAG,uBAAa,OAAO,CAAE,CAAC;IACtD,CAAC;CACF,CAAC;AAEW,QAAA,wBAAwB,GAA6B;IAChE,QAAQ,EAAE,8BAAsB;IAChC,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,aAAa;IACnB,yBAAyB,YAAC,QAAgB;QACxC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IACD,YAAY,YAAC,SAAiB;QAC5B,OAAO,qBAAc,SAAS,CAAE,CAAC;IACnC,CAAC;IACD,6BAA6B,YAAC,QAAgB;QAC5C,OAAO,CAAC,CAAC,CACP,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAClC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CACvC,CAAC;IACJ,CAAC;IACD,iBAAiB,YAAC,GAAW,EAAE,OAAe;QAC5C,OAAO,uBAAgB,GAAG,gCAAsB,OAAO,CAAE,CAAC;IAC5D,CAAC;IACD,mBAAmB,YAAC,QAAgB;QAClC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IACD,UAAU,YAAC,GAAW;QACpB,OAAO,uBAAgB,GAAG,CAAE,CAAC;IAC/B,CAAC;CACF,CAAC;AAEF,SAAsB,KAAK,CAAC,OAAgB,EAAE,MAAe;;;;;;oBAC3D,KAAK,CAAC,KAAK,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,yBAAyB,CAAC,CAAC;oBAC5C,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;oBACnC,iBAAiB,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,CAAC;oBAChE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,SAAS,CAAC,SAAS,CAAC,CAAC;oBACxC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,MAAM,EAAE,CAAC;oBACtB,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC;oBACxD,IAAI,aAAa,EAAE;wBACjB,aAAa,CAAC,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC7D,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;qBAChC;oBACD,qBAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAA;;oBAAxB,SAAwB,CAAC;oBACzB,sBAAO,OAAO,CAAC,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,CAAC,CAAC,EAAC;;;;CAClC;AAbD,sBAaC;AAED,SAAsB,gBAAgB,CACpC,KAAqB;;;;;;oBAEjB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,QAAQ,CAAA;oBAAC,qBAAM,KAAK,EAAA;;yBAA1B,cAAe,SAAW,EAAC,EAA3B,wBAA2B;oBAC7B,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;oBAClC,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;oBACnC,iBAAiB,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,CAAC;oBAChE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,SAAS,CAAC,WAAW,CAAC,CAAC;oBAC1C,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,MAAM,EAAE,CAAC;oBAC5B,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBAC/B,qBAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAA;;oBAAxB,SAAwB,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;wBAEhB,sBAAO,KAA2B,EAAC;;;;;CAEtC;AAfD,4CAeC;AAED,SAAgB,YAAY,CAAC,OAK5B;IACC,IAAI,aAAa,GAAyB,EAAE,CAAC;IAE7C,IAAI;QACF,mEAAmE;QACnE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAC/C,IAAI,EACJ,cAAc,CACf,CAAC,CAAC;KACJ;IAAC,WAAM;QACN,6BAA6B;KAC9B;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,CAAC,KAAK,CAAC,eAAK,CAAC,OAAO,CAAC,WAAI,OAAO,CAAC,UAAU,MAAG,CAAC,CAAC,CAAC;IAEtD,IAAI,WAAW,GACb,OAAO,CAAC,OAAO;QACf,cAAO,OAAO,CAAC,UAAU,sFAAmF,CAAC;IAE/G,IAAI,OAAO,CAAC,SAAS,EAAE;QACrB,WAAW,GAAG,UAAG,WAAW,mCAAyB,OAAO,CAAC,SAAS,CAAE,CAAC;KAC1E;IAED,IAAI,aAAa,CAAC,OAAO,EAAE;QACzB,WAAW,GAAG,UAAG,WAAW,0BAAgB,aAAa,CAAC,OAAO,CAAE,CAAC;KACrE;IAED,IAAI,OAAO,CAAC,gBAAgB,EAAE;QAC5B,WAAW,GAAG,UAAG,WAAW,+JAGe,eAAK,CAAC,UAAU,CACzD,mCAAmC,CACpC,MAAG,CAAC;KACN;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1B,CAAC;AA7CD,oCA6CC;AAED,SAAsB,iCAAiC;;;;YACrD,sBAAO,IAAA,qBAAS,EAAC,kBAAkB,EAAE;;;;;qCAC/B,CAAC,WAAW,EAAE,EAAd,wBAAc;gCACW,qBAAM,gBAAgB,CAC/C,KAAK,CAAC,OAAO,CAAC;wCACZ,OAAO,EACL,+GAA+G;qCAClH,CAAC,CACH,EAAA;;gCALK,kBAAkB,GAAG,SAK1B;gCAED,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;qCAEtD,CAAC,kBAAkB,EAAnB,wBAAmB;gCACrB,qBAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAA;;gCAAzB,SAAyB,CAAC;;;gCAIxB,2BAA2B,GAAG,8BAA8B,EAAE,CAAC;qCACjE,2BAA2B,CAAC,MAAM,EAAlC,wBAAkC;gCACpC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,mEAEN,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,iDAEC,CAClC,CAAC;gCAC4B,qBAAM,gBAAgB,CAClD,KAAK,CAAC,OAAO,CAAC;wCACZ,OAAO,EAAE,iCAAiC;qCAC3C,CAAC,CACH,EAAA;;gCAJK,qBAAqB,GAAG,SAI7B;gCAED,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,qBAAqB,CAAC,CAAC;qCAE7D,CAAC,qBAAqB,EAAtB,wBAAsB;gCACxB,qBAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAA;;gCAAzB,SAAyB,CAAC;;;;;qBAG/B,CAAC,EAAC;;;CACJ;AAvCD,8EAuCC;AAED,SAAS,WAAW;IAClB,IAAI;QACF,YAAY,CAAC,QAAQ,CAAC,qCAAqC,EAAE;YAC3D,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;KACb;IAAC,WAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED,SAAS,8BAA8B;IACrC,IAAI;QACF,IAAM,SAAS,GAAG,YAAY;aAC3B,QAAQ,CAAC,2BAA2B,CAAC;aACrC,QAAQ,EAAE,CAAC;QAEd,IAAM,KAAK,GAAG,SAAS;aACpB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;aACb,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,EAAE,EAAX,CAAW,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,YAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,EAAxB,CAAwB,CAAC,CAAC;QAExC,OAAO,KAAK,CAAC;KACd;IAAC,WAAM;QACN,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAED,SAAsB,qBAAqB;;;;wBAClC,qBAAM,gBAAgB,CAC3B,KAAK,CAAC,OAAO,CAAC;wBACZ,OAAO,EACL,iEAAiE;qBACpE,CAAC,CACH,EAAA;wBALD,sBAAO,SAKN,EAAC;;;;CACH;AAPD,sDAOC;AAED,SAAsB,mBAAmB,CACvC,KAAe,EACf,OAAe;;;;;wBAGb,qBAAM,gBAAgB,CACpB,KAAK,CAAC,MAAM,CAAC;wBACX,QAAQ,EAAE,EAAE;wBACZ,OAAO,EAAE,OAAO;wBAChB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK;4BAC7B,OAAO;gCACL,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;gCACpC,KAAK,EAAE,IAAI;6BACZ,CAAC;wBACJ,CAAC,CAAC;qBACH,CAAC,CACH,EAAA;;oBAZG,SAAS,GACb,SAWC;oBAEH,sBAAO,SAAS,EAAC;;;;CAClB;AAnBD,kDAmBC;AAED,SAAsB,2CAA2C,CAAC,EAUjE;QATC,SAAS,eAAA,EACT,WAAW,iBAAA,EACX,cAAc,oBAAA,EACd,kBAAkB,wBAAA;;;;YAOlB,sBAAO,IAAA,qBAAS,EAAC,uBAAuB,EAAE;;;;;gCACxC,MAAM,CAAC,MAAM,CAAC,UAAG,WAAW,CAAC,WAAW,EAAE,aAAU,EAAE,cAAc,CAAC,CAAC;gCAChE,kBAAkB,GAAG,IAAA,6BAAoB,EAAC;oCAC9C,kBAAkB,oBAAA;oCAClB,OAAO,EAAE,cAAc;oCACvB,WAAW,EAAE,IAAI;iCAClB,CAAC,CAAC;gCAEH,IAAI,kBAAkB,EAAE;oCACtB,MAAM,CAAC,MAAM,CAAC,UAAG,WAAW,CAAC,WAAW,EAAE,eAAY,EAAE,IAAI,CAAC,CAAC;oCAC9D,sBAAO;iCACR;gCAED,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,6CAAsC,WAAW,8BAEnD,SAAS,cAAI,cAAc,CAAE,CAC5B,CAAC;gCAEF,KAAK,CAAC,IAAI,CACR,4BAAqB,kBAAkB,oEAC5B,eAAK,CAAC,IAAI,CACnB,0EAA0E,CAC3E,CAAE,CACJ,CAAC;gCACqC,qBAAM,gBAAgB,CAC3D,KAAK,CAAC,OAAO,CAAC;wCACZ,OAAO,EAAE,iCAAiC;qCAC3C,CAAC,CACH,EAAA;;gCAJK,8BAA8B,GAAG,SAItC;gCACD,MAAM,CAAC,MAAM,CACX,UAAG,WAAW,CAAC,WAAW,EAAE,uCAAoC,EAChE,8BAA8B,CAC/B,CAAC;qCAEE,CAAC,8BAA8B,EAA/B,wBAA+B;gCACjC,qBAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAA;;gCAAzB,SAAyB,CAAC;;;;;qBAE7B,CAAC,EAAC;;;CACJ;AAlDD,kGAkDC;AAED;;;;;GAKG;AACH,SAAsB,cAAc,CAAC,EAQpC;QAPC,WAAW,iBAAA,EACX,gBAAgB,sBAAA,EAChB,yBAAwB,EAAxB,iBAAiB,mBAAG,IAAI,KAAA;;;;YAMxB,sBAAO,IAAA,qBAAS,EAAC,iBAAiB,EAAE;;;;;qCAC9B,CAAA,gBAAgB,IAAI,iBAAiB,CAAA,EAArC,wBAAqC;gCACX,qBAAM,gBAAgB,CAChD,KAAK,CAAC,OAAO,CAAC;wCACZ,OAAO,EAAE,cAAO,eAAK,CAAC,IAAI,CAAC,IAAI,CAC7B,WAAW,CACZ,mFAAgF;qCAClF,CAAC,CACH,EAAA;;gCANK,mBAAmB,GAAG,SAM3B;gCAED,IAAI,CAAC,mBAAmB,EAAE;oCACxB,sBAAO;iCACR;;;gCAGG,iBAAiB,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;gCAEnB,qBAAM,iBAAiB,EAAE,EAAA;;gCAA1C,cAAc,GAAG,SAAyB;gCAEhD,iBAAiB,CAAC,KAAK,CACrB,UAAG,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,cAAI,eAAK,CAAC,IAAI,CAAC,IAAI,CAChE,WAAW,CACZ,mBAAS,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAG,CAC9C,CAAC;;;;gCAGA,qBAAM,IAAA,kDAAgC,EAAC,cAAc,EAAE,WAAW,CAAC,EAAA;;gCAAnE,SAAmE,CAAC;;;;gCAEpE,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gCAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,UAAG,eAAK,CAAC,GAAG,CACV,sDAAsD,CAEvD,iBAAO,GAAC,iBAAO,eAAK,CAAC,GAAG,CACvB,8HAA8H,CAC/H,CAAE,CACJ,CAAC;gCACF,qBAAM,KAAK,EAAE,EAAA;;gCAAb,SAAa,CAAC;;;gCAGhB,iBAAiB,CAAC,IAAI,CACpB,UAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,cAAI,eAAK,CAAC,IAAI,CAAC,IAAI,CAC9D,WAAW,CACZ,mBAAS,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAG,CAC9C,CAAC;;;;qBACH,CAAC,EAAC;;;CACJ;AAvDD,wCAuDC;AAED,SAAsB,kBAAkB,CACtC,EAAuD,EACvD,WAA8C;QAD5C,SAAS,eAAA,EAAE,GAAG,SAAA,EAAE,OAAO,aAAA,EAAE,GAAG,SAAA;IAC9B,4BAAA,EAAA,cAA8B,wBAAgB;;;;YAE9C,sBAAO,IAAA,qBAAS,EAAC,uBAAuB,EAAE;;;;;gCAClC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;gCAC5D,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gCAE3C,cAAc,GAChB,CAAC,YAAY,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gCAC9D,cAAc,GAAG,0BAA0B,CACzC,cAAc,EACd,SAAS,EACT,WAAW,CACZ,CAAC;gCACF,cAAc,GAAG,8BAA8B,CAC7C,cAAc,EACd,GAAG,EACH,OAAO,EACP,WAAW,CACZ,CAAC;gCACF,cAAc,GAAG,oBAAoB,CAAC,cAAc,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;;;;gCAGtE,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE;wCACtD,QAAQ,EAAE,MAAM;wCAChB,IAAI,EAAE,GAAG;qCACV,CAAC,EAAA;;gCAHF,SAGE,CAAC;gCACH,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,UAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,cAAI,eAAK,CAAC,IAAI,CACjD,WAAW,CAAC,QAAQ,CACrB,MAAG,CACL,CAAC;;;;gCAEF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,sCAA+B,eAAK,CAAC,IAAI,CACvC,WAAW,CAAC,QAAQ,CACrB,yBACC,WAAW,CAAC,IAAI,gDAC2B,CAC9C,CAAC;;;qCAGA,WAAW,CAAC,SAAS,EAArB,wBAAqB;gCACvB,qBAAM,2BAA2B,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAA;;gCAAvD,SAAuD,CAAC;;;gCAExD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAC7D,CAAC;;;;;qBAEL,CAAC,EAAC;;;CACJ;AAnDD,gDAmDC;AAED,SAAS,0BAA0B,CACjC,cAAsB,EACtB,SAA6B,EAC7B,WAA2B;IAE3B,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,cAAc,CAAC;KACvB;IAED,IAAI,WAAW,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE;QACzD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,WAAW,CAAC,QAAQ,CACrB,+CAA4C,CAC9C,CAAC;QACF,OAAO,cAAc,CAAC;KACvB;IAED,IAAM,WAAW,GAAG,UAAG,cAAc,eAAK,WAAW,CAAC,YAAY,CAChE,SAAS,CACV,OAAI,CAAC;IACN,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,8BAAuB,eAAK,CAAC,IAAI,CAC/B,WAAW,CAAC,QAAQ,CACrB,wCAA8B,WAAW,CAAC,IAAI,cAAW,CAC3D,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,8BAA8B,CACrC,cAAsB,EACtB,GAAuB,EACvB,OAA2B,EAC3B,WAA2B;IAE3B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACpB,OAAO,cAAc,CAAC;KACvB;IAED,IAAI,WAAW,CAAC,6BAA6B,CAAC,cAAc,CAAC,EAAE;QAC7D,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,WAAW,CAAC,QAAQ,CACrB,qDAAkD,CACpD,CAAC;QACF,OAAO,cAAc,CAAC;KACvB;IAED,IAAM,WAAW,GAAG,UAAG,cAAc,eAAK,WAAW,CAAC,iBAAiB,CACrE,GAAG,EACH,OAAO,CACR,OAAI,CAAC;IACN,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2CAAoC,eAAK,CAAC,IAAI,CAC5C,WAAW,CAAC,QAAQ,CACrB,wCAA8B,WAAW,CAAC,IAAI,cAAW,CAC3D,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAC3B,cAAsB,EACtB,GAAuB,EACvB,WAA2B;IAE3B,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;QACvE,OAAO,cAAc,CAAC;KACvB;IAED,IAAI,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE;QACnD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,wCAAqC,CACzE,CAAC;QACF,OAAO,cAAc,CAAC;KACvB;IAED,IAAM,WAAW,GAAG,UAAG,cAAc,eAAK,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,OAAI,CAAC;IAC1E,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,+BAAwB,eAAK,CAAC,IAAI,CAChC,WAAW,CAAC,QAAQ,CACrB,wCAA8B,WAAW,CAAC,IAAI,cAAW,CAC3D,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAsB,8BAA8B,CAClD,SAAiB;;;;;;oBAEX,aAAa,GAAG,ySAIH,SAAS,SAC7B,CAAC;oBAEM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAAmB,CAAC,CAAC;oBAC/D,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;yBAEnD,gBAAgB,EAAhB,wBAAgB;oBACZ,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;oBAE5D,YAAY,GAAG,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAC5C,4BAA4B,CAC7B,CAAC;yBAEE,YAAY,EAAZ,wBAAY;oBACd,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,2BAAmB,CACpB,+CAA4C,CAC9C,CAAC;;;;oBAGA,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,cAAc,EACd,UAAG,iBAAiB,eAAK,aAAa,CAAE,EACxC;4BACE,QAAQ,EAAE,MAAM;4BAChB,IAAI,EAAE,GAAG;yBACV,CACF,EAAA;;oBAPD,SAOC,CAAC;oBACF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,8BAAuB,eAAK,CAAC,IAAI,CAAC,2BAAmB,CAAC,CAAE,CACzD,CAAC;;;;oBAEF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,sCAA+B,eAAK,CAAC,IAAI,CACvC,2BAAmB,CACpB,uEAAoE,CACtE,CAAC;;;;;oBAKJ,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,aAAa,EAAE;4BACzD,QAAQ,EAAE,MAAM;4BAChB,IAAI,EAAE,GAAG;yBACV,CAAC,EAAA;;oBAHF,SAGE,CAAC;oBACH,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,kBAAW,eAAK,CAAC,IAAI,CACnB,2BAAmB,CACpB,mEAAgE,CAClE,CAAC;;;;oBAEF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2BAAoB,eAAK,CAAC,IAAI,CAC5B,2BAAmB,CACpB,uFAAoF,CACtF,CAAC;;wBAIN,qBAAM,2BAA2B,CAAC,2BAAmB,CAAC,EAAA;;oBAAtD,SAAsD,CAAC;;;;;CACxD;AApED,wEAoEC;AAED,SAAe,2BAA2B,CAAC,QAAgB;;;;;;;oBAGvD,qBAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EACtC,kCAA2B,QAAQ,OAAI,EACvC,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,EAAA;;oBAJD,SAIC,CAAC;oBACF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,gBAAS,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAO,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAG,CAChE,CAAC;;;;oBAEF,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,wBAAiB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAO,eAAK,CAAC,IAAI,CACpD,YAAY,CACb,8BAA2B,CAC7B,CAAC;;;;;;CAEL;AAED;;;;;;;;;GASG;AACH,SAAsB,wBAAwB,CAC5C,WAA2B,EAC3B,SAAiB,EACjB,WAAmB;;;;YAEnB,sBAAO,IAAA,qBAAS,EAAC,0BAA0B,EAAE;;;;;gCACrC,SAAS,GAAG,IAAA,kCAAmB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gCAE9D,MAAM,CAAC,MAAM,CAAC,UAAG,WAAW,CAAC,WAAW,EAAE,eAAY,EAAE,SAAS,CAAC,CAAC;qCAE/D,CAAC,SAAS,EAAV,wBAAU;gCACZ,MAAM,CAAC,MAAM,CAAC,UAAG,WAAW,CAAC,WAAW,EAAE,eAAY,EAAE,KAAK,CAAC,CAAC;gCAChC,qBAAM,gBAAgB,CACnD,KAAK,CAAC,OAAO,CAAC;wCACZ,OAAO,EAAE,UAAG,WAAW,mEAAgE;wCACvF,YAAY,EAAE,KAAK;qCACpB,CAAC,CACH,EAAA;;gCALK,sBAAsB,GAAG,SAK9B;qCAEG,CAAC,sBAAsB,EAAvB,wBAAuB;gCACzB,qBAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAA;;gCAAzB,SAAyB,CAAC;;;;;qBAG/B,CAAC,EAAC;;;CACJ;AAxBD,4DAwBC;AAED,SAAsB,iBAAiB;;;;;wBACL,qBAAM,EAAE,CAAC,QAAQ;yBAC9C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC;yBAC1D,KAAK,CAAC;wBACL,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,mFAAmF,CACpF,CAAC;wBACF,OAAO,KAAK,EAAE,CAAC;oBACjB,CAAC,CAAC,EAAA;;oBAPE,uBAAuB,GAAG,SAO5B;oBAEA,WAAW,GAA+B,SAAS,CAAC;;;;oBAGtD,mEAAmE;oBACnE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;;;;oBAElD,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,+BAAwB,eAAK,CAAC,IAAI,CAChC,cAAc,CACf,uCAAoC,CACtC,CAAC;oBAEF,qBAAM,KAAK,EAAE,EAAA;;oBAAb,SAAa,CAAC;;wBAGhB,sBAAO,WAAW,IAAI,EAAE,EAAC;;;;CAC1B;AA1BD,8CA0BC;AAED,SAAe,iBAAiB;;;;;;oBACxB,sBAAsB,GAAG,IAAA,qCAAmB,GAAE,CAAC;oBAErD,IAAI,sBAAsB,EAAE;wBAC1B,sBAAO,sBAAsB,EAAC;qBAC/B;oBAGC,qBAAM,gBAAgB,CACpB,KAAK,CAAC,MAAM,CAAC;4BACX,OAAO,EAAE,qCAAqC;4BAC9C,OAAO,EAAE,iCAAe,CAAC,GAAG,CAAC,UAAC,cAAc,IAAK,OAAA,CAAC;gCAChD,KAAK,EAAE,cAAc;gCACrB,KAAK,EAAE,cAAc,CAAC,KAAK;6BAC5B,CAAC,EAH+C,CAG/C,CAAC;yBACJ,CAAC,CACH,EAAA;;oBATG,sBAAsB,GAC1B,SAQC;oBAEH,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;oBAE9D,sBAAO,sBAAsB,EAAC;;;;CAC/B;AAED,SAAgB,iBAAiB;IAC/B,IAAI;QACF,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;KACjE;IAAC,WAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAND,8CAMC;AAED;;;;;;;;;;GAUG;AACH,SAAsB,sBAAsB,CAC1C,OAAsB,EACtB,QAMkB;;;;;;;oBAOlB,IAAI,OAAO,CAAC,kBAAkB,EAAE;wBAC9B,sBAAO;gCACL,UAAU,EAAE,OAAO,CAAC,kBAAkB,CAAC,UAAU;gCACjD,SAAS,EAAE,MAAA,OAAO,CAAC,GAAG,mCAAI,QAAQ;gCAClC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS;gCAC/C,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAAC,OAAO;6BACpD,EAAC;qBACH;oBACsC,qBAAM,IAAA,qBAAS,EACpD,iBAAiB,EACjB,cAAM,OAAA,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,EAA7B,CAA6B,CACpC,EAAA;;oBAHK,KAAiC,SAGtC,EAHY,SAAS,SAAA,EAAE,UAAU,gBAAA;oBAKJ,qBAAM,IAAA,qBAAS,EAAC,OAAO,EAAE;4BACrD,OAAA,iBAAiB,CAAC;gCAChB,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,GAAG,EAAE,SAAS;gCACd,QAAQ,EAAE,QAAQ;6BACnB,CAAC;wBAJF,CAIE,CACH,EAAA;;oBANK,KAAwB,SAM7B,EANO,QAAQ,cAAA,EAAE,OAAO,aAAA;yBAQrB,CAAA,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,EAA7B,wBAA6B;oBAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,qEAAqE,CACtE,CAAC;oBACF,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;oBACzC,qBAAM,KAAK,EAAE,EAAA;;oBAAb,SAAa,CAAC;;wBAGQ,qBAAM,IAAA,qBAAS,EAAC,gBAAgB,EAAE;wBACxD,OAAA,sBAAsB,CAAC,QAAQ,CAAC;oBAAhC,CAAgC,CACjC,EAAA;;oBAFK,eAAe,GAAG,SAEvB;oBAED,sBAAO;4BACL,SAAS,WAAA;4BACT,UAAU,YAAA;4BACV,SAAS,EAAE,OAAO,CAAC,KAAK;4BACxB,eAAe,iBAAA;yBAChB,EAAC;;;;CACH;AAtDD,wDAsDC;AAED;;;;;;;;GAQG;AACH,SAAe,gBAAgB,CAAC,WAAoB;;;;;;yBAI9C,CAAC,WAAW,EAAZ,wBAAY;oBACkC,qBAAM,gBAAgB,CACpE,KAAK,CAAC,MAAM,CAAC;4BACX,OAAO,EAAE,kDAAkD;4BAC3D,OAAO,EAAE;gCACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE;gCACnD;oCACE,KAAK,EAAE,aAAa;oCACpB,KAAK,EAAE,sCAAsC;iCAC9C;6BACF;yBACF,CAAC,CACH,EAAA;;oBAXK,MAAM,GAAoC,SAW/C;oBAED,IAAI,MAAM,KAAK,MAAM,EAAE;wBACrB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;wBAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;wBACpC,sBAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAC;qBAC7C;;;oBAIC,cAAc,GAAG,WAAW,CAAC;;;yBAE1B,CAAA,QAAQ,KAAK,SAAS,CAAA;oBAEzB,KAAA,cAAc,CAAA;4BAAd,wBAAc;oBACb,qBAAM,gBAAgB,CACrB,KAAK,CAAC,IAAI,CAAC;4BACT,OAAO,EAAE,uCACP,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,qBACjB;4BAClB,WAAW,EAAE,oBAAoB;yBAClC,CAAC,CACH,EAAA;;oBAPD,KAAA,CAAC,SAOA,CAAC,CAAA;;;oBATE,GAAG,KASL;oBACJ,cAAc,GAAG,SAAS,CAAC;oBAE3B,IAAI;wBACF,QAAQ,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;wBAEnC,yDAAyD;wBACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;4BAC3B,QAAQ,IAAI,GAAG,CAAC;yBACjB;qBACF;oBAAC,WAAM;wBACN,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,0FAA0F,CAC3F,CAAC;qBACH;;;oBAGG,eAAe,GAAG,IAAI,SAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,IAAI,SAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;oBAE1E,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;oBAE9C,sBAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,EAAC;;;;CAC5C;AAED,SAAe,iBAAiB,CAAC,OAUhC;;;;;;oBACC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAE9B,qBAAM,KAAK,CAAC,OAAO,CAAC;4BACzC,OAAO,EAAE,uCAAuC;yBACjD,CAAC,EAAA;;oBAFE,gBAAgB,GAAG,SAErB;oBAEiB,qBAAM,gBAAgB,CAAC,gBAAgB,CAAC,EAAA;;oBAA3D,gBAAgB,GAAG,SAAwC,CAAC;oBAE5D,MAAM,CAAC,MAAM,CAAC,4BAA4B,EAAE,gBAAgB,CAAC,CAAC;;;;oBAK1D,qBAAM,eAAK,CAAC,GAAG,CAAmB,UAAG,OAAO,CAAC,GAAG,kBAAe,CAAC,EAAA;;oBADlE,UAAU,GAAG,CACX,SAAgE,CACjE,CAAC,IAAI,CAAC,IAAI,CAAC;;;;yBAER,CAAA,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAA,EAAxB,wBAAwB;oBAC1B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;oBACzE,qBAAM,KAAK,CACT,eAAK,CAAC,GAAG,CACP,6KAA6K,CAC9K,CACF,EAAA;;oBAJD,SAIC,CAAC;;;oBAEF,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBAC1C,qBAAM,KAAK,CACT,eAAK,CAAC,GAAG,CACP,6HAA6H,CAC9H,CACF,EAAA;;oBAJD,SAIC,CAAC;;;;oBAIA,QAAQ,GAAG,IAAI,SAAG,CACtB,UAAG,OAAO,CAAC,GAAG,qCAA2B,UAAW,MAAG,CACxD,CAAC;oBAEF,IAAI,CAAC,gBAAgB,EAAE;wBACrB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;wBACzC,IAAI,OAAO,CAAC,QAAQ,EAAE;4BACpB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;yBACjE;qBACF;oBAED,IAAI,OAAO,CAAC,SAAS,EAAE;wBACrB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;qBACtD;oBAEK,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtC,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,6FACE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,kBACpB,CAChB,iBAAO,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAE,CAChC,CAAC;oBAEF,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;wBACnB,iGAAiG;oBACnG,CAAC,CAAC,CAAC;oBAEG,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAErC,YAAY,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBAExD,qBAAM,IAAI,OAAO,CAAoB,UAAC,OAAO;4BACxD,IAAM,eAAe,GAAG,IAAA,oBAAW,EAAC;gCAClC,eAAK;qCACF,GAAG,CAAoB,UAAG,OAAO,CAAC,GAAG,0BAAgB,UAAU,MAAG,EAAE;oCACnE,OAAO,EAAE;wCACP,iBAAiB,EAAE,SAAS;qCAC7B;iCACF,CAAC;qCACD,IAAI,CAAC,UAAC,MAAM;oCACX,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oCACrB,YAAY,CAAC,OAAO,CAAC,CAAC;oCACtB,aAAa,CAAC,eAAe,CAAC,CAAC;oCAC/B,KAAK,eAAK,CAAC,MAAM,CAAC,UAAG,OAAO,CAAC,GAAG,0BAAgB,UAAU,MAAG,CAAC,CAAC;gCACjE,CAAC,CAAC;qCACD,KAAK,CAAC;oCACL,wBAAwB;gCAC1B,CAAC,CAAC,CAAC;4BACP,CAAC,EAAE,GAAG,CAAC,CAAC;4BAER,IAAM,OAAO,GAAG,UAAU,CAAC;gCACzB,aAAa,CAAC,eAAe,CAAC,CAAC;gCAC/B,YAAY,CAAC,IAAI,CACf,6DAA6D,CAC9D,CAAC;gCAEF,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gCAC3C,KAAK,KAAK,CAAC,6DAA6D,CAAC,CAAC;4BAC5E,CAAC,EAAE,MAAO,CAAC,CAAC;wBACd,CAAC,CAAC,EAAA;;oBA5BI,IAAI,GAAG,SA4BX;oBAEF,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBACrC,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;oBAE1C,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAe,sBAAsB,CACnC,QAA6B;;;;;;oBAEvB,KAAK,GAAG,UAAC,OAA0B;wBACvC,OAAO,UAAG,OAAO,CAAC,YAAY,CAAC,IAAI,cAAI,OAAO,CAAC,IAAI,CAAE,CAAC;oBACxD,CAAC,CAAC;oBACI,cAAc,qBAAO,QAAQ,OAAC,CAAC;oBACrC,cAAc,CAAC,IAAI,CAAC,UAAC,CAAoB,EAAE,CAAoB;wBAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1C,CAAC,CAAC,CAAC;oBAC2C,qBAAM,gBAAgB,CAClE,KAAK,CAAC,MAAM,CAAC;4BACX,QAAQ,EAAE,EAAE;4BACZ,OAAO,EAAE,6BAA6B;4BACtC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,UAAC,OAAO;gCAClC,OAAO;oCACL,KAAK,EAAE,OAAO;oCACd,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;iCACtB,CAAC;4BACJ,CAAC,CAAC;yBACH,CAAC,CACH,EAAA;;oBAXK,SAAS,GAA+B,SAW7C;oBAED,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBACzC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;oBAEpD,sBAAO,SAAS,EAAC;;;;CAClB;AAED;;;;;;;;;;;GAWG;AACH,SAAsB,oBAAoB,CACxC,QAAgB,EAChB,cAAsB;;;;;wBAEJ,qBAAM,gBAAgB,CACtC,KAAK,CAAC,OAAO,CAAC;wBACZ,OAAO,EAAE,wBAAiB,QAAQ,gCAAsB,eAAK,CAAC,IAAI,CAChE,cAAc,CACf,OAAI;wBACL,YAAY,EAAE,IAAI;qBACnB,CAAC,CACH,EAAA;;oBAPK,SAAS,GAAG,SAOjB;oBAED,IAAI,CAAC,SAAS,EAAE;wBACd,sBAAO,SAAS,EAAC;qBAClB;oBAEM,qBAAM,gBAAgB,CAC3B,KAAK,CAAC,IAAI,CAAC;4BACT,OAAO,EAAE,wCAAiC,QAAQ,kBAAe;4BACjE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;4BAC3C,QAAQ,EAAE,UAAC,KAAK;gCACd,IAAI,CAAC,KAAK,EAAE;oCACV,OAAO,sBAAsB,CAAC;iCAC/B;gCAED,IAAI;oCACF,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;iCACtB;gCAAC,WAAM;oCACN,OAAO,yCAAyC,CAAC;iCAClD;4BACH,CAAC;yBACF,CAAC,CACH,EAAA;wBAhBD,sBAAO,SAgBN,EAAC;;;;CACH;AAlCD,oDAkCC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAsB,yBAAyB,CAC7C,QAAgB,EAChB,WAAmB,EACnB,IAAa;;;;;oBAEb,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,yCAAkC,eAAK,CAAC,IAAI,CAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACxB,mBAAS,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,YAAK,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAE,CAC3D,CAAC;oBAEF,4EAA4E;oBAC5E,8EAA8E;oBAC9E,gGAAgG;oBAChG,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CAAC,YAAK,WAAW,OAAI,CAAC,CAAC;oBAElC,qBAAM,gBAAgB,CACpB,KAAK,CAAC,MAAM,CAAC;4BACX,OAAO,EAAE,kCAAkC;4BAC3C,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;4BACnD,YAAY,EAAE,IAAI;yBACnB,CAAC,CACH,EAAA;;oBAND,SAMC,CAAC;;;;;CACH;AAxBD,8DAwBC;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,eAAe,CAC7B,MAAe,EACf,QAA8B;IAE9B,IAAM,SAAS,GAAG,UAAC,GAAW,IAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAhC,CAAgC,CAAC;IACpE,IAAM,IAAI,GAAG,UAAC,GAAW,IAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAvC,CAAuC,CAAC;IACtE,IAAM,KAAK,GAAG,UAAC,GAAW,IAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAArC,CAAqC,CAAC;IAErE,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AATD,0CASC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAsB,mBAAmB,CACvC,QAAgB,EAChB,WAAmB,EACnB,eAAwB;;;;;;oBAExB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBAC9B,IAAA,aAAK,EAAC,yDAAkD,QAAQ,CAAE,CAAC,CAAC;wBACpE,sBAAO,KAAK,EAAC;qBACd;oBAEK,cAAc,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;;;;oBAGxE,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAA;;oBAAlD,SAAkD,CAAC;oBAEnD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAa,cAAc,WAAQ,CAAC,CAAC;oBAEvD,IAAI,eAAe,EAAE;wBACnB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;qBAC7C;oBAED,sBAAO,IAAI,EAAC;;;oBAEZ,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;oBACT,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,iCAA0B,cAAc,yEAAsE,CAC/G,CAAC;;wBAGJ,sBAAO,KAAK,EAAC;;;;CACd;AA9BD,kDA8BC;AAED,SAAsB,0BAA0B,CAC9C,WAAoB;;;;YAEd,KAAK,GAAG,eAAK,CAAC,IAAI,CAAC,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,sBAAsB,CAAC,CAAC;YAChE,sBAAO,IAAA,qBAAS,EAAC,yBAAyB,EAAE;oBAC1C,OAAA,gBAAgB,CACd,KAAK,CAAC,MAAM,CAAC;wBACX,OAAO,EAAE,mDAA2C,KAAK,mCAA+B;wBACxF,OAAO,EAAE;4BACP;gCACE,KAAK,EAAE,IAAI;gCACX,KAAK,EAAE,KAAK;gCACZ,IAAI,EAAE,wDAAwD;6BAC/D;4BACD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;yBAC9B;qBACF,CAAC,CACH;gBAZD,CAYC,CACF,EAAC;;;CACH;AAnBD,gEAmBC","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport * as childProcess from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { setInterval } from 'timers';\nimport { URL } from 'url';\nimport * as Sentry from '@sentry/node';\nimport { hasPackageInstalled, PackageDotJson } from './package-json';\nimport { SentryProjectData, WizardOptions } from './types';\nimport { traceStep } from '../telemetry';\nimport {\n detectPackageManger,\n PackageManager,\n installPackageWithPackageManager,\n packageManagers,\n} from './package-manager';\nimport { debug } from './debug';\nimport { fulfillsVersionRange } from './semver';\n\nconst opn = require('opn') as (\n url: string,\n) => Promise<childProcess.ChildProcess>;\n\nexport const SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';\nexport const SENTRY_CLI_RC_FILE = '.sentryclirc';\nexport const SENTRY_PROPERTIES_FILE = 'sentry.properties';\n\nconst SAAS_URL = 'https://sentry.io/';\n\ninterface WizardProjectData {\n apiKeys: {\n token: string;\n };\n projects: SentryProjectData[];\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport const rcCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_CLI_RC_FILE,\n name: 'source maps',\n gitignore: true,\n likelyAlreadyHasAuthToken: function (contents: string): boolean {\n return !!(contents.includes('[auth]') && contents.match(/token=./g));\n },\n tokenContent: function (authToken: string): string {\n return `[auth]\\ntoken=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject: function (contents: string): boolean {\n return !!(\n contents.includes('[defaults]') &&\n contents.match(/org=./g) &&\n contents.match(/project=./g)\n );\n },\n orgAndProjContent: function (org: string, project: string): string {\n return `[defaults]\\norg=${org}\\nproject=${project}`;\n },\n};\n\nexport const propertiesCliSetupConfig: Required<CliSetupConfig> = {\n filename: SENTRY_PROPERTIES_FILE,\n gitignore: true,\n name: 'debug files',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n likelyAlreadyHasUrl(contents: string): boolean {\n return !!contents.match(/defaults\\.url=./g);\n },\n urlContent(url: string): string {\n return `defaults.url=${url}`;\n },\n};\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('aborted');\n sentryTransaction?.finish();\n const sentrySession = sentryHub.getScope().getSession();\n if (sentrySession) {\n sentrySession.status = status === 0 ? 'abnormal' : 'crashed';\n sentryHub.captureSession(true);\n }\n await Sentry.flush(3000);\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('cancelled');\n sentryTransaction?.finish();\n sentryHub.captureSession(true);\n await Sentry.flush(3000);\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n promoCode?: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n let wizardPackage: { version?: string } = {};\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wizardPackage = require(path.join(\n path.dirname(require.resolve('@sentry/wizard')),\n '..',\n 'package.json',\n ));\n } catch {\n // We don't need to have this\n }\n\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up Sentry for your application.\\nThank you for using Sentry :)`;\n\n if (options.promoCode) {\n welcomeText = `${welcomeText}\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n if (wizardPackage.version) {\n welcomeText = `${welcomeText}\\n\\nVersion: ${wizardPackage.version}`;\n }\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'sentry-wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nfunction isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1')\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askToInstallSentryCLI(): Promise<boolean> {\n return await abortIfCancelled(\n clack.confirm({\n message:\n \"You don't have Sentry CLI installed. Do you want to install it?\",\n }),\n );\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Sentry.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Sentry.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n `Please upgrade to ${acceptableVersions} if you wish to use the Sentry Wizard.\nOr setup using ${chalk.cyan(\n 'https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/',\n )}`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Sentry.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n}: {\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n}): Promise<void> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return;\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const packageManager = await getPackageManager();\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(packageManager.label)}.`,\n );\n\n try {\n await installPackageWithPackageManager(packageManager, packageName);\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during 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 await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(packageManager.label)}.`,\n );\n });\n}\n\nexport async function addSentryCliConfig(\n { authToken, org, project, url }: CliSetupConfigContent,\n setupConfig: CliSetupConfig = rcCliSetupConfig,\n): Promise<void> {\n return traceStep('add-sentry-cli-config', async () => {\n const configPath = path.join(process.cwd(), setupConfig.filename);\n const configExists = fs.existsSync(configPath);\n\n let configContents =\n (configExists && fs.readFileSync(configPath, 'utf8')) || '';\n configContents = addAuthTokenToSentryConfig(\n configContents,\n authToken,\n setupConfig,\n );\n configContents = addOrgAndProjectToSentryConfig(\n configContents,\n org,\n project,\n setupConfig,\n );\n configContents = addUrlToSentryConfig(configContents, url, setupConfig);\n\n try {\n await fs.promises.writeFile(configPath, configContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `${configExists ? 'Saved' : 'Created'} ${chalk.cyan(\n setupConfig.filename,\n )}.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.cyan(\n setupConfig.filename,\n )}. Uploading ${\n setupConfig.name\n } during build will likely not work locally.`,\n );\n }\n\n if (setupConfig.gitignore) {\n await addCliConfigFileToGitIgnore(setupConfig.filename);\n } else {\n clack.log.warn(\n chalk.yellow('DO NOT commit auth token to your repository!'),\n );\n }\n });\n}\n\nfunction addAuthTokenToSentryConfig(\n configContents: string,\n authToken: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!authToken) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasAuthToken(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has auth token. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.tokenContent(\n authToken,\n )}\\n`;\n clack.log.success(\n `Added auth token to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addOrgAndProjectToSentryConfig(\n configContents: string,\n org: string | undefined,\n project: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!org || !project) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasOrgAndProject(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has org and project. Will not add them.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.orgAndProjContent(\n org,\n project,\n )}\\n`;\n clack.log.success(\n `Added default org and project to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addUrlToSentryConfig(\n configContents: string,\n url: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!url || !setupConfig.urlContent || !setupConfig.likelyAlreadyHasUrl) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasUrl(configContents)) {\n clack.log.warn(\n `${chalk.cyan(setupConfig.filename)} already has url. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.urlContent(url)}\\n`;\n clack.log.success(\n `Added default url to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const envVarContent = `# DO NOT commit this file to your repository!\n# The SENTRY_AUTH_TOKEN variable is picked up by the Sentry Build Plugin.\n# It's used for authentication when uploading source maps.\n# You can also set this env variable in your own \\`.env\\` files and remove this file.\nSENTRY_AUTH_TOKEN=\"${authToken}\"\n`;\n\n const dotEnvFilePath = path.join(process.cwd(), SENTRY_DOT_ENV_FILE);\n const dotEnvFileExists = fs.existsSync(dotEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(dotEnvFilePath, 'utf8');\n\n const hasAuthToken = !!dotEnvFileContent.match(\n /^\\s*SENTRY_AUTH_TOKEN\\s*=/g,\n );\n\n if (hasAuthToken) {\n clack.log.warn(\n `${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n dotEnvFilePath,\n `${dotEnvFileContent}\\n${envVarContent}`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold(SENTRY_DOT_ENV_FILE)}`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(dotEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} with auth token for you to test source map uploading locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addCliConfigFileToGitIgnore(SENTRY_DOT_ENV_FILE);\n}\n\nasync function addCliConfigFileToGitIgnore(filename: string): Promise<void> {\n //TODO: Add a check to see if the file is already ignored in .gitignore\n try {\n await fs.promises.appendFile(\n path.join(process.cwd(), '.gitignore'),\n `\\n# Sentry Config File\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.cyan(filename)} to ${chalk.cyan('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.cyan(filename)} to ${chalk.cyan(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson(): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(path.join(process.cwd(), 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nasync function getPackageManager(): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript() {\n try {\n return fs.existsSync(path.join(process.cwd(), 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @param platform the platform of the wizard\n * @returns project data (org, project, token, url)\n */\nexport async function getOrAskForProjectData(\n options: WizardOptions,\n platform?:\n | 'javascript-nextjs'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native',\n): Promise<{\n sentryUrl: string;\n selfHosted: boolean;\n selectedProject: SentryProjectData;\n authToken: string;\n}> {\n if (options.preSelectedProject) {\n return {\n selfHosted: options.preSelectedProject.selfHosted,\n sentryUrl: options.url ?? SAAS_URL,\n authToken: options.preSelectedProject.authToken,\n selectedProject: options.preSelectedProject.project,\n };\n }\n const { url: sentryUrl, selfHosted } = await traceStep(\n 'ask-self-hosted',\n () => askForSelfHosted(options.url),\n );\n\n const { projects, apiKeys } = await traceStep('login', () =>\n askForWizardLogin({\n promoCode: options.promoCode,\n url: sentryUrl,\n platform: platform,\n }),\n );\n\n if (!projects || !projects.length) {\n clack.log.error(\n 'No projects found. Please create a project in Sentry and try again.',\n );\n Sentry.setTag('no-projects-found', true);\n await abort();\n }\n\n const selectedProject = await traceStep('select-project', () =>\n askForProjectSelection(projects),\n );\n\n return {\n sentryUrl,\n selfHosted,\n authToken: apiKeys.token,\n selectedProject,\n };\n}\n\n/**\n * Asks users if they are using SaaS or self-hosted Sentry and returns the validated URL.\n *\n * If users started the wizard with a --url arg, that URL is used as the default and we skip\n * the self-hosted question. However, the passed url is still validated and in case it's\n * invalid, users are asked to enter a new one until it is valid.\n *\n * @param urlFromArgs the url passed via the --url arg\n */\nasync function askForSelfHosted(urlFromArgs?: string): Promise<{\n url: string;\n selfHosted: boolean;\n}> {\n if (!urlFromArgs) {\n const choice: 'saas' | 'self-hosted' | symbol = await abortIfCancelled(\n clack.select({\n message: 'Are you using Sentry SaaS or self-hosted Sentry?',\n options: [\n { value: 'saas', label: 'Sentry SaaS (sentry.io)' },\n {\n value: 'self-hosted',\n label: 'Self-hosted/on-premise/single-tenant',\n },\n ],\n }),\n );\n\n if (choice === 'saas') {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n }\n\n let validUrl: string | undefined;\n let tmpUrlFromArgs = urlFromArgs;\n\n while (validUrl === undefined) {\n const url =\n tmpUrlFromArgs ||\n (await abortIfCancelled(\n clack.text({\n message: `Please enter the URL of your ${\n urlFromArgs ? '' : 'self-hosted '\n }Sentry instance.`,\n placeholder: 'https://sentry.io/',\n }),\n ));\n tmpUrlFromArgs = undefined;\n\n try {\n validUrl = new URL(url).toString();\n\n // We assume everywhere else that the URL ends in a slash\n if (!validUrl.endsWith('/')) {\n validUrl += '/';\n }\n } catch {\n clack.log.error(\n 'Please enter a valid URL. (It should look something like \"https://sentry.mydomain.com/\")',\n );\n }\n }\n\n const isSelfHostedUrl = new URL(validUrl).host !== new URL(SAAS_URL).host;\n\n Sentry.setTag('url', validUrl);\n Sentry.setTag('self-hosted', isSelfHostedUrl);\n\n return { url: validUrl, selfHosted: true };\n}\n\nasync function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?:\n | 'javascript-nextjs'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native';\n}): Promise<WizardProjectData> {\n Sentry.setTag('has-promo-code', !!options.promoCode);\n\n let hasSentryAccount = await clack.confirm({\n message: 'Do you already have a Sentry account?',\n });\n\n hasSentryAccount = await abortIfCancelled(hasSentryAccount);\n\n Sentry.setTag('already-has-sentry-account', hasSentryAccount);\n\n let wizardHash: string;\n try {\n wizardHash = (\n await axios.get<{ hash: string }>(`${options.url}api/0/wizard/`)\n ).data.hash;\n } catch {\n if (options.url !== SAAS_URL) {\n clack.log.error('Loading Wizard failed. Did you provide the right URL?');\n await abort(\n chalk.red(\n 'Please check your configuration and try again.\\n\\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n } else {\n clack.log.error('Loading Wizard failed.');\n await abort(\n chalk.red(\n 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n }\n }\n\n const loginUrl = new URL(\n `${options.url}account/settings/wizard/${wizardHash!}/`,\n );\n\n if (!hasSentryAccount) {\n loginUrl.searchParams.set('signup', '1');\n if (options.platform) {\n loginUrl.searchParams.set('project_platform', options.platform);\n }\n }\n\n if (options.promoCode) {\n loginUrl.searchParams.set('code', options.promoCode);\n }\n\n const urlToOpen = loginUrl.toString();\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to ${\n hasSentryAccount ? 'log' : 'sign'\n } into Sentry:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\n );\n\n opn(urlToOpen).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<WizardProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n axios\n .get<WizardProjectData>(`${options.url}api/0/wizard/${wizardHash}/`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n },\n })\n .then((result) => {\n resolve(result.data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n void axios.delete(`${options.url}api/0/wizard/${wizardHash}/`);\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Sentry.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Sentry.setTag('opened-wizard-link', true);\n\n return data;\n}\n\nasync function askForProjectSelection(\n projects: SentryProjectData[],\n): Promise<SentryProjectData> {\n const label = (project: SentryProjectData): string => {\n return `${project.organization.slug}/${project.slug}`;\n };\n const sortedProjects = [...projects];\n sortedProjects.sort((a: SentryProjectData, b: SentryProjectData) => {\n return label(a).localeCompare(label(b));\n });\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: sortedProjects.map((project) => {\n return {\n value: project,\n label: label(project),\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: path.join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * More guidelines on copy/paste instructions:\n * @see {@link https://develop.sentry.dev/sdk/setup-wizards/#copy--paste-snippets}\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(\n path.basename(filename),\n )} file:${hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''}`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n moreInformation?: string,\n): Promise<boolean> {\n if (!path.isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(path.relative(process.cwd(), filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function askShouldCreateExamplePage(\n customRoute?: string,\n): Promise<boolean> {\n const route = chalk.cyan(customRoute ?? '/sentry-example-page');\n return traceStep('ask-create-example-page', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example page (\"${route}\") to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n"]}
1
+ {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as childProcess from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { setInterval } from 'timers';\nimport { URL } from 'url';\nimport * as Sentry from '@sentry/node';\nimport { hasPackageInstalled, PackageDotJson } from './package-json';\nimport { SentryProjectData, WizardOptions } from './types';\nimport { traceStep } from '../telemetry';\nimport {\n detectPackageManger,\n PackageManager,\n installPackageWithPackageManager,\n packageManagers,\n} from './package-manager';\nimport { debug } from './debug';\nimport { fulfillsVersionRange } from './semver';\n\nconst opn = require('opn') as (\n url: string,\n) => Promise<childProcess.ChildProcess>;\n\nexport const SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';\nexport const SENTRY_CLI_RC_FILE = '.sentryclirc';\nexport const SENTRY_PROPERTIES_FILE = 'sentry.properties';\n\nconst SAAS_URL = 'https://sentry.io/';\n\ninterface WizardProjectData {\n apiKeys: {\n token: string;\n };\n projects: SentryProjectData[];\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport const rcCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_CLI_RC_FILE,\n name: 'source maps',\n gitignore: true,\n likelyAlreadyHasAuthToken: function (contents: string): boolean {\n return !!(contents.includes('[auth]') && contents.match(/token=./g));\n },\n tokenContent: function (authToken: string): string {\n return `[auth]\\ntoken=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject: function (contents: string): boolean {\n return !!(\n contents.includes('[defaults]') &&\n contents.match(/org=./g) &&\n contents.match(/project=./g)\n );\n },\n orgAndProjContent: function (org: string, project: string): string {\n return `[defaults]\\norg=${org}\\nproject=${project}`;\n },\n};\n\nexport const propertiesCliSetupConfig: Required<CliSetupConfig> = {\n filename: SENTRY_PROPERTIES_FILE,\n gitignore: true,\n name: 'debug files',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n likelyAlreadyHasUrl(contents: string): boolean {\n return !!contents.match(/defaults\\.url=./g);\n },\n urlContent(url: string): string {\n return `defaults.url=${url}`;\n },\n};\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('aborted');\n sentryTransaction?.finish();\n const sentrySession = sentryHub.getScope().getSession();\n if (sentrySession) {\n sentrySession.status = status === 0 ? 'abnormal' : 'crashed';\n sentryHub.captureSession(true);\n }\n await Sentry.flush(3000);\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('cancelled');\n sentryTransaction?.finish();\n sentryHub.captureSession(true);\n await Sentry.flush(3000);\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n promoCode?: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n let wizardPackage: { version?: string } = {};\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wizardPackage = require(path.join(\n path.dirname(require.resolve('@sentry/wizard')),\n '..',\n 'package.json',\n ));\n } catch {\n // We don't need to have this\n }\n\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up Sentry for your application.\\nThank you for using Sentry :)`;\n\n if (options.promoCode) {\n welcomeText = `${welcomeText}\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n if (wizardPackage.version) {\n welcomeText = `${welcomeText}\\n\\nVersion: ${wizardPackage.version}`;\n }\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'sentry-wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nfunction isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1')\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askToInstallSentryCLI(): Promise<boolean> {\n return await abortIfCancelled(\n clack.confirm({\n message:\n \"You don't have Sentry CLI installed. Do you want to install it?\",\n }),\n );\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Sentry.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Sentry.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n `Please upgrade to ${acceptableVersions} if you wish to use the Sentry Wizard.\nOr setup using ${chalk.cyan(\n 'https://docs.sentry.io/platforms/react-native/manual-setup/manual-setup/',\n )}`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Sentry.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n}: {\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n}): Promise<void> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return;\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const packageManager = await getPackageManager();\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(packageManager.label)}.`,\n );\n\n try {\n await installPackageWithPackageManager(packageManager, packageName);\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during 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 await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(packageManager.label)}.`,\n );\n });\n}\n\nexport async function addSentryCliConfig(\n { authToken, org, project, url }: CliSetupConfigContent,\n setupConfig: CliSetupConfig = rcCliSetupConfig,\n): Promise<void> {\n return traceStep('add-sentry-cli-config', async () => {\n const configPath = path.join(process.cwd(), setupConfig.filename);\n const configExists = fs.existsSync(configPath);\n\n let configContents =\n (configExists && fs.readFileSync(configPath, 'utf8')) || '';\n configContents = addAuthTokenToSentryConfig(\n configContents,\n authToken,\n setupConfig,\n );\n configContents = addOrgAndProjectToSentryConfig(\n configContents,\n org,\n project,\n setupConfig,\n );\n configContents = addUrlToSentryConfig(configContents, url, setupConfig);\n\n try {\n await fs.promises.writeFile(configPath, configContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `${configExists ? 'Saved' : 'Created'} ${chalk.cyan(\n setupConfig.filename,\n )}.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.cyan(\n setupConfig.filename,\n )}. Uploading ${\n setupConfig.name\n } during build will likely not work locally.`,\n );\n }\n\n if (setupConfig.gitignore) {\n await addCliConfigFileToGitIgnore(setupConfig.filename);\n } else {\n clack.log.warn(\n chalk.yellow('DO NOT commit auth token to your repository!'),\n );\n }\n });\n}\n\nfunction addAuthTokenToSentryConfig(\n configContents: string,\n authToken: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!authToken) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasAuthToken(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has auth token. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.tokenContent(\n authToken,\n )}\\n`;\n clack.log.success(\n `Added auth token to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addOrgAndProjectToSentryConfig(\n configContents: string,\n org: string | undefined,\n project: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!org || !project) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasOrgAndProject(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has org and project. Will not add them.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.orgAndProjContent(\n org,\n project,\n )}\\n`;\n clack.log.success(\n `Added default org and project to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addUrlToSentryConfig(\n configContents: string,\n url: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!url || !setupConfig.urlContent || !setupConfig.likelyAlreadyHasUrl) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasUrl(configContents)) {\n clack.log.warn(\n `${chalk.cyan(setupConfig.filename)} already has url. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.urlContent(url)}\\n`;\n clack.log.success(\n `Added default url to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const envVarContent = `# DO NOT commit this file to your repository!\n# The SENTRY_AUTH_TOKEN variable is picked up by the Sentry Build Plugin.\n# It's used for authentication when uploading source maps.\n# You can also set this env variable in your own \\`.env\\` files and remove this file.\nSENTRY_AUTH_TOKEN=\"${authToken}\"\n`;\n\n const dotEnvFilePath = path.join(process.cwd(), SENTRY_DOT_ENV_FILE);\n const dotEnvFileExists = fs.existsSync(dotEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(dotEnvFilePath, 'utf8');\n\n const hasAuthToken = !!dotEnvFileContent.match(\n /^\\s*SENTRY_AUTH_TOKEN\\s*=/g,\n );\n\n if (hasAuthToken) {\n clack.log.warn(\n `${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n dotEnvFilePath,\n `${dotEnvFileContent}\\n${envVarContent}`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold(SENTRY_DOT_ENV_FILE)}`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(dotEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} with auth token for you to test source map uploading locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold(\n SENTRY_DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addCliConfigFileToGitIgnore(SENTRY_DOT_ENV_FILE);\n}\n\nasync function addCliConfigFileToGitIgnore(filename: string): Promise<void> {\n //TODO: Add a check to see if the file is already ignored in .gitignore\n try {\n await fs.promises.appendFile(\n path.join(process.cwd(), '.gitignore'),\n `\\n# Sentry Config File\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.cyan(filename)} to ${chalk.cyan('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.cyan(filename)} to ${chalk.cyan(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson(): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(path.join(process.cwd(), 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nasync function getPackageManager(): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript() {\n try {\n return fs.existsSync(path.join(process.cwd(), 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @param platform the platform of the wizard\n * @returns project data (org, project, token, url)\n */\nexport async function getOrAskForProjectData(\n options: WizardOptions,\n platform?:\n | 'javascript-nextjs'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native',\n): Promise<{\n sentryUrl: string;\n selfHosted: boolean;\n selectedProject: SentryProjectData;\n authToken: string;\n}> {\n if (options.preSelectedProject) {\n return {\n selfHosted: options.preSelectedProject.selfHosted,\n sentryUrl: options.url ?? SAAS_URL,\n authToken: options.preSelectedProject.authToken,\n selectedProject: options.preSelectedProject.project,\n };\n }\n const { url: sentryUrl, selfHosted } = await traceStep(\n 'ask-self-hosted',\n () => askForSelfHosted(options.url),\n );\n\n const { projects, apiKeys } = await traceStep('login', () =>\n askForWizardLogin({\n promoCode: options.promoCode,\n url: sentryUrl,\n platform: platform,\n }),\n );\n\n if (!projects || !projects.length) {\n clack.log.error(\n 'No projects found. Please create a project in Sentry and try again.',\n );\n Sentry.setTag('no-projects-found', true);\n await abort();\n }\n\n const selectedProject = await traceStep('select-project', () =>\n askForProjectSelection(projects),\n );\n\n return {\n sentryUrl,\n selfHosted,\n authToken: apiKeys.token,\n selectedProject,\n };\n}\n\n/**\n * Asks users if they are using SaaS or self-hosted Sentry and returns the validated URL.\n *\n * If users started the wizard with a --url arg, that URL is used as the default and we skip\n * the self-hosted question. However, the passed url is still validated and in case it's\n * invalid, users are asked to enter a new one until it is valid.\n *\n * @param urlFromArgs the url passed via the --url arg\n */\nasync function askForSelfHosted(urlFromArgs?: string): Promise<{\n url: string;\n selfHosted: boolean;\n}> {\n if (!urlFromArgs) {\n const choice: 'saas' | 'self-hosted' | symbol = await abortIfCancelled(\n clack.select({\n message: 'Are you using Sentry SaaS or self-hosted Sentry?',\n options: [\n { value: 'saas', label: 'Sentry SaaS (sentry.io)' },\n {\n value: 'self-hosted',\n label: 'Self-hosted/on-premise/single-tenant',\n },\n ],\n }),\n );\n\n if (choice === 'saas') {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n }\n\n let validUrl: string | undefined;\n let tmpUrlFromArgs = urlFromArgs;\n\n while (validUrl === undefined) {\n const url =\n tmpUrlFromArgs ||\n (await abortIfCancelled(\n clack.text({\n message: `Please enter the URL of your ${\n urlFromArgs ? '' : 'self-hosted '\n }Sentry instance.`,\n placeholder: 'https://sentry.io/',\n }),\n ));\n tmpUrlFromArgs = undefined;\n\n try {\n validUrl = new URL(url).toString();\n\n // We assume everywhere else that the URL ends in a slash\n if (!validUrl.endsWith('/')) {\n validUrl += '/';\n }\n } catch {\n clack.log.error(\n 'Please enter a valid URL. (It should look something like \"https://sentry.mydomain.com/\")',\n );\n }\n }\n\n const isSelfHostedUrl = new URL(validUrl).host !== new URL(SAAS_URL).host;\n\n Sentry.setTag('url', validUrl);\n Sentry.setTag('self-hosted', isSelfHostedUrl);\n\n return { url: validUrl, selfHosted: true };\n}\n\nasync function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?:\n | 'javascript-nextjs'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native';\n}): Promise<WizardProjectData> {\n Sentry.setTag('has-promo-code', !!options.promoCode);\n\n let hasSentryAccount = await clack.confirm({\n message: 'Do you already have a Sentry account?',\n });\n\n hasSentryAccount = await abortIfCancelled(hasSentryAccount);\n\n Sentry.setTag('already-has-sentry-account', hasSentryAccount);\n\n const nodeFetch = await import('node-fetch').then((m) => m.default);\n\n let wizardHash: string | undefined;\n\n try {\n const response = await nodeFetch(`${options.url}api/0/wizard/`);\n const data = (await response.json()) as { hash?: string };\n wizardHash = data?.hash;\n } catch (e: unknown) {\n if (options.url !== SAAS_URL) {\n clack.log.error('Loading Wizard failed. Did you provide the right URL?');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please check your configuration and try again.\\n\\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n } else {\n clack.log.error('Loading Wizard failed.');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n }\n }\n\n if (!wizardHash) {\n clack.log.error('Loading Wizard failed.');\n clack.log.info(\"Didn't receive a wizard hash from the server.\");\n await abort(\n chalk.red(\n 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n return Promise.reject();\n }\n\n const loginUrl = new URL(\n `${options.url}account/settings/wizard/${wizardHash}/`,\n );\n\n if (!hasSentryAccount) {\n loginUrl.searchParams.set('signup', '1');\n if (options.platform) {\n loginUrl.searchParams.set('project_platform', options.platform);\n }\n }\n\n if (options.promoCode) {\n loginUrl.searchParams.set('code', options.promoCode);\n }\n\n const urlToOpen = loginUrl.toString();\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to ${\n hasSentryAccount ? 'log' : 'sign'\n } into Sentry:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\n );\n\n opn(urlToOpen).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<WizardProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore\n nodeFetch(`${options.url}api/0/wizard/${wizardHash}/`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n },\n })\n .then(async (result) => {\n const data = (await result.json()) as WizardProjectData;\n resolve(data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore\n void nodeFetch(`${options.url}api/0/wizard/${wizardHash}/`, {\n method: 'DELETE',\n });\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Sentry.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Sentry.setTag('opened-wizard-link', true);\n\n return data;\n}\n\nasync function askForProjectSelection(\n projects: SentryProjectData[],\n): Promise<SentryProjectData> {\n const label = (project: SentryProjectData): string => {\n return `${project.organization.slug}/${project.slug}`;\n };\n const sortedProjects = [...projects];\n sortedProjects.sort((a: SentryProjectData, b: SentryProjectData) => {\n return label(a).localeCompare(label(b));\n });\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: sortedProjects.map((project) => {\n return {\n value: project,\n label: label(project),\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: path.join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * More guidelines on copy/paste instructions:\n * @see {@link https://develop.sentry.dev/sdk/setup-wizards/#copy--paste-snippets}\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(\n path.basename(filename),\n )} file:${hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''}`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n moreInformation?: string,\n): Promise<boolean> {\n if (!path.isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(path.relative(process.cwd(), filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function askShouldCreateExamplePage(\n customRoute?: string,\n): Promise<boolean> {\n const route = chalk.cyan(customRoute ?? '/sentry-example-page');\n return traceStep('ask-create-example-page', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example page (\"${route}\") to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n"]}
@@ -35,31 +35,33 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
38
  Object.defineProperty(exports, "__esModule", { value: true });
42
39
  exports.fetchSdkVersion = void 0;
43
- var axios_1 = __importDefault(require("axios"));
44
40
  var debug_1 = require("./debug");
45
41
  var registryUrl = 'https://release-registry.services.sentry.io/';
46
42
  function fetchSdkVersion(sdk) {
47
43
  var _a;
48
44
  return __awaiter(this, void 0, void 0, function () {
49
- var data, _b;
45
+ var fetch, response, data, _b;
50
46
  return __generator(this, function (_c) {
51
47
  switch (_c.label) {
52
48
  case 0:
53
- _c.trys.push([0, 2, , 3]);
54
- return [4 /*yield*/, axios_1.default.get("".concat(registryUrl, "/sdks"))];
49
+ _c.trys.push([0, 4, , 5]);
50
+ return [4 /*yield*/, import('node-fetch').then(function (m) { return m.default; })];
55
51
  case 1:
56
- data = (_c.sent()).data;
57
- return [2 /*return*/, (_a = data[sdk]) === null || _a === void 0 ? void 0 : _a.version];
52
+ fetch = _c.sent();
53
+ return [4 /*yield*/, fetch("".concat(registryUrl, "/sdks"))];
58
54
  case 2:
55
+ response = _c.sent();
56
+ return [4 /*yield*/, response.json()];
57
+ case 3:
58
+ data = (_c.sent());
59
+ return [2 /*return*/, data && ((_a = data[sdk]) === null || _a === void 0 ? void 0 : _a.version)];
60
+ case 4:
59
61
  _b = _c.sent();
60
62
  (0, debug_1.debug)('Failed to fetch latest version from release registry.');
61
- return [3 /*break*/, 3];
62
- case 3: return [2 /*return*/, undefined];
63
+ return [3 /*break*/, 5];
64
+ case 5: return [2 /*return*/, undefined];
63
65
  }
64
66
  });
65
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"release-registry.js","sourceRoot":"","sources":["../../../src/utils/release-registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAA0B;AAC1B,iCAAgC;AAChC,IAAM,WAAW,GAAG,8CAA8C,CAAC;AAEnE,SAAsB,eAAe,CACnC,GAAW;;;;;;;;oBAIP,qBAAM,eAAK,CAAC,GAAG,CACb,UAAG,WAAW,UAAO,CACtB,EAAA;;oBAHG,IAAI,GAAG,CACX,SAEC,CACF,CAAC,IAAI;oBACN,sBAAO,MAAA,IAAI,CAAC,GAAG,CAAC,0CAAE,OAAO,EAAC;;;oBAE1B,IAAA,aAAK,EAAC,uDAAuD,CAAC,CAAC;;wBAEjE,sBAAO,SAAS,EAAC;;;;CAClB;AAdD,0CAcC","sourcesContent":["import axios from 'axios';\nimport { debug } from './debug';\nconst registryUrl = 'https://release-registry.services.sentry.io/';\n\nexport async function fetchSdkVersion(\n sdk: string,\n): Promise<string | undefined> {\n try {\n const data = (\n await axios.get<Record<string, { version: string }>>(\n `${registryUrl}/sdks`,\n )\n ).data;\n return data[sdk]?.version;\n } catch {\n debug('Failed to fetch latest version from release registry.');\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"release-registry.js","sourceRoot":"","sources":["../../../src/utils/release-registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAgC;AAChC,IAAM,WAAW,GAAG,8CAA8C,CAAC;AAEnE,SAAsB,eAAe,CACnC,GAAW;;;;;;;;oBAGK,qBAAM,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,OAAO,EAAT,CAAS,CAAC,EAAA;;oBAAzD,KAAK,GAAG,SAAiD;oBAC9C,qBAAM,KAAK,CAAC,UAAG,WAAW,UAAO,CAAC,EAAA;;oBAA7C,QAAQ,GAAG,SAAkC;oBACrC,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;;oBAA7B,IAAI,GAAG,CAAC,SAAqB,CAGlC;oBACD,sBAAO,IAAI,KAAI,MAAA,IAAI,CAAC,GAAG,CAAC,0CAAE,OAAO,CAAA,EAAC;;;oBAElC,IAAA,aAAK,EAAC,uDAAuD,CAAC,CAAC;;wBAEjE,sBAAO,SAAS,EAAC;;;;CAClB;AAfD,0CAeC","sourcesContent":["import { debug } from './debug';\nconst registryUrl = 'https://release-registry.services.sentry.io/';\n\nexport async function fetchSdkVersion(\n sdk: string,\n): Promise<string | undefined> {\n try {\n const fetch = await import('node-fetch').then((m) => m.default);\n const response = await fetch(`${registryUrl}/sdks`);\n const data = (await response.json()) as Record<\n string,\n { version: string } | undefined\n >;\n return data && data[sdk]?.version;\n } catch {\n debug('Failed to fetch latest version from release registry.');\n }\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "3.20.1",
3
+ "version": "3.20.3-beta.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,12 +27,12 @@
27
27
  "@clack/prompts": "0.7.0",
28
28
  "@sentry/cli": "^1.72.0",
29
29
  "@sentry/node": "^7.69.0",
30
- "axios": "1.6.0",
31
30
  "chalk": "^2.4.1",
32
31
  "glob": "^7.1.3",
33
32
  "inquirer": "^6.2.0",
34
33
  "lodash": "^4.17.15",
35
34
  "magicast": "^0.2.10",
35
+ "node-fetch": "^3.3.2",
36
36
  "opn": "^5.4.0",
37
37
  "r2": "^2.0.1",
38
38
  "read-env": "^1.3.0",
@@ -1,6 +1,5 @@
1
1
  // @ts-ignore - clack is ESM and TS complains about that. It works though
2
2
  import * as clack from '@clack/prompts';
3
- import axios from 'axios';
4
3
  import chalk from 'chalk';
5
4
  import * as childProcess from 'child_process';
6
5
  import * as fs from 'fs';
@@ -886,14 +885,18 @@ async function askForWizardLogin(options: {
886
885
 
887
886
  Sentry.setTag('already-has-sentry-account', hasSentryAccount);
888
887
 
889
- let wizardHash: string;
888
+ const nodeFetch = await import('node-fetch').then((m) => m.default);
889
+
890
+ let wizardHash: string | undefined;
891
+
890
892
  try {
891
- wizardHash = (
892
- await axios.get<{ hash: string }>(`${options.url}api/0/wizard/`)
893
- ).data.hash;
894
- } catch {
893
+ const response = await nodeFetch(`${options.url}api/0/wizard/`);
894
+ const data = (await response.json()) as { hash?: string };
895
+ wizardHash = data?.hash;
896
+ } catch (e: unknown) {
895
897
  if (options.url !== SAAS_URL) {
896
898
  clack.log.error('Loading Wizard failed. Did you provide the right URL?');
899
+ clack.log.info(JSON.stringify(e, null, 2));
897
900
  await abort(
898
901
  chalk.red(
899
902
  'Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues',
@@ -901,6 +904,7 @@ async function askForWizardLogin(options: {
901
904
  );
902
905
  } else {
903
906
  clack.log.error('Loading Wizard failed.');
907
+ clack.log.info(JSON.stringify(e, null, 2));
904
908
  await abort(
905
909
  chalk.red(
906
910
  'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',
@@ -909,8 +913,19 @@ async function askForWizardLogin(options: {
909
913
  }
910
914
  }
911
915
 
916
+ if (!wizardHash) {
917
+ clack.log.error('Loading Wizard failed.');
918
+ clack.log.info("Didn't receive a wizard hash from the server.");
919
+ await abort(
920
+ chalk.red(
921
+ 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',
922
+ ),
923
+ );
924
+ return Promise.reject();
925
+ }
926
+
912
927
  const loginUrl = new URL(
913
- `${options.url}account/settings/wizard/${wizardHash!}/`,
928
+ `${options.url}account/settings/wizard/${wizardHash}/`,
914
929
  );
915
930
 
916
931
  if (!hasSentryAccount) {
@@ -943,17 +958,21 @@ async function askForWizardLogin(options: {
943
958
 
944
959
  const data = await new Promise<WizardProjectData>((resolve) => {
945
960
  const pollingInterval = setInterval(() => {
946
- axios
947
- .get<WizardProjectData>(`${options.url}api/0/wizard/${wizardHash}/`, {
948
- headers: {
949
- 'Accept-Encoding': 'deflate',
950
- },
951
- })
952
- .then((result) => {
953
- resolve(result.data);
961
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore
962
+ nodeFetch(`${options.url}api/0/wizard/${wizardHash}/`, {
963
+ headers: {
964
+ 'Accept-Encoding': 'deflate',
965
+ },
966
+ })
967
+ .then(async (result) => {
968
+ const data = (await result.json()) as WizardProjectData;
969
+ resolve(data);
954
970
  clearTimeout(timeout);
955
971
  clearInterval(pollingInterval);
956
- void axios.delete(`${options.url}api/0/wizard/${wizardHash}/`);
972
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- wizardHash can't be undefined anymore
973
+ void nodeFetch(`${options.url}api/0/wizard/${wizardHash}/`, {
974
+ method: 'DELETE',
975
+ });
957
976
  })
958
977
  .catch(() => {
959
978
  // noop - just try again
@@ -1,4 +1,3 @@
1
- import axios from 'axios';
2
1
  import { debug } from './debug';
3
2
  const registryUrl = 'https://release-registry.services.sentry.io/';
4
3
 
@@ -6,12 +5,13 @@ export async function fetchSdkVersion(
6
5
  sdk: string,
7
6
  ): Promise<string | undefined> {
8
7
  try {
9
- const data = (
10
- await axios.get<Record<string, { version: string }>>(
11
- `${registryUrl}/sdks`,
12
- )
13
- ).data;
14
- return data[sdk]?.version;
8
+ const fetch = await import('node-fetch').then((m) => m.default);
9
+ const response = await fetch(`${registryUrl}/sdks`);
10
+ const data = (await response.json()) as Record<
11
+ string,
12
+ { version: string } | undefined
13
+ >;
14
+ return data && data[sdk]?.version;
15
15
  } catch {
16
16
  debug('Failed to fetch latest version from release registry.');
17
17
  }