UNPKG

2.42 kBJavaScriptView Raw
1const Server = require('karma').Server;
2const closure = require('closure-util');
3const path = require('path');
4const processCliArgs = require('karma/lib/cli').process;
5
6function insertDependencies(manager, files, previousLookup) {
7 previousLookup = previousLookup || {};
8 let firstIndex = NaN;
9 const original = files.filter((obj, index) => {
10 if (previousLookup[obj.pattern]) {
11 if (isNaN(firstIndex)) {
12 firstIndex = index;
13 }
14 return false;
15 } else {
16 return true;
17 }
18 });
19 if (isNaN(firstIndex)) {
20 firstIndex = 0;
21 }
22 const lookup = {};
23 const dependencies = manager.getDependencies().map(script => {
24 lookup[script.path] = true;
25 return {
26 pattern: script.path,
27 included: true,
28 served: true,
29 watched: false
30 };
31 });
32 original.splice.apply(original, [firstIndex, 0].concat(dependencies));
33 files.length = 0;
34 files.push.apply(files, original);
35
36 return lookup;
37}
38
39/**
40 * Start Karma. This prepends the Karma `files` config with all library files
41 * sorted in dependency order.
42 * @param {Object} config Karma options.
43 * @param {Manager} manager The dependency file manager.
44 * @param {function(Error)} callback Called with any error.
45 */
46function serve(config, manager, callback) {
47 function exit(code) {
48 let error = null;
49 if (code) {
50 error = new Error(`Karma exited with ${code}`);
51 error.code = code;
52 }
53 callback(error);
54 }
55 const server = new Server(config, exit);
56
57 const files = server.get('config.files');
58
59 let lookup = insertDependencies(manager, files);
60
61 // stop goog base.js from trying to load deps.js
62 files.unshift({
63 pattern: path.resolve(__dirname, '../test/no-deps.js'),
64 included: true,
65 served: true,
66 watched: false
67 });
68
69 manager.on('update', () => {
70 lookup = insertDependencies(manager, files, lookup);
71 server.refreshFiles();
72 });
73
74 server.start();
75}
76
77function main(config, callback) {
78 const manager = new closure.Manager({
79 lib: [
80 'src/**/*.js',
81 'build/ol.ext/*.js'
82 ]
83 });
84
85 manager.on('error', callback);
86
87 manager.on('ready', () => {
88 serve(config, manager, callback);
89 });
90}
91
92if (require.main === module) {
93 const config = processCliArgs();
94 main(config, (err, manager) => {
95 if (err) {
96 process.stderr.write(err.message, () => process.exit(1));
97 return;
98 } else {
99 process.exit(0);
100 }
101 });
102}