-
Notifications
You must be signed in to change notification settings - Fork 809
/
Dependencies.js
98 lines (85 loc) · 2.53 KB
/
Dependencies.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
let childProcess = require('child_process');
let Log = require('./Log');
let argv = require('yargs').argv;
let collect = require('collect.js');
class Dependencies {
/**
* Create a new Dependencies instance.
*
* @param {Object} dependencies
*/
constructor(dependencies) {
this.dependencies = dependencies;
}
/**
* Install all dependencies that aren't available.
*
* @param {Boolean} abortOnComplete
*/
install(abortOnComplete = false) {
collect(this.dependencies)
.reject(dependency => {
try {
return require.resolve(
dependency.replace(/(?!^@)@.+$/, '')
);
} catch (e) {}
})
.pipe(dependencies => {
if (!dependencies.count()) {
return;
}
this.execute(
this.buildInstallCommand(dependencies.all()),
dependencies.all(),
abortOnComplete
);
});
}
/**
* Execute the provided console command.
*
* @param {string} command
* @param {Boolean} abortOnComplete
*/
execute(command, dependencies, abortOnComplete) {
Log.feedback(
'Additional dependencies must be installed. This will only take a moment.'
);
Log.feedback(`Running: ${command}`);
childProcess.execSync(command);
Log.feedback(
'Okay, done. The following packages have been installed and saved to your package.json dependencies list:'
);
dependencies.forEach(d => Log.feedback('- ' + d));
this.respond(abortOnComplete);
}
/**
* Build the dependency install command.
*
* @param {Object} dependencies
* @param {Boolean} forceNpm
*/
buildInstallCommand(dependencies) {
dependencies = [].concat(dependencies).join(' ');
return `npm install ${dependencies} --save-dev --production=false`;
}
/**
* Complete the install process.
*
* @param {Boolean} abortOnComplete
*/
respond(abortOnComplete) {
if (abortOnComplete) {
Log.feedback(
typeof abortOnComplete === 'string'
? abortOnComplete
: 'Finished. Please run Mix again.'
);
if (!argv['$0'].includes('ava')) {
process.exit();
}
}
}
}
module.exports = Dependencies;