@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.
- package/CHANGELOG.md +17 -2
- package/bin.ts +5 -1
- package/dist/bin.js +6 -1
- package/dist/bin.js.map +1 -1
- package/dist/lib/Constants.d.ts +2 -1
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/File.js +25 -2
- package/dist/lib/Helper/File.js.map +1 -1
- package/dist/lib/Helper/Git.d.ts +7 -0
- package/dist/lib/Helper/Git.js +94 -0
- package/dist/lib/Helper/Git.js.map +1 -0
- package/dist/lib/Helper/Logging.d.ts +1 -0
- package/dist/lib/Helper/Logging.js +9 -2
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/MergeConfig.js +24 -1
- package/dist/lib/Helper/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/Package.d.ts +9 -0
- package/dist/lib/Helper/Package.js +39 -2
- package/dist/lib/Helper/Package.js.map +1 -1
- package/dist/lib/Helper/PackageManager.d.ts +1 -1
- package/dist/lib/Helper/PackageManager.js +32 -11
- package/dist/lib/Helper/PackageManager.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +11 -0
- package/dist/lib/Helper/SentryCli.js +141 -2
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Helper/Wizard.js +24 -1
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Helper/__tests__/MergeConfig.js +25 -2
- package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
- package/dist/lib/Setup.js +25 -2
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/ChooseIntegration.js +28 -1
- package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
- package/dist/lib/Steps/Initial.js +25 -2
- package/dist/lib/Steps/Initial.js.map +1 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.js +24 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.js +25 -2
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +26 -3
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.js +24 -1
- package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
- package/dist/lib/Steps/Integrations/NextJs.d.ts +5 -11
- package/dist/lib/Steps/Integrations/NextJs.js +14 -343
- package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
- package/dist/lib/Steps/Integrations/ReactNative.d.ts +1 -0
- package/dist/lib/Steps/Integrations/ReactNative.js +67 -6
- package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
- package/dist/lib/Steps/Integrations/SvelteKit.d.ts +13 -0
- package/dist/lib/Steps/Integrations/SvelteKit.js +95 -0
- package/dist/lib/Steps/Integrations/SvelteKit.js.map +1 -0
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js +28 -5
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js.map +1 -1
- package/dist/lib/Steps/PromptForParameters.js +24 -1
- package/dist/lib/Steps/PromptForParameters.js.map +1 -1
- package/dist/lib/Steps/SentryProjectSelector.js +25 -1
- package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
- package/dist/lib/__tests__/Setup.js +24 -1
- package/dist/lib/__tests__/Setup.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +326 -0
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -0
- package/dist/src/sveltekit/sdk-example.d.ts +10 -0
- package/dist/src/sveltekit/sdk-example.js +106 -0
- package/dist/src/sveltekit/sdk-example.js.map +1 -0
- package/dist/src/sveltekit/sdk-setup.d.ts +13 -0
- package/dist/src/sveltekit/sdk-setup.js +451 -0
- package/dist/src/sveltekit/sdk-setup.js.map +1 -0
- package/dist/src/sveltekit/sentry-cli-setup.d.ts +2 -0
- package/dist/src/sveltekit/sentry-cli-setup.js +71 -0
- package/dist/src/sveltekit/sentry-cli-setup.js.map +1 -0
- package/dist/src/sveltekit/sveltekit-wizard.d.ts +5 -0
- package/dist/src/sveltekit/sveltekit-wizard.js +147 -0
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -0
- package/dist/src/templates/nextjs-templates.d.ts +13 -0
- package/dist/src/templates/nextjs-templates.js +54 -0
- package/dist/src/templates/nextjs-templates.js.map +1 -0
- package/dist/src/templates/sveltekit-templates.d.ts +12 -0
- package/dist/src/templates/sveltekit-templates.js +26 -0
- package/dist/src/templates/sveltekit-templates.js.map +1 -0
- package/dist/src/{clack-utils.d.ts → utils/clack-utils.d.ts} +7 -0
- package/dist/src/{clack-utils.js → utils/clack-utils.js} +127 -42
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/lib/Constants.ts +5 -0
- package/lib/Helper/Git.ts +39 -0
- package/lib/Helper/Logging.ts +4 -0
- package/lib/Helper/Package.ts +17 -0
- package/lib/Helper/PackageManager.ts +4 -9
- package/lib/Helper/SentryCli.ts +74 -0
- package/lib/Steps/ChooseIntegration.ts +4 -0
- package/lib/Steps/Integrations/NextJs.ts +7 -397
- package/lib/Steps/Integrations/ReactNative.ts +49 -3
- package/lib/Steps/Integrations/SvelteKit.ts +29 -0
- package/lib/Steps/SentryProjectSelector.ts +1 -0
- package/package.json +1 -1
- package/src/{nextjs-wizard.ts → nextjs/nextjs-wizard.ts} +45 -273
- package/src/sveltekit/sdk-example.ts +56 -0
- package/src/sveltekit/sdk-setup.ts +430 -0
- package/src/sveltekit/sentry-cli-setup.ts +27 -0
- package/src/sveltekit/sveltekit-wizard.ts +116 -0
- package/src/templates/nextjs-templates.ts +252 -0
- package/src/templates/sveltekit-templates.ts +172 -0
- package/src/{clack-utils.ts → utils/clack-utils.ts} +73 -11
- package/dist/src/clack-utils.js.map +0 -1
- package/dist/src/nextjs-wizard.js +0 -346
- package/dist/src/nextjs-wizard.js.map +0 -1
- /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
|
-
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
44
|
-
var
|
|
45
|
-
var
|
|
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
|
-
|
|
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
|
|
89
|
-
return __generator(this, function (
|
|
90
|
-
switch (
|
|
112
|
+
var _a, continueWithoutGit;
|
|
113
|
+
return __generator(this, function (_b) {
|
|
114
|
+
switch (_b.label) {
|
|
91
115
|
case 0:
|
|
92
|
-
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
118
|
-
return __generator(this, function (
|
|
119
|
-
switch (
|
|
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 =
|
|
148
|
+
hasSentryAccount = _b.sent();
|
|
125
149
|
abortIfCancelled(hasSentryAccount);
|
|
126
|
-
|
|
150
|
+
_b.label = 2;
|
|
127
151
|
case 2:
|
|
128
|
-
|
|
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 = (
|
|
155
|
+
wizardHash = (_b.sent()).data.hash;
|
|
132
156
|
return [3 /*break*/, 5];
|
|
133
157
|
case 4:
|
|
134
|
-
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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,
|
|
279
|
-
return __generator(this, function (
|
|
280
|
-
switch (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"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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';\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
|
+
}
|
package/lib/Helper/Logging.ts
CHANGED
|
@@ -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
|
}
|
package/lib/Helper/Package.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|
package/lib/Helper/SentryCli.ts
CHANGED
|
@@ -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;
|