161 lines
4.6 KiB
JavaScript
Raw Normal View History

2015-10-01 00:30:16 +02:00
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const path = require('path');
// Public node modules.
const _ = require('lodash');
const async = require('async');
// Local utilities.
const dictionary = require('../../../../util/dictionary');
/**
* Async module loader to create a
* dictionary of the user config
*/
module.exports = function (strapi) {
const hook = {
/**
* Initialize the hook
*/
initialize: function (cb) {
async.auto({
// Load common settings from `./config/*.js|json`.
2015-10-01 00:30:16 +02:00
'config/*': function (cb) {
dictionary.aggregate({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.config),
excludeDirs: /(locales|environments)$/,
filter: /(.+)\.(js|json)$/,
2015-10-01 00:30:16 +02:00
depth: 2
}, cb);
},
// Load locales from `./config/locales/*.json`.
'config/locales/*': function (cb) {
dictionary.optional({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.config, 'locales'),
filter: /(.+)\.(json)$/,
identity: false,
depth: 1
}, cb);
},
// Load functions config from `./config/functions/*.js`.
'config/functions/*': function (cb) {
dictionary.aggregate({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.config, 'functions'),
filter: /(.+)\.(js)$/,
depth: 1
}, cb);
},
// Load all environments config from `./config/environments/*/*.js|json`.
// Not really used inside the framework but useful for the Studio.
2015-10-01 00:30:16 +02:00
'config/environments/**': function (cb) {
dictionary.optional({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.config, 'environments'),
filter: /(.+)\.(js|json)$/,
identity: false,
depth: 4
}, cb);
},
// Load environment-specific config from `./config/environments/**/*.js|json`.
'config/environments/*': function (cb) {
2015-10-01 00:30:16 +02:00
dictionary.aggregate({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.config, 'environments', strapi.config.environment),
filter: /(.+)\.(js|json)$/,
2015-10-01 00:30:16 +02:00
depth: 1
}, cb);
},
// Load APIs from `./api/**/*.js|json`.
'api/**': function (cb) {
dictionary.optional({
dirname: path.resolve(strapi.config.appPath, strapi.config.paths.api),
excludeDirs: /(public)$/,
filter: /(.+)\.(js|json)$/,
depth: 4
}, cb);
2015-10-01 00:30:16 +02:00
}
},
// Callback.
function (err, config) {
// Just in case there is an error.
if (err) {
return cb(err);
}
// Merge every user config together.
const mergedConfig = _.merge(
config['config/*'],
config['config/environments/*'],
2015-10-01 00:30:16 +02:00
config['config/functions/*']
);
// Remove cache.
delete require.cache[path.resolve(strapi.config.appPath, 'package.json')];
2015-10-01 00:30:16 +02:00
// Local `package.json`.
const packageJSON = require(path.resolve(strapi.config.appPath, 'package.json'));
// Merge default config and user loaded config together inside `strapi.config`.
strapi.config = _.merge(strapi.config, mergedConfig, packageJSON);
// Expose user APIs.
strapi.api = config['api/**'];
2015-10-01 00:30:16 +02:00
// Add user locales for the settings of the `i18n` hook
// aiming to load locales automatically.
if (_.isPlainObject(strapi.config.i18n) && !_.isEmpty(strapi.config.i18n)) {
strapi.config.i18n.locales = [];
_.forEach(config['config/locales/*'], function (strings, lang) {
strapi.config.i18n.locales.push(lang);
});
}
// Save different environments because we need it in the Strapi Studio.
strapi.config.environments = config['config/environments/**'] || {};
2015-10-01 00:30:16 +02:00
// Make the application name in config match the server one.
strapi.app.name = strapi.config.name;
// Initialize empty API objects.
strapi.controllers = {};
strapi.models = {};
strapi.policies = {};
2015-10-01 00:30:16 +02:00
cb();
});
2015-11-09 15:10:53 +01:00
},
/**
* Reload the hook
*/
reload: function () {
hook.initialize(function (err) {
if (err) {
strapi.log.error('Failed to reinitialize the config hook.');
strapi.stop();
} else {
strapi.emit('hook:_config:reloaded');
}
});
2015-10-01 00:30:16 +02:00
}
};
return hook;
};