nt-arcane
Version:
App creator for arcane framework.
136 lines (124 loc) • 2.83 kB
JavaScript
var commandLineArgs = require('command-line-args');
var inquirer = require('inquirer');
var path = require('path');
var unzip = require('unzip2');
var fs = require('fs');
var npm = require('npm');
var cli = commandLineArgs([
{name: 'create', alias: 'c', type: String},
{name: 'src', type: String, defaultOption: true}
]);
var options = cli.parse();
var directory_exists = function(path) {
try {
stats = fs.lstatSync(path);
if (stats.isDirectory()) {
return true;
}
} catch (e) {
return false;
}
};
var create_directory = function(path) {
if(!directory_exists(path)) {
fs.mkdirSync(path);
}
};
var project_location = process.cwd();
if(options.src) {
project_location = path.resolve(options.src.replace(/\/$/g, ''));
}
var default_name = options.src.split('/').slice(-1)[0];
if(options.create) {
create_project(options);
} else {
inquirer.prompt([
{
type: 'list',
name: 'create',
message: 'Select Project type',
choices: [
'Angular',
'API',
'Basic Web',
// new inquirer.Separator(),
// 'Custom'
]
}
], create_project);
}
function create_project(answers) {
var target_app = null;
switch(answers.create.toLowerCase()) {
case 'angular':
target_app = __dirname + '/../files/applications/angular.web.app';
break;
case 'api':
target_app = __dirname + '/../files/applications/api.web.app';
break;
case 'basic web':
target_app = __dirname + '/../files/applications/basic.web.app';
break;
case 'custom':
break;
default:
console.log('Invalid project type.');
}
if(target_app) {
create_project_information(project_location, function(package) {
create_directory(project_location);
var unzipExtractor = unzip.Extract({ path: project_location });
var fscrs = fs.createReadStream(target_app);
fscrs.pipe(unzipExtractor);
unzipExtractor.on('close', update_package(package));
});
}
}
function create_project_information(path, cb) {
inquirer.prompt([
{
type: 'input',
name: 'name',
message: 'Project Name',
default: default_name
},
{
type: 'input',
name: 'description',
message: 'Description'
},
{
type: 'input',
name: 'version',
message: 'Version',
default: '1.0.0'
},
{
type: 'input',
name: 'author',
message: 'Author'
},
], cb);
}
function update_package(package) {
return function() {
var json_path = project_location + '/package.json';
var json = require(json_path);
for(var i in json) {
if(!package[i]) {
package[i] = json[i];
}
}
fs.writeFileSync(json_path, JSON.stringify(package, null, 4));
process.chdir(project_location);
npm.load(package, function(er) {
if (er) throw er;
npm.commands.install(function (er, data) {
// console.log(data);
});
npm.on('log', function(message) {
console.log(message);
});
});
}
}