UNPKG

@sentry/wizard

Version:

Sentry wizard helping you to configure your project

148 lines (122 loc) 4.06 kB
import * as fs from 'fs'; import type { Answers} from 'inquirer'; import { prompt } from 'inquirer'; import * as _ from 'lodash'; import * as path from 'path'; import type { Args } from '../../Constants'; import { dim, green, l, nl, red } from '../../Helper/Logging'; import { SentryCli } from '../../Helper/SentryCli'; import { BaseIntegration } from './BaseIntegration'; const MIN_ELECTRON_VERSION_STRING = '2.0.0'; const MIN_ELECTRON_VERSION = parseInt( MIN_ELECTRON_VERSION_STRING.replace(/\D+/g, ''), 10, ); const CODE_EXAMPLE = `const Sentry = require('@sentry/electron'); Sentry.init({ dsn: '___DSN___', });`; let appPackage: any = {}; function printExample(example: string, title = ''): void { if (title) { l(title); } nl(); dim(example.replace(/^/gm, ' ')); nl(); } try { appPackage = require(path.join(process.cwd(), 'package.json')); } catch { // We don't need to have this } export class Electron extends BaseIntegration { protected _sentryCli: SentryCli; public constructor(protected _argv: Args) { super(_argv); this._sentryCli = new SentryCli(this._argv); } // eslint-disable-next-line @typescript-eslint/require-await public async emit(answers: Answers): Promise<Answers> { const dsn = _.get(answers, ['config', 'dsn', 'public'], null); nl(); const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers); fs.writeFileSync( './sentry.properties', this._sentryCli.dumpProperties(sentryCliProps), ); green('Successfully created sentry.properties'); nl(); printExample( CODE_EXAMPLE.replace('___DSN___', dsn), 'Put these lines in to your main and renderer processes to setup Sentry:', ); l('For more information, see https://docs.sentry.io/clients/electron/'); nl(); return {}; } public async shouldConfigure(_answers: Answers): Promise<Answers> { // eslint-disable-next-line @typescript-eslint/no-misused-promises if (this._shouldConfigure) { return this._shouldConfigure; } let success = true; nl(); success = this._checkDep('electron', MIN_ELECTRON_VERSION_STRING) && success; success = this._checkDep('@sentry/electron') && success; let continued: Answers = { continue: true }; if (!success && !this._argv.quiet) { continued = await prompt({ message: 'There were errors during your project checkup, do you still want to continue?', name: 'continue', default: false, type: 'confirm', }); } nl(); if (!_.get(continued, 'continue', false)) { throw new Error('Please install the required dependencies to continue.'); } this._shouldConfigure = Promise.resolve({ electron: true }); // eslint-disable-next-line @typescript-eslint/unbound-method return this.shouldConfigure; } private _checkDep(packageName: string, minVersion?: string): boolean { const depVersion = parseInt( _.get(appPackage, ['dependencies', packageName], '0').replace(/\D+/g, ''), 10, ); const devDepVersion = parseInt( _.get(appPackage, ['devDependencies', packageName], '0').replace( /\D+/g, '', ), 10, ); if ( !_.get(appPackage, `dependencies.${packageName}`, false) && !_.get(appPackage, `devDependencies.${packageName}`, false) ) { red(`✗ ${packageName} isn't in your dependencies`); red(' please install it with yarn/npm'); return false; } else if ( minVersion && depVersion < MIN_ELECTRON_VERSION && devDepVersion < MIN_ELECTRON_VERSION ) { red( `✗ Your installed version of ${packageName} is to old, >${MIN_ELECTRON_VERSION_STRING} needed`, ); return false; } else { // eslint-disable-next-line @typescript-eslint/no-unused-expressions minVersion ? green(`✓ ${packageName} > ${minVersion} is installed`) : green(`✓ ${packageName} is installed`); return true; } } }