import { rimraf } from '@cirrusct/fs'; import { Logger } from '@cirrusct/logging'; import { BuildSpecConfigSettings, TypescriptBuildCommandOptions } from '@cirrusct/mr-build-typescript'; import { createError, IBuildSpecBuilderCommandHandlerHooks, MrBuilderCommandOptions, MrBuildSpecBuilderCommandHandlerArgs, MrBuildSpecConfig, MrCommandArguments, MrPackage, MrPackageBuilderCommandResults, } from '@cirrusct/mr-core'; import { existsSync } from 'fs'; export abstract class SpecBuilderCommandHandlerBase< TCommandOptions extends MrBuilderCommandOptions = MrBuilderCommandOptions & TypescriptBuildCommandOptions, TCommandArguments extends MrCommandArguments = MrCommandArguments, TCommandConfigSettings extends BuildSpecConfigSettings = BuildSpecConfigSettings, TCommandConfig extends MrBuildSpecConfig = MrBuildSpecConfig > { protected get buildSpecSettings(): TCommandConfigSettings { return this.args.config.value; } protected get config(): TCommandConfig { return this.args.config; } protected get options(): TCommandOptions { return this.args.options; } protected get mrPackage(): MrPackage { return this.args.currentPackage; } protected get logger(): Logger { return this.args.logger; } protected get isDevelopment(): boolean { return process.env.NODE_ENV === 'development'; } protected get isProduction(): boolean { return process.env.NODE_ENV === 'production'; } public get hooks(): IBuildSpecBuilderCommandHandlerHooks { return {}; } protected constructor( protected readonly args: MrBuildSpecBuilderCommandHandlerArgs< TCommandOptions, TCommandArguments, TCommandConfigSettings, TCommandConfig > ) {} public abstract async run(): Promise; // tslint:disable-next-line: no-empty protected async init() {} protected clearOutputPath(keepRoot?: boolean) { const outputPath = this.buildSpecSettings.paths.output; if (outputPath && existsSync(outputPath)) { this.logger.debug({ outputPath }, 'Clearing Output Path'); try { // deleting contents but not root, as there are issues when blowing out a dist dir referenced by vscode rimraf(outputPath, keepRoot); } catch (e) { throw createError(`Failed to clear output path: '${outputPath}'`, e); } } } }