From 7b226b212ec81950e99552d746fb48f41aa948f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= <mbajtos@cz.ibm.com>
Date: Wed, 29 Jun 2016 14:08:46 -0400
Subject: [PATCH] Stop caching config files

---
 lib/config-loader.js       |  4 +++-
 test/config-loader.test.js | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 test/config-loader.test.js

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);
+  });
+});