UNPKG

@sentry/wizard

Version:

Sentry wizard helping you to configure your project

201 lines (198 loc) 10.1 kB
"use strict"; 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 mcp_config_1 = require("../utils/clack/mcp-config"); 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 projectData = await (0, clack_1.getOrAskForProjectData)(options, 'javascript-angular'); if (projectData.spotlight) { prompts_1.default.log.warn('Spotlight mode is not yet supported for Angular.'); prompts_1.default.log.info('Spotlight is currently only available for Next.js.'); await (0, clack_1.abort)('Exiting wizard', 0); return; } const { selectedProject, authToken, sentryUrl, selfHosted } = projectData; 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 }); }); // Offer optional project-scoped MCP config for Sentry with org and project scope await (0, mcp_config_1.offerProjectScopedMcpConfig)(selectedProject.organization.slug, selectedProject.slug); 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