From 41af081c55266a8ad364d1bc913e2a4c0e132309 Mon Sep 17 00:00:00 2001 From: Dennis Ashby Date: Sat, 25 Jul 2015 09:56:28 -0700 Subject: [PATCH 1/3] Added code to allow model-config to respect model-config.local.js and model-config.env.js as do other config files. --- lib/config-loader.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/config-loader.js b/lib/config-loader.js index cd7926a..30842d9 100644 --- a/lib/config-loader.js +++ b/lib/config-loader.js @@ -32,7 +32,8 @@ ConfigLoader.loadDataSources = function(rootDir, env) { */ ConfigLoader.loadModels = function(rootDir, env) { /*jshint unused:false */ - return tryReadJsonConfig(rootDir, 'model-config') || {}; + //return tryReadJsonConfig(rootDir, 'model-config') || {}; + return loadNamed(rootDir, env, 'model-config', mergeModelConfig); }; /** @@ -148,6 +149,15 @@ function mergeDataSourceConfig(target, config, fileName) { } } +function mergeModelConfig(target, config, fileName) { + for (var mc in target) { + var err = mergeObjects(target[mc], config[mc]); + if (err) { + throw new Error('Cannot apply ' + fileName + ' to `' + mc + '`: ' + err); + } + } +} + function mergeAppConfig(target, config, fileName) { var err = mergeObjects(target, config); if (err) { From ab723b54903e7a3d0ecdee3d1f3720fdf8089bc8 Mon Sep 17 00:00:00 2001 From: Dennis Ashby Date: Fri, 31 Jul 2015 06:29:03 -0700 Subject: [PATCH 2/3] Resolved style issue --- lib/config-loader.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/config-loader.js b/lib/config-loader.js index 30842d9..edf7cc7 100644 --- a/lib/config-loader.js +++ b/lib/config-loader.js @@ -32,7 +32,6 @@ ConfigLoader.loadDataSources = function(rootDir, env) { */ ConfigLoader.loadModels = function(rootDir, env) { /*jshint unused:false */ - //return tryReadJsonConfig(rootDir, 'model-config') || {}; return loadNamed(rootDir, env, 'model-config', mergeModelConfig); }; From 02c826337caf8d720060474258926b4eb48af0a4 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 31 Jul 2015 10:01:53 -0700 Subject: [PATCH 3/3] Fix the model-config/datasource merge --- lib/config-loader.js | 40 +++++++++------------------------------- test/compiler.test.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/lib/config-loader.js b/lib/config-loader.js index edf7cc7..1b34105 100644 --- a/lib/config-loader.js +++ b/lib/config-loader.js @@ -140,20 +140,16 @@ function mergeConfigurations(configObjects, mergeFn) { } function mergeDataSourceConfig(target, config, fileName) { - for (var ds in target) { - var err = mergeObjects(target[ds], config[ds]); - if (err) { - throw new Error('Cannot apply ' + fileName + ' to `' + ds + '`: ' + err); - } + var err = mergeObjects(target, config); + if (err) { + throw new Error('Cannot apply ' + fileName + ': ' + err); } } function mergeModelConfig(target, config, fileName) { - for (var mc in target) { - var err = mergeObjects(target[mc], config[mc]); - if (err) { - throw new Error('Cannot apply ' + fileName + ' to `' + mc + '`: ' + err); - } + var err = mergeObjects(target, config); + if (err) { + throw new Error('Cannot apply ' + fileName + ': ' + err); } } @@ -191,11 +187,9 @@ function mergePhaseConfig(target, config, phase) { } function mergeComponentConfig(target, config, fileName) { - for (var c in target) { - var err = mergeObjects(target[c], config[c]); - if (err) { - throw new Error('Cannot apply ' + fileName + ' to `' + c + '`: ' + err); - } + var err = mergeObjects(target, config); + if (err) { + throw new Error('Cannot apply ' + fileName + ': ' + err); } } @@ -259,19 +253,3 @@ function hasCompatibleType(origValue, newValue) { // we don't need to explicitly check array types return typeof newValue !== 'object'; } - -/** - * Try to read a config file with .json extension - * @param {string} cwd Dirname of the file - * @param {string} fileName Name of the file without extension - * @returns {Object|undefined} Content of the file, undefined if not found. - */ -function tryReadJsonConfig(cwd, fileName) { - try { - return require(path.join(cwd, fileName + '.json')); - } catch (e) { - if (e.code !== 'MODULE_NOT_FOUND') { - throw e; - } - } -} diff --git a/test/compiler.test.js b/test/compiler.test.js index 4d11d8b..787a811 100644 --- a/test/compiler.test.js +++ b/test/compiler.test.js @@ -417,6 +417,46 @@ describe('compiler', function() { expect(db.nested).to.eql(arrayValue); }); + it('allows env specific model-config json', function() { + appdir.createConfigFilesSync(); + appdir.writeConfigFileSync('model-config.local.json', { + foo: { dataSource: 'db' } + }); + + var instructions = boot.compile(appdir.PATH); + + expect(instructions.models).to.have.length(1); + expect(instructions.models[0]).to.have.property('name', 'foo'); + }); + + it('allows env specific model-config json to be merged', function() { + appdir.createConfigFilesSync(null, null, + {foo: {dataSource: 'mongo', public: false}}); + appdir.writeConfigFileSync('model-config.local.json', { + foo: {dataSource: 'db'} + }); + + var instructions = boot.compile(appdir.PATH); + + expect(instructions.models).to.have.length(1); + expect(instructions.models[0]).to.have.property('name', 'foo'); + expect(instructions.models[0].config).to.eql({ + dataSource: 'db', + public: false + }); + }); + + it('allows env specific model-config js', function() { + appdir.createConfigFilesSync(); + appdir.writeFileSync('model-config.local.js', + 'module.exports = { foo: { dataSource: \'db\' } };'); + + var instructions = boot.compile(appdir.PATH); + + expect(instructions.models).to.have.length(1); + expect(instructions.models[0]).to.have.property('name', 'foo'); + }); + it('refuses to merge Array properties of different length', function() { appdir.createConfigFilesSync({ nest: {