1 | var async = require('async'),
|
2 | fs = require('fs'),
|
3 | path = require('path'),
|
4 | _ = require ('underscore'),
|
5 | readJson = require('read-package-json'),
|
6 | semver = require('semver');
|
7 |
|
8 | module.exports.installDependencies = function (packagesPath, callback){
|
9 |
|
10 |
|
11 | async.map (packagesPath.filter(fs.existsSync), checkPackagesFolder, function(err, results){
|
12 | if (err){ return callback(err); }
|
13 | var paths = _.flatten(results);
|
14 |
|
15 | async.eachSeries(paths, checkValidIfAtlasboardVersionForPackage, function (err){
|
16 | if (err){
|
17 | return callback(err);
|
18 | }
|
19 |
|
20 | async.eachSeries(paths, install, function (err){
|
21 | callback(err);
|
22 | });
|
23 | });
|
24 | });
|
25 | };
|
26 |
|
27 | var atlasboardPackageJsonPath = path.join(__dirname, '../');
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | function checkPackagesFolder (packagesPath, cb){
|
34 | fs.readdir(packagesPath, function(err, allPackagesDir){
|
35 | if (err){ return cb(err); }
|
36 |
|
37 |
|
38 | allPackagesDir = allPackagesDir.map(function(partial_dir){
|
39 | return path.join(packagesPath, partial_dir);});
|
40 |
|
41 |
|
42 | allPackagesDir = allPackagesDir.filter(function(dir){
|
43 | return fs.statSync(dir).isDirectory() && fs.existsSync(dir + '/package.json');
|
44 | });
|
45 |
|
46 | cb(null, allPackagesDir);
|
47 | });
|
48 | }
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | function getValidPackageJSON (pathPackage, callback) {
|
54 | readJson(pathPackage + '/package.json', callback);
|
55 | }
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | function checkValidIfAtlasboardVersionForPackage (pathPackage, callback){
|
61 | getValidPackageJSON(pathPackage, function(err, packageJson){
|
62 | if (err){
|
63 | return callback(err);
|
64 | }
|
65 |
|
66 | getValidPackageJSON(atlasboardPackageJsonPath, function(err, atlasboardPackageJson){
|
67 | if (err) { return callback('package.json not found for atlasboard at ' + atlasboardPackageJsonPath); }
|
68 |
|
69 | if (packageJson.engines && packageJson.engines.atlasboard){
|
70 | var ok = semver.satisfies(atlasboardPackageJson.version, packageJson.engines.atlasboard);
|
71 | var msg = 'Atlasboard version does not satisfy package dependencies at ' +
|
72 | pathPackage + '. Please consider updating your version of atlasboard. Version required: '+
|
73 | packageJson.engines.atlasboard + '. Atlasboard version: ' + atlasboardPackageJson.version;
|
74 |
|
75 | callback(ok ? null : msg);
|
76 | }
|
77 | else {
|
78 | callback(null);
|
79 | }
|
80 | });
|
81 | });
|
82 | }
|
83 |
|
84 |
|
85 |
|
86 |
|
87 | function install (pathPackageJson, callback){
|
88 | var currPath = process.cwd();
|
89 | process.chdir(pathPackageJson);
|
90 |
|
91 | console.log ('\nChecking npm dependencies for ' + pathPackageJson + '...');
|
92 | executeCommand('npm', ["install", "--production", pathPackageJson], function(err, code){
|
93 | console.log(err);
|
94 | callback(null);
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 | });
|
101 |
|
102 | process.chdir(currPath);
|
103 | }
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 | function executeCommand(cmd, args, callback) {
|
110 | var childProcess = require('child_process');
|
111 | var child = childProcess.spawn(cmd, args, {stdio: 'inherit'});
|
112 | child.on('error', function (err) {
|
113 | callback(err);
|
114 | });
|
115 | child.on('exit', function (code) {
|
116 | callback(null, code);
|
117 | });
|
118 | } |
\ | No newline at end of file |