waw-dev
Version:
[waw](https://webart.work) is the open-source web, mobile and desktop app development framework that makes it easy to build top quality web apps with web technologies.
389 lines (387 loc) • 12.4 kB
JavaScript
const fs = require('fs');
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
const isDirectory = source => fs.lstatSync(source).isDirectory();
const getDirectories = source => {
if (!fs.existsSync(source)) {
return [];
}
return fs.readdirSync(source).map(name => require('path').join(source, name)).filter(isDirectory);
}
const git_fetch = function(git, location, repo, branch='master', cb = ()=>{}){
let git_repo = git(location);
git_repo.init(function(){
git_repo.addRemote('origin', repo, function(err){
git_repo.fetch('--all', function(err){
git_repo.reset('origin/'+branch, cb);
});
});
});
}
/*
* Create new project
*/
const list = {
'1) Angular': 'https://github.com/WebArtWork/wawNgx.git',
'2) Template': 'https://github.com/WebArtWork/wawTemplate.git',
/*
'2) React New': 'https://github.com/WebArtWork/wawReact.git',
'3) Vue New': 'https://github.com/WebArtWork/wawVue.git',
'4) Angular CRM': 'https://github.com/WebArtWork/wawNgxCrm.git',
'5) React CRM': 'https://github.com/WebArtWork/wawReactCrm.git',
'6) Vue CRM': 'https://github.com/WebArtWork/wawVueCrm.git',
'7) Angular eCommerce': 'https://github.com/WebArtWork/wawNgxeCommerce.git',
'8) React eCommerce': 'https://github.com/WebArtWork/wawReacteCommerce.git',
'9) Vue eCommerce': 'https://github.com/WebArtWork/wawVueeCommerce.git',
'10) Angular Social Network': 'https://github.com/WebArtWork/wawNgxSocial.git',
'11) React Social Network': 'https://github.com/WebArtWork/wawReactSocial.git',
'12) Vue Social Network': 'https://github.com/WebArtWork/wawVueSocial.git',
'13) Angular Profile': 'https://github.com/WebArtWork/wawNgxProfile.git',
'13) React Profile': 'https://github.com/WebArtWork/wawReactProfile.git',
'14) Vue Profile': 'https://github.com/WebArtWork/wawVueProfile.git'
*/
};
const new_project = function(params) {
if(!params.new_project) params.new_project={};
if(!params.new_project.name){
if(params.argv.length){
if (fs.existsSync(process.cwd()+'/'+params.argv[0])) {
console.log('This project already exists in current directory');
process.exit(0);
}else{
params.new_project.name = params.argv[0];
}
}else{
return readline.question('Provide name for the project you want to create: ', function(answer){
if(answer){
if (fs.existsSync(process.cwd()+'/'+answer)) {
console.log('This project already exists in current directory');
}else{
params.new_project.name = answer;
}
}else{
console.log('Please type your project name');
}
new_project(params);
});
}
}
if(!params.new_project.repo){
if(params.argv.length>1){
params.new_project.repo = params.argv[1];
}else{
let text = 'Which project you want to start with?', counter=0, repos={};
for(let key in list){
repos[++counter] = list[key];
text += '\n'+key;
}
text += '\nChoose number: ';
return readline.question(text, function(answer){
if(!answer||!repos[parseInt(answer)]) return new_project();
params.new_project.repo = repos[parseInt(answer)];
new_project(params);
});
}
}
let folder = process.cwd()+'/'+params.new_project.name;
fs.mkdirSync(folder, { recursive: true });
let repo = params.git(folder);
repo.init(function(){
repo.addRemote('origin', params.new_project.repo, function(err){
repo.fetch('--all', function(err){
let branch = 'master';
if(params.argv.length>2){
branch = params.argv[2];
}
repo.reset('origin/'+branch, err=>{
console.log('Your project has been generated successfully');
process.exit(1);
});
});
});
});
};
module.exports.new = new_project;
module.exports.n = new_project;
/*
* Create new part
*/
const new_part = function(params) {
if (!fs.existsSync(process.cwd()+'/config.json')) {
console.log('You are located not in waw project');
process.exit(0);
}
if(!params.new_part) params.new_part={};
if(!params.new_part.name){
if(params.argv.length){
if (fs.existsSync(process.cwd()+'/server/'+params.argv[0].toLowerCase())) {
console.log('This part already exists in current project');
process.exit(0);
}else{
params.new_part.name = params.argv[0];
}
}else{
return readline.question('Provide name for the part you want to create: ', function(answer){
if(answer){
if (fs.existsSync(process.cwd()+'/'+answer.toLowerCase())) {
console.log('This part already exists in current project');
}else{
params.new_part.name = answer;
}
}else{
console.log('Please type your project name');
}
new_part(params);
});
}
}
let folder = process.cwd()+'/server/'+params.new_project.name;
if(params.argv.length > 1){
fs.mkdirSync(folder, { recursive: true });
let repo = params.git(folder);
repo.init(function(){
repo.addRemote('origin', params.argv[1], function(err){
repo.fetch('--all', function(err){
let branch = 'master';
if(params.argv.length>2){
branch = params.argv[2];
}
repo.reset('origin/'+branch, err=>{
console.log('Part has been created');
process.exit(1);
});
});
});
});
}else{
fs.mkdirSync(folder, { recursive: true });
fs.writeFileSync(folder+'/index.js', `module.exports = function(waw) {\n\t// add your router code\n};`, 'utf8');
let data = `{\n\t"name": "CNAME",\n\t"router": "index.js",\n\t"dependencies": {}\n}`;
data = data.split('CNAME').join(params.new_part.name.toString().charAt(0).toUpperCase() + params.new_part.name.toString().substr(1).toLowerCase());
data = data.split('NAME').join(params.new_part.name.toLowerCase());
fs.writeFileSync(folder+'/part.json', data, 'utf8');
console.log('Part has been created');
process.exit(1);
}
};
module.exports.add = new_part;
module.exports.a = new_part;
/*
* Version Management
*/
const version = function(params){
let logs = '';
if (fs.existsSync(params.waw_root+'/package.json')) {
try{
let config = JSON.parse(fs.readFileSync(params.waw_root+'/package.json'));
if(config.version){
logs = 'waw: ' + config.version;
}else{
console.log('Missing files, try to reinstall waw framework.');
process.exit(1);
}
}catch(err){
console.log('Missing files, try to reinstall waw framework.');
process.exit(1);
}
}
if(params.parts.length){
logs += '\nAccesible Parts: ';
for (var i = 0; i < params.parts.length; i++) {
if(i){
logs += ', '+params.parts[i];
}else{
logs += params.parts[i];
}
}
}
console.log(logs);
process.exit(1);
}
module.exports['--version'] = version;
module.exports['-v'] = version;
module.exports.version = version;
module.exports.v = version;
/*
* Git Management
*/
const generate = function(params){
if(!params.argv.length){
console.log('Please provide part name');
process.exit(1);
}
let name = params.argv.shift();
if(params._parts[name.toLowerCase()]){
console.log('This part already exists.');
process.exit(1);
}
const global_part = params.origin_argv[1].toLowerCase() == 'global' || params.origin_argv[1].toLowerCase() == 'pg';
if(global_part && !params.argv.length){
console.log('To install global part you has to provide repo link.');
process.exit(1);
}
let repo_link;
if(params.argv.length){
repo_link = params.argv.shift();
}
let folder = (global_part&¶ms.waw_root||process.cwd())+'/server/'+name;
fs.mkdirSync(folder, { recursive: true });
if(repo_link){
let repo = params.git(folder);
repo.init(function(){
repo.addRemote('origin', repo_link, function(err){
repo.fetch('--all', function(err){
let branch = 'master';
if(params.argv.length){
branch = params.argv.shift();
}
repo.reset('origin/'+branch, err=>{
console.log('Part has been created');
process.exit(1);
});
});
});
});
}else{
fs.writeFileSync(folder+'/index.js', `module.exports = function(waw) {\n\t// add your router code\n};`, 'utf8');
let data = `{\n\t"name": "CNAME",\n\t"router": "index.js",\n\t"dependencies": {}\n}`;
data = data.split('CNAME').join(name.toString().charAt(0).toUpperCase() + name.toString().substr(1).toLowerCase());
data = data.split('NAME').join(name.toLowerCase());
fs.writeFileSync(folder+'/part.json', data, 'utf8');
console.log('Part has been created');
process.exit(1);
}
}
const parts_renew = function(params){
let parts = getDirectories(params.waw_root+'/server');
let counter = 0;
for (var i = 0; i < parts.length; i++) {
if (fs.existsSync(parts[i]+'/part.json')) {
let config = JSON.parse(fs.readFileSync(parts[i]+'/part.json'));
if(config.git && config.git.repo){
counter++;
git_fetch(params.git, parts[i], config.git.repo, config.git.branch||'master', ()=>{
if(--counter === 0){
console.log('All global parts has been updated');
process.exit(1);
}
});
}
}
}
if(!counter){
console.log('All global parts has been updated');
process.exit(1);
}
}
const part = function(params){
if(!params.argv.length){
console.log('Please provide git command');
process.exit(1);
}
let command = params.argv.shift().toLowerCase();
if(command == 'new' || command == 'global'){
return generate(params);
}
if(!params.argv.length){
console.log('Please provide part name');
process.exit(1);
}
let part = params.argv.shift();
if(!params._parts[part]){
console.log("There is no such part");
process.exit(1);
}
if(!params._parts[part].git || !params._parts[part].git.repo){
console.log("Part don't have git config");
process.exit(1);
}
switch(command){
case 'renew':
return parts_renew(params);
case 'fetch':
let repo = params.git(params._parts[part].__root);
repo.init(function(){
repo.addRemote('origin', params._parts[part].git.repo, function(err){
repo.fetch('--all', function(err){
repo.reset('origin/'+(params._parts[part].git.branch||'master'), ()=>{
console.log('Part has been fetched');
process.exit(1);
});
});
});
});
return false;
default:
console.log('Please provide correct git command. Type `waw part help`');
process.exit(1);
}
}
module.exports.part = part;
module.exports.pr = parts_renew;
module.exports.pn = generate;
module.exports.pg = generate;
/*
* PM2 management
*/
let pm2;
const install_pm2 = function(params, callback){
if(pm2) return callback();
if (!fs.existsSync(params.waw_root+'/node_modules/pm2')) {
return params.npmi({
name: 'pm2',
version: 'latest',
path: params.waw_root,
forceInstall: true,
npmLoad: {
loglevel: 'silent'
}
}, function(){
start(params);
});
}
if(!pm2) pm2 = require(params.waw_root+'/node_modules/pm2');
pm2.connect(function(err) {
if (err) {
console.error(err);
process.exit(2);
}
if(!params.config.pm2) params.config.pm2={};
callback();
});
}
const start = function(params){
install_pm2(params, function(){
pm2.start({
name: params.config.name||process.cwd(),
script: params.waw_root+'/app.js',
exec_mode: params.config.pm2.exec_mode||'fork', //default fork
instances: params.config.pm2.instances||1,
max_memory_restart: params.config.pm2.memory||'800M'
}, function(err, apps) {
pm2.disconnect();
process.exit(2);
});
});
}
module.exports.start = start;
const stop = function(params){
install_pm2(params, function(){
pm2.delete(params.config.name||process.cwd(), function(err, apps) {
pm2.disconnect();
process.exit(2);
});
});
}
module.exports.stop = stop;
const restart = function(params){
install_pm2(params, function(){
pm2.restart(params.config.name||process.cwd());
});
}
module.exports.restart = restart;
/*
* End of Core Runners
*/