starter-kit
Version:
A quick command-line utility for NodeJS that helps quickly spin up new projects.
101 lines (81 loc) • 2.97 kB
JavaScript
;
const program = require('commander');
const remove = require('remove');
const colors = require('colors');
const spawn = require('child_process').spawn;
const kits = require('../kits');
function useCommand(kit, options) {
console.log('Fetching kit [%s]...'.green, kit);
if(kit == null) {
console.log('Kit not found.'.red);
return;
}
if(kits[kit] == null) {
return;
}
const repo = kits[kit];
const additionalPackagePromises = [];
const bowerPackages = [];
const npmPackages = [];
let clone = null;
const packageForEach = function packageForeach(packageName, type) {
var promise = new Promise(function promiseResolution(resolve) {
console.log('Installing %s'.blue, packageName);
var newPackage = spawn(type, [ 'install', packageName, '--save' ]);
newPackage.stdout.on('end', function newPackageEnd() {
resolve();
});
});
additionalPackagePromises.push(promise);
};
const npmPackageForEach = function npmPackageForEach(packageName) {
return packageForEach(packageName, 'npm');
};
const bowerPackageForEach = function bowerPackageForEach(packageName) {
return packageForEach(packageName, 'bower');
};
clone = spawn('git', [ 'clone', repo, process.cwd() ]);
// Break out the packages.
if(options.bower != null && options.bower !== 'undefined') {
bowerPackages = options.bower.split(',');
}
if(options.npm != null && options.npm !== 'undefined') {
npmPackages = options.npm.split(',');
}
// Clones the repo down.
clone.stdout.on('end', function success() {
console.log('Kit cloned! Removing .git folder...'.green);
// Removes the existing .git folder, which should give us a clean repo.
remove.removeSync(process.cwd() + '/.git');
console.log('.git folder removed! Working on bootstrapping the project...this could take a grip.'.green);
// Run ./bin/bootstrap.
let bootstrap = spawn('./bin/bootstrap');
bootstrap.stdout.on('data', function dataReceived(data) {
console.log(data.toString('utf-8', 0, data.length).gray);
});
// Additional packages.
// When it's all done, let us tell the user.
bootstrap.stdout.on('end', function dataFinished() {
console.log('Bootstrapping completed!'.green);
if(npmPackages.length !== 0) {
console.log('Beginning to add additional npm packages...'.green);
npmPackages.forEach(npmPackageForEach);
}
if(bowerPackages.length !== 0) {
console.log('Beginning to add additional bower packages...'.green);
bowerPackages.forEach(bowerPackageForEach);
}
Promise.all(additionalPackagePromises).then(function completeResolution() {
spawn('git', [ 'init' ]);
console.log('This project has been thoroughly startered. Enjoy!'.green);
});
});
});
}
program
.version('0.0.1')
.command('use [kit]')
.option('-b, --bower <bower_packages>', 'Packages to install using Bower')
.option('-n, --npm <npm_packages>', 'Packages to install using NPM')
.action(useCommand);
program.parse(process.argv);