raptor-dev
Version:
Developer tools for RaptorJS
224 lines (190 loc) • 6.79 kB
JavaScript
;
var path = require('path');
var git = require('../lib/git');
var npm = require('../lib/npm');
var parallel = require('raptor-async/parallel');
var series = require('raptor-async/series');
var fs = require('fs');
var rimraf = require('rimraf');
function removeDir(absFilePath, logger, callback) {
var stat = fs.lstatSync(absFilePath);
function onRemove(err) {
if (err) {
logger.error('Unable to remove unused module: ' + absFilePath, err);
} else {
logger.info('Removed unused module: ' + absFilePath);
}
callback();
}
if (stat.isDirectory()) {
rimraf(absFilePath, onRemove);
} else if (stat.isSymbolicLink()) {
fs.unlink(absFilePath, onRemove);
} else {
// ignore
return callback();
}
}
function removeUnneeded(repos, reposDir, logger, callback) {
var createJob = function(repo, repoDir) {
return function(callback) {
fs.readFile(path.join(repoDir, 'package.json'), 'utf8', function(err, json) {
if (err) {
return callback();
}
var known = {};
var packageObj = JSON.parse(json);
var moduleName;
if (packageObj.dependencies) {
for (moduleName in packageObj.dependencies) {
known[moduleName] = true;
}
}
if (packageObj.devDependencies) {
for (moduleName in packageObj.devDependencies) {
known[moduleName] = true;
}
}
var node_modulesDir = path.join(repoDir, 'node_modules');
fs.readdir(node_modulesDir, function(err, files) {
if (err) {
return callback();
}
var work = [];
files.forEach(function(filePath) {
if (!known[filePath] && (filePath.charAt(0) !== '.')) {
work.push(function(callback) {
var absFilePath = path.join(node_modulesDir, filePath);
removeDir(absFilePath, logger, callback);
});
}
});
parallel(work, callback);
});
});
};
};
var work = [];
for (var i = 0; i < repos.length; i++) {
var repo = repos[i];
var repoDir = path.join(reposDir, repo.name);
work.push(createJob(repo, repoDir));
}
parallel(work, callback);
}
function runSetup(args, logger) {
var org = require('../lib/raptorjs-github-org');
logger.info('Repositories for ' + org + ' will be cloned to ' + args.dir);
// STEP 1: Find all of the RaptorJS repos on GitHub
require('../lib/github').fetchRepos(org, function(err, repos) {
if (err) {
logger.error('Error fetching GitHub repositories.', err);
process.exit(1);
return;
}
var dir = args.dir;
var i;
var repo;
logger.info('Found the following ' + org + ' repositories on GitHub:');
for (i = 0; i < repos.length; i++) {
repo = repos[i];
logger.info(repo.name);
}
logger.info('Cloning or updating raptorjs repositories to ' + dir + '...');
series([
function(callback) {
// update git repos
if (args['skip-git-update']) {
callback();
} else {
git.updateRepos(repos, args.dir, logger, function(err) {
if (err) {
logger.error('Error cloning one or more repos.');
} else {
logger.info('All raptorjs repositories cloned or updated successfully.');
}
callback(err);
});
}
},
function(callback) {
// remove unneeded modules from node_modules
removeUnneeded(repos, args.dir, logger, callback);
},
function(callback) {
// run npm link
if (args['skip-link']) {
callback();
} else {
// STEP 4: Use "npm link" to link all of the modules for development
npm.linkModules(repos, args.dir, logger, function(err) {
if (err) {
logger.error('Error linking modules.', err);
} else {
logger.info('All raptorjs modules linked successfully.');
}
callback(err);
});
}
}
], function(err) {
if (err) {
logger.error('Errors during setup.', err);
} else {
logger.success('Setup completed successfully.');
}
});
});
}
module.exports = {
usage: 'Usage: $0 $commandName [dir]',
options: {
'org': {
'description': 'GitHub organization',
'default': require('../lib/raptorjs-github-org')
},
'skip-link': {
'description': 'Disable/enable npm link of modules',
type: 'boolean',
default: false
},
'skip-git-update': {
'description': 'Skip updating git repos',
type: 'boolean',
default: false
}
},
validate: function(args, rapido) {
args.org = args.org || 'raptorjs';
args.dir = args._[0];
if (args.dir) {
args.dir = path.resolve(process.cwd(), args.dir);
} else {
args.dir = require('../lib/repos-dir');
}
return args;
},
run: function(args, config, rapido) {
var org = args.org;
var logger = rapido.log;
logger.info('GitHub organization: ' + org);
var prompt = rapido.prompt;
prompt.start();
prompt.get({
properties: {
dir: {
name: 'dir',
description: 'Enter location for ' + org + ' repositories',
default: args.dir
}
}
}, function(err, result) {
if (err) {
logger.error(err);
return;
}
args.dir = path.resolve(result.dir);
runSetup(args, rapido.log);
});
}
};