@sentry/wizard 3.1.0-beta.0 → 3.2.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 (108) hide show
  1. package/CHANGELOG.md +17 -2
  2. package/bin.ts +5 -1
  3. package/dist/bin.js +6 -1
  4. package/dist/bin.js.map +1 -1
  5. package/dist/lib/Constants.d.ts +2 -1
  6. package/dist/lib/Constants.js +5 -0
  7. package/dist/lib/Constants.js.map +1 -1
  8. package/dist/lib/Helper/File.js +25 -2
  9. package/dist/lib/Helper/File.js.map +1 -1
  10. package/dist/lib/Helper/Git.d.ts +7 -0
  11. package/dist/lib/Helper/Git.js +94 -0
  12. package/dist/lib/Helper/Git.js.map +1 -0
  13. package/dist/lib/Helper/Logging.d.ts +1 -0
  14. package/dist/lib/Helper/Logging.js +9 -2
  15. package/dist/lib/Helper/Logging.js.map +1 -1
  16. package/dist/lib/Helper/MergeConfig.js +24 -1
  17. package/dist/lib/Helper/MergeConfig.js.map +1 -1
  18. package/dist/lib/Helper/Package.d.ts +9 -0
  19. package/dist/lib/Helper/Package.js +39 -2
  20. package/dist/lib/Helper/Package.js.map +1 -1
  21. package/dist/lib/Helper/PackageManager.d.ts +1 -1
  22. package/dist/lib/Helper/PackageManager.js +32 -11
  23. package/dist/lib/Helper/PackageManager.js.map +1 -1
  24. package/dist/lib/Helper/SentryCli.d.ts +11 -0
  25. package/dist/lib/Helper/SentryCli.js +141 -2
  26. package/dist/lib/Helper/SentryCli.js.map +1 -1
  27. package/dist/lib/Helper/Wizard.js +24 -1
  28. package/dist/lib/Helper/Wizard.js.map +1 -1
  29. package/dist/lib/Helper/__tests__/MergeConfig.js +25 -2
  30. package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
  31. package/dist/lib/Setup.js +25 -2
  32. package/dist/lib/Setup.js.map +1 -1
  33. package/dist/lib/Steps/ChooseIntegration.js +28 -1
  34. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  35. package/dist/lib/Steps/Initial.js +25 -2
  36. package/dist/lib/Steps/Initial.js.map +1 -1
  37. package/dist/lib/Steps/Integrations/BaseIntegration.js +24 -1
  38. package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
  39. package/dist/lib/Steps/Integrations/Cordova.js +25 -2
  40. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  41. package/dist/lib/Steps/Integrations/Electron.js +26 -3
  42. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  43. package/dist/lib/Steps/Integrations/MobileProject.js +24 -1
  44. package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
  45. package/dist/lib/Steps/Integrations/NextJs.d.ts +5 -11
  46. package/dist/lib/Steps/Integrations/NextJs.js +14 -343
  47. package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
  48. package/dist/lib/Steps/Integrations/ReactNative.d.ts +1 -0
  49. package/dist/lib/Steps/Integrations/ReactNative.js +67 -6
  50. package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
  51. package/dist/lib/Steps/Integrations/SvelteKit.d.ts +13 -0
  52. package/dist/lib/Steps/Integrations/SvelteKit.js +95 -0
  53. package/dist/lib/Steps/Integrations/SvelteKit.js.map +1 -0
  54. package/dist/lib/Steps/Integrations/__tests__/ReactNative.js +28 -5
  55. package/dist/lib/Steps/Integrations/__tests__/ReactNative.js.map +1 -1
  56. package/dist/lib/Steps/PromptForParameters.js +24 -1
  57. package/dist/lib/Steps/PromptForParameters.js.map +1 -1
  58. package/dist/lib/Steps/SentryProjectSelector.js +25 -1
  59. package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
  60. package/dist/lib/__tests__/Setup.js +24 -1
  61. package/dist/lib/__tests__/Setup.js.map +1 -1
  62. package/dist/src/nextjs/nextjs-wizard.js +326 -0
  63. package/dist/src/nextjs/nextjs-wizard.js.map +1 -0
  64. package/dist/src/sveltekit/sdk-example.d.ts +10 -0
  65. package/dist/src/sveltekit/sdk-example.js +106 -0
  66. package/dist/src/sveltekit/sdk-example.js.map +1 -0
  67. package/dist/src/sveltekit/sdk-setup.d.ts +13 -0
  68. package/dist/src/sveltekit/sdk-setup.js +451 -0
  69. package/dist/src/sveltekit/sdk-setup.js.map +1 -0
  70. package/dist/src/sveltekit/sentry-cli-setup.d.ts +2 -0
  71. package/dist/src/sveltekit/sentry-cli-setup.js +71 -0
  72. package/dist/src/sveltekit/sentry-cli-setup.js.map +1 -0
  73. package/dist/src/sveltekit/sveltekit-wizard.d.ts +5 -0
  74. package/dist/src/sveltekit/sveltekit-wizard.js +147 -0
  75. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -0
  76. package/dist/src/templates/nextjs-templates.d.ts +13 -0
  77. package/dist/src/templates/nextjs-templates.js +54 -0
  78. package/dist/src/templates/nextjs-templates.js.map +1 -0
  79. package/dist/src/templates/sveltekit-templates.d.ts +12 -0
  80. package/dist/src/templates/sveltekit-templates.js +26 -0
  81. package/dist/src/templates/sveltekit-templates.js.map +1 -0
  82. package/dist/src/{clack-utils.d.ts → utils/clack-utils.d.ts} +7 -0
  83. package/dist/src/{clack-utils.js → utils/clack-utils.js} +127 -42
  84. package/dist/src/utils/clack-utils.js.map +1 -0
  85. package/lib/Constants.ts +5 -0
  86. package/lib/Helper/Git.ts +39 -0
  87. package/lib/Helper/Logging.ts +4 -0
  88. package/lib/Helper/Package.ts +17 -0
  89. package/lib/Helper/PackageManager.ts +4 -9
  90. package/lib/Helper/SentryCli.ts +74 -0
  91. package/lib/Steps/ChooseIntegration.ts +4 -0
  92. package/lib/Steps/Integrations/NextJs.ts +7 -397
  93. package/lib/Steps/Integrations/ReactNative.ts +49 -3
  94. package/lib/Steps/Integrations/SvelteKit.ts +29 -0
  95. package/lib/Steps/SentryProjectSelector.ts +1 -0
  96. package/package.json +1 -1
  97. package/src/{nextjs-wizard.ts → nextjs/nextjs-wizard.ts} +45 -273
  98. package/src/sveltekit/sdk-example.ts +56 -0
  99. package/src/sveltekit/sdk-setup.ts +430 -0
  100. package/src/sveltekit/sentry-cli-setup.ts +27 -0
  101. package/src/sveltekit/sveltekit-wizard.ts +116 -0
  102. package/src/templates/nextjs-templates.ts +252 -0
  103. package/src/templates/sveltekit-templates.ts +172 -0
  104. package/src/{clack-utils.ts → utils/clack-utils.ts} +73 -11
  105. package/dist/src/clack-utils.js.map +0 -1
  106. package/dist/src/nextjs-wizard.js +0 -346
  107. package/dist/src/nextjs-wizard.js.map +0 -1
  108. /package/dist/src/{nextjs-wizard.d.ts → nextjs/nextjs-wizard.d.ts} +0 -0
@@ -1,4 +1,27 @@
1
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
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -35,14 +58,18 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
58
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
59
  }
37
60
  };
61
+ var __importDefault = (this && this.__importDefault) || function (mod) {
62
+ return (mod && mod.__esModule) ? mod : { "default": mod };
63
+ };
38
64
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.addSentryCliRc = exports.askForSelfHosted = exports.installPackage = exports.askForWizardLogin = exports.confirmContinueEvenThoughNoGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = void 0;
40
- var clack = require("@clack/prompts");
41
- var axios_1 = require("axios");
42
- var chalk_1 = require("chalk");
43
- var childProcess = require("child_process");
44
- var fs = require("fs");
45
- var path = require("path");
65
+ exports.hasPackageInstalled = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.addSentryCliRc = exports.askForSelfHosted = exports.installPackage = exports.askForWizardLogin = exports.confirmContinueEvenThoughNoGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = void 0;
66
+ // @ts-ignore - clack is ESM and TS complains about that. It works though
67
+ var clack = __importStar(require("@clack/prompts"));
68
+ var axios_1 = __importDefault(require("axios"));
69
+ var chalk_1 = __importDefault(require("chalk"));
70
+ var childProcess = __importStar(require("child_process"));
71
+ var fs = __importStar(require("fs"));
72
+ var path = __importStar(require("path"));
46
73
  var timers_1 = require("timers");
47
74
  var url_1 = require("url");
48
75
  var util_1 = require("util");
@@ -54,10 +81,7 @@ exports.abort = abort;
54
81
  function abortIfCancelled(input) {
55
82
  if (clack.isCancel(input)) {
56
83
  clack.cancel('Wizard setup cancelled.');
57
- return process.exit(0);
58
- }
59
- else {
60
- return;
84
+ process.exit(0);
61
85
  }
62
86
  }
63
87
  exports.abortIfCancelled = abortIfCancelled;
@@ -85,22 +109,22 @@ function printWelcome(options) {
85
109
  exports.printWelcome = printWelcome;
86
110
  function confirmContinueEvenThoughNoGitRepo() {
87
111
  return __awaiter(this, void 0, void 0, function () {
88
- var e_1, continueWithoutGit;
89
- return __generator(this, function (_a) {
90
- switch (_a.label) {
112
+ var _a, continueWithoutGit;
113
+ return __generator(this, function (_b) {
114
+ switch (_b.label) {
91
115
  case 0:
92
- _a.trys.push([0, 1, , 3]);
116
+ _b.trys.push([0, 1, , 3]);
93
117
  childProcess.execSync('git rev-parse --is-inside-work-tree', {
94
118
  stdio: 'ignore',
95
119
  });
96
120
  return [3 /*break*/, 3];
97
121
  case 1:
98
- e_1 = _a.sent();
122
+ _a = _b.sent();
99
123
  return [4 /*yield*/, clack.confirm({
100
124
  message: 'You are not inside a git repository. The wizard will create and update files. Do you still want to continue?',
101
125
  })];
102
126
  case 2:
103
- continueWithoutGit = _a.sent();
127
+ continueWithoutGit = _b.sent();
104
128
  abortIfCancelled(continueWithoutGit);
105
129
  if (!continueWithoutGit) {
106
130
  abort();
@@ -114,24 +138,24 @@ function confirmContinueEvenThoughNoGitRepo() {
114
138
  exports.confirmContinueEvenThoughNoGitRepo = confirmContinueEvenThoughNoGitRepo;
115
139
  function askForWizardLogin(options) {
116
140
  return __awaiter(this, void 0, void 0, function () {
117
- var hasSentryAccount, wizardHash, e_2, loginUrl, loginSpinner, data;
118
- return __generator(this, function (_a) {
119
- switch (_a.label) {
141
+ var hasSentryAccount, wizardHash, _a, loginUrl, loginSpinner, data;
142
+ return __generator(this, function (_b) {
143
+ switch (_b.label) {
120
144
  case 0: return [4 /*yield*/, clack.confirm({
121
145
  message: 'Do you already have a Sentry account?',
122
146
  })];
123
147
  case 1:
124
- hasSentryAccount = _a.sent();
148
+ hasSentryAccount = _b.sent();
125
149
  abortIfCancelled(hasSentryAccount);
126
- _a.label = 2;
150
+ _b.label = 2;
127
151
  case 2:
128
- _a.trys.push([2, 4, , 5]);
152
+ _b.trys.push([2, 4, , 5]);
129
153
  return [4 /*yield*/, axios_1.default.get("".concat(options.url, "api/0/wizard/"))];
130
154
  case 3:
131
- wizardHash = (_a.sent()).data.hash;
155
+ wizardHash = (_b.sent()).data.hash;
132
156
  return [3 /*break*/, 5];
133
157
  case 4:
134
- e_2 = _a.sent();
158
+ _a = _b.sent();
135
159
  clack.log.error('Loading Wizard failed.');
136
160
  clack.outro(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'));
137
161
  return [2 /*return*/, process.exit(1)];
@@ -169,7 +193,7 @@ function askForWizardLogin(options) {
169
193
  }, 180000);
170
194
  })];
171
195
  case 6:
172
- data = _a.sent();
196
+ data = _b.sent();
173
197
  loginSpinner.stop('Login complete.');
174
198
  return [2 /*return*/, data];
175
199
  }
@@ -180,7 +204,7 @@ exports.askForWizardLogin = askForWizardLogin;
180
204
  function installPackage(_a) {
181
205
  var packageName = _a.packageName, alreadyInstalled = _a.alreadyInstalled;
182
206
  return __awaiter(this, void 0, void 0, function () {
183
- var shouldUpdatePackage, sdkInstallSpinner, detectedPackageManager, e_3;
207
+ var shouldUpdatePackage, sdkInstallSpinner, detectedPackageManager, e_1;
184
208
  return __generator(this, function (_b) {
185
209
  switch (_b.label) {
186
210
  case 0:
@@ -191,7 +215,10 @@ function installPackage(_a) {
191
215
  case 1:
192
216
  shouldUpdatePackage = _b.sent();
193
217
  abortIfCancelled(shouldUpdatePackage);
194
- return [2 /*return*/];
218
+ if (!shouldUpdatePackage) {
219
+ return [2 /*return*/];
220
+ }
221
+ _b.label = 2;
195
222
  case 2:
196
223
  sdkInstallSpinner = clack.spinner();
197
224
  if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {
@@ -229,9 +256,9 @@ function installPackage(_a) {
229
256
  _b.label = 9;
230
257
  case 9: return [3 /*break*/, 11];
231
258
  case 10:
232
- e_3 = _b.sent();
259
+ e_1 = _b.sent();
233
260
  sdkInstallSpinner.stop('Installation failed.');
234
- clack.log.error("".concat(chalk_1.default.red('Encountered the following error during installation:'), "\n\n").concat(e_3, "\n\n").concat(chalk_1.default.dim('If you think this issue is caused by the Sentry wizard, let us know here:\nhttps://github.com/getsentry/sentry-wizard/issues')));
261
+ clack.log.error("".concat(chalk_1.default.red('Encountered the following error during installation:'), "\n\n").concat(e_1, "\n\n").concat(chalk_1.default.dim('If you think this issue is caused by the Sentry wizard, let us know here:\nhttps://github.com/getsentry/sentry-wizard/issues')));
235
262
  clack.outro('Wizard setup cancelled.');
236
263
  return [2 /*return*/, process.exit(1)];
237
264
  case 11:
@@ -275,9 +302,9 @@ function askForSelfHosted() {
275
302
  exports.askForSelfHosted = askForSelfHosted;
276
303
  function addSentryCliRc(authToken) {
277
304
  return __awaiter(this, void 0, void 0, function () {
278
- var clircExists, clircContents, likelyAlreadyHasAuthToken, e_4, e_5, e_6;
279
- return __generator(this, function (_a) {
280
- switch (_a.label) {
305
+ var clircExists, clircContents, likelyAlreadyHasAuthToken, _a, _b, _c;
306
+ return __generator(this, function (_d) {
307
+ switch (_d.label) {
281
308
  case 0:
282
309
  clircExists = fs.existsSync(path.join(process.cwd(), '.sentryclirc'));
283
310
  if (!clircExists) return [3 /*break*/, 5];
@@ -287,37 +314,37 @@ function addSentryCliRc(authToken) {
287
314
  clack.log.warn("".concat(chalk_1.default.bold('.sentryclirc'), " already has auth token. Will not add one."));
288
315
  return [3 /*break*/, 4];
289
316
  case 1:
290
- _a.trys.push([1, 3, , 4]);
317
+ _d.trys.push([1, 3, , 4]);
291
318
  return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), '.sentryclirc'), "".concat(clircContents, "\n[auth]\ntoken=").concat(authToken, "\n"), { encoding: 'utf8', flag: 'w' })];
292
319
  case 2:
293
- _a.sent();
320
+ _d.sent();
294
321
  clack.log.success("Added auth token to ".concat(chalk_1.default.bold('.sentryclirc')));
295
322
  return [3 /*break*/, 4];
296
323
  case 3:
297
- e_4 = _a.sent();
324
+ _a = _d.sent();
298
325
  clack.log.warning("Failed to add auth token to ".concat(chalk_1.default.bold('.sentryclirc'), ". Uploading source maps during build will likely not work."));
299
326
  return [3 /*break*/, 4];
300
327
  case 4: return [3 /*break*/, 8];
301
328
  case 5:
302
- _a.trys.push([5, 7, , 8]);
329
+ _d.trys.push([5, 7, , 8]);
303
330
  return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), '.sentryclirc'), "[auth]\ntoken=".concat(authToken, "\n"), { encoding: 'utf8', flag: 'w' })];
304
331
  case 6:
305
- _a.sent();
332
+ _d.sent();
306
333
  clack.log.success("Created ".concat(chalk_1.default.bold('.sentryclirc'), " with auth token."));
307
334
  return [3 /*break*/, 8];
308
335
  case 7:
309
- e_5 = _a.sent();
336
+ _b = _d.sent();
310
337
  clack.log.warning("Failed to create ".concat(chalk_1.default.bold('.sentryclirc'), " with auth token. Uploading source maps during build will likely not work."));
311
338
  return [3 /*break*/, 8];
312
339
  case 8:
313
- _a.trys.push([8, 10, , 11]);
340
+ _d.trys.push([8, 10, , 11]);
314
341
  return [4 /*yield*/, fs.promises.appendFile(path.join(process.cwd(), '.gitignore'), '\n# Sentry Auth Token\n.sentryclirc\n', { encoding: 'utf8' })];
315
342
  case 9:
316
- _a.sent();
343
+ _d.sent();
317
344
  clack.log.success("Added ".concat(chalk_1.default.bold('.sentryclirc'), " to ").concat(chalk_1.default.bold('.gitignore'), "."));
318
345
  return [3 /*break*/, 11];
319
346
  case 10:
320
- e_6 = _a.sent();
347
+ _c = _d.sent();
321
348
  clack.log.error("Failed adding ".concat(chalk_1.default.bold('.sentryclirc'), " to ").concat(chalk_1.default.bold('.gitignore'), ". Please add it manually!"));
322
349
  return [3 /*break*/, 11];
323
350
  case 11: return [2 /*return*/];
@@ -326,4 +353,62 @@ function addSentryCliRc(authToken) {
326
353
  });
327
354
  }
328
355
  exports.addSentryCliRc = addSentryCliRc;
356
+ function ensurePackageIsInstalled(packageJson, packageId, packageName) {
357
+ return __awaiter(this, void 0, void 0, function () {
358
+ var continueWithoutPackage;
359
+ return __generator(this, function (_a) {
360
+ switch (_a.label) {
361
+ case 0:
362
+ if (!!hasPackageInstalled(packageId, packageJson)) return [3 /*break*/, 2];
363
+ return [4 /*yield*/, clack.confirm({
364
+ message: "".concat(packageName, " does not seem to be installed. Do you still want to continue?"),
365
+ initialValue: false,
366
+ })];
367
+ case 1:
368
+ continueWithoutPackage = _a.sent();
369
+ abortIfCancelled(continueWithoutPackage);
370
+ if (!continueWithoutPackage) {
371
+ abort();
372
+ }
373
+ _a.label = 2;
374
+ case 2: return [2 /*return*/];
375
+ }
376
+ });
377
+ });
378
+ }
379
+ exports.ensurePackageIsInstalled = ensurePackageIsInstalled;
380
+ function getPackageDotJson() {
381
+ return __awaiter(this, void 0, void 0, function () {
382
+ var packageJsonFileContents, packageJson;
383
+ return __generator(this, function (_a) {
384
+ switch (_a.label) {
385
+ case 0: return [4 /*yield*/, fs.promises
386
+ .readFile(path.join(process.cwd(), 'package.json'), 'utf8')
387
+ .catch(function () {
388
+ clack.log.error('Could not find package.json. Make sure to run the wizard in the root of your app!');
389
+ abort();
390
+ })];
391
+ case 1:
392
+ packageJsonFileContents = _a.sent();
393
+ packageJson = undefined;
394
+ try {
395
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
396
+ packageJson = JSON.parse(packageJsonFileContents);
397
+ }
398
+ catch (_b) {
399
+ clack.log.error('Unable to parse your package.json. Make sure it has a valid format!');
400
+ abort();
401
+ }
402
+ return [2 /*return*/, packageJson || {}];
403
+ }
404
+ });
405
+ });
406
+ }
407
+ exports.getPackageDotJson = getPackageDotJson;
408
+ function hasPackageInstalled(packageName, packageJson) {
409
+ var _a, _b;
410
+ return (!!((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) ||
411
+ !!((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies) === null || _b === void 0 ? void 0 : _b[packageName]));
412
+ }
413
+ exports.hasPackageInstalled = hasPackageInstalled;
329
414
  //# sourceMappingURL=clack-utils.js.map
@@ -0,0 +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,iCAAqC;AACrC,2BAA0B;AAC1B,6BAAiC;AAwBjC,SAAgB,KAAK;IACnB,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAHD,sBAGC;AAED,SAAgB,gBAAgB,CAC9B,KAAQ;IAER,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACzB,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC;AAPD,4CAOC;AAED,SAAgB,YAAY,CAAC,OAG5B;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,iGAAiG,CAAC;IAEpG,IAAI,OAAO,CAAC,SAAS,EAAE;QACrB,WAAW,IAAI,gCAAyB,OAAO,CAAC,SAAS,CAAE,CAAC;KAC7D;IAED,IAAI,aAAa,CAAC,OAAO,EAAE;QACzB,WAAW,IAAI,uBAAgB,aAAa,CAAC,OAAO,CAAE,CAAC;KACxD;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1B,CAAC;AAjCD,oCAiCC;AAED,SAAsB,kCAAkC;;;;;;;oBAEpD,YAAY,CAAC,QAAQ,CAAC,qCAAqC,EAAE;wBAC3D,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;;;;oBAEwB,qBAAM,KAAK,CAAC,OAAO,CAAC;4BAC7C,OAAO,EACL,8GAA8G;yBACjH,CAAC,EAAA;;oBAHI,kBAAkB,GAAG,SAGzB;oBAEF,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;oBAErC,IAAI,CAAC,kBAAkB,EAAE;wBACvB,KAAK,EAAE,CAAC;qBACT;;;;;;CAEJ;AAjBD,gFAiBC;AAED,SAAsB,iBAAiB,CAAC,OAGvC;;;;;wBAC0B,qBAAM,KAAK,CAAC,OAAO,CAAC;wBAC3C,OAAO,EAAE,uCAAuC;qBACjD,CAAC,EAAA;;oBAFI,gBAAgB,GAAG,SAEvB;oBAEF,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;;;;oBAK/B,qBAAM,eAAK,CAAC,GAAG,CAAmB,UAAG,OAAO,CAAC,GAAG,kBAAe,CAAC,EAAA;;oBADlE,UAAU,GAAG,CACX,SAAgE,CACjE,CAAC,IAAI,CAAC,IAAI,CAAC;;;;oBAEZ,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBAC1C,KAAK,CAAC,KAAK,CACT,eAAK,CAAC,GAAG,CACP,6HAA6H,CAC9H,CACF,CAAC;oBAEF,sBAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;;oBAGnB,QAAQ,GAAG,IAAI,SAAG,CACtB,UAAG,OAAO,CAAC,GAAG,qCAA2B,UAAU,MAAG,CACvD,CAAC;oBAEF,IAAI,CAAC,gBAAgB,EAAE;wBACrB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;wBACzC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;qBACpE;oBAED,IAAI,OAAO,CAAC,SAAS,EAAE;wBACrB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;qBACtD;oBAED,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,4DACE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,kBACpB,CAChB,iBAAO,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAE,CAC1C,CAAC;oBAEI,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAErC,YAAY,CAAC,KAAK,CAChB,6DAA6D,CAC9D,CAAC;oBAEW,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,CAAC;qCACnE,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;gCACF,KAAK,CAAC,KAAK,CACT,6DAA6D,CAC9D,CAAC;gCACF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BACzB,CAAC,EAAE,MAAO,CAAC,CAAC;wBACd,CAAC,CAAC,EAAA;;oBAzBI,IAAI,GAAG,SAyBX;oBAEF,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAErC,sBAAO,IAAI,EAAC;;;;CACb;AAnFD,8CAmFC;AAED,SAAsB,cAAc,CAAC,EAMpC;QALC,WAAW,iBAAA,EACX,gBAAgB,sBAAA;;;;;;yBAKZ,gBAAgB,EAAhB,wBAAgB;oBACU,qBAAM,KAAK,CAAC,OAAO,CAAC;4BAC9C,OAAO,EAAE,cAAO,eAAK,CAAC,IAAI,CAAC,IAAI,CAC7B,WAAW,CACZ,mFAAgF;yBAClF,CAAC,EAAA;;oBAJI,mBAAmB,GAAG,SAI1B;oBAEF,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;oBAEtC,IAAI,CAAC,mBAAmB,EAAE;wBACxB,sBAAO;qBACR;;;oBAGG,iBAAiB,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAG1C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,EAAE;wBACxD,sBAAsB,GAAG,MAAM,CAAC;qBACjC;yBAAM,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE;wBACvE,sBAAsB,GAAG,KAAK,CAAC;qBAChC;yBAAM,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,EAAE;wBACpE,sBAAsB,GAAG,MAAM,CAAC;qBACjC;yBAAM;wBACL,sBAAsB,GAAG,KAAK,CAAC;qBAChC;oBAED,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,sBAAsB,CAAC,MAAG,CAChD,CAAC;;;;yBAGI,CAAA,sBAAsB,KAAK,MAAM,CAAA,EAAjC,wBAAiC;oBACnC,qBAAM,IAAA,gBAAS,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC,mBAAY,WAAW,YAAS,CAAC,EAAA;;oBAApE,SAAoE,CAAC;;;yBAC5D,CAAA,sBAAsB,KAAK,MAAM,CAAA,EAAjC,wBAAiC;oBAC1C,qBAAM,IAAA,gBAAS,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC,mBAAY,WAAW,YAAS,CAAC,EAAA;;oBAApE,SAAoE,CAAC;;;yBAC5D,CAAA,sBAAsB,KAAK,KAAK,CAAA,EAAhC,wBAAgC;oBACzC,qBAAM,IAAA,gBAAS,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC,sBAAe,WAAW,YAAS,CAAC,EAAA;;oBAAvE,SAAuE,CAAC;;;;;oBAG1E,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBAC/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;oBACF,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACvC,sBAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;;oBAGzB,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,sBAAsB,CAAC,MAAG,CAChD,CAAC;;;;;CACH;AAnED,wCAmEC;AAED,SAAsB,gBAAgB;;;;;wBAIY,qBAAM,KAAK,CAAC,MAAM,CAAC;wBACjE,OAAO,EAAE,kDAAkD;wBAC3D,OAAO,EAAE;4BACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE;4BACnD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,wBAAwB,EAAE;yBAC1D;qBACF,CAAC,EAAA;;oBANI,MAAM,GAAoC,SAM9C;oBAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBAEzB,IAAI,MAAM,KAAK,MAAM,EAAE;wBACrB,sBAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,EAAE,KAAK,EAAE,EAAC;qBACzD;oBAEW,qBAAM,KAAK,CAAC,IAAI,CAAC;4BAC3B,OAAO,EAAE,2DAA2D;4BACpE,WAAW,EAAE,oBAAoB;yBAClC,CAAC,EAAA;;oBAHI,GAAG,GAAG,SAGV;oBAEF,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBAEtB,sBAAO,EAAE,GAAG,KAAA,EAAE,UAAU,EAAE,IAAI,EAAE,EAAC;;;;CAClC;AA1BD,4CA0BC;AAED,SAAsB,cAAc,CAAC,SAAiB;;;;;;oBAC9C,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;yBACxE,WAAW,EAAX,wBAAW;oBACP,aAAa,GAAG,EAAE,CAAC,YAAY,CACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,MAAM,CACP,CAAC;oBAEI,yBAAyB,GAAG,CAAC,CAAC,CAClC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CACpE,CAAC;yBAEE,yBAAyB,EAAzB,wBAAyB;oBAC3B,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,UAAG,eAAK,CAAC,IAAI,CACX,cAAc,CACf,+CAA4C,CAC9C,CAAC;;;;oBAGA,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,UAAG,aAAa,6BAAmB,SAAS,OAAI,EAChD,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,EAAA;;oBAJD,SAIC,CAAC;oBACF,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,8BAAuB,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAE,CAAC,CAAC;;;;oBAEvE,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,sCAA+B,eAAK,CAAC,IAAI,CACvC,cAAc,CACf,+DAA4D,CAC9D,CAAC;;;;;oBAKJ,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,wBAAiB,SAAS,OAAI,EAC9B,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,EAAA;;oBAJD,SAIC,CAAC;oBACF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,kBAAW,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAmB,CACzD,CAAC;;;;oBAEF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2BAAoB,eAAK,CAAC,IAAI,CAC5B,cAAc,CACf,+EAA4E,CAC9E,CAAC;;;;oBAKJ,qBAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EACtC,uCAAuC,EACvC,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,EAAA;;oBAJD,SAIC,CAAC;oBACF,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,gBAAS,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAO,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAG,CACtE,CAAC;;;;oBAEF,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,wBAAiB,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAO,eAAK,CAAC,IAAI,CAC1D,YAAY,CACb,8BAA2B,CAC7B,CAAC;;;;;;CAEL;AArED,wCAqEC;AAED,SAAsB,wBAAwB,CAC5C,WAA2B,EAC3B,SAAiB,EACjB,WAAmB;;;;;;yBAEf,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,EAA5C,wBAA4C;oBACf,qBAAM,KAAK,CAAC,OAAO,CAAC;4BACjD,OAAO,EAAE,UAAG,WAAW,mEAAgE;4BACvF,YAAY,EAAE,KAAK;yBACpB,CAAC,EAAA;;oBAHI,sBAAsB,GAAG,SAG7B;oBAEF,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;oBAEzC,IAAI,CAAC,sBAAsB,EAAE;wBAC3B,KAAK,EAAE,CAAC;qBACT;;;;;;CAEJ;AAjBD,4DAiBC;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,KAAK,EAAE,CAAC;oBACV,CAAC,CAAC,EAAA;;oBAPE,uBAAuB,GAAG,SAO5B;oBAEA,WAAW,GAA+B,SAAS,CAAC;oBAExD,IAAI;wBACF,mEAAmE;wBACnE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;qBACnD;oBAAC,WAAM;wBACN,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,qEAAqE,CACtE,CAAC;wBAEF,KAAK,EAAE,CAAC;qBACT;oBAED,sBAAO,WAAW,IAAI,EAAE,EAAC;;;;CAC1B;AAxBD,8CAwBC;AAED,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,WAA2B;;IAE3B,OAAO,CACL,CAAC,CAAC,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,0CAAG,WAAW,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,0CAAG,WAAW,CAAC,CAAA,CAC9C,CAAC;AACJ,CAAC;AARD,kDAQC","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';\n\ninterface WizardProjectData {\n apiKeys: {\n token: string;\n };\n projects: SentryProjectData[];\n}\n\nexport type PackageDotJson = {\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 function abort(): never {\n clack.outro('Wizard setup cancelled.');\n return process.exit(0);\n}\n\nexport function abortIfCancelled<T>(\n input: T,\n): asserts input is Exclude<T, symbol> {\n if (clack.isCancel(input)) {\n clack.cancel('Wizard setup cancelled.');\n process.exit(0);\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n promoCode?: 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 'This Wizard will help you to 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 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 abortIfCancelled(continueWithoutGit);\n\n if (!continueWithoutGit) {\n abort();\n }\n }\n}\n\nexport async function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n}): Promise<WizardProjectData> {\n const hasSentryAccount = await clack.confirm({\n message: 'Do you already have a Sentry account?',\n });\n\n abortIfCancelled(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 clack.log.error('Loading Wizard failed.');\n clack.outro(\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 return process.exit(1);\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 loginUrl.searchParams.set('project_platform', 'javascript-nextjs');\n }\n\n if (options.promoCode) {\n loginUrl.searchParams.set('code', options.promoCode);\n }\n\n clack.log.info(\n `${chalk.bold(\n `Please open the following link in your browser to ${\n hasSentryAccount ? 'log' : 'sign'\n } into Sentry:`,\n )}\\n\\n${chalk.cyan(loginUrl.toString())}`,\n );\n\n const loginSpinner = clack.spinner();\n\n loginSpinner.start(\n 'Waiting for you to click the link above 👆. Take your time.',\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 clack.outro(\n 'Please restart the Wizard and log in to complete the setup.',\n );\n return process.exit(0);\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n\n return data;\n}\n\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n}: {\n packageName: string;\n alreadyInstalled: boolean;\n}): Promise<void> {\n if (alreadyInstalled) {\n const shouldUpdatePackage = await 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 abortIfCancelled(shouldUpdatePackage);\n\n if (!shouldUpdatePackage) {\n return;\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\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 } else {\n detectedPackageManager = 'npm';\n }\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(detectedPackageManager)}.`,\n );\n\n try {\n if (detectedPackageManager === 'yarn') {\n await promisify(childProcess.exec)(`yarn add ${packageName}@latest`);\n } else if (detectedPackageManager === 'pnpm') {\n await promisify(childProcess.exec)(`pnpm add ${packageName}@latest`);\n } else if (detectedPackageManager === '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 clack.outro('Wizard setup cancelled.');\n return process.exit(1);\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageName,\n )} with ${chalk.bold(detectedPackageManager)}.`,\n );\n}\n\nexport async function askForSelfHosted(): Promise<{\n url: string;\n selfHosted: boolean;\n}> {\n const choice: 'saas' | 'self-hosted' | symbol = await clack.select({\n message: 'Are you using Sentry SaaS or self-hosted Sentry?',\n options: [\n { value: 'saas', label: 'Sentry SaaS (sentry.io)' },\n { value: 'self-hosted', label: 'Self-hosted/on-premise' },\n ],\n });\n\n abortIfCancelled(choice);\n\n if (choice === 'saas') {\n return { url: 'https://sentry.io/', selfHosted: false };\n }\n\n const url = await clack.text({\n message: 'Please enter the URL of your self-hosted Sentry instance.',\n placeholder: 'https://sentry.io/',\n });\n\n abortIfCancelled(url);\n\n return { url, 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(`Added auth token to ${chalk.bold('.sentryclirc')}`);\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.`,\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('.sentryclirc')} with auth token.`,\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.`,\n );\n }\n }\n\n try {\n await fs.promises.appendFile(\n path.join(process.cwd(), '.gitignore'),\n '\\n# Sentry Auth Token\\n.sentryclirc\\n',\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.bold('.sentryclirc')} to ${chalk.bold('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.bold('.sentryclirc')} 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 clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n });\n\n abortIfCancelled(continueWithoutPackage);\n\n if (!continueWithoutPackage) {\n abort();\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 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 abort();\n }\n\n return packageJson || {};\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return (\n !!packageJson?.dependencies?.[packageName] ||\n !!packageJson?.devDependencies?.[packageName]\n );\n}\n"]}
package/lib/Constants.ts CHANGED
@@ -4,6 +4,7 @@ export enum Integration {
4
4
  cordova = 'cordova',
5
5
  electron = 'electron',
6
6
  nextjs = 'nextjs',
7
+ sveltekit = 'sveltekit',
7
8
  }
8
9
 
9
10
  /** Key value should be the same here */
@@ -39,6 +40,8 @@ export function getIntegrationDescription(type: string): string {
39
40
  return 'Electron';
40
41
  case Integration.nextjs:
41
42
  return 'Next.js';
43
+ case Integration.sveltekit:
44
+ return 'SvelteKit';
42
45
  default:
43
46
  return 'React Native';
44
47
  }
@@ -54,6 +57,8 @@ export function mapIntegrationToPlatform(type: string): string {
54
57
  return 'javascript-electron';
55
58
  case Integration.nextjs:
56
59
  return 'javascript-nextjs';
60
+ case Integration.sveltekit:
61
+ return 'javascript-sveltekit';
57
62
  default:
58
63
  throw new Error(`Unknown integration ${type}`);
59
64
  }
@@ -0,0 +1,39 @@
1
+ import * as fs from 'fs';
2
+
3
+ import { green, red } from './Logging';
4
+
5
+ const GITIGNORE_FILENAME = '.gitignore';
6
+
7
+ /**
8
+ * Adds the given file to the .gitignore file.
9
+ *
10
+ * @param filepath the file(path) to add to the .gitignore file
11
+ * @param errorMsg the error message to display if the file couldn't be added
12
+ */
13
+ export async function addToGitignore(
14
+ filepath: string,
15
+ errorMsg: string,
16
+ ): Promise<void> {
17
+ /**
18
+ * Don't check whether the given file is ignored because:
19
+ * 1. It's tricky to check it without git.
20
+ * 2. Git might not be installed or accessible.
21
+ * 3. It's convenient to use a module to interact with git, but it would
22
+ * increase the size x2 approximately. Docs say to run the Wizard without
23
+ * installing it, and duplicating the size would slow the set-up down.
24
+ * 4. The Wizard is meant to be run once.
25
+ * 5. A message is logged informing users it's been added to the gitignore.
26
+ * 6. It will be added to the gitignore as many times as it runs - not a big
27
+ * deal.
28
+ * 7. It's straightforward to remove it from the gitignore.
29
+ */
30
+ try {
31
+ await fs.promises.appendFile(
32
+ GITIGNORE_FILENAME,
33
+ `\n# Sentry\n${filepath}\n`,
34
+ );
35
+ green(`✓ ${filepath} added to ${GITIGNORE_FILENAME}`);
36
+ } catch {
37
+ red(errorMsg);
38
+ }
39
+ }
@@ -35,6 +35,10 @@ export function yellow(msg: string): void {
35
35
  return l(Chalk.yellow(prepareMessage(msg)));
36
36
  }
37
37
 
38
+ export function cyan(msg: string): void {
39
+ return l(Chalk.cyan(prepareMessage(msg)));
40
+ }
41
+
38
42
  export function debug(msg: any): void {
39
43
  return l(Chalk.italic.yellow(prepareMessage(msg)));
40
44
  }
@@ -59,3 +59,20 @@ function fulfillsVersionRange(
59
59
  : satisfies(cleanedUserVersion, acceptableVersions))
60
60
  );
61
61
  }
62
+
63
+ /**
64
+ * Determines if the passed `package.json` object has the passed package installed.
65
+ *
66
+ * @param appPackage The `package.json` object
67
+ * @param packageName The name of the package to check for
68
+ *
69
+ * @returns `true` if the package is installed, `false` otherwise
70
+ */
71
+ export function hasPackageInstalled(
72
+ appPackage: Record<string, any>,
73
+ packageName: string,
74
+ ): boolean {
75
+ const depsVersion = appPackage.dependencies[packageName];
76
+ const devDepsVersion = appPackage.devDependencies[packageName];
77
+ return !!depsVersion || !!devDepsVersion;
78
+ }
@@ -4,9 +4,7 @@ import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import { promisify } from 'util';
6
6
 
7
- import { green } from './Logging';
8
-
9
- export function getPackageMangerChoice(): PackageManager | null {
7
+ export function getPackageManagerChoice(): PackageManager | null {
10
8
  if (fs.existsSync(path.join(process.cwd(), Yarn.LOCK_FILE))) {
11
9
  return new Yarn();
12
10
  }
@@ -29,7 +27,7 @@ export class Npm implements PackageManager {
29
27
  public static INSTALL_COMMAND = 'npm install';
30
28
 
31
29
  public async installPackage(packageName: string): Promise<void> {
32
- await installPackage(Npm.INSTALL_COMMAND, packageName, Npm.LABEL);
30
+ await installPackage(Npm.INSTALL_COMMAND, packageName);
33
31
  }
34
32
  }
35
33
 
@@ -39,7 +37,7 @@ export class Yarn implements PackageManager {
39
37
  public static INSTALL_COMMAND = 'yarn add';
40
38
 
41
39
  public async installPackage(packageName: string): Promise<void> {
42
- await installPackage(Yarn.INSTALL_COMMAND, packageName, Yarn.LABEL);
40
+ await installPackage(Yarn.INSTALL_COMMAND, packageName);
43
41
  }
44
42
  }
45
43
 
@@ -49,16 +47,13 @@ export class Pnpm implements PackageManager {
49
47
  public static INSTALL_COMMAND = 'pnpm add';
50
48
 
51
49
  public async installPackage(packageName: string): Promise<void> {
52
- await installPackage(Pnpm.INSTALL_COMMAND, packageName, Pnpm.LABEL);
50
+ await installPackage(Pnpm.INSTALL_COMMAND, packageName);
53
51
  }
54
52
  }
55
53
 
56
54
  async function installPackage(
57
55
  command: string,
58
56
  packageName: string,
59
- label: string,
60
57
  ): Promise<void> {
61
58
  await promisify(exec)(`${command} ${packageName}`);
62
- green(`✓ Added \`${packageName}\` using \`${label}\`.`);
63
- return;
64
59
  }
@@ -1,8 +1,15 @@
1
+ import * as fs from 'fs';
1
2
  import type { Answers } from 'inquirer';
2
3
  import * as _ from 'lodash';
3
4
  import * as path from 'path';
4
5
 
5
6
  import type { Args } from '../Constants';
7
+ import { addToGitignore } from './Git';
8
+ import { green, l, nl, red } from './Logging';
9
+
10
+ const SENTRYCLIRC_FILENAME = '.sentryclirc';
11
+ const GITIGNORE_FILENAME = '.gitignore';
12
+ const PROPERTIES_FILENAME = 'sentry.properties';
6
13
 
7
14
  export interface SentryCliProps {
8
15
  [s: string]: string;
@@ -71,4 +78,71 @@ export class SentryCli {
71
78
  }
72
79
  return dumpedSections.join('\n');
73
80
  }
81
+
82
+ /**
83
+ * Creates `.sentryclirc` and `sentry.properties` files with the CLI properties
84
+ * obtained from the user answers (or from logging into Sentry).
85
+ * The `.sentryclirc` only contains the auth token and will be added to the
86
+ * user's `.gitignore` file. The properties file contains the rest of the
87
+ * properties (org, project, etc.).
88
+ *
89
+ * @param sentryCli instance of the Sentry CLI
90
+ * @param cliProps the properties to write to the files
91
+ */
92
+ public async createSentryCliConfig(cliProps: SentryCliProps): Promise<void> {
93
+ const { 'auth/token': authToken, ...cliPropsToWrite } = cliProps;
94
+
95
+ /**
96
+ * To not commit the auth token to the VCS, instead of adding it to the
97
+ * properties file (like the rest of props), it's added to the Sentry CLI
98
+ * config, which is added to the gitignore. This way makes the properties
99
+ * file safe to commit without exposing any auth tokens.
100
+ */
101
+ if (authToken) {
102
+ try {
103
+ await fs.promises.appendFile(
104
+ SENTRYCLIRC_FILENAME,
105
+ this.dumpConfig({ auth: { token: authToken } }),
106
+ );
107
+ green(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);
108
+ } catch {
109
+ red(
110
+ `⚠ Could not add the auth token to ${SENTRYCLIRC_FILENAME}, ` +
111
+ `please add it to identify your user account:\n${authToken}`,
112
+ );
113
+ nl();
114
+ }
115
+ } else {
116
+ red(
117
+ `⚠ Did not find an auth token, please add your token to ${SENTRYCLIRC_FILENAME}`,
118
+ );
119
+ l(
120
+ 'To generate an auth token, visit https://sentry.io/settings/account/api/auth-tokens/',
121
+ );
122
+ l(
123
+ 'To learn how to configure Sentry CLI, visit ' +
124
+ 'https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',
125
+ );
126
+ }
127
+
128
+ await addToGitignore(
129
+ SENTRYCLIRC_FILENAME,
130
+ `⚠ Could not add ${SENTRYCLIRC_FILENAME} to ${GITIGNORE_FILENAME}, ` +
131
+ 'please add it to not commit your auth key.',
132
+ );
133
+
134
+ try {
135
+ await fs.promises.writeFile(
136
+ `./${PROPERTIES_FILENAME}`,
137
+ this.dumpProperties(cliPropsToWrite),
138
+ );
139
+ green('✓ Successfully created sentry.properties');
140
+ } catch {
141
+ red(`⚠ Could not add org and project data to ${PROPERTIES_FILENAME}`);
142
+ l(
143
+ 'See docs for a manual setup: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',
144
+ );
145
+ }
146
+ nl();
147
+ }
74
148
  }
@@ -8,6 +8,7 @@ import { Cordova } from './Integrations/Cordova';
8
8
  import { Electron } from './Integrations/Electron';
9
9
  import { NextJs } from './Integrations/NextJs';
10
10
  import { ReactNative } from './Integrations/ReactNative';
11
+ import { SvelteKit } from './Integrations/SvelteKit';
11
12
 
12
13
  let projectPackage: any = {};
13
14
 
@@ -54,6 +55,9 @@ export class ChooseIntegration extends BaseStep {
54
55
  case Integration.nextjs:
55
56
  integration = new NextJs(this._argv);
56
57
  break;
58
+ case Integration.sveltekit:
59
+ integration = new SvelteKit(this._argv);
60
+ break;
57
61
  default:
58
62
  integration = new ReactNative(this._argv);
59
63
  break;