'use strict'; // Dependencies. const glob = require('glob'); const { setWith, merge, get, isObject, isFunction } = require('lodash'); const optionalPath = path => { return path .replace(/(\.settings|.json|.js)/g, '') .split('/') .slice(1, path.split('/').length - 1) .join('.') .toLowerCase(); }; const aggregatePath = path => { return path .replace(/(\.settings|.json|.js)/g, '') .split('/') .slice(1) .join('.') .toLowerCase(); }; const setConfig = function (ctx, path, type, loader) { const objPath = type === 'optional' ? optionalPath(path) : aggregatePath(path); // Load value. const value = loader(path); // Merge doesn't work for none-object value and function. const obj = isObject(value) && !isFunction(value) ? merge(get(ctx, objPath), value) : value; // Assignation. return setWith(ctx, objPath, obj, Object); }; module.exports = function() { return Promise.all([ new Promise((resolve, reject) => { // Load configurations. glob('./modules/*/!(config)/*.*(js|json)', { cwd: this.config.appPath }, (err, files) => { if (err) { return reject(err); } files.map(p => setConfig(this, p, 'aggregate', this.loadFile)); resolve(); }); }), ]); };