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.
250 lines • 7.43 kB
JavaScript
/*
* Supportive
*/
const fs = require('fs');
const path = require('path');
const git = require('gitty');
const npmi = require('npmi');
const nodemon = require('nodemon');
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 fetch = (folder, repo, cb, branch='master')=>{
fs.mkdirSync(folder, { recursive: true });
folder = git(folder);
folder.init(function(){
folder.addRemote('origin', repo, function(err){
folder.fetch('--all', function(err){
folder.reset('origin/'+branch, cb);
});
});
});
};
const parallel = function(arr, callback){
let counter = arr.length;
if(counter===0) return callback();
for (let i = 0; i < arr.length; i++) {
arr[i](function(){
if(--counter===0) callback();
});
}
}
/*
* Variables
*/
let waw_project = false;
const core_parts = {
core: 'https://github.com/WebArtWork/core.git'
};
const orgs = {
waw: 'https://github.com/WebArtWork/NAME.git'
}
if (fs.existsSync(process.cwd()+'/angular.json')) {
core_parts.angular = 'git@github.com:WebArtWork/angular.git';
}
if (fs.existsSync(process.cwd()+'/template.json')) {
waw_project = true;
core_parts.template = 'git@github.com:WebArtWork/template.git';
core_parts.sem = 'git@github.com:WebArtWork/sem.git';
}
const parts = getDirectories(process.cwd()+'/server');
const _parts = {};
/*
* Read Project Config
*/
fs.mkdirSync(__dirname+'/server', { recursive: true });
let config = {};
if (fs.existsSync(process.cwd()+'/config.json')) {
waw_project = true;
config = JSON.parse(fs.readFileSync(process.cwd()+'/config.json'));
fs.mkdirSync(process.cwd()+'/server', { recursive: true });
}
if (fs.existsSync(process.cwd()+'/server.json')) {
let serverConfig = JSON.parse(fs.readFileSync(process.cwd()+'/server.json'));
for(let each in serverConfig){
config[each] = serverConfig[each];
}
}
/*
* Execute runners
*/
const execute_runners = function(){
const argv = process.argv.slice();
argv.shift();
argv.shift();
let command;
/*
* Start Runners
*/
if(argv.length){
let origin_argv = argv.slice();
command = argv.shift();
let done = false;
for (var i = 0; i < parts.length; i++) {
if(_parts[parts[i]].runner){
let runners = require(_parts[parts[i]].__root+'/'+_parts[parts[i]].runner);
if(typeof runners == 'object' && !Array.isArray(runners)){
for(let each in runners){
if(each.toLowerCase() == command.toLowerCase()){
let continue_process = runners[each]({
getDirectories: getDirectories,
origin_argv: origin_argv,
argv: argv,
git: git,
npmi: npmi,
nodemon: nodemon,
parts: parts,
_parts: _parts,
config: config,
part_config: _parts[parts[i]],
project_root: process.cwd(),
part_root: _parts[parts[i]].__root,
waw_root: __dirname
});
if(continue_process !== true) return;
done = true;
break;
}
}
if(done) break;
}
}
}
}
/*
* Frameworks Runners
*/
if(command && command.toLowerCase()=='wipe'){
fs.rmdirSync(__dirname+'/server', { recursive: true });
process.exit(1);
}
if(command && command.toLowerCase()=='renew'){
let framework = git(__dirname);
return framework.init(function(){
framework.addRemote('origin', 'https://github.com/WebArtWork/waw.git', function(err){
framework.fetch('--all', function(err){
framework.reset('origin/dev', function(){
fs.rmdirSync(__dirname+'/server', { recursive: true });
console.log('Framework has been updated');
process.exit(1);
});
});
});
});
}
/*
* End of runners
*/
if(!waw_project){
console.log('This is not waw project or runner was not executed.');
process.exit(0);
}
// remove nodemon from package.json and install it if it's not installed
nodemon({
script: __dirname+'/app.js',
watch: [process.cwd()+'/server', __dirname+'/server', __dirname+'/pages', __dirname+'/config.json', __dirname+'/template.json', __dirname+'/app.js'],
ext: 'js json'
});
nodemon.on('start', function () {
console.log(' ===== App has started ===== ');
}).on('restart', function (files) {
console.log(' ===== App restarted ===== ');
});
}
/*
* Read Project Parts
*/
const read_project_parts = function(){
for (let i = parts.length-1; i >= 0; i--) {
parts[i] = parts[i].split(path.sep).pop();
if (fs.existsSync(process.cwd()+'/server/'+parts[i]+'/part.json')) {
try{
_parts[parts[i]] = JSON.parse(fs.readFileSync(process.cwd()+'/server/'+parts[i]+'/part.json'));
}catch(err){
console.log('Review your part.json at '+parts[i]+' part.');
process.exit(0);
}
_parts[parts[i]].__root = process.cwd()+'/server/'+parts[i];
}else{
parts.splice(i, 1);
}
}
for(let each in config.parts){
if (fs.existsSync(__dirname+'/server/'+each) && fs.existsSync(__dirname+'/server/'+each+'/part.json')) {
parts.unshift(each);
_parts[each] = JSON.parse(fs.readFileSync(__dirname+'/server/'+each+'/part.json'));
_parts[each].__root = __dirname+'/server/'+each;
}
}
if(!parts.length){
for(let each in core_parts){
if (fs.existsSync(__dirname+'/server/'+each+'/part.json')) {
parts.unshift(each);
_parts[each] = JSON.parse(fs.readFileSync(__dirname+'/server/'+each+'/part.json'));
_parts[each].__root = __dirname+'/server/'+each;
}
}
}
let installs = [];
const add_install = function(name, version, path){
installs.push(function(next){
npmi({
name: name,
version: version,
path: path,
forceInstall: true,
npmLoad: {
loglevel: 'silent'
}
}, next);
});
}
for (var i = 0; i < parts.length; i++) {
for(let each in _parts[parts[i]].dependencies){
if (fs.existsSync(_parts[parts[i]].__root+'/node_modules/'+each)) {
continue;
}
add_install(each, _parts[parts[i]].dependencies[each], _parts[parts[i]].__root);
}
}
for(let each in config.dependencies){
if (fs.existsSync(process.cwd()+'/node_modules/'+each)) {
continue;
}
add_install(each, config.dependencies[each], process.cwd());
}
parallel(installs, execute_runners);
}
/*
* Read and Install Common Parts
*/
let installs = [];
const installs_add = function(folder, repo){
installs.push(function(next){
fetch(folder, repo, next);
});
}
for(let each in core_parts){
if (!fs.existsSync(__dirname+'/server/'+each)) {
installs_add(__dirname+'/server/'+each, core_parts[each]);
}
}
for(let each in config.parts){
if (!fs.existsSync(__dirname+'/server/'+each)) {
for(let org in orgs){
if(config.parts[each].toLowerCase()==org){
installs_add(__dirname+'/server/'+each, orgs[org].replace('NAME', each));
break;
}
}
}
}
parallel(installs, read_project_parts);
/*
* End of waw
*/