BRIKEV/express-jsdoc-swagger

View on GitHub
consumers/globFilesMatches.js

Summary

Maintainability
B
4 hrs
Test Coverage
A
100%
const glob = require('glob');
const path = require('path');

const DEFAULT_EXCLUDED_FOLDER = 'node_modules';
const DEFAULT_GLOB_OPTIONS = { ignore: '**/node_modules/**' };

const globFilesMatches = (baseDir, filesPattern, excludedFolder = DEFAULT_EXCLUDED_FOLDER) => (
  new Promise((resolve, reject) => {
    if (!baseDir || !filesPattern) {
      const error = new Error('baseDir and filePath are required');
      return reject(error);
    }

    if (!Array.isArray(filesPattern) && typeof filesPattern !== 'string') {
      const error = new Error('files pattern has to be a type of string');
      return reject(error);
    }

    if (Array.isArray(filesPattern)) {
      if (filesPattern.length === 0) {
        const error = new Error('if you submit an array of filesPattern it must contain at least one pattern');
        return reject(error);
      }

      if (filesPattern.some(pattern => typeof pattern !== 'string')) {
        const error = new Error('all file patterns have to be strings');
        return reject(error);
      }
    }

    try {
      let files;
      if (!Array.isArray(filesPattern)) {
        files = glob.sync(path.resolve(baseDir, filesPattern), DEFAULT_GLOB_OPTIONS);
      } else {
        files = filesPattern
          .map(pattern => glob.sync(path.resolve(baseDir, pattern), DEFAULT_EXCLUDED_FOLDER))
          .reduce((memo, it) => memo.concat(it), [])
          .filter((value, index, self) => self.indexOf(value) === index);
      }

      const filteredFiles = files.filter(file => !file.includes(excludedFolder));
      return resolve(filteredFiles);
    } catch (error) {
      return reject(error);
    }
  })
);

module.exports = globFilesMatches;