Dedupe boot scripts

Remove duplicated entries in the array of boot scripts to run.
Because the bootDirs defaults to process.cwd(), if the user manually
includes scripts in the same directory, without specifying a bootDir,
those scripts will be included multiple times.
This commit is contained in:
Eric Satterwhite 2014-11-19 11:54:36 -06:00 committed by Miroslav Bajtoš
parent beb4f8c34c
commit 301031b78f
2 changed files with 17 additions and 0 deletions

View File

@ -6,6 +6,7 @@ var toposort = require('toposort');
var ConfigLoader = require('./config-loader');
var debug = require('debug')('loopback:boot:compiler');
var Module = require('module');
var _ = require('lodash');
/**
* Gather all bootstrap-related configuration data and compile it into
@ -61,6 +62,10 @@ module.exports = function compile(options) {
bootScripts = bootScripts.concat(findScripts(dir));
});
// de-dedup boot scripts -ERS
// https://github.com/strongloop/loopback-boot/issues/64
bootScripts = _.uniq(bootScripts);
var modelsMeta = modelsConfig._meta || {};
delete modelsConfig._meta;

View File

@ -405,6 +405,18 @@ describe('compiler', function() {
expect(instructions.files.boot).to.eql([initJs]);
});
it('should remove duplicate scripts', function() {
appdir.createConfigFilesSync();
var initJs = appdir.writeFileSync('custom-boot/init.js',
'module.exports = function(app) { app.fnCalled = true; };');
var instructions = boot.compile({
appRootDir: appdir.PATH,
bootDirs:[path.dirname(initJs)],
bootScripts: [initJs]
});
expect(instructions.files.boot).to.eql([initJs]);
});
it('ignores models/ subdirectory', function() {
appdir.createConfigFilesSync();
appdir.writeFileSync('models/my-model.js', '');