diff --git a/lib/config-loader.js b/lib/config-loader.js index 8d8c451..1f5ab6a 100644 --- a/lib/config-loader.js +++ b/lib/config-loader.js @@ -3,6 +3,7 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT +var cloneDeep = require('lodash').cloneDeep; var fs = require('fs'); var path = require('path'); var debug = require('debug')('loopback:boot:config-loader'); @@ -125,11 +126,12 @@ function findConfigFiles(appRootDir, env, name) { */ function loadConfigFiles(files) { return files.map(function(f) { - var config = require(f); + var config = cloneDeep(require(f)); Object.defineProperty(config, '_filename', { enumerable: false, value: f, }); + debug('loaded config file %s: %j', f, config); return config; }); } diff --git a/test/config-loader.test.js b/test/config-loader.test.js new file mode 100644 index 0000000..2faade0 --- /dev/null +++ b/test/config-loader.test.js @@ -0,0 +1,37 @@ +// Copyright IBM Corp. 2014,2016. All Rights Reserved. +// Node module: loopback-boot +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +var configLoader = require('../lib/config-loader'); +var fs = require('fs-extra'); +var path = require('path'); +var expect = require('chai').expect; +var sandbox = require('./helpers/sandbox'); +var appdir = require('./helpers/appdir'); + +describe('config-loader', function() { + beforeEach(sandbox.reset); + beforeEach(appdir.init); + + it('does not cache loaded values', function() { + appdir.createConfigFilesSync(); + appdir.writeConfigFileSync('middleware.json', { + 'strong-error-handler': { params: { debug: false }}, + }); + appdir.writeConfigFileSync('middleware.development.json', { + 'strong-error-handler': { params: { debug: true }}, + }); + + // Here we load main config and merge it with DEV overrides + var config = configLoader.loadMiddleware(appdir.PATH, 'development'); + expect(config['strong-error-handler'].params.debug, 'debug in development') + .to.equal(true); + + // When we load the config file again in different environment, + // only the main file is loaded and no overrides are applied. + config = configLoader.loadMiddleware(appdir.PATH, 'production'); + expect(config['strong-error-handler'].params.debug, 'debug in production') + .to.equal(false); + }); +});