diff --git a/package.json b/package.json index 47bfd6839..2913cb301 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "vip-dev-env-start": "dist/bin/vip-dev-env-start.js", "vip-dev-env-stop": "dist/bin/vip-dev-env-stop.js", "vip-dev-env-logs": "dist/bin/vip-dev-env-logs.js", + "vip-dev-env-purge": "dist/bin/vip-dev-env-purge.js", "vip-export": "dist/bin/vip-export.js", "vip-export-sql": "dist/bin/vip-export-sql.js", "vip-dev-env-sync": "dist/bin/vip-dev-env-sync.js", diff --git a/src/bin/vip-dev-env-purge.js b/src/bin/vip-dev-env-purge.js new file mode 100755 index 000000000..d2872546b --- /dev/null +++ b/src/bin/vip-dev-env-purge.js @@ -0,0 +1,91 @@ +#!/usr/bin/env node + +/** + * External dependencies + */ +import chalk from 'chalk'; +import debugLib from 'debug'; + +/** + * Internal dependencies + */ +import command from '../lib/cli/command'; +import { DEV_ENVIRONMENT_FULL_COMMAND } from '../lib/constants/dev-environment'; +import { + getEnvTrackingInfo, + handleCLIException, + validateDependencies, + promptForBoolean, +} from '../lib/dev-environment/dev-environment-cli'; +import { + destroyEnvironment, + getAllEnvironmentNames, +} from '../lib/dev-environment/dev-environment-core'; +import { bootstrapLando } from '../lib/dev-environment/dev-environment-lando'; +import { trackEvent } from '../lib/tracker'; + +const debug = debugLib( '@automattic/vip:bin:dev-environment' ); + +const examples = [ + { + usage: `${ DEV_ENVIRONMENT_FULL_COMMAND } purge`, + description: 'Destroys all local dev environments', + }, + { + usage: `${ DEV_ENVIRONMENT_FULL_COMMAND } purge --force`, + description: 'Destroys all local dev environments without prompting', + }, +]; + +command() + .option( 'soft', 'Keep config files needed to start an environment intact' ) + .option( 'force', 'Removes prompt that verifies if user wants to destroy all environments' ) + .examples( examples ) + .argv( process.argv, async ( arg, opt ) => { + debug( 'Args: ', arg, 'Options: ', opt ); + + const allEnvNames = getAllEnvironmentNames(); + const lando = await bootstrapLando(); + + if ( allEnvNames.length === 0 ) { + console.log( 'No environments to purge!' ); + return; + } + + if ( ! opt.force ) { + const purge = await promptForBoolean( + 'Are you sure you want to purge ALL existing dev environments?', + true + ); + + if ( ! purge ) { + return; + } + } + + const trackingInfo = { all: true }; + await trackEvent( 'dev_env_purge_command_execute', trackingInfo ); + await validateDependencies( lando, '' ); + const removeFiles = ! ( opt.soft || false ); + + try { + for ( const slug of allEnvNames ) { + try { + // eslint-disable-next-line no-await-in-loop + await destroyEnvironment( lando, slug, removeFiles ); + + const message = chalk.green( '✓' ) + ' Environment destroyed.\n'; + console.log( message ); + } catch ( error ) { + const trackingInfoChild = getEnvTrackingInfo( slug ); + // eslint-disable-next-line no-await-in-loop + await handleCLIException( error, 'dev_env_purge_command_error', trackingInfoChild ); + process.exitCode = 1; + } + } + await trackEvent( 'dev_env_purge_command_success', trackingInfo ); + } catch ( error ) { + await handleCLIException( error, 'dev_env_purge_command_error', trackingInfo ); + process.exitCode = 1; + } + } ); diff --git a/src/bin/vip-dev-env.js b/src/bin/vip-dev-env.js index 32ddf75e4..fd65bd36f 100755 --- a/src/bin/vip-dev-env.js +++ b/src/bin/vip-dev-env.js @@ -20,4 +20,5 @@ command( { .command( 'shell', 'Spawns a shell in a dev environment' ) .command( 'logs', 'View logs from a local WordPress environment' ) .command( 'sync', 'Pull data from production to local development environment' ) + .command( 'purge', 'Destroy all existing environments' ) .argv( process.argv );