MobileFirstLLC/extension-cli

View on GitHub
cli/xt-clean.js

Summary

Maintainability
A
2 hrs
Test Coverage
#!/usr/bin/env node

/**
 * @name xt-clean
 * @module
 * @public
 *
 * @description
 *
 *```text
 * xt-clean [--modules] [--idea] [--vscode]
 * ```
 *
 * Clean operation iterates over files and directories listed in the
 * project `.gitignore` file, and removes all ignored files and
 * directories, except `node_modules`, `.idea/`, and `.vscode`. To remove these
 * directories, you must explicitly pass a flag to delete each one of them.
 */

const fs = require('fs');
const del = require('del');
const path = require('path');
const readline = require('readline');
const program = require('commander');
const pkg = require('../package.json');
const ignore = path.join(process.cwd(), '.gitignore');
const Utilities = require('./utilities').Utilities;
const texts = require('./texts').xtClean;

let counter = 0;

program
    .version(pkg.version)
    .option('-m --modules', texts.argModules)
    .option('-i --idea', texts.argIdea)
    .option('-v --vscode', texts.argVS)
    .parse(process.argv);

if (!Utilities.fileExists(ignore)) {
    console.log(texts.onConfigError(ignore));
    process.exit(0);
}

const {modules, idea, vscode} = program.opts();

readline.createInterface({input: fs.createReadStream(ignore)})
    .on('line', function (line) {

        // never clean these
        if (line.trim().indexOf('#') === 0 ||
            line.trim().indexOf('.env') === 0 ||
            !(line || '').trim().length) {
            return false;
        }

        // clean these only if flagged
        if ((line.indexOf('.idea') > -1 && !idea) ||
            (line.indexOf('.vscode') > -1 && !vscode) ||
            (line.indexOf('node_modules') > -1 && !modules)) {
            return false;
        }

        // otherwise clean if exists
        const basePath = path.join(process.cwd(), line);

        if (fs.existsSync(basePath)) {
            try {
                if (fs.lstatSync(basePath).isDirectory()) {
                    del.sync(path.join(basePath, '/*'));
                }
                if (fs.existsSync(basePath)) {
                    del.sync(basePath);
                }
                console.log(texts.onCleanFile(line));
                counter++;
            } catch (e) {
                console.log(texts.onCleanError(e, line));
            }
        }
        return true;
    })
    .on('close', () => {
        console.log(texts.result(counter));
        process.exit(0);
    });