vegana
Version:
vegana is a container based js framework
240 lines (207 loc) • 7.72 kB
JavaScript
const fs = require('fs');
const lazy = require('./lazy');
const sass = require('./sass');
const browserify = require('browserify');
const wasm = require('./wasm');
// const { setEngine } = require('crypto');
const common = require('../../common');
const tinyify = require('tinyify');
module.exports = {
init:init,
bundle:bundle,
appModule:appModule,
lazyLoader:lazyLoader,
wasm:wasm.recompile,
compile:compile
};
async function init(){
console.log('>>> compiling app');
let currentDirectory = await io.dir.cwd(),
readLocation = currentDirectory + '/compile.js',
writeLocation = currentDirectory + '/js/bundle.js',
doCompile = await compile(readLocation,writeLocation);
if(doCompile == false){
return common.error('failed-bundle_compilation');
} else {return true;}
}
async function lazyLoader(){
return new Promise(async (resolve,reject)=>{
console.log('>>> compiling lazy modules');
let adb = await lazy.getAllModules(); //adb = address book
if(!adb){return common.error('compiler_failed-lazy_loader');}
let promises = [];
if(adb.sass && adb.sass.length > 0){
for(let sassPack of adb.sass){
promises.push(sass.render(sassPack.read,sassPack.write));
}
}
if(adb.globals && adb.globals.length > 0){
for(let global of adb.globals){
promises.push(compile(global.read,global.write,global.sassRead,global.sassWrite));
}
}
if(adb.pages && adb.pages.length > 0){
for(let page of adb.pages){
promises.push(compile(page.read,page.write,page.sassRead,page.sassWrite));
}
}
if(adb.conts && adb.conts.length > 0){
for(let cont of adb.conts){
promises.push(compile(cont.read,cont.write,cont.sassRead,cont.sassWrite));
}
}
if(adb.panels && adb.panels.length > 0){
for(let panel of adb.panels){
promises.push(compile(panel.read,panel.write,panel.sassRead,panel.sassWrite));
}
}
if(adb.wasm && adb.wasm.length > 0){
for(let wasmModule of adb.wasm){
promises.push(wasm.lazy(wasmModule));
}
}
if(adb.uiLibs && adb.uiLibs.length > 0){
for(let uiLib of adb.uiLibs){
promises.push(compile(uiLib.read,uiLib.write,uiLib.sassRead,uiLib.sassWrite));
}
}
Promise.all(promises)
.then((results)=>{
resolve(true);
})
.catch((error)=>{
common.error(error);
reject(false);
});
});
}
async function bundle(log){
common.tell('compiling app bundle');
let currentDirectory = await io.dir.cwd() + '/',
readLocation = currentDirectory + 'compile.js',
writeLocation = currentDirectory + 'js/bundle.js',
doCompile = await compile(readLocation,writeLocation,false,false,true)
.then(()=>{return true;}).catch(()=>{return false;});
// console.log("\n\n");
// console.log({readLocation:readLocation,writeLocation:writeLocation,doCompile:doCompile});
// console.log("\n\n");
if(doCompile == false){
return common.error('failed-bundle_compilation');
} else {return true;}
}
async function appModule(type,parents,name,log){
common.tell('compiling lazy module');
let readLocation = null,writeLocation = null;
let currentDirectory = await io.dir.cwd() + "/";
let baseRead = currentDirectory + 'app/';
let baseWrite = currentDirectory + 'js/';
if(
(
parents.hasOwnProperty('page') == false &&
parents.hasOwnProperty('cont') == false &&
parents.hasOwnProperty('panel') == false
) &&
(
parents.hasOwnProperty('global') == false
) &&
(
parents.hasOwnProperty('ui') == false
)
){
return common.error('invalid-comp_parents');
}
if(type == 'page'){
if(!parents.page){return common.error('not_found-comp_parent_page');}
readLocation = baseRead + 'pages/' + parents['page'] + '/page.js';
writeLocation = baseWrite + 'pages/' + parents['page'] + '/page.js';
} else if(type == 'cont'){
if(!parents.page || !parents.cont){return common.error('not_found-comp_parent_page/cont');}
readLocation = baseRead + 'pages/' + parents['page'] + '/conts/' + parents['cont'] + '/cont.js';
writeLocation = baseWrite + 'pages/' + parents['page'] + '/conts/' + parents['cont'] + '/cont.js';
} else if(type == 'panel'){
if(!parents.page || !parents.cont || !parents.panel){return common.error('not_found-comp_parent_page/cont/panel');}
readLocation = baseRead + 'pages/' + parents['page'] + '/conts/' + parents['cont'] + '/panels/' + parents['panel'] + '/panel.js';
writeLocation = baseWrite + 'pages/' + parents['page'] + '/conts/' + parents['cont'] + '/panels/' + parents['panel'] + '/panel.js';
} else if(type == 'global'){
if(!parents.global){return common.error('not_found-global_comp');}
readLocation = baseRead + 'globals/' + parents['global'] + '/globalComp.js';
writeLocation = baseWrite + 'globals/' + parents['global'] + '/globalComp.js';
} else if(type === "ui"){
if(!parents.ui){return common.error('not_found-uiName');}
readLocation = baseRead + 'ui/' + parents['ui'] + '/index.js';
writeLocation = baseWrite + 'ui/' + parents['ui'] + '/ui.js';
} else {
return common.error("there is no valid module type to update");
}
if(log && false){
console.log("\n\n------------");
console.log({readLocation:readLocation});
console.log({writeLocation:writeLocation});
console.log("---------------\n\n");
}
if(!readLocation || !writeLocation){return common.error('invalid-comp_type');}
let doCompile = await compile(readLocation,writeLocation,false,false,true);
if(doCompile == false){
return common.error('failed-lazy_module_compilation');
} else {return true;}
}
async function compile(readLocation,writeLocation,sassRead,sassWrite,log_success){
return new Promise(async (resolve,reject)=>{
if(sassRead && sassWrite && await io.exists(sassRead)){
const compile_sass = await sass.render(sassRead,sassWrite)
.then(()=>{return true;}).catch(()=>{return false;});
if(!compile_sass){
reject("failed-sass_compile");
}
}
if(!await io.exists(writeLocation)){
if(!await makeBaseDir(writeLocation)){
common.error("failed-make_base_dir");
reject("failed-make_base_dir");
}
}
let yo = browserify({ debug: false })
.require(readLocation,{entry: true});
if(global.VeganaBuildProduction){
yo.plugin(tinyify, { flat: false });
}
yo.bundle()
.on("error", (err)=>{
if(err.message){
reject(err.message);
return;
}
reject(err);
})
.on("end", (e,f)=>{
resolve();
})
.pipe(fs.createWriteStream(writeLocation));
})
.then(()=>{
if(log_success){
common.success(`module compiled => ${readLocation}`);
}
return true;
})
.catch((e)=>{
if(typeof(e) === "string"){
common.error(`${e}`);
}
if(e instanceof Object){
common.error(`line : ${e.line} column : ${e.column}`);
common.error('\nstart------------------------\n');
common.error(e.annotated);
common.error('\n------------------------end\n');
}
common.error(`failed compile => ${readLocation}`);
return false;
});
}
async function makeBaseDir(path){
let collect = '',hold = io.clean_path(path).split("/")
for(let i=0;i<hold.length-1;i++){
collect += hold[i] + "/";
}
if(!await io.dir.ensure(collect)){return false} else {return collect;}
}