UNPKG

3.71 kBJavaScriptView Raw
1var 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
8module.exports.installDependencies = function (packagesPath, callback){
9
10 // Process all available package containers
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
27var atlasboardPackageJsonPath = path.join(__dirname, '../'); // in both test and production env will be located here.
28
29/**
30 * Search for packages in the current folder
31 */
32
33function checkPackagesFolder (packagesPath, cb){
34 fs.readdir(packagesPath, function(err, allPackagesDir){
35 if (err){ return cb(err); }
36
37 // convert to absolute path
38 allPackagesDir = allPackagesDir.map(function(partial_dir){
39 return path.join(packagesPath, partial_dir);});
40
41 // make sure we have package.json file
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 * Install from package folder
52 */
53function getValidPackageJSON (pathPackage, callback) {
54 readJson(pathPackage + '/package.json', callback);
55}
56
57/**
58 * Install from package folder
59 */
60function 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); // not atlasboard reference in engines node
79 }
80 });
81 });
82}
83
84/**
85 * Install from package folder
86 */
87function install (pathPackageJson, callback){
88 var currPath = process.cwd(); // save current path
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 //if (err){
96 // callback('Error installing dependencies for ' + pathPackageJson + '. err:' + err);
97 //} else {
98 // callback(code !== 0 ? 'error installing ' + pathPackageJson : null);
99 //}
100 });
101
102 process.chdir(currPath); //restore path
103}
104
105/**
106 * Executes a command in a childProcess
107 */
108
109function 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