const Nconf = require('nconf'); const _ = require('lodash'); const os = require('os'); const path = require('path'); const _debug = require('ghost-ignition').debug._base; const debug = _debug('ghost:config'); const localUtils = require('./utils'); const env = process.env.NODE_ENV || 'development'; const _private = {}; _private.loadNconf = function loadNconf(options) { debug('config start'); options = options || {}; const baseConfigPath = options.baseConfigPath || __dirname; const customConfigPath = options.customConfigPath || process.cwd(); const nconf = new Nconf.Provider(); /** * no channel can override the overrides */ nconf.file('overrides', path.join(baseConfigPath, 'overrides.json')); /** * command line arguments */ nconf.argv(); /** * env arguments */ nconf.env({ separator: '__', parseValues: true }); nconf.file('custom-env', path.join(customConfigPath, 'config.' + env + '.json')); if (env !== 'testing') { nconf.file('local-env', path.join(customConfigPath, 'config.local.json')); } nconf.file('default-env', path.join(baseConfigPath, 'env', 'config.' + env + '.json')); nconf.file('defaults', path.join(baseConfigPath, 'defaults.json')); /** * transform all relative paths to absolute paths * transform sqlite filename path for Ghost-CLI */ nconf.makePathsAbsolute = localUtils.makePathsAbsolute.bind(nconf); nconf.isPrivacyDisabled = localUtils.isPrivacyDisabled.bind(nconf); nconf.getContentPath = localUtils.getContentPath.bind(nconf); nconf.sanitizeDatabaseProperties = localUtils.sanitizeDatabaseProperties.bind(nconf); nconf.doesContentPathExist = localUtils.doesContentPathExist.bind(nconf); nconf.sanitizeDatabaseProperties(); nconf.makePathsAbsolute(nconf.get('paths'), 'paths'); if (nconf.get('database:client') === 'sqlite3') { nconf.makePathsAbsolute(nconf.get('database:connection'), 'database:connection'); // In the default SQLite test config we set the path to /tmp/ghost-test.db, // but this won't work on Windows, so we need to replace the /tmp bit with // the Windows temp folder const filename = nconf.get('database:connection:filename'); if (_.isString(filename) && filename.match(/^\/tmp/)) { nconf.set('database:connection:filename', filename.replace(/^\/tmp/, os.tmpdir())); } } /** * Check if the URL in config has a protocol */ nconf.checkUrlProtocol = localUtils.checkUrlProtocol.bind(nconf); nconf.checkUrlProtocol(); /** * Ensure that the content path exists */ nconf.doesContentPathExist(); /** * values we have to set manual */ nconf.set('env', env); // Wrap this in a check, because else nconf.get() is executed unnecessarily // To output this, use DEBUG=ghost:*,ghost-config if (_debug.enabled('ghost-config')) { debug(nconf.get()); } debug('config end'); return nconf; }; module.exports = _private.loadNconf(); module.exports.loadNconf = _private.loadNconf;