async getTargetDirectory() {
    let targetDir = path.resolve(this.cwd, '');
    const { force } = this.argv;

    const validate = (dir) => {
      // create dir if not exist
      if (!fs.existsSync(dir)) {
        mkdirp.sync(dir);
        return true;
      }

      // not a directory
      if (!fs.statSync(dir).isDirectory()) {
        log.error(`${dir} already exists as a file`);
        return false;
      }

      // check if directory empty
      const files = fs.readdirSync(dir).filter(name => name[0] !== '.');
      if (files.length) {
        if (force) {
          log.info(`${dir} already exists and will be override due to --force`);
          return true;
        }
        log.warn(
          `${dir} already exists and not empty, to override please use --force`
        );
        return false;
      }
      return true;
    };

    // if argv dir is invalid, then ask user
    const isValid = validate(targetDir);
    if (!isValid) {
      const answer = await inquirer.prompt({
        name: 'dir',
        message: 'Please enter target dir: ',
        filter: dir => path.resolve(this.cwd, dir),
        validate,
      });
      targetDir = answer.dir;
    }
    log.info(`target dir is ${targetDir}`);
    return targetDir;
  }
ask for target directory, will check if dir is valid.
@return {String} Full path of target directory