"use strict";

const fs        = require("fs");
const merge     = require("merge");
const minimatch = require("minimatch");

/**
 * Configurações
 *
 * @constructor
 * @param {string[]} pattern Padrão de Captura
 * @param {fs}       fs      Manipulador de Sistema de Arquivos
 */
function Config (pattern, fs)
{
    this.setPattern(pattern);
    this.setFs(fs);
};

/**
 * Configura o Padrão de Captura
 *
 * @param  {string[]} pattern Valores para Configuração
 * @return undefined
 */
Config.prototype.setPattern = function (pattern)
{
    this._pattern = pattern;
};

/**
 * Apresenta o Padrão de Captura
 *
 * @return {string[]} Valores Configurados
 */
Config.prototype.getPattern = function ()
{
    return this._pattern;
};

/**
 * Configura o Manipulador de Sistema de Arquivos
 *
 * @param  {fs}      aFs Elemento para Configuração
 * @return undefined
 */
Config.prototype.setFs = function (aFs)
{
    this._fs = aFs || fs;
};

/**
 * Apresenta o Manipulador de Sistema de Arquivos
 *
 * @return {fs} Elemento Configurado
 */
Config.prototype.getFs = function ()
{
    return this._fs;
};

/**
 * Busca Nomes de Arquivos
 *
 * @return {string[]} Lista de Arquivos Encontrados
 */
Config.prototype._fetchFilenames = function ()
{
    // Inicialização
    var fs    = this.getFs();
    var files = [];
    // Função: Captura Recursiva
    var fn = function (directory) {
        // Leitura de Diretório
        fs.readdirSync(directory).forEach(function (file) {
            // Caminho Completo
            file = directory + "/" + file;
            // Diretório?
            if (fs.statSync(file).isDirectory()) {
                // Recursão
                fn(file);
                return;
            }
            // Captura
            files.push(file.substr(2));
        });
    };
    // Execução
    fn(".");
    // Apresentação
    return files;
};

/**
 * Busca Configurações
 *
 * @return {Promise} Execução Assíncrona
 */
Config.prototype.fetch = function ()
{
    // Inicialização
    var pattern = this.getPattern();
    var fs      = this.getFs();

    // Capturar Arquivos
    var filenames = this._fetchFilenames().filter(function (filename) {
        return pattern.filter(function (pattern) {
            return minimatch(filename, pattern);
        }).length > 0;
    });

    // Execuções Assíncronas
    var promises = [];

    // Consulta
    filenames.forEach(function (filename) {
        // Execução Assíncrona
        promises.push(new Promise(function (resolve, reject) {
            // Carregar Arquivo
            fs.readFile(filename, function (error, data) {
                // Erro Encontrado?
                if (error) {
                    // Impossível Continuar
                    reject(error);
                    return;
                }
                // Sucesso!
                resolve({ "filename": filename, "content": JSON.parse(data) });
            });
        }));
    });

    // Execução
    return Promise.all(promises).then(function (elements) {
        // Ordenação
        elements.sort(function (a, b) {
            return a.filename.localeCompare(b.filename);
        });

        // Apresentação
        return elements.reduce(function (elements, item) {
            return merge(elements, item.content);
        }, {});
    });
};

// Configuração
module.exports = Config;

@@ -1263,24 +1263,28 @@
   var fs    
+    
 = this.getFs
@@ -1299,16 +1299,20 @@
 var file
+name
 s = %5B%5D;%0A
@@ -1468,16 +1468,20 @@
 on (file
+name
 ) %7B%0A    
@@ -1524,16 +1524,20 @@
     file
+name
  = direc
@@ -1553,16 +1553,20 @@
 %22 + file
+name
 ;%0A      
@@ -1617,16 +1617,20 @@
 ync(file
+name
 ).isDire
@@ -1691,16 +1691,20 @@
  fn(file
+name
 );%0A     
@@ -1775,16 +1775,20 @@
     file
+name
 s.push(f
@@ -1790,16 +1790,20 @@
 ush(file
+name
 .substr(
@@ -1890,16 +1890,20 @@
 urn file
+name
 s;%0A%7D;%0A%0A/

Modifica nomenclatura de variável