@sentry/wizard 2.7.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.
- package/CHANGELOG.md +16 -3
- package/bin.ts +9 -2
- package/dist/NextJs/configs/next.config.template.js +1 -1
- package/dist/bin.js +16 -4
- package/dist/bin.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/Constants.js +1 -1
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/BottomBar.js +2 -2
- package/dist/lib/Helper/BottomBar.js.map +1 -1
- package/dist/lib/Helper/File.js +10 -12
- package/dist/lib/Helper/File.js.map +1 -1
- package/dist/lib/Helper/Logging.js +1 -1
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/MergeConfig.js +1 -0
- package/dist/lib/Helper/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/Package.js +10 -10
- package/dist/lib/Helper/Package.js.map +1 -1
- package/dist/lib/Helper/PackageManager.js +6 -9
- package/dist/lib/Helper/PackageManager.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +3 -3
- package/dist/lib/Helper/SentryCli.js +3 -3
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Helper/Wizard.d.ts +4 -4
- package/dist/lib/Helper/Wizard.js +11 -11
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Helper/__tests__/File.js +5 -5
- package/dist/lib/Helper/__tests__/File.js.map +1 -1
- package/dist/lib/Helper/__tests__/MergeConfig.js +9 -9
- package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
- package/dist/lib/Setup.js +11 -9
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/BaseStep.d.ts +2 -2
- package/dist/lib/Steps/BaseStep.js +3 -3
- package/dist/lib/Steps/BaseStep.js.map +1 -1
- package/dist/lib/Steps/ChooseIntegration.d.ts +1 -1
- package/dist/lib/Steps/ChooseIntegration.js +7 -5
- package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
- package/dist/lib/Steps/ConfigureProject.d.ts +1 -1
- package/dist/lib/Steps/ConfigureProject.js +5 -3
- package/dist/lib/Steps/ConfigureProject.js.map +1 -1
- package/dist/lib/Steps/Initial.d.ts +1 -1
- package/dist/lib/Steps/Initial.js +7 -4
- package/dist/lib/Steps/Initial.js.map +1 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.d.ts +2 -2
- package/dist/lib/Steps/Integrations/BaseIntegration.js +7 -4
- package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.d.ts +2 -2
- package/dist/lib/Steps/Integrations/Cordova.js +13 -10
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.d.ts +2 -2
- package/dist/lib/Steps/Integrations/Electron.js +25 -21
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.d.ts +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.js +8 -5
- package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
- package/dist/lib/Steps/Integrations/NextJs.d.ts +2 -2
- package/dist/lib/Steps/Integrations/NextJs.js +57 -52
- package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
- package/dist/lib/Steps/Integrations/ReactNative.d.ts +2 -2
- package/dist/lib/Steps/Integrations/ReactNative.js +54 -52
- package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js +1 -1
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js.map +1 -1
- package/dist/lib/Steps/OpenSentry.d.ts +1 -1
- package/dist/lib/Steps/OpenSentry.js +19 -17
- package/dist/lib/Steps/OpenSentry.js.map +1 -1
- package/dist/lib/Steps/PromptForParameters.d.ts +1 -1
- package/dist/lib/Steps/PromptForParameters.js +21 -19
- package/dist/lib/Steps/PromptForParameters.js.map +1 -1
- package/dist/lib/Steps/Result.d.ts +1 -1
- package/dist/lib/Steps/Result.js +8 -5
- package/dist/lib/Steps/Result.js.map +1 -1
- package/dist/lib/Steps/SentryProjectSelector.d.ts +1 -1
- package/dist/lib/Steps/SentryProjectSelector.js +6 -4
- package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
- package/dist/lib/Steps/ShouldConfigure.d.ts +1 -1
- package/dist/lib/Steps/ShouldConfigure.js +5 -3
- package/dist/lib/Steps/ShouldConfigure.js.map +1 -1
- package/dist/lib/Steps/WaitForSentry.d.ts +1 -1
- package/dist/lib/Steps/WaitForSentry.js +47 -50
- package/dist/lib/Steps/WaitForSentry.js.map +1 -1
- package/dist/lib/Steps/Welcome.d.ts +1 -1
- package/dist/lib/Steps/Welcome.js +8 -6
- package/dist/lib/Steps/Welcome.js.map +1 -1
- package/dist/lib/Steps/index.js +1 -0
- package/dist/lib/Steps/index.js.map +1 -1
- package/dist/lib/__tests__/Env.js +1 -1
- package/dist/lib/__tests__/Env.js.map +1 -1
- package/dist/lib/__tests__/Setup.js +1 -1
- package/dist/lib/__tests__/Setup.js.map +1 -1
- package/dist/src/clack-utils.d.ts +40 -0
- package/dist/src/clack-utils.js +329 -0
- package/dist/src/clack-utils.js.map +1 -0
- package/dist/src/nextjs-wizard.d.ts +5 -0
- package/dist/src/nextjs-wizard.js +346 -0
- package/dist/src/nextjs-wizard.js.map +1 -0
- package/lib/Helper/File.ts +2 -8
- package/lib/Helper/MergeConfig.ts +1 -0
- package/lib/Helper/SentryCli.ts +3 -3
- package/lib/Helper/Wizard.ts +6 -5
- package/lib/Helper/__tests__/File.ts +5 -5
- package/lib/Helper/__tests__/SentryCli.ts +3 -2
- package/lib/Helper/test-fixtures/next.config.1-merged.js +1 -1
- package/lib/Helper/test-fixtures/next.config.3-merged.js +1 -1
- package/lib/Helper/test-fixtures/next.config.4-merged.js +1 -1
- package/lib/Steps/BaseStep.ts +4 -4
- package/lib/Steps/ChooseIntegration.ts +2 -1
- package/lib/Steps/ConfigureProject.ts +1 -1
- package/lib/Steps/Initial.ts +2 -1
- package/lib/Steps/Integrations/BaseIntegration.ts +5 -3
- package/lib/Steps/Integrations/Cordova.ts +7 -6
- package/lib/Steps/Integrations/Electron.ts +10 -7
- package/lib/Steps/Integrations/MobileProject.ts +3 -1
- package/lib/Steps/Integrations/NextJs.ts +8 -6
- package/lib/Steps/Integrations/ReactNative.ts +47 -26
- package/lib/Steps/Integrations/__tests__/ReactNative.ts +3 -2
- package/lib/Steps/OpenSentry.ts +1 -1
- package/lib/Steps/PromptForParameters.ts +3 -2
- package/lib/Steps/Result.ts +2 -1
- package/lib/Steps/SentryProjectSelector.ts +3 -2
- package/lib/Steps/ShouldConfigure.ts +1 -1
- package/lib/Steps/WaitForSentry.ts +4 -4
- package/lib/Steps/Welcome.ts +3 -2
- package/lib/__tests__/Setup.ts +1 -1
- package/package.json +17 -14
- package/scripts/NextJs/configs/next.config.template.js +1 -1
- package/src/clack-utils.ts +346 -0
- package/src/nextjs-wizard.ts +619 -0
|
@@ -3,10 +3,12 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
3
3
|
var extendStatics = function (d, b) {
|
|
4
4
|
extendStatics = Object.setPrototypeOf ||
|
|
5
5
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
7
|
return extendStatics(d, b);
|
|
8
8
|
};
|
|
9
9
|
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
10
12
|
extendStatics(d, b);
|
|
11
13
|
function __() { this.constructor = d; }
|
|
12
14
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
@@ -27,7 +29,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
27
29
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
28
30
|
function step(op) {
|
|
29
31
|
if (f) throw new TypeError("Generator is already executing.");
|
|
30
|
-
while (_) try {
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
31
33
|
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;
|
|
32
34
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
33
35
|
switch (op[0]) {
|
|
@@ -52,11 +54,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
52
54
|
exports.Welcome = void 0;
|
|
53
55
|
var Logging_1 = require("../Helper/Logging");
|
|
54
56
|
var BaseStep_1 = require("./BaseStep");
|
|
55
|
-
var Welcome = /** @class */ (function (_super) {
|
|
57
|
+
var Welcome = exports.Welcome = /** @class */ (function (_super) {
|
|
56
58
|
__extends(Welcome, _super);
|
|
57
59
|
function Welcome() {
|
|
58
60
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
59
61
|
}
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
60
63
|
Welcome.prototype.emit = function (_answers) {
|
|
61
64
|
return __awaiter(this, void 0, void 0, function () {
|
|
62
65
|
return __generator(this, function (_a) {
|
|
@@ -64,8 +67,8 @@ var Welcome = /** @class */ (function (_super) {
|
|
|
64
67
|
return [2 /*return*/, {}];
|
|
65
68
|
}
|
|
66
69
|
if (this._argv.uninstall === false) {
|
|
67
|
-
Logging_1.green('Sentry Wizard will help you to configure your project');
|
|
68
|
-
Logging_1.dim('Thank you for using Sentry :)');
|
|
70
|
+
(0, Logging_1.green)('Sentry Wizard will help you to configure your project');
|
|
71
|
+
(0, Logging_1.dim)('Thank you for using Sentry :)');
|
|
69
72
|
}
|
|
70
73
|
Welcome._didShow = true;
|
|
71
74
|
return [2 /*return*/, {}];
|
|
@@ -75,5 +78,4 @@ var Welcome = /** @class */ (function (_super) {
|
|
|
75
78
|
Welcome._didShow = false;
|
|
76
79
|
return Welcome;
|
|
77
80
|
}(BaseStep_1.BaseStep));
|
|
78
|
-
exports.Welcome = Welcome;
|
|
79
81
|
//# sourceMappingURL=Welcome.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Welcome.js","sourceRoot":"","sources":["../../../lib/Steps/Welcome.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Welcome.js","sourceRoot":"","sources":["../../../lib/Steps/Welcome.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,6CAA+C;AAC/C,uCAAsC;AAEtC;IAA6B,2BAAQ;IAArC;;IAeA,CAAC;IAZC,4DAA4D;IAC/C,sBAAI,GAAjB,UAAkB,QAAiB;;;gBACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;oBACpB,sBAAO,EAAE,EAAC;iBACX;gBACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE;oBAClC,IAAA,eAAK,EAAC,uDAAuD,CAAC,CAAC;oBAC/D,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC;iBACtC;gBACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACxB,sBAAO,EAAE,EAAC;;;KACX;IAbc,gBAAQ,GAAG,KAAK,CAAC;IAclC,cAAC;CAAA,AAfD,CAA6B,mBAAQ,GAepC","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport { dim, green } from '../Helper/Logging';\nimport { BaseStep } from './BaseStep';\n\nexport class Welcome extends BaseStep {\n private static _didShow = false;\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async emit(_answers: Answers): Promise<Answers> {\n if (Welcome._didShow) {\n return {};\n }\n if (this._argv.uninstall === false) {\n green('Sentry Wizard will help you to configure your project');\n dim('Thank you for using Sentry :)');\n }\n Welcome._didShow = true;\n return {};\n }\n}\n"]}
|
package/dist/lib/Steps/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PromptForParameters = exports.ShouldConfigure = exports.ChooseIntegration = exports.ConfigureProject = exports.Result = exports.SentryProjectSelector = exports.Initial = exports.WaitForSentry = exports.OpenSentry = exports.Welcome = void 0;
|
|
3
4
|
var Welcome_1 = require("./Welcome");
|
|
4
5
|
Object.defineProperty(exports, "Welcome", { enumerable: true, get: function () { return Welcome_1.Welcome; } });
|
|
5
6
|
var OpenSentry_1 = require("./OpenSentry");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/Steps/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/Steps/index.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAC9B,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA","sourcesContent":["export { Welcome } from './Welcome';\nexport { OpenSentry } from './OpenSentry';\nexport { WaitForSentry } from './WaitForSentry';\nexport { Initial } from './Initial';\nexport { SentryProjectSelector } from './SentryProjectSelector';\nexport { Result } from './Result';\nexport { ConfigureProject } from './ConfigureProject';\nexport { ChooseIntegration } from './ChooseIntegration';\nexport { ShouldConfigure } from './ShouldConfigure';\nexport { PromptForParameters } from './PromptForParameters';\n"]}
|
|
@@ -17,7 +17,7 @@ describe('read-env', function () {
|
|
|
17
17
|
process.env.SENTRY_WIZARD_PLATFORM = ['ios', 'android'];
|
|
18
18
|
// @ts-ignore: true not assignable to string/undefined
|
|
19
19
|
process.env.SENTRY_WIZARD_URL = 'https://sentry.io';
|
|
20
|
-
expect(Env_1.readEnvironment()).toEqual({
|
|
20
|
+
expect((0, Env_1.readEnvironment)()).toEqual({
|
|
21
21
|
debug: true,
|
|
22
22
|
integration: 'reactNative,electron',
|
|
23
23
|
platform: 'ios,android',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Env.js","sourceRoot":"","sources":["../../../lib/__tests__/Env.ts"],"names":[],"mappings":";;AAAA,qCAAgD;AAEhD,QAAQ,CAAC,UAAU,EAAE;IACnB,IAAI,CAAC,WAAW,EAAE;QAChB,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAC5C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAC9C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACpE,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,mBAAmB,CAAC;QACpD,MAAM,CAAC,qBAAe,
|
|
1
|
+
{"version":3,"file":"Env.js","sourceRoot":"","sources":["../../../lib/__tests__/Env.ts"],"names":[],"mappings":";;AAAA,qCAAgD;AAEhD,QAAQ,CAAC,UAAU,EAAE;IACnB,IAAI,CAAC,WAAW,EAAE;QAChB,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAC5C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAC9C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACpE,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,mBAAmB,CAAC;QACpD,MAAM,CAAC,IAAA,qBAAe,GAAE,CAAC,CAAC,OAAO,CAAC;YAChC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,mBAAmB;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { readEnvironment } from '../Helper/Env';\n\ndescribe('read-env', () => {\n test('transform', () => {\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_DEBUG = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_UNINSTALL = false;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_SKIP_CONNECT = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_QUIET = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_INTEGRATION = ['reactNative', 'electron'];\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_PLATFORM = ['ios', 'android'];\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_URL = 'https://sentry.io';\n expect(readEnvironment()).toEqual({\n debug: true,\n integration: 'reactNative,electron',\n platform: 'ios,android',\n quiet: true,\n skipConnect: true,\n uninstall: false,\n url: 'https://sentry.io',\n });\n });\n});\n"]}
|
|
@@ -22,7 +22,7 @@ describe('Wizard', function () {
|
|
|
22
22
|
describe('React Native', function () {
|
|
23
23
|
test('run', function () {
|
|
24
24
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
25
|
-
expect(Setup_1.run({
|
|
25
|
+
expect((0, Setup_1.run)({
|
|
26
26
|
quiet: true,
|
|
27
27
|
integration: Constants_1.Integration.reactNative,
|
|
28
28
|
platform: [Constants_1.Platform.ios, Constants_1.Platform.android],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Setup.js","sourceRoot":"","sources":["../../../lib/__tests__/Setup.ts"],"names":[],"mappings":";;AAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,4CAA4C;AAC5E,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3B,6CAA+C;AAE/C,0CAAqD;AACrD,kCAA+B;AAE/B,IAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC;AAExC,IAAM,WAAW,GAAG;IACjB,aAAqB,CAAC,IAAI,GAAG,YAAY,CAAC;AAC7C,CAAC,CAAC;AAEF,IAAM,QAAQ,GAAG;
|
|
1
|
+
{"version":3,"file":"Setup.js","sourceRoot":"","sources":["../../../lib/__tests__/Setup.ts"],"names":[],"mappings":";;AAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,4CAA4C;AAC5E,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3B,6CAA+C;AAE/C,0CAAqD;AACrD,kCAA+B;AAE/B,IAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC;AAExC,IAAM,WAAW,GAAG;IACjB,aAAqB,CAAC,IAAI,GAAG,YAAY,CAAC;AAC7C,CAAC,CAAC;AAEF,IAAM,QAAQ,GAAG;IACd,aAAa,CAAC,IAA6B,CAAC,kBAAkB,CAC7D,UAAC,QAAQ,EAAE,QAAQ,IAAK,OAAA,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAA9B,CAA8B,CACvD,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,QAAQ,EAAE;IACjB,UAAU,CAAC;QACT,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE;QACvB,IAAI,CAAC,KAAK,EAAE;YACV,mEAAmE;YACnE,MAAM,CACJ,IAAA,WAAG,EAAC;gBACF,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,uBAAW,CAAC,WAAW;gBACpC,QAAQ,EAAE,CAAC,oBAAQ,CAAC,GAAG,EAAE,oBAAQ,CAAC,OAAO,CAAC;gBAC1C,WAAW,EAAE,IAAI;aAClB,CAAC,CACH,CAAC,UAAU,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('../Helper/Logging'); // We mock logging to not pollute the output\njest.mock('child_process');\nimport * as child_process from 'child_process';\n\nimport { Integration, Platform } from '../Constants';\nimport { run } from '../Setup';\n\nconst originalExec = child_process.exec;\n\nconst restoreExec = (): void => {\n (child_process as any).exec = originalExec;\n};\n\nconst mockExec = (): void => {\n (child_process.exec as unknown as jest.Mock).mockImplementation(\n (_command, callback) => callback(null, { stdout: '' }),\n );\n};\n\ndescribe('Wizard', () => {\n beforeEach(() => {\n mockExec();\n });\n\n afterEach(() => {\n restoreExec();\n });\n\n describe('React Native', () => {\n test('run', () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n expect(\n run({\n quiet: true,\n integration: Integration.reactNative,\n platform: [Platform.ios, Platform.android],\n skipConnect: true,\n }),\n ).toBeTruthy();\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
interface WizardProjectData {
|
|
2
|
+
apiKeys: {
|
|
3
|
+
token: string;
|
|
4
|
+
};
|
|
5
|
+
projects: SentryProjectData[];
|
|
6
|
+
}
|
|
7
|
+
export interface SentryProjectData {
|
|
8
|
+
id: string;
|
|
9
|
+
slug: string;
|
|
10
|
+
name: string;
|
|
11
|
+
organization: {
|
|
12
|
+
slug: string;
|
|
13
|
+
};
|
|
14
|
+
keys: [{
|
|
15
|
+
dsn: {
|
|
16
|
+
public: string;
|
|
17
|
+
};
|
|
18
|
+
}];
|
|
19
|
+
}
|
|
20
|
+
export declare function abort(): never;
|
|
21
|
+
export declare function abortIfCancelled<T>(input: T): asserts input is Exclude<T, symbol>;
|
|
22
|
+
export declare function printWelcome(options: {
|
|
23
|
+
wizardName: string;
|
|
24
|
+
promoCode?: string;
|
|
25
|
+
}): void;
|
|
26
|
+
export declare function confirmContinueEvenThoughNoGitRepo(): Promise<void>;
|
|
27
|
+
export declare function askForWizardLogin(options: {
|
|
28
|
+
url: string;
|
|
29
|
+
promoCode?: string;
|
|
30
|
+
}): Promise<WizardProjectData>;
|
|
31
|
+
export declare function installPackage({ packageName, alreadyInstalled, }: {
|
|
32
|
+
packageName: string;
|
|
33
|
+
alreadyInstalled: boolean;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
export declare function askForSelfHosted(): Promise<{
|
|
36
|
+
url: string;
|
|
37
|
+
selfHosted: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function addSentryCliRc(authToken: string): Promise<void>;
|
|
40
|
+
export {};
|
|
@@ -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"]}
|