@sentry/wizard 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/bin.ts +8 -9
  3. package/dist/bin.js +8 -5
  4. package/dist/bin.js.map +1 -1
  5. package/dist/lib/Constants.d.ts +2 -0
  6. package/dist/lib/Constants.js +5 -0
  7. package/dist/lib/Constants.js.map +1 -1
  8. package/dist/lib/Helper/Wizard.js +2 -0
  9. package/dist/lib/Helper/Wizard.js.map +1 -1
  10. package/dist/lib/Helper/__tests__/SentryCli.js +1 -0
  11. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  12. package/dist/lib/Steps/ChooseIntegration.js +4 -0
  13. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  14. package/dist/lib/Steps/Integrations/Apple.d.ts +10 -0
  15. package/dist/lib/Steps/Integrations/Apple.js +92 -0
  16. package/dist/lib/Steps/Integrations/Apple.js.map +1 -0
  17. package/dist/lib/Steps/Integrations/NextJsShim.js +1 -0
  18. package/dist/lib/Steps/Integrations/NextJsShim.js.map +1 -1
  19. package/dist/lib/Steps/Integrations/SourceMapsShim.js +1 -0
  20. package/dist/lib/Steps/Integrations/SourceMapsShim.js.map +1 -1
  21. package/dist/lib/Steps/Integrations/SvelteKitShim.js +1 -0
  22. package/dist/lib/Steps/Integrations/SvelteKitShim.js.map +1 -1
  23. package/dist/package.json +2 -2
  24. package/dist/src/apple/apple-wizard.d.ts +2 -0
  25. package/dist/src/apple/apple-wizard.js +197 -0
  26. package/dist/src/apple/apple-wizard.js.map +1 -0
  27. package/dist/src/apple/code-tools.d.ts +1 -0
  28. package/dist/src/apple/code-tools.js +100 -0
  29. package/dist/src/apple/code-tools.js.map +1 -0
  30. package/dist/src/apple/templates.d.ts +4 -0
  31. package/dist/src/apple/templates.js +19 -0
  32. package/dist/src/apple/templates.js.map +1 -0
  33. package/dist/src/apple/xcode-manager.d.ts +4 -0
  34. package/dist/src/apple/xcode-manager.js +145 -0
  35. package/dist/src/apple/xcode-manager.js.map +1 -0
  36. package/dist/src/sourcemaps/sourcemaps-wizard.js +143 -71
  37. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  38. package/dist/src/sourcemaps/tools/angular.d.ts +1 -0
  39. package/dist/src/sourcemaps/tools/angular.js +76 -0
  40. package/dist/src/sourcemaps/tools/angular.js.map +1 -0
  41. package/dist/src/sourcemaps/tools/esbuild.js +2 -1
  42. package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
  43. package/dist/src/sourcemaps/tools/rollup.js +2 -1
  44. package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
  45. package/dist/src/sourcemaps/tools/sentry-cli.js +2 -1
  46. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  47. package/dist/src/sourcemaps/tools/vite.js +2 -1
  48. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  49. package/dist/src/sourcemaps/tools/webpack.js +2 -1
  50. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  51. package/dist/src/sourcemaps/utils/detect-tool.d.ts +3 -0
  52. package/dist/src/sourcemaps/utils/detect-tool.js +73 -0
  53. package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -0
  54. package/dist/src/sourcemaps/utils/other-wizards.d.ts +4 -0
  55. package/dist/src/sourcemaps/utils/other-wizards.js +183 -0
  56. package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -0
  57. package/dist/src/sourcemaps/utils/sdk-version.js +14 -13
  58. package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
  59. package/dist/src/sveltekit/sveltekit-wizard.js +2 -1
  60. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  61. package/dist/src/telemetry.d.ts +1 -0
  62. package/dist/src/telemetry.js +7 -1
  63. package/dist/src/telemetry.js.map +1 -1
  64. package/dist/src/utils/bash.d.ts +3 -0
  65. package/dist/src/utils/bash.js +118 -0
  66. package/dist/src/utils/bash.js.map +1 -0
  67. package/dist/src/utils/clack-utils.d.ts +9 -8
  68. package/dist/src/utils/clack-utils.js +54 -21
  69. package/dist/src/utils/clack-utils.js.map +1 -1
  70. package/dist/src/utils/package-json.d.ts +19 -0
  71. package/dist/src/utils/package-json.js +29 -0
  72. package/dist/src/utils/package-json.js.map +1 -0
  73. package/dist/src/utils/types.d.ts +4 -0
  74. package/dist/src/utils/types.js.map +1 -1
  75. package/lib/Constants.ts +6 -0
  76. package/lib/Helper/Wizard.ts +3 -0
  77. package/lib/Helper/__tests__/SentryCli.ts +2 -1
  78. package/lib/Steps/ChooseIntegration.ts +4 -0
  79. package/lib/Steps/Integrations/Apple.ts +27 -0
  80. package/lib/Steps/Integrations/NextJsShim.ts +1 -0
  81. package/lib/Steps/Integrations/SourceMapsShim.ts +1 -0
  82. package/lib/Steps/Integrations/SvelteKitShim.ts +1 -0
  83. package/package-lock.json +8910 -0
  84. package/package.json +2 -2
  85. package/src/apple/apple-wizard.ts +150 -0
  86. package/src/apple/code-tools.ts +81 -0
  87. package/src/apple/templates.ts +39 -0
  88. package/src/apple/xcode-manager.ts +147 -0
  89. package/src/sourcemaps/sourcemaps-wizard.ts +156 -91
  90. package/src/sourcemaps/tools/angular.ts +42 -0
  91. package/src/sourcemaps/tools/esbuild.ts +1 -1
  92. package/src/sourcemaps/tools/rollup.ts +2 -4
  93. package/src/sourcemaps/tools/sentry-cli.ts +1 -1
  94. package/src/sourcemaps/tools/vite.ts +1 -1
  95. package/src/sourcemaps/tools/webpack.ts +1 -1
  96. package/src/sourcemaps/utils/detect-tool.ts +41 -0
  97. package/src/sourcemaps/utils/other-wizards.ts +148 -0
  98. package/src/sourcemaps/utils/sdk-version.ts +9 -16
  99. package/src/sveltekit/sveltekit-wizard.ts +1 -1
  100. package/src/telemetry.ts +8 -0
  101. package/src/utils/bash.ts +44 -0
  102. package/src/utils/clack-utils.ts +44 -37
  103. package/src/utils/package-json.ts +45 -0
  104. package/src/utils/types.ts +5 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.execute = exports.installSentryCLI = exports.hasSentryCLI = void 0;
63
+ var child_process = __importStar(require("child_process"));
64
+ var https = __importStar(require("https"));
65
+ var fs = __importStar(require("fs"));
66
+ function hasSentryCLI() {
67
+ try {
68
+ child_process.execSync('sentry-cli --version');
69
+ return true;
70
+ }
71
+ catch (e) {
72
+ return false;
73
+ }
74
+ }
75
+ exports.hasSentryCLI = hasSentryCLI;
76
+ function installSentryCLI() {
77
+ return __awaiter(this, void 0, void 0, function () {
78
+ var httpAsync;
79
+ return __generator(this, function (_a) {
80
+ switch (_a.label) {
81
+ case 0:
82
+ httpAsync = new Promise(function (resolve, reject) {
83
+ var file = fs.createWriteStream('installcli.sh');
84
+ https.get('https://sentry.io/get-cli/', function (response) {
85
+ response.pipe(file);
86
+ file.on('finish', function () {
87
+ file.close();
88
+ try {
89
+ child_process.execSync('bash ./installcli.sh');
90
+ }
91
+ catch (e) {
92
+ reject(e);
93
+ return;
94
+ }
95
+ fs.unlinkSync('installcli.sh');
96
+ resolve(null);
97
+ });
98
+ file.on('error', function (err) {
99
+ fs.unlinkSync('installcli.sh');
100
+ reject(err);
101
+ });
102
+ });
103
+ });
104
+ return [4 /*yield*/, httpAsync];
105
+ case 1:
106
+ _a.sent();
107
+ return [2 /*return*/];
108
+ }
109
+ });
110
+ });
111
+ }
112
+ exports.installSentryCLI = installSentryCLI;
113
+ function execute(command) {
114
+ var output = child_process.execSync(command);
115
+ return output.toString();
116
+ }
117
+ exports.execute = execute;
118
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/utils/bash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAA+C;AAC/C,2CAA+B;AAC/B,qCAAyB;AAEzB,SAAgB,YAAY;IACxB,IAAI;QACA,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACR,OAAO,KAAK,CAAC;KAChB;AACL,CAAC;AAPD,oCAOC;AAED,SAAsB,gBAAgB;;;;;;oBAC5B,SAAS,GAAG,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;wBAC1C,IAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;wBACnD,KAAK,CAAC,GAAG,CAAC,4BAA4B,EAAE,UAAC,QAAQ;4BAC7C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACpB,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;gCACd,IAAI,CAAC,KAAK,EAAE,CAAC;gCACb,IAAI;oCACA,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;iCAClD;gCAAC,OAAO,CAAC,EAAE;oCACR,MAAM,CAAC,CAAC,CAAC,CAAC;oCACV,OAAM;iCACT;gCACD,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;gCAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;4BAClB,CAAC,CAAC,CAAC;4BAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,GAAG;gCACjB,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;gCAC/B,MAAM,CAAC,GAAG,CAAC,CAAC;4BAChB,CAAC,CAAC,CAAC;wBACP,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;oBAEH,qBAAM,SAAS,EAAA;;oBAAf,SAAe,CAAC;;;;;CACnB;AAzBD,4CAyBC;AAED,SAAgB,OAAO,CAAC,OAAe;IACnC,IAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAHD,0BAGC","sourcesContent":["import * as child_process from 'child_process';\nimport * as https from 'https';\nimport * as fs from 'fs';\n\nexport function hasSentryCLI(): boolean {\n try {\n child_process.execSync('sentry-cli --version');\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport async function installSentryCLI(): Promise<void> {\n const httpAsync = new Promise((resolve, reject) => {\n const file = fs.createWriteStream('installcli.sh');\n https.get('https://sentry.io/get-cli/', (response) => {\n response.pipe(file);\n file.on('finish', () => {\n file.close();\n try {\n child_process.execSync('bash ./installcli.sh');\n } catch (e) {\n reject(e);\n return\n }\n fs.unlinkSync('installcli.sh');\n resolve(null);\n });\n\n file.on('error', (err) => {\n fs.unlinkSync('installcli.sh');\n reject(err);\n });\n });\n });\n\n await httpAsync;\n}\n\nexport function execute(command: string): string {\n const output = child_process.execSync(command);\n return output.toString();\n}\n"]}
@@ -1,18 +1,15 @@
1
+ import { PackageDotJson } from './package-json';
1
2
  interface WizardProjectData {
2
3
  apiKeys: {
3
4
  token: string;
4
5
  };
5
6
  projects: SentryProjectData[];
6
7
  }
7
- export type PackageDotJson = {
8
- scripts?: Record<string, string>;
9
- dependencies?: Record<string, string>;
10
- devDependencies?: Record<string, string>;
11
- };
12
8
  export interface SentryProjectData {
13
9
  id: string;
14
10
  slug: string;
15
11
  name: string;
12
+ platform: string;
16
13
  organization: {
17
14
  slug: string;
18
15
  };
@@ -30,11 +27,16 @@ export declare function printWelcome(options: {
30
27
  message?: string;
31
28
  }): void;
32
29
  export declare function confirmContinueEvenThoughNoGitRepo(): Promise<void>;
30
+ export declare function askToInstallSentryCLI(): Promise<boolean>;
33
31
  export declare function askForWizardLogin(options: {
34
32
  url: string;
35
33
  promoCode?: string;
36
- platform?: 'javascript-nextjs' | 'javascript-sveltekit';
34
+ platform?: 'javascript-nextjs' | 'javascript-sveltekit' | 'apple-ios';
37
35
  }): Promise<WizardProjectData>;
36
+ export declare function askForItemSelection(items: string[], message: string): Promise<{
37
+ value: string;
38
+ index: number;
39
+ }>;
38
40
  export declare function askForProjectSelection(projects: SentryProjectData[]): Promise<SentryProjectData>;
39
41
  export declare function installPackage({ packageName, alreadyInstalled, askBeforeUpdating, }: {
40
42
  packageName: string;
@@ -58,6 +60,5 @@ export declare function addSentryCliRc(authToken: string): Promise<void>;
58
60
  export declare function addDotEnvSentryBuildPluginFile(authToken: string): Promise<void>;
59
61
  export declare function ensurePackageIsInstalled(packageJson: PackageDotJson, packageId: string, packageName: string): Promise<void>;
60
62
  export declare function getPackageDotJson(): Promise<PackageDotJson>;
61
- export declare function hasPackageInstalled(packageName: string, packageJson: PackageDotJson): boolean;
62
- export declare function getPackageVersion(packageName: string, packageJson: PackageDotJson): string | undefined;
63
+ export declare function detectPackageManager(): 'yarn' | 'npm' | 'pnpm' | undefined;
63
64
  export {};
@@ -62,7 +62,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
62
62
  return (mod && mod.__esModule) ? mod : { "default": mod };
63
63
  };
64
64
  Object.defineProperty(exports, "__esModule", { value: true });
65
- exports.getPackageVersion = exports.hasPackageInstalled = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliRc = exports.askForSelfHosted = exports.installPackage = exports.askForProjectSelection = exports.askForWizardLogin = exports.confirmContinueEvenThoughNoGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = void 0;
65
+ exports.detectPackageManager = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliRc = exports.askForSelfHosted = exports.installPackage = exports.askForProjectSelection = exports.askForItemSelection = exports.askForWizardLogin = exports.askToInstallSentryCLI = exports.confirmContinueEvenThoughNoGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = void 0;
66
66
  // @ts-ignore - clack is ESM and TS complains about that. It works though
67
67
  var clack = __importStar(require("@clack/prompts"));
68
68
  var axios_1 = __importDefault(require("axios"));
@@ -75,6 +75,7 @@ var url_1 = require("url");
75
75
  var util_1 = require("util");
76
76
  var Sentry = __importStar(require("@sentry/node"));
77
77
  var clack_custom_select_1 = require("./vendor/clack-custom-select");
78
+ var package_json_1 = require("./package-json");
78
79
  var opn = require('opn');
79
80
  var SAAS_URL = 'https://sentry.io/';
80
81
  function abort(message, status) {
@@ -184,6 +185,19 @@ function confirmContinueEvenThoughNoGitRepo() {
184
185
  });
185
186
  }
186
187
  exports.confirmContinueEvenThoughNoGitRepo = confirmContinueEvenThoughNoGitRepo;
188
+ function askToInstallSentryCLI() {
189
+ return __awaiter(this, void 0, void 0, function () {
190
+ return __generator(this, function (_a) {
191
+ switch (_a.label) {
192
+ case 0: return [4 /*yield*/, abortIfCancelled(clack.confirm({
193
+ message: "You don't have Sentry CLI installed. Do you want to install it?"
194
+ }))];
195
+ case 1: return [2 /*return*/, _a.sent()];
196
+ }
197
+ });
198
+ });
199
+ }
200
+ exports.askToInstallSentryCLI = askToInstallSentryCLI;
187
201
  function askForWizardLogin(options) {
188
202
  return __awaiter(this, void 0, void 0, function () {
189
203
  var hasSentryAccount, wizardHash, _a, loginUrl, urlToOpen, loginSpinner, data;
@@ -271,6 +285,29 @@ function askForWizardLogin(options) {
271
285
  });
272
286
  }
273
287
  exports.askForWizardLogin = askForWizardLogin;
288
+ function askForItemSelection(items, message) {
289
+ return __awaiter(this, void 0, void 0, function () {
290
+ var selection;
291
+ return __generator(this, function (_a) {
292
+ switch (_a.label) {
293
+ case 0: return [4 /*yield*/, abortIfCancelled((0, clack_custom_select_1.windowedSelect)({
294
+ maxItems: 12,
295
+ message: message,
296
+ options: items.map(function (item, index) {
297
+ return {
298
+ value: { value: item, index: index },
299
+ label: item,
300
+ };
301
+ }),
302
+ }))];
303
+ case 1:
304
+ selection = _a.sent();
305
+ return [2 /*return*/, selection];
306
+ }
307
+ });
308
+ });
309
+ }
310
+ exports.askForItemSelection = askForItemSelection;
274
311
  function askForProjectSelection(projects) {
275
312
  return __awaiter(this, void 0, void 0, function () {
276
313
  var selection;
@@ -289,6 +326,7 @@ function askForProjectSelection(projects) {
289
326
  case 1:
290
327
  selection = _a.sent();
291
328
  Sentry.setTag('project', selection.slug);
329
+ Sentry.setTag('project-platform', selection.platform);
292
330
  Sentry.setUser({ id: selection.organization.slug });
293
331
  return [2 /*return*/, selection];
294
332
  }
@@ -554,7 +592,7 @@ function ensurePackageIsInstalled(packageJson, packageId, packageName) {
554
592
  return __generator(this, function (_a) {
555
593
  switch (_a.label) {
556
594
  case 0:
557
- if (!!hasPackageInstalled(packageId, packageJson)) return [3 /*break*/, 3];
595
+ if (!!(0, package_json_1.hasPackageInstalled)(packageId, packageJson)) return [3 /*break*/, 3];
558
596
  return [4 /*yield*/, abortIfCancelled(clack.confirm({
559
597
  message: "".concat(packageName, " does not seem to be installed. Do you still want to continue?"),
560
598
  initialValue: false,
@@ -605,31 +643,13 @@ function getPackageDotJson() {
605
643
  });
606
644
  }
607
645
  exports.getPackageDotJson = getPackageDotJson;
608
- function hasPackageInstalled(packageName, packageJson) {
609
- return getPackageVersion(packageName, packageJson) !== undefined;
610
- }
611
- exports.hasPackageInstalled = hasPackageInstalled;
612
- function getPackageVersion(packageName, packageJson) {
613
- var _a, _b;
614
- return (((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) ||
615
- ((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies) === null || _b === void 0 ? void 0 : _b[packageName]));
616
- }
617
- exports.getPackageVersion = getPackageVersion;
618
646
  function getPackageManager() {
619
647
  return __awaiter(this, void 0, void 0, function () {
620
648
  var detectedPackageManager, selectedPackageManager;
621
649
  return __generator(this, function (_a) {
622
650
  switch (_a.label) {
623
651
  case 0:
624
- if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {
625
- detectedPackageManager = 'yarn';
626
- }
627
- else if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {
628
- detectedPackageManager = 'npm';
629
- }
630
- else if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
631
- detectedPackageManager = 'pnpm';
632
- }
652
+ detectedPackageManager = detectPackageManager();
633
653
  if (detectedPackageManager) {
634
654
  return [2 /*return*/, detectedPackageManager];
635
655
  }
@@ -649,4 +669,17 @@ function getPackageManager() {
649
669
  });
650
670
  });
651
671
  }
672
+ function detectPackageManager() {
673
+ if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {
674
+ return 'yarn';
675
+ }
676
+ if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {
677
+ return 'npm';
678
+ }
679
+ if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
680
+ return 'pnpm';
681
+ }
682
+ return undefined;
683
+ }
684
+ exports.detectPackageManager = detectPackageManager;
652
685
  //# sourceMappingURL=clack-utils.js.map
@@ -1 +1 @@
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 axios from 'axios';\nimport chalk from 'chalk';\nimport * as childProcess from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { setInterval } from 'timers';\nimport { URL } from 'url';\nimport { promisify } from 'util';\nimport * as Sentry from '@sentry/node';\nimport { windowedSelect } from './vendor/clack-custom-select';\n\nconst opn = require('opn') as (\n url: string,\n) => Promise<childProcess.ChildProcess>;\n\nconst SAAS_URL = 'https://sentry.io/';\n\ninterface WizardProjectData {\n apiKeys: {\n token: string;\n };\n projects: SentryProjectData[];\n}\n\nexport type PackageDotJson = {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\nexport interface SentryProjectData {\n id: string;\n slug: string;\n name: string;\n organization: {\n slug: string;\n };\n keys: [{ dsn: { public: string } }];\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}): 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 'This Wizard will help you set up Sentry for your application.\\nThank you for using Sentry :)';\n\n if (options.promoCode) {\n welcomeText += `\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n if (wizardPackage.version) {\n welcomeText += `\\n\\nVersion: ${wizardPackage.version}`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueEvenThoughNoGitRepo(): Promise<void> {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n } catch {\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 still want to continue?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n }\n}\n\nexport async function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?: 'javascript-nextjs' | 'javascript-sveltekit';\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(\n \"Waiting for you to log in using the link above. Once you're logged in, return to this wizard.\",\n );\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 .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\nexport async function askForProjectSelection(\n projects: SentryProjectData[],\n): Promise<SentryProjectData> {\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n windowedSelect({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: projects.map((project) => {\n return {\n value: project,\n label: `${project.organization.slug}/${project.slug}`,\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\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 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)}.`,\n );\n\n try {\n if (packageManager === 'yarn') {\n await promisify(childProcess.exec)(`yarn add ${packageName}@latest`);\n } else if (packageManager === 'pnpm') {\n await promisify(childProcess.exec)(`pnpm add ${packageName}@latest`);\n } else if (packageManager === 'npm') {\n await promisify(childProcess.exec)(`npm install ${packageName}@latest`);\n }\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)}.`,\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 */\nexport async 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\nexport async function addSentryCliRc(authToken: string): Promise<void> {\n const clircExists = fs.existsSync(path.join(process.cwd(), '.sentryclirc'));\n if (clircExists) {\n const clircContents = fs.readFileSync(\n path.join(process.cwd(), '.sentryclirc'),\n 'utf8',\n );\n\n const likelyAlreadyHasAuthToken = !!(\n clircContents.includes('[auth]') && clircContents.match(/token=./g)\n );\n\n if (likelyAlreadyHasAuthToken) {\n clack.log.warn(\n `${chalk.bold(\n '.sentryclirc',\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n path.join(process.cwd(), '.sentryclirc'),\n `${clircContents}\\n[auth]\\ntoken=${authToken}\\n`,\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold(\n '.sentryclirc',\n )} for you to test uploading source maps locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n '.sentryclirc',\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(\n path.join(process.cwd(), '.sentryclirc'),\n `[auth]\\ntoken=${authToken}\\n`,\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created ${chalk.bold(\n '.sentryclirc',\n )} with auth token for you to test uploading source maps locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold(\n '.sentryclirc',\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addAuthTokenFileToGitIgnore('.sentryclirc');\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const DOT_ENV_FILE = '.env.sentry-build-plugin';\n\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(), 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(DOT_ENV_FILE)} 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(`Added auth token to ${chalk.bold(DOT_ENV_FILE)}`);\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n 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 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 DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addAuthTokenFileToGitIgnore(DOT_ENV_FILE);\n}\n\nasync function addAuthTokenFileToGitIgnore(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 Auth Token\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.bold(filename)} to ${chalk.bold('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.bold(filename)} to ${chalk.bold(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n) {\n if (!hasPackageInstalled(packageId, packageJson)) {\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\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 package.json. Make sure it has a valid format!',\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return getPackageVersion(packageName, packageJson) !== undefined;\n}\n\nexport function getPackageVersion(\n packageName: string,\n packageJson: PackageDotJson,\n): string | undefined {\n return (\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName]\n );\n}\n\nasync function getPackageManager(): Promise<string> {\n let detectedPackageManager;\n if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {\n detectedPackageManager = 'yarn';\n } else if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {\n detectedPackageManager = 'npm';\n } else if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {\n detectedPackageManager = 'pnpm';\n }\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: string | symbol = await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: [\n { value: 'npm', label: 'Npm' },\n { value: 'yarn', label: 'Yarn' },\n { value: 'pnpm', label: 'Pnpm' },\n ],\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager);\n\n return selectedPackageManager;\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 axios from 'axios';\nimport chalk from 'chalk';\nimport * as childProcess from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { setInterval } from 'timers';\nimport { URL } from 'url';\nimport { promisify } from 'util';\nimport * as Sentry from '@sentry/node';\nimport { windowedSelect } from './vendor/clack-custom-select';\nimport { hasPackageInstalled, PackageDotJson } from './package-json';\n\nconst opn = require('opn') as (\n url: string,\n) => Promise<childProcess.ChildProcess>;\n\nconst SAAS_URL = 'https://sentry.io/';\n\ninterface WizardProjectData {\n apiKeys: {\n token: string;\n };\n projects: SentryProjectData[];\n}\n\nexport interface SentryProjectData {\n id: string;\n slug: string;\n name: string;\n platform: string;\n organization: {\n slug: string;\n };\n keys: [{ dsn: { public: string } }];\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}): 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 'This Wizard will help you set up Sentry for your application.\\nThank you for using Sentry :)';\n\n if (options.promoCode) {\n welcomeText += `\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n if (wizardPackage.version) {\n welcomeText += `\\n\\nVersion: ${wizardPackage.version}`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueEvenThoughNoGitRepo(): Promise<void> {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n } catch {\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 still want to continue?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n }\n}\n\nexport async function askToInstallSentryCLI(): Promise<boolean> {\n return await abortIfCancelled(clack.confirm({\n message: \"You don't have Sentry CLI installed. Do you want to install it?\"\n }));\n}\n\nexport async function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?: 'javascript-nextjs' | 'javascript-sveltekit' | 'apple-ios';\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 ${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(\n \"Waiting for you to log in using the link above. Once you're logged in, return to this wizard.\",\n );\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 .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\nexport async function askForItemSelection(items: string[], message: string): Promise<{ value: string, index: number }> {\n const selection: { value: string, index: number } | symbol = await abortIfCancelled(\n windowedSelect({\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 askForProjectSelection(\n projects: SentryProjectData[],\n): Promise<SentryProjectData> {\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n windowedSelect({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: projects.map((project) => {\n return {\n value: project,\n label: `${project.organization.slug}/${project.slug}`,\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setTag('project-platform', selection.platform);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\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 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)}.`,\n );\n\n try {\n if (packageManager === 'yarn') {\n await promisify(childProcess.exec)(`yarn add ${packageName}@latest`);\n } else if (packageManager === 'pnpm') {\n await promisify(childProcess.exec)(`pnpm add ${packageName}@latest`);\n } else if (packageManager === 'npm') {\n await promisify(childProcess.exec)(`npm install ${packageName}@latest`);\n }\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)}.`,\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 */\nexport async 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 ${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\nexport async function addSentryCliRc(authToken: string): Promise<void> {\n const clircExists = fs.existsSync(path.join(process.cwd(), '.sentryclirc'));\n if (clircExists) {\n const clircContents = fs.readFileSync(\n path.join(process.cwd(), '.sentryclirc'),\n 'utf8',\n );\n\n const likelyAlreadyHasAuthToken = !!(\n clircContents.includes('[auth]') && clircContents.match(/token=./g)\n );\n\n if (likelyAlreadyHasAuthToken) {\n clack.log.warn(\n `${chalk.bold(\n '.sentryclirc',\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n path.join(process.cwd(), '.sentryclirc'),\n `${clircContents}\\n[auth]\\ntoken=${authToken}\\n`,\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold(\n '.sentryclirc',\n )} for you to test uploading source maps locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n '.sentryclirc',\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(\n path.join(process.cwd(), '.sentryclirc'),\n `[auth]\\ntoken=${authToken}\\n`,\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created ${chalk.bold(\n '.sentryclirc',\n )} with auth token for you to test uploading source maps locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold(\n '.sentryclirc',\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addAuthTokenFileToGitIgnore('.sentryclirc');\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const DOT_ENV_FILE = '.env.sentry-build-plugin';\n\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(), 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(DOT_ENV_FILE)} 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(`Added auth token to ${chalk.bold(DOT_ENV_FILE)}`);\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold(\n 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 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 DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addAuthTokenFileToGitIgnore(DOT_ENV_FILE);\n}\n\nasync function addAuthTokenFileToGitIgnore(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 Auth Token\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.bold(filename)} to ${chalk.bold('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.bold(filename)} to ${chalk.bold(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n) {\n if (!hasPackageInstalled(packageId, packageJson)) {\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\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 package.json. Make sure it has a valid format!',\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nasync function getPackageManager(): Promise<string> {\n const detectedPackageManager = detectPackageManager();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: string | symbol = await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: [\n { value: 'npm', label: 'Npm' },\n { value: 'yarn', label: 'Yarn' },\n { value: 'pnpm', label: 'Pnpm' },\n ],\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager);\n\n return selectedPackageManager;\n}\n\nexport function detectPackageManager(): 'yarn' | 'npm' | 'pnpm' | undefined {\n if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {\n return 'yarn';\n }\n if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {\n return 'npm';\n }\n if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n return undefined;\n}\n"]}
@@ -0,0 +1,19 @@
1
+ export type PackageDotJson = {
2
+ scripts?: Record<string, string>;
3
+ dependencies?: Record<string, string>;
4
+ devDependencies?: Record<string, string>;
5
+ };
6
+ type NpmPackage = {
7
+ name: string;
8
+ version: string;
9
+ };
10
+ /**
11
+ * Checks if @param packageJson has any of the @param packageNamesList package names
12
+ * listed as a dependency or devDependency.
13
+ * If so, it returns the first package name that is found, including the
14
+ * version (range) specified in the package.json.
15
+ */
16
+ export declare function findInstalledPackageFromList(packageNamesList: string[], packageJson: PackageDotJson): NpmPackage | undefined;
17
+ export declare function hasPackageInstalled(packageName: string, packageJson: PackageDotJson): boolean;
18
+ export declare function getPackageVersion(packageName: string, packageJson: PackageDotJson): string | undefined;
19
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPackageVersion = exports.hasPackageInstalled = exports.findInstalledPackageFromList = void 0;
4
+ /**
5
+ * Checks if @param packageJson has any of the @param packageNamesList package names
6
+ * listed as a dependency or devDependency.
7
+ * If so, it returns the first package name that is found, including the
8
+ * version (range) specified in the package.json.
9
+ */
10
+ function findInstalledPackageFromList(packageNamesList, packageJson) {
11
+ return packageNamesList
12
+ .map(function (packageName) { return ({
13
+ name: packageName,
14
+ version: getPackageVersion(packageName, packageJson),
15
+ }); })
16
+ .find(function (sdkPackage) { return !!sdkPackage.version; });
17
+ }
18
+ exports.findInstalledPackageFromList = findInstalledPackageFromList;
19
+ function hasPackageInstalled(packageName, packageJson) {
20
+ return getPackageVersion(packageName, packageJson) !== undefined;
21
+ }
22
+ exports.hasPackageInstalled = hasPackageInstalled;
23
+ function getPackageVersion(packageName, packageJson) {
24
+ var _a, _b;
25
+ return (((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) ||
26
+ ((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies) === null || _b === void 0 ? void 0 : _b[packageName]));
27
+ }
28
+ exports.getPackageVersion = getPackageVersion;
29
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/utils/package-json.ts"],"names":[],"mappings":";;;AAWA;;;;;GAKG;AACH,SAAgB,4BAA4B,CAC1C,gBAA0B,EAC1B,WAA2B;IAE3B,OAAO,gBAAgB;SACpB,GAAG,CAAC,UAAC,WAAW,IAAK,OAAA,CAAC;QACrB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC;KACrD,CAAC,EAHoB,CAGpB,CAAC;SACF,IAAI,CAAC,UAAC,UAAU,IAA+B,OAAA,CAAC,CAAC,UAAU,CAAC,OAAO,EAApB,CAAoB,CAAC,CAAC;AAC1E,CAAC;AAVD,oEAUC;AAED,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,WAA2B;IAE3B,OAAO,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC;AACnE,CAAC;AALD,kDAKC;AAED,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,WAA2B;;IAE3B,OAAO,CACL,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,0CAAG,WAAW,CAAC;SACxC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,0CAAG,WAAW,CAAC,CAAA,CAC5C,CAAC;AACJ,CAAC;AARD,8CAQC","sourcesContent":["export type PackageDotJson = {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\ntype NpmPackage = {\n name: string;\n version: string;\n};\n\n/**\n * Checks if @param packageJson has any of the @param packageNamesList package names\n * listed as a dependency or devDependency.\n * If so, it returns the first package name that is found, including the\n * version (range) specified in the package.json.\n */\nexport function findInstalledPackageFromList(\n packageNamesList: string[],\n packageJson: PackageDotJson,\n): NpmPackage | undefined {\n return packageNamesList\n .map((packageName) => ({\n name: packageName,\n version: getPackageVersion(packageName, packageJson),\n }))\n .find((sdkPackage): sdkPackage is NpmPackage => !!sdkPackage.version);\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return getPackageVersion(packageName, packageJson) !== undefined;\n}\n\nexport function getPackageVersion(\n packageName: string,\n packageJson: PackageDotJson,\n): string | undefined {\n return (\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName]\n );\n}\n"]}
@@ -1,4 +1,8 @@
1
1
  export type WizardOptions = {
2
+ /**
3
+ * Controls whether the wizard should send telemetry data to Sentry.
4
+ */
5
+ telemetryEnabled: boolean;
2
6
  /**
3
7
  * The promo code to use while signing up for Sentry.
4
8
  * This can be passed via the --promo-code arg.
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type WizardOptions = {\n /**\n * The promo code to use while signing up for Sentry.\n * This can be passed via the --promo-code arg.\n */\n promoCode?: string;\n\n /**\n * The url of the Sentry instance to use.\n * This can be passed via the `-u` or `--url` arg.\n */\n url?: string;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type WizardOptions = {\n /**\n * Controls whether the wizard should send telemetry data to Sentry.\n */\n telemetryEnabled: boolean;\n\n /**\n * The promo code to use while signing up for Sentry.\n * This can be passed via the --promo-code arg.\n */\n promoCode?: string;\n\n /**\n * The url of the Sentry instance to use.\n * This can be passed via the `-u` or `--url` arg.\n */\n url?: string;\n};\n"]}
package/lib/Constants.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /** Key value should be the same here */
2
2
  export enum Integration {
3
3
  reactNative = 'reactNative',
4
+ ios = 'ios',
4
5
  cordova = 'cordova',
5
6
  electron = 'electron',
6
7
  nextjs = 'nextjs',
@@ -45,6 +46,8 @@ export function getIntegrationDescription(type: string): string {
45
46
  return 'SvelteKit';
46
47
  case Integration.sourcemaps:
47
48
  return 'Configure Source Maps Upload';
49
+ case Integration.ios:
50
+ return 'iOS';
48
51
  default:
49
52
  return 'React Native';
50
53
  }
@@ -64,6 +67,8 @@ export function mapIntegrationToPlatform(type: string): string | undefined {
64
67
  return 'javascript-sveltekit';
65
68
  case Integration.sourcemaps:
66
69
  return undefined;
70
+ case Integration.ios:
71
+ return 'iOS';
67
72
  default:
68
73
  throw new Error(`Unknown integration ${type}`);
69
74
  }
@@ -91,6 +96,7 @@ export interface Args {
91
96
  quiet: boolean;
92
97
  signup: boolean;
93
98
  promoCode?: string;
99
+ disableTelemetry?: boolean;
94
100
  }
95
101
 
96
102
  export const DEFAULT_URL = 'https://sentry.io/';
@@ -21,6 +21,9 @@ function sanitizeAndValidateArgs(argv: Args): void {
21
21
  }
22
22
  // @ts-ignore skip-connect does not exist on args
23
23
  argv.promoCode = argv['promo-code'];
24
+
25
+ // @ts-ignore skip-connect does not exist on args
26
+ argv.disableTelemetry = argv['disable-telemetry'] != undefined;
24
27
  }
25
28
 
26
29
  export function getCurrentIntegration(answers: Answers): BaseIntegration {
@@ -1,7 +1,7 @@
1
1
  /// <reference types="jest" />
2
2
  import type { Answers } from 'inquirer';
3
3
 
4
- import type { Args} from '../../Constants';
4
+ import type { Args } from '../../Constants';
5
5
  import { Integration, Platform } from '../../Constants';
6
6
  import { SentryCli } from '../SentryCli';
7
7
 
@@ -14,6 +14,7 @@ const args: Args = {
14
14
  uninstall: false,
15
15
  url: 'https://localhost:1234',
16
16
  signup: false,
17
+ disableTelemetry: false,
17
18
  };
18
19
 
19
20
  const demoAnswers: Answers = {
@@ -15,6 +15,7 @@ import { Electron } from './Integrations/Electron';
15
15
  import { NextJsShim } from './Integrations/NextJsShim';
16
16
  import { ReactNative } from './Integrations/ReactNative';
17
17
  import { SourceMapsShim } from './Integrations/SourceMapsShim';
18
+ import { Apple } from './Integrations/Apple';
18
19
  import { SvelteKitShim } from './Integrations/SvelteKitShim';
19
20
 
20
21
  let projectPackage: any = {};
@@ -51,6 +52,9 @@ export class ChooseIntegration extends BaseStep {
51
52
  case Integration.sourcemaps:
52
53
  integration = new SourceMapsShim(this._argv);
53
54
  break;
55
+ case Integration.ios:
56
+ integration = new Apple(this._argv);
57
+ break;
54
58
  case Integration.reactNative:
55
59
  default:
56
60
  integration = new ReactNative(sanitizeUrl(this._argv));