500tech/angular-kick

View on GitHub
lib/fs-utils.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const fs         = require('fs-extra');
const changeCase = require('change-case');
const path       = require('path');
const prompt     = require('readline-sync').question;
const message    = require('./messages');
const Logger     = require('./logger');

module.exports = class FSUtils {

  static appName() {
    return FSUtils.exists('package.json') ? fs.readJSONSync('package.json').name : '';
  }

  static getPath(localPath) {
    return path.join.apply(null, (localPath || '').split('/'));
  }

  static isEmptyDir(path) {
    const files = fs.readdirSync(path);

    return !files.length;
  }

  static replaceInFile(filename, replacements) {
    let file = fs.readFileSync(filename, 'utf8');

    Object.keys(replacements).forEach((key) => {
      const value = new RegExp('%' + changeCase.constantCase(key) + '%', 'g');

      file = file.replace(value, replacements[key]);
    });

    return file.replace(/%APP_NAME%/g, FSUtils.appName());
  }

  static createFile(filename, template) {
    filename = FSUtils.getPath(filename);

    if (FSUtils.exists(filename)) {
      Logger.warn(`${filename.yellow} ${'already exists.'.white}`);

      const answer = prompt(`${message.new.overrideQuestion} ${message.yesNo}`);
      Logger.blankLine();

      switch (answer.toLowerCase()) {
        case 'yes':
        case 'y':
          break;
        default:
          Logger.log(`${filename} was not overriden`);
          process.exit(0);
      }
    }

    Logger.createFile(filename);
    fs.writeFileSync(filename, template);
  }

  static prependToFile(filename, string) {
    filename = FSUtils.getPath(filename);

    if (!FSUtils.exists(filename)) {
      return;
    }
    Logger.modifyFile(filename);
    return fs.writeFileSync(filename, string + fs.readFileSync(filename, 'utf-8'))
  }

  static appendToFile(filename, string) {
    filename = FSUtils.getPath(filename);

    if (!FSUtils.exists(filename)) {
      return;
    }
    Logger.modifyFile(filename);
    if (fs.readFileSync(filename, 'utf-8').match(/\n$/)) {
      return fs.appendFileSync(filename, string);
    } else {
      return fs.appendFileSync(filename, '\n' + string);
    }
  }

  static modifyFile(filename, rules) {
    filename = FSUtils.getPath(filename);

    if (!FSUtils.exists(filename)) {
      return;
    }
    Logger.modifyFile(filename);
    return rules.forEach((rule) => {
      fs.writeFileSync(filename,
        fs.readFileSync(filename, 'utf8').replace(rule.find, rule.replace)
      );
    })
  }

  static removeFromFile(filename, pattern) {
    filename = FSUtils.getPath(filename);

    if (!FSUtils.exists(filename)) {
      return;
    }
    Logger.modifyFile(filename);
    return fs.writeFileSync(filename,
      fs.readFileSync(filename, 'utf8').replace(pattern, '')
    );
  }

  static createDirectory(name) {
    name = FSUtils.getPath(name);

    if (!FSUtils.exists(name)) {
      Logger.mkdir(name);
    }
    return fs.ensureDirSync(name);
  }

  static destroyFile(filename) {
    filename = FSUtils.getPath(filename);

    if (FSUtils.exists(filename)) {
      Logger.destroyFile(filename);
    }
    return fs.removeSync(filename);
  }

  static destroyDirectoryIfEmpty(name) {
    if (name.match(/app\/[^\/]*\/$/)) {
      return;
    }
    if (name.match(/test\/unit\/[^\/]*\/$/)) {
      return;
    }
    if (name.match(/test\/mock\/[^\/]*\/$/)) {
      return;
    }

    name = FSUtils.getPath(name);
    if (FSUtils.exists(name) && FSUtils.isEmptyDir(name)) {
      Logger.rmdir(name);
      return fs.removeSync(name);
    }
  }

  static exists(fileName) {
    fileName = FSUtils.getPath(fileName);

    try {
      fs.statSync(fileName);
    } catch (error) {
      return false;
    }
    return true;
  }
};