@sentry/wizard
Version:
Sentry wizard helping you to configure your project
191 lines (188 loc) • 9.55 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildOutroMessage = exports.runAngularWizard = void 0;
// @ts-expect-error - clack is ESM and TS complains about that. It works though
const prompts_1 = __importDefault(require("@clack/prompts"));
const chalk_1 = __importDefault(require("chalk"));
const telemetry_1 = require("../telemetry");
const clack_1 = require("../utils/clack");
const package_json_1 = require("../utils/package-json");
const semver_1 = require("semver");
const Sentry = __importStar(require("@sentry/node"));
const sdk_setup_1 = require("./sdk-setup");
const sdk_setup_2 = require("./sdk-setup");
const sourcemaps_wizard_1 = require("../sourcemaps/sourcemaps-wizard");
const sourcemaps_1 = require("./codemods/sourcemaps");
const example_component_1 = require("./example-component");
const MIN_SUPPORTED_ANGULAR_VERSION = '14.0.0';
const MIN_SUPPORTED_WIZARD_ANGULAR_VERSION = '17.0.0';
async function runAngularWizard(options) {
return (0, telemetry_1.withTelemetry)({
enabled: options.telemetryEnabled,
integration: 'angular',
wizardOptions: options,
}, () => runAngularWizardWithTelemetry(options));
}
exports.runAngularWizard = runAngularWizard;
async function runAngularWizardWithTelemetry(options) {
(0, clack_1.printWelcome)({
wizardName: 'Sentry Angular Wizard',
promoCode: options.promoCode,
telemetryEnabled: options.telemetryEnabled,
});
await (0, clack_1.confirmContinueIfNoOrDirtyGitRepo)({
ignoreGitChanges: options.ignoreGitChanges,
cwd: undefined,
});
const packageJson = await (0, clack_1.getPackageDotJson)();
await (0, clack_1.ensurePackageIsInstalled)(packageJson, '@angular/core', 'Angular');
let installedAngularVersion = (0, package_json_1.getPackageVersion)('@angular/core', packageJson);
if (!installedAngularVersion) {
prompts_1.default.log.warn('Could not determine installed Angular version.');
installedAngularVersion = await (0, clack_1.abortIfCancelled)(prompts_1.default.text({
message: `Please enter your installed Angular major version (e.g. ${chalk_1.default.cyan('18')} for Angular 18)`,
validate(value) {
if (!value) {
return 'Angular version is required';
}
try {
if (!(0, semver_1.minVersion)(value)) {
return `Invalid Angular version provided: ${value}`;
}
}
catch (error) {
return `Invalid Angular version provided: ${value}`;
}
},
}));
}
Sentry.setTag('angular-version', installedAngularVersion);
const installedMinVersion = (0, semver_1.minVersion)(installedAngularVersion);
const sdkSupportsAngularVersion = (0, semver_1.gte)(installedMinVersion, MIN_SUPPORTED_ANGULAR_VERSION);
const wizardSupportsAngularVersion = (0, semver_1.gte)(installedMinVersion, MIN_SUPPORTED_WIZARD_ANGULAR_VERSION);
if (!sdkSupportsAngularVersion) {
Sentry.setTag('angular-version-compatible', false);
prompts_1.default.log.warn(`Angular version ${chalk_1.default.cyan(MIN_SUPPORTED_ANGULAR_VERSION)} or higher is required for the Sentry SDK.`);
prompts_1.default.log.warn(`Please refer to Sentry's version compatibility table for more information:
${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular/#angular-version-compatibility')}
`);
return (0, clack_1.abort)('Exiting the wizard.', 0);
}
if (!wizardSupportsAngularVersion) {
Sentry.setTag('angular-wizard-version-compatible', false);
prompts_1.default.log.warn(`The Sentry Angular Wizard requires Angular version ${chalk_1.default.cyan(MIN_SUPPORTED_WIZARD_ANGULAR_VERSION)} or higher.`);
prompts_1.default.log.warn(`Your Angular version (${installedAngularVersion}) is compatible with the Sentry SDK but you need to set it up manually by following our documentation:
${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular')}
Apologies for the inconvenience!`);
return (0, clack_1.abort)('Exiting the wizard.', 0);
}
const { selectedProject, authToken, sentryUrl, selfHosted } = await (0, clack_1.getOrAskForProjectData)(options, 'javascript-angular');
const dsn = selectedProject.keys[0].dsn.public;
const sdkAlreadyInstalled = (0, package_json_1.hasPackageInstalled)('@sentry/angular', packageJson);
Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);
await (0, clack_1.installPackage)({
packageName: '@sentry/angular@^10',
packageNameDisplayLabel: '@sentry/angular',
alreadyInstalled: sdkAlreadyInstalled,
});
const selectedFeatures = await (0, clack_1.featureSelectionPrompt)([
{
id: 'performance',
prompt: `Do you want to enable ${chalk_1.default.bold('Tracing')} to track the performance of your application?`,
enabledHint: 'recommended',
},
{
id: 'replay',
prompt: `Do you want to enable ${chalk_1.default.bold('Sentry Session Replay')} to get a video-like reproduction of errors during a user session?`,
enabledHint: 'recommended, but increases bundle size',
},
{
id: 'logs',
prompt: `Do you want to enable ${chalk_1.default.bold('Logs')} to send your application logs to Sentry?`,
enabledHint: 'recommended',
},
]);
await (0, telemetry_1.traceStep)('Initialize Sentry on Angular application entry point', async () => {
await (0, sdk_setup_1.initializeSentryOnApplicationEntry)(dsn, selectedFeatures);
});
await (0, telemetry_1.traceStep)('Update Angular project configuration', async () => {
await (0, sdk_setup_2.updateAppConfig)(installedMinVersion, selectedFeatures.performance);
});
await (0, telemetry_1.traceStep)('Setup for sourcemap uploads', async () => {
await (0, sourcemaps_1.addSourcemapEntryToAngularJSON)();
if (!options.preSelectedProject) {
options.preSelectedProject = {
authToken,
selfHosted,
project: {
organization: {
id: selectedProject.organization.id,
name: selectedProject.organization.name,
slug: selectedProject.organization.slug,
},
id: selectedProject.id,
slug: selectedProject.slug,
keys: [
{
dsn: {
public: dsn,
},
},
],
},
};
options.url = sentryUrl;
}
await (0, sourcemaps_wizard_1.runSourcemapsWizard)(options, 'angular');
});
const shouldCreateExampleComponent = await (0, clack_1.askShouldCreateExampleComponent)();
Sentry.setTag('create-example-component', shouldCreateExampleComponent);
if (shouldCreateExampleComponent) {
await (0, telemetry_1.traceStep)('create-example-component', async () => await (0, example_component_1.createExampleComponent)({
url: sentryUrl,
orgSlug: selectedProject.organization.slug,
projectId: selectedProject.id,
}));
}
await (0, telemetry_1.traceStep)('Run Prettier', async () => {
await (0, clack_1.runPrettierIfInstalled)({ cwd: undefined });
});
prompts_1.default.outro(buildOutroMessage(shouldCreateExampleComponent));
}
function buildOutroMessage(createdExampleComponent) {
let msg = chalk_1.default.green('\nSuccessfully installed the Sentry Angular SDK!');
if (createdExampleComponent) {
msg += `\n\nYou can validate your setup by starting your dev environment (${chalk_1.default.cyan('ng serve')}) and throwing an error in the example component.`;
}
msg += `\n\nCheck out the SDK documentation for further configuration:
https://docs.sentry.io/platforms/javascript/guides/angular/`;
return msg;
}
exports.buildOutroMessage = buildOutroMessage;
//# sourceMappingURL=angular-wizard.js.map