@sentry/wizard 3.0.0 → 3.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/bin.ts +9 -2
  3. package/dist/bin.js +10 -2
  4. package/dist/bin.js.map +1 -1
  5. package/dist/lib/Helper/MergeConfig.js +1 -0
  6. package/dist/lib/Helper/MergeConfig.js.map +1 -1
  7. package/dist/lib/Steps/BaseStep.js.map +1 -1
  8. package/dist/lib/Steps/Initial.js +1 -0
  9. package/dist/lib/Steps/Initial.js.map +1 -1
  10. package/dist/lib/Steps/Integrations/BaseIntegration.js +2 -0
  11. package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
  12. package/dist/lib/Steps/Integrations/Cordova.js +1 -0
  13. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  14. package/dist/lib/Steps/Integrations/Electron.js +2 -0
  15. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  16. package/dist/lib/Steps/Integrations/MobileProject.js +1 -0
  17. package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
  18. package/dist/lib/Steps/Integrations/NextJs.js +1 -0
  19. package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
  20. package/dist/lib/Steps/Integrations/ReactNative.js +2 -1
  21. package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
  22. package/dist/lib/Steps/Result.js +1 -0
  23. package/dist/lib/Steps/Result.js.map +1 -1
  24. package/dist/lib/Steps/WaitForSentry.js +42 -47
  25. package/dist/lib/Steps/WaitForSentry.js.map +1 -1
  26. package/dist/lib/Steps/Welcome.js +1 -0
  27. package/dist/lib/Steps/Welcome.js.map +1 -1
  28. package/dist/src/clack-utils.d.ts +40 -0
  29. package/dist/src/clack-utils.js +329 -0
  30. package/dist/src/clack-utils.js.map +1 -0
  31. package/dist/src/nextjs-wizard.d.ts +5 -0
  32. package/dist/src/nextjs-wizard.js +346 -0
  33. package/dist/src/nextjs-wizard.js.map +1 -0
  34. package/lib/Helper/MergeConfig.ts +1 -0
  35. package/lib/Steps/BaseStep.ts +1 -1
  36. package/lib/Steps/Initial.ts +1 -0
  37. package/lib/Steps/Integrations/BaseIntegration.ts +2 -0
  38. package/lib/Steps/Integrations/Cordova.ts +2 -1
  39. package/lib/Steps/Integrations/Electron.ts +3 -1
  40. package/lib/Steps/Integrations/MobileProject.ts +1 -0
  41. package/lib/Steps/Integrations/NextJs.ts +1 -0
  42. package/lib/Steps/Integrations/ReactNative.ts +3 -2
  43. package/lib/Steps/Result.ts +1 -0
  44. package/lib/Steps/WaitForSentry.ts +1 -1
  45. package/lib/Steps/Welcome.ts +2 -1
  46. package/package.json +10 -3
  47. package/src/clack-utils.ts +346 -0
  48. package/src/nextjs-wizard.ts +619 -0
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ 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");
46
+ var timers_1 = require("timers");
47
+ var url_1 = require("url");
48
+ var util_1 = require("util");
49
+ function abort() {
50
+ clack.outro('Wizard setup cancelled.');
51
+ return process.exit(0);
52
+ }
53
+ exports.abort = abort;
54
+ function abortIfCancelled(input) {
55
+ if (clack.isCancel(input)) {
56
+ clack.cancel('Wizard setup cancelled.');
57
+ return process.exit(0);
58
+ }
59
+ else {
60
+ return;
61
+ }
62
+ }
63
+ exports.abortIfCancelled = abortIfCancelled;
64
+ function printWelcome(options) {
65
+ var wizardPackage = {};
66
+ try {
67
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
68
+ wizardPackage = require(path.join(path.dirname(require.resolve('@sentry/wizard')), '..', 'package.json'));
69
+ }
70
+ catch (_a) {
71
+ // We don't need to have this
72
+ }
73
+ // eslint-disable-next-line no-console
74
+ console.log('');
75
+ clack.intro(chalk_1.default.inverse(" ".concat(options.wizardName, " ")));
76
+ var welcomeText = 'This Wizard will help you to set up Sentry for your application.\nThank you for using Sentry :)';
77
+ if (options.promoCode) {
78
+ welcomeText += "\n\nUsing promo-code: ".concat(options.promoCode);
79
+ }
80
+ if (wizardPackage.version) {
81
+ welcomeText += "\n\nVersion: ".concat(wizardPackage.version);
82
+ }
83
+ clack.note(welcomeText);
84
+ }
85
+ exports.printWelcome = printWelcome;
86
+ function confirmContinueEvenThoughNoGitRepo() {
87
+ return __awaiter(this, void 0, void 0, function () {
88
+ var e_1, continueWithoutGit;
89
+ return __generator(this, function (_a) {
90
+ switch (_a.label) {
91
+ case 0:
92
+ _a.trys.push([0, 1, , 3]);
93
+ childProcess.execSync('git rev-parse --is-inside-work-tree', {
94
+ stdio: 'ignore',
95
+ });
96
+ return [3 /*break*/, 3];
97
+ case 1:
98
+ e_1 = _a.sent();
99
+ return [4 /*yield*/, clack.confirm({
100
+ message: 'You are not inside a git repository. The wizard will create and update files. Do you still want to continue?',
101
+ })];
102
+ case 2:
103
+ continueWithoutGit = _a.sent();
104
+ abortIfCancelled(continueWithoutGit);
105
+ if (!continueWithoutGit) {
106
+ abort();
107
+ }
108
+ return [3 /*break*/, 3];
109
+ case 3: return [2 /*return*/];
110
+ }
111
+ });
112
+ });
113
+ }
114
+ exports.confirmContinueEvenThoughNoGitRepo = confirmContinueEvenThoughNoGitRepo;
115
+ function askForWizardLogin(options) {
116
+ 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) {
120
+ case 0: return [4 /*yield*/, clack.confirm({
121
+ message: 'Do you already have a Sentry account?',
122
+ })];
123
+ case 1:
124
+ hasSentryAccount = _a.sent();
125
+ abortIfCancelled(hasSentryAccount);
126
+ _a.label = 2;
127
+ case 2:
128
+ _a.trys.push([2, 4, , 5]);
129
+ return [4 /*yield*/, axios_1.default.get("".concat(options.url, "api/0/wizard/"))];
130
+ case 3:
131
+ wizardHash = (_a.sent()).data.hash;
132
+ return [3 /*break*/, 5];
133
+ case 4:
134
+ e_2 = _a.sent();
135
+ clack.log.error('Loading Wizard failed.');
136
+ 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
+ return [2 /*return*/, process.exit(1)];
138
+ case 5:
139
+ loginUrl = new url_1.URL("".concat(options.url, "account/settings/wizard/").concat(wizardHash, "/"));
140
+ if (!hasSentryAccount) {
141
+ loginUrl.searchParams.set('signup', '1');
142
+ loginUrl.searchParams.set('project_platform', 'javascript-nextjs');
143
+ }
144
+ if (options.promoCode) {
145
+ loginUrl.searchParams.set('code', options.promoCode);
146
+ }
147
+ clack.log.info("".concat(chalk_1.default.bold("Please open the following link in your browser to ".concat(hasSentryAccount ? 'log' : 'sign', " into Sentry:")), "\n\n").concat(chalk_1.default.cyan(loginUrl.toString())));
148
+ loginSpinner = clack.spinner();
149
+ loginSpinner.start('Waiting for you to click the link above 👆. Take your time.');
150
+ return [4 /*yield*/, new Promise(function (resolve) {
151
+ var pollingInterval = (0, timers_1.setInterval)(function () {
152
+ axios_1.default
153
+ .get("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"))
154
+ .then(function (result) {
155
+ resolve(result.data);
156
+ clearTimeout(timeout);
157
+ clearInterval(pollingInterval);
158
+ void axios_1.default.delete("".concat(options.url, "api/0/wizard/").concat(wizardHash, "/"));
159
+ })
160
+ .catch(function () {
161
+ // noop - just try again
162
+ });
163
+ }, 500);
164
+ var timeout = setTimeout(function () {
165
+ clearInterval(pollingInterval);
166
+ loginSpinner.stop('Login timed out. No worries - it happens to the best of us.');
167
+ clack.outro('Please restart the Wizard and log in to complete the setup.');
168
+ return process.exit(0);
169
+ }, 180000);
170
+ })];
171
+ case 6:
172
+ data = _a.sent();
173
+ loginSpinner.stop('Login complete.');
174
+ return [2 /*return*/, data];
175
+ }
176
+ });
177
+ });
178
+ }
179
+ exports.askForWizardLogin = askForWizardLogin;
180
+ function installPackage(_a) {
181
+ var packageName = _a.packageName, alreadyInstalled = _a.alreadyInstalled;
182
+ return __awaiter(this, void 0, void 0, function () {
183
+ var shouldUpdatePackage, sdkInstallSpinner, detectedPackageManager, e_3;
184
+ return __generator(this, function (_b) {
185
+ switch (_b.label) {
186
+ case 0:
187
+ if (!alreadyInstalled) return [3 /*break*/, 2];
188
+ return [4 /*yield*/, clack.confirm({
189
+ message: "The ".concat(chalk_1.default.bold.cyan(packageName), " package is already installed. Do you want to update it to the latest version?"),
190
+ })];
191
+ case 1:
192
+ shouldUpdatePackage = _b.sent();
193
+ abortIfCancelled(shouldUpdatePackage);
194
+ return [2 /*return*/];
195
+ case 2:
196
+ sdkInstallSpinner = clack.spinner();
197
+ if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {
198
+ detectedPackageManager = 'yarn';
199
+ }
200
+ else if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {
201
+ detectedPackageManager = 'npm';
202
+ }
203
+ else if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
204
+ detectedPackageManager = 'pnpm';
205
+ }
206
+ else {
207
+ detectedPackageManager = 'npm';
208
+ }
209
+ sdkInstallSpinner.start("".concat(alreadyInstalled ? 'Updating' : 'Installing', " ").concat(chalk_1.default.bold.cyan(packageName), " with ").concat(chalk_1.default.bold(detectedPackageManager), "."));
210
+ _b.label = 3;
211
+ case 3:
212
+ _b.trys.push([3, 10, , 11]);
213
+ if (!(detectedPackageManager === 'yarn')) return [3 /*break*/, 5];
214
+ return [4 /*yield*/, (0, util_1.promisify)(childProcess.exec)("yarn add ".concat(packageName, "@latest"))];
215
+ case 4:
216
+ _b.sent();
217
+ return [3 /*break*/, 9];
218
+ case 5:
219
+ if (!(detectedPackageManager === 'pnpm')) return [3 /*break*/, 7];
220
+ return [4 /*yield*/, (0, util_1.promisify)(childProcess.exec)("pnpm add ".concat(packageName, "@latest"))];
221
+ case 6:
222
+ _b.sent();
223
+ return [3 /*break*/, 9];
224
+ case 7:
225
+ if (!(detectedPackageManager === 'npm')) return [3 /*break*/, 9];
226
+ return [4 /*yield*/, (0, util_1.promisify)(childProcess.exec)("npm install ".concat(packageName, "@latest"))];
227
+ case 8:
228
+ _b.sent();
229
+ _b.label = 9;
230
+ case 9: return [3 /*break*/, 11];
231
+ case 10:
232
+ e_3 = _b.sent();
233
+ 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')));
235
+ clack.outro('Wizard setup cancelled.');
236
+ return [2 /*return*/, process.exit(1)];
237
+ case 11:
238
+ sdkInstallSpinner.stop("".concat(alreadyInstalled ? 'Updated' : 'Installed', " ").concat(chalk_1.default.bold.cyan(packageName), " with ").concat(chalk_1.default.bold(detectedPackageManager), "."));
239
+ return [2 /*return*/];
240
+ }
241
+ });
242
+ });
243
+ }
244
+ exports.installPackage = installPackage;
245
+ function askForSelfHosted() {
246
+ return __awaiter(this, void 0, void 0, function () {
247
+ var choice, url;
248
+ return __generator(this, function (_a) {
249
+ switch (_a.label) {
250
+ case 0: return [4 /*yield*/, clack.select({
251
+ message: 'Are you using Sentry SaaS or self-hosted Sentry?',
252
+ options: [
253
+ { value: 'saas', label: 'Sentry SaaS (sentry.io)' },
254
+ { value: 'self-hosted', label: 'Self-hosted/on-premise' },
255
+ ],
256
+ })];
257
+ case 1:
258
+ choice = _a.sent();
259
+ abortIfCancelled(choice);
260
+ if (choice === 'saas') {
261
+ return [2 /*return*/, { url: 'https://sentry.io/', selfHosted: false }];
262
+ }
263
+ return [4 /*yield*/, clack.text({
264
+ message: 'Please enter the URL of your self-hosted Sentry instance.',
265
+ placeholder: 'https://sentry.io/',
266
+ })];
267
+ case 2:
268
+ url = _a.sent();
269
+ abortIfCancelled(url);
270
+ return [2 /*return*/, { url: url, selfHosted: true }];
271
+ }
272
+ });
273
+ });
274
+ }
275
+ exports.askForSelfHosted = askForSelfHosted;
276
+ function addSentryCliRc(authToken) {
277
+ 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) {
281
+ case 0:
282
+ clircExists = fs.existsSync(path.join(process.cwd(), '.sentryclirc'));
283
+ if (!clircExists) return [3 /*break*/, 5];
284
+ clircContents = fs.readFileSync(path.join(process.cwd(), '.sentryclirc'), 'utf8');
285
+ likelyAlreadyHasAuthToken = !!(clircContents.includes('[auth]') && clircContents.match(/token=./g));
286
+ if (!likelyAlreadyHasAuthToken) return [3 /*break*/, 1];
287
+ clack.log.warn("".concat(chalk_1.default.bold('.sentryclirc'), " already has auth token. Will not add one."));
288
+ return [3 /*break*/, 4];
289
+ case 1:
290
+ _a.trys.push([1, 3, , 4]);
291
+ return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), '.sentryclirc'), "".concat(clircContents, "\n[auth]\ntoken=").concat(authToken, "\n"), { encoding: 'utf8', flag: 'w' })];
292
+ case 2:
293
+ _a.sent();
294
+ clack.log.success("Added auth token to ".concat(chalk_1.default.bold('.sentryclirc')));
295
+ return [3 /*break*/, 4];
296
+ case 3:
297
+ e_4 = _a.sent();
298
+ 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
+ return [3 /*break*/, 4];
300
+ case 4: return [3 /*break*/, 8];
301
+ case 5:
302
+ _a.trys.push([5, 7, , 8]);
303
+ return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), '.sentryclirc'), "[auth]\ntoken=".concat(authToken, "\n"), { encoding: 'utf8', flag: 'w' })];
304
+ case 6:
305
+ _a.sent();
306
+ clack.log.success("Created ".concat(chalk_1.default.bold('.sentryclirc'), " with auth token."));
307
+ return [3 /*break*/, 8];
308
+ case 7:
309
+ e_5 = _a.sent();
310
+ 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
+ return [3 /*break*/, 8];
312
+ case 8:
313
+ _a.trys.push([8, 10, , 11]);
314
+ return [4 /*yield*/, fs.promises.appendFile(path.join(process.cwd(), '.gitignore'), '\n# Sentry Auth Token\n.sentryclirc\n', { encoding: 'utf8' })];
315
+ case 9:
316
+ _a.sent();
317
+ clack.log.success("Added ".concat(chalk_1.default.bold('.sentryclirc'), " to ").concat(chalk_1.default.bold('.gitignore'), "."));
318
+ return [3 /*break*/, 11];
319
+ case 10:
320
+ e_6 = _a.sent();
321
+ clack.log.error("Failed adding ".concat(chalk_1.default.bold('.sentryclirc'), " to ").concat(chalk_1.default.bold('.gitignore'), ". Please add it manually!"));
322
+ return [3 /*break*/, 11];
323
+ case 11: return [2 /*return*/];
324
+ }
325
+ });
326
+ });
327
+ }
328
+ exports.addSentryCliRc = addSentryCliRc;
329
+ //# sourceMappingURL=clack-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../src/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * 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 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 return process.exit(0);\n } else {\n return;\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 (e) {\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 (e) {\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 return;\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 (e) {\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 (e) {\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 (e) {\n clack.log.error(\n `Failed adding ${chalk.bold('.sentryclirc')} to ${chalk.bold(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ interface NextjsWizardOptions {
2
+ promoCode?: string;
3
+ }
4
+ export declare function runNextjsWizard(options: NextjsWizardOptions): Promise<void>;
5
+ export {};