Allow middleware array merge by a key in item objects
This commit is contained in:
parent
be3997de15
commit
b081d828b2
|
@ -1,6 +1,7 @@
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var debug = require('debug')('loopback:boot:config-loader');
|
var debug = require('debug')('loopback:boot:config-loader');
|
||||||
|
var assert = require('assert');
|
||||||
|
|
||||||
var ConfigLoader = exports;
|
var ConfigLoader = exports;
|
||||||
|
|
||||||
|
@ -173,36 +174,59 @@ function mergeMiddlewareConfig(target, config, fileName) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mergeNamedItems(arr1, arr2, key) {
|
||||||
|
assert(Array.isArray(arr1), 'invalid array: ' + arr1);
|
||||||
|
assert(Array.isArray(arr2), 'invalid array: ' + arr2);
|
||||||
|
key = key || 'name';
|
||||||
|
var result = [].concat(arr1);
|
||||||
|
for (var i = 0, n = arr2.length; i < n; i++) {
|
||||||
|
var item = arr2[i];
|
||||||
|
var found = false;
|
||||||
|
if (item[key]) {
|
||||||
|
for (var j = 0, k = result.length; j < k; j++) {
|
||||||
|
if (result[j][key] === item[key]) {
|
||||||
|
mergeObjects(result[j], item);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
result.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
function mergePhaseConfig(target, config, phase) {
|
function mergePhaseConfig(target, config, phase) {
|
||||||
var err;
|
var err;
|
||||||
for (var middleware in config) {
|
for (var mw in config) {
|
||||||
if (middleware in target) {
|
if (mw in target) {
|
||||||
var targetMiddleware = target[middleware];
|
var targetMiddleware = target[mw];
|
||||||
var configMiddleware = config[middleware];
|
var configMiddleware = config[mw];
|
||||||
if (Array.isArray(targetMiddleware) && Array.isArray(configMiddleware)) {
|
if (Array.isArray(targetMiddleware) && Array.isArray(configMiddleware)) {
|
||||||
// Both are arrays, combine them
|
// Both are arrays, combine them
|
||||||
target[middleware] = targetMiddleware.concat(configMiddleware);
|
target[mw] = mergeNamedItems(targetMiddleware, configMiddleware);
|
||||||
} else if (Array.isArray(targetMiddleware)) {
|
} else if (Array.isArray(targetMiddleware)) {
|
||||||
if (typeof configMiddleware === 'object' &&
|
if (typeof configMiddleware === 'object' &&
|
||||||
Object.keys(configMiddleware).length) {
|
Object.keys(configMiddleware).length) {
|
||||||
// Config side is an non-empty object
|
// Config side is an non-empty object
|
||||||
targetMiddleware.push(configMiddleware);
|
target[mw] = mergeNamedItems(targetMiddleware, [configMiddleware]);
|
||||||
}
|
}
|
||||||
} else if (Array.isArray(configMiddleware)) {
|
} else if (Array.isArray(configMiddleware)) {
|
||||||
if (typeof targetMiddleware === 'object' &&
|
if (typeof targetMiddleware === 'object' &&
|
||||||
Object.keys(targetMiddleware).length) {
|
Object.keys(targetMiddleware).length) {
|
||||||
// Target side is an non-empty object
|
// Target side is an non-empty object
|
||||||
targetMiddleware = target[middleware] =
|
target[mw] = mergeNamedItems([targetMiddleware], configMiddleware);
|
||||||
[targetMiddleware].concat(configMiddleware);
|
|
||||||
} else {
|
} else {
|
||||||
// Target side is empty
|
// Target side is empty
|
||||||
target[middleware] = configMiddleware;
|
target[mw] = configMiddleware;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = mergeObjects(targetMiddleware, configMiddleware);
|
err = mergeObjects(targetMiddleware, configMiddleware);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = 'The middleware "' + middleware + '" in phase "' + phase + '"' +
|
err = 'The middleware "' + mw + '" in phase "' + phase + '"' +
|
||||||
'is not defined in the main config.';
|
'is not defined in the main config.';
|
||||||
}
|
}
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
|
|
|
@ -1850,6 +1850,59 @@ describe('compiler', function() {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('merges config.params array to array by name', function() {
|
||||||
|
appdir.writeConfigFileSync('./middleware.json', {
|
||||||
|
routes: {
|
||||||
|
'./middleware': [{
|
||||||
|
name: 'a',
|
||||||
|
params: {
|
||||||
|
key: 'initial value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
appdir.writeConfigFileSync('./middleware.local.json', {
|
||||||
|
routes: {
|
||||||
|
'./middleware': [{
|
||||||
|
name: 'a',
|
||||||
|
params: {
|
||||||
|
key: 'custom value'
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
params: {
|
||||||
|
key: '2nd value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var instructions = boot.compile(appdir.PATH);
|
||||||
|
|
||||||
|
expect(instructions.middleware.middleware)
|
||||||
|
.to.eql([
|
||||||
|
{
|
||||||
|
sourceFile: path.resolve(appdir.PATH, 'middleware'),
|
||||||
|
config: {
|
||||||
|
name: 'a',
|
||||||
|
phase: 'routes',
|
||||||
|
params: {
|
||||||
|
key: 'custom value'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourceFile: path.resolve(appdir.PATH, 'middleware'),
|
||||||
|
config: {
|
||||||
|
phase: 'routes',
|
||||||
|
params: {
|
||||||
|
key: '2nd value'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it('flattens sub-phases', function() {
|
it('flattens sub-phases', function() {
|
||||||
appdir.writeConfigFileSync('middleware.json', {
|
appdir.writeConfigFileSync('middleware.json', {
|
||||||
'initial:after': {
|
'initial:after': {
|
||||||
|
|
Loading…
Reference in New Issue