103 lines
2.4 KiB
JavaScript
103 lines
2.4 KiB
JavaScript
const Server = require('karma').Server;
|
|
const closure = require('closure-util');
|
|
const path = require('path');
|
|
const processCliArgs = require('karma/lib/cli').process;
|
|
|
|
function insertDependencies(manager, files, previousLookup) {
|
|
previousLookup = previousLookup || {};
|
|
let firstIndex = NaN;
|
|
const original = files.filter((obj, index) => {
|
|
if (previousLookup[obj.pattern]) {
|
|
if (isNaN(firstIndex)) {
|
|
firstIndex = index;
|
|
}
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
});
|
|
if (isNaN(firstIndex)) {
|
|
firstIndex = 0;
|
|
}
|
|
const lookup = {};
|
|
const dependencies = manager.getDependencies().map(script => {
|
|
lookup[script.path] = true;
|
|
return {
|
|
pattern: script.path,
|
|
included: true,
|
|
served: true,
|
|
watched: false
|
|
};
|
|
});
|
|
original.splice.apply(original, [firstIndex, 0].concat(dependencies));
|
|
files.length = 0;
|
|
files.push.apply(files, original);
|
|
|
|
return lookup;
|
|
}
|
|
|
|
/**
|
|
* Start Karma. This prepends the Karma `files` config with all library files
|
|
* sorted in dependency order.
|
|
* @param {Object} config Karma options.
|
|
* @param {Manager} manager The dependency file manager.
|
|
* @param {function(Error)} callback Called with any error.
|
|
*/
|
|
function serve(config, manager, callback) {
|
|
function exit(code) {
|
|
let error = null;
|
|
if (code) {
|
|
error = new Error(`Karma exited with ${code}`);
|
|
error.code = code;
|
|
}
|
|
callback(error);
|
|
}
|
|
const server = new Server(config, exit);
|
|
|
|
const files = server.get('config.files');
|
|
|
|
let lookup = insertDependencies(manager, files);
|
|
|
|
// stop goog base.js from trying to load deps.js
|
|
files.unshift({
|
|
pattern: path.resolve(__dirname, '../test/no-deps.js'),
|
|
included: true,
|
|
served: true,
|
|
watched: false
|
|
});
|
|
|
|
manager.on('update', () => {
|
|
lookup = insertDependencies(manager, files, lookup);
|
|
server.refreshFiles();
|
|
});
|
|
|
|
server.start();
|
|
}
|
|
|
|
function main(config, callback) {
|
|
const manager = new closure.Manager({
|
|
lib: [
|
|
'src/**/*.js',
|
|
'build/ol.ext/*.js'
|
|
]
|
|
});
|
|
|
|
manager.on('error', callback);
|
|
|
|
manager.on('ready', () => {
|
|
serve(config, manager, callback);
|
|
});
|
|
}
|
|
|
|
if (require.main === module) {
|
|
const config = processCliArgs();
|
|
main(config, (err, manager) => {
|
|
if (err) {
|
|
process.stderr.write(err.message, () => process.exit(1));
|
|
return;
|
|
} else {
|
|
process.exit(0);
|
|
}
|
|
});
|
|
}
|