Prepare customAutoLoad install functions for UI+
parent
f70cfcfe19
commit
f5c2b936fc
|
@ -1,8 +1,208 @@
|
|||
var fs = require('fs')
|
||||
var express = require('express')
|
||||
var spawn = require('child_process').spawn
|
||||
module.exports = function(s,config,lang,app,io){
|
||||
const modulesBasePath = s.mainDirectory + '/libs/customAutoLoad/'
|
||||
const initializeModules = () => {
|
||||
const searchText = function(searchFor,searchIn){
|
||||
return searchIn.indexOf(searchFor) > -1
|
||||
}
|
||||
const extractNameFromPackage = (filePath) => {
|
||||
const filePathParts = filePath.split('/')
|
||||
const packageName = filePathParts[filePathParts.length - 1].split('.')[0]
|
||||
return packageName
|
||||
}
|
||||
const getModulePath = (name) => {
|
||||
return modulesBasePath + name + '/'
|
||||
}
|
||||
const getModules = () => {
|
||||
const foundModules = {}
|
||||
fs.readdirSync(modulesBasePath).forEach((moduleName) => {
|
||||
const modulePath = getModulePath(moduleName)
|
||||
const isDirectory = fs.lstatSync(modulePath).isDirectory()
|
||||
foundModules[moduleName] = {
|
||||
moduleName: moduleName,
|
||||
path: modulePath,
|
||||
isDirectory: isDirectory,
|
||||
}
|
||||
if(isDirectory){
|
||||
if(!fs.existsSync(modulePath + 'index.js')){
|
||||
foundModules[moduleName].noIndex = true
|
||||
}
|
||||
if(!fs.existsSync(modulePath + 'package.json')){
|
||||
foundModules[moduleName].properties = getModuleProperties(moduleName)
|
||||
}
|
||||
}else{
|
||||
foundModules[moduleName].isIgnitor = (moduleName.indexOf('.js') > -1)
|
||||
foundModules[moduleName].properties = {
|
||||
name: moduleName
|
||||
}
|
||||
}
|
||||
})
|
||||
return foundModules
|
||||
}
|
||||
const downloadModule = (downloadUrl,packageRoot,packageName) => {
|
||||
return fetch(downloadUrl).pipe(fs.createWriteStream(modulesBasePath + (packageName ? packageName : extractNameFromPackage(downloadUrl))))
|
||||
}
|
||||
const getModuleProperties = (name) => {
|
||||
const modulePath = getModulePath(name)
|
||||
const propertiesPath = modulePath + 'package.json'
|
||||
const properties = fs.existsSync(propertiesPath) ? s.parseJSON(fs.readFileSync(propertiesPath)) : {
|
||||
name: name
|
||||
}
|
||||
return properties
|
||||
}
|
||||
const installModule = async (name) => {
|
||||
//depending on module this may only work for Ubuntu
|
||||
const modulePath = getModulePath(name)
|
||||
const properties = getModuleProperties(name);
|
||||
const installerPath = modulePath + `INSTALL.sh`
|
||||
const propertiesPath = modulePath + 'package.json'
|
||||
// check for INSTALL.sh (ubuntu only)
|
||||
if(fs.existsSync(installerPath)){
|
||||
const installProcess = spawn(`sh`,installerPath)
|
||||
installProcess.stderr.on('data',(data) => {
|
||||
console.log(data.toString())
|
||||
})
|
||||
installProcess.stdout.on('data',(data) => {
|
||||
console.log(data.toString())
|
||||
})
|
||||
}else if(fs.existsSync(propertiesPath)){
|
||||
// no INSTALL.sh found, check for package.json and do `npm install --unsafe-perm`
|
||||
const installProcess = spawn(`npm`,['install','--unsafe-perm'])
|
||||
installProcess.stderr.on('data',(data) => {
|
||||
console.log(data.toString())
|
||||
})
|
||||
installProcess.stdout.on('data',(data) => {
|
||||
console.log(data.toString())
|
||||
})
|
||||
}
|
||||
}
|
||||
const loadModule = (module) => {
|
||||
const moduleName = module.name
|
||||
s.customAutoLoadModules[moduleName] = {}
|
||||
var customModulePath = modulesBasePath + '/' + moduleName
|
||||
if(module.isIgnitor){
|
||||
s.customAutoLoadModules[moduleName].type = 'file'
|
||||
try{
|
||||
require(customModulePath)(s,config,lang,app,io)
|
||||
}catch(err){
|
||||
s.systemLog('Failed to Load Module : ' + moduleName)
|
||||
s.systemLog(err)
|
||||
}
|
||||
}else if(module.isDirectory){
|
||||
s.customAutoLoadModules[moduleName].type = 'folder'
|
||||
try{
|
||||
require(customModulePath)(s,config,lang,app,io)
|
||||
fs.readdir(customModulePath,function(err,folderContents){
|
||||
folderContents.forEach(function(name){
|
||||
switch(name){
|
||||
case'web':
|
||||
var webFolder = s.checkCorrectPathEnding(customModulePath) + 'web/'
|
||||
fs.readdir(webFolder,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(name){
|
||||
switch(name){
|
||||
case'libs':
|
||||
case'pages':
|
||||
if(name === 'libs'){
|
||||
if(config.webPaths.home !== '/'){
|
||||
app.use('/libs',express.static(webFolder + '/libs'))
|
||||
}
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.home)+'libs',express.static(webFolder + '/libs'))
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.admin)+'libs',express.static(webFolder + '/libs'))
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.super)+'libs',express.static(webFolder + '/libs'))
|
||||
}
|
||||
var libFolder = webFolder + name + '/'
|
||||
fs.readdir(libFolder,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(libName){
|
||||
var thirdLevelName = libFolder + libName
|
||||
switch(libName){
|
||||
case'js':
|
||||
case'css':
|
||||
case'blocks':
|
||||
fs.readdir(thirdLevelName,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(filename){
|
||||
var fullPath = thirdLevelName + '/' + filename
|
||||
var blockPrefix = ''
|
||||
switch(true){
|
||||
case searchText('super.',filename):
|
||||
blockPrefix = 'super'
|
||||
break;
|
||||
case searchText('admin.',filename):
|
||||
blockPrefix = 'admin'
|
||||
break;
|
||||
}
|
||||
switch(libName){
|
||||
case'js':
|
||||
s.customAutoLoadTree[blockPrefix + 'LibsJs'].push(filename)
|
||||
break;
|
||||
case'css':
|
||||
s.customAutoLoadTree[blockPrefix + 'LibsCss'].push(filename)
|
||||
break;
|
||||
case'blocks':
|
||||
s.customAutoLoadTree[blockPrefix + 'PageBlocks'].push(fullPath)
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
default:
|
||||
if(libName.indexOf('.ejs') > -1){
|
||||
s.customAutoLoadTree.pages.push(thirdLevelName)
|
||||
}
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
case'languages':
|
||||
var languagesFolder = s.checkCorrectPathEnding(customModulePath) + 'languages/'
|
||||
fs.readdir(languagesFolder,function(err,files){
|
||||
if(err)return console.log(err);
|
||||
files.forEach(function(filename){
|
||||
var fileData = require(languagesFolder + filename)
|
||||
var rule = filename.replace('.json','')
|
||||
if(config.language === rule){
|
||||
lang = Object.assign(lang,fileData)
|
||||
}
|
||||
if(s.loadedLanguages[rule]){
|
||||
s.loadedLanguages[rule] = Object.assign(s.loadedLanguages[rule],fileData)
|
||||
}else{
|
||||
s.loadedLanguages[rule] = Object.assign(s.copySystemDefaultLanguage(),fileData)
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
case'definitions':
|
||||
var definitionsFolder = s.checkCorrectPathEnding(customModulePath) + 'definitions/'
|
||||
fs.readdir(definitionsFolder,function(err,files){
|
||||
if(err)return console.log(err);
|
||||
files.forEach(function(filename){
|
||||
var fileData = require(definitionsFolder + filename)
|
||||
var rule = filename.replace('.json','').replace('.js','')
|
||||
if(config.language === rule){
|
||||
s.definitions = s.mergeDeep(s.definitions,fileData)
|
||||
}
|
||||
if(s.loadedDefinitons[rule]){
|
||||
s.loadedDefinitons[rule] = s.mergeDeep(s.loadedDefinitons[rule],fileData)
|
||||
}else{
|
||||
s.loadedDefinitons[rule] = s.mergeDeep(s.copySystemDefaultDefinitions(),fileData)
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
}catch(err){
|
||||
s.systemLog('Failed to Load Module : ' + moduleName)
|
||||
s.systemLog(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
const initializeAllModules = async () => {
|
||||
s.customAutoLoadModules = {}
|
||||
s.customAutoLoadTree = {
|
||||
pages: [],
|
||||
|
@ -16,186 +216,19 @@ module.exports = function(s,config,lang,app,io){
|
|||
superLibsJs: [],
|
||||
superLibsCss: []
|
||||
}
|
||||
var search = function(searchFor,searchIn){return searchIn.indexOf(searchFor) > -1}
|
||||
|
||||
fs.readdir(modulesBasePath,function(err,folderContents){
|
||||
if(!err && folderContents){
|
||||
folderContents.forEach(function(filename){
|
||||
s.customAutoLoadModules[filename] = {}
|
||||
var customModulePath = modulesBasePath + '/' + filename
|
||||
if(filename.indexOf('.js') > -1){
|
||||
s.customAutoLoadModules[filename].type = 'file'
|
||||
try{
|
||||
require(customModulePath)(s,config,lang,app,io)
|
||||
}catch(err){
|
||||
console.log('Failed to Load Module : ' + filename)
|
||||
console.log(err)
|
||||
}
|
||||
}else{
|
||||
if(fs.lstatSync(customModulePath).isDirectory()){
|
||||
s.customAutoLoadModules[filename].type = 'folder'
|
||||
try{
|
||||
require(customModulePath)(s,config,lang,app,io)
|
||||
fs.readdir(customModulePath,function(err,folderContents){
|
||||
folderContents.forEach(function(name){
|
||||
switch(name){
|
||||
case'web':
|
||||
var webFolder = s.checkCorrectPathEnding(customModulePath) + 'web/'
|
||||
fs.readdir(webFolder,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(name){
|
||||
switch(name){
|
||||
case'libs':
|
||||
case'pages':
|
||||
if(name === 'libs'){
|
||||
if(config.webPaths.home !== '/'){
|
||||
app.use('/libs',express.static(webFolder + '/libs'))
|
||||
}
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.home)+'libs',express.static(webFolder + '/libs'))
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.admin)+'libs',express.static(webFolder + '/libs'))
|
||||
app.use(s.checkCorrectPathEnding(config.webPaths.super)+'libs',express.static(webFolder + '/libs'))
|
||||
}
|
||||
var libFolder = webFolder + name + '/'
|
||||
fs.readdir(libFolder,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(libName){
|
||||
var thirdLevelName = libFolder + libName
|
||||
switch(libName){
|
||||
case'js':
|
||||
case'css':
|
||||
case'blocks':
|
||||
fs.readdir(thirdLevelName,function(err,webFolderContents){
|
||||
webFolderContents.forEach(function(filename){
|
||||
var fullPath = thirdLevelName + '/' + filename
|
||||
var blockPrefix = ''
|
||||
switch(true){
|
||||
case search('super.',filename):
|
||||
blockPrefix = 'super'
|
||||
break;
|
||||
case search('admin.',filename):
|
||||
blockPrefix = 'admin'
|
||||
break;
|
||||
}
|
||||
switch(libName){
|
||||
case'js':
|
||||
s.customAutoLoadTree[blockPrefix + 'LibsJs'].push(filename)
|
||||
break;
|
||||
case'css':
|
||||
s.customAutoLoadTree[blockPrefix + 'LibsCss'].push(filename)
|
||||
break;
|
||||
case'blocks':
|
||||
s.customAutoLoadTree[blockPrefix + 'PageBlocks'].push(fullPath)
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
default:
|
||||
if(libName.indexOf('.ejs') > -1){
|
||||
s.customAutoLoadTree.pages.push(thirdLevelName)
|
||||
}
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
case'languages':
|
||||
var languagesFolder = s.checkCorrectPathEnding(customModulePath) + 'languages/'
|
||||
fs.readdir(languagesFolder,function(err,files){
|
||||
if(err)return console.log(err);
|
||||
files.forEach(function(filename){
|
||||
var fileData = require(languagesFolder + filename)
|
||||
var rule = filename.replace('.json','')
|
||||
if(config.language === rule){
|
||||
lang = Object.assign(lang,fileData)
|
||||
}
|
||||
if(s.loadedLanguages[rule]){
|
||||
s.loadedLanguages[rule] = Object.assign(s.loadedLanguages[rule],fileData)
|
||||
}else{
|
||||
s.loadedLanguages[rule] = Object.assign(s.copySystemDefaultLanguage(),fileData)
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
case'definitions':
|
||||
var definitionsFolder = s.checkCorrectPathEnding(customModulePath) + 'definitions/'
|
||||
fs.readdir(definitionsFolder,function(err,files){
|
||||
if(err)return console.log(err);
|
||||
files.forEach(function(filename){
|
||||
var fileData = require(definitionsFolder + filename)
|
||||
var rule = filename.replace('.json','').replace('.js','')
|
||||
if(config.language === rule){
|
||||
s.definitions = s.mergeDeep(s.definitions,fileData)
|
||||
}
|
||||
if(s.loadedDefinitons[rule]){
|
||||
s.loadedDefinitons[rule] = s.mergeDeep(s.loadedDefinitons[rule],fileData)
|
||||
}else{
|
||||
s.loadedDefinitons[rule] = s.mergeDeep(s.copySystemDefaultDefinitions(),fileData)
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
}catch(err){
|
||||
console.log('Failed to Load Module : ' + filename)
|
||||
console.log(err)
|
||||
}
|
||||
}
|
||||
if(!err && folderContents.length > 0){
|
||||
getModules().forEach((module) => {
|
||||
if(module.properties.disabled){
|
||||
return;
|
||||
}
|
||||
loadModule(module)
|
||||
})
|
||||
}else{
|
||||
fs.mkdirSync(modulesBasePath)
|
||||
}
|
||||
})
|
||||
}
|
||||
const extractNameFromPackage = (filePath) => {
|
||||
const filePathParts = filePath.split('/')
|
||||
const packageName = filePathParts[filePathParts.length - 1].split('.')[0]
|
||||
return packageName
|
||||
}
|
||||
const getModulePath = (name) => {
|
||||
return modulesBasePath + name + '/'
|
||||
}
|
||||
const getModules = async (showInstalledOnly) => {
|
||||
const foundModules = {}
|
||||
fs.readdirSync(modulesBasePath).forEach((moduleName) => {
|
||||
const modulePath = getModulePath(moduleName)
|
||||
const isDirectory = fs.statSync(modulePath).isDirectory()
|
||||
foundModules[moduleName] = {
|
||||
moduleName: moduleName,
|
||||
path: modulePath,
|
||||
isDirectory: isDirectory,
|
||||
}
|
||||
if(isDirectory){
|
||||
if(!fs.existsSync(modulePath + 'index.js')){
|
||||
foundModules[moduleName].noIndex = true
|
||||
}
|
||||
// is folder
|
||||
}else{
|
||||
// is igniter
|
||||
}
|
||||
})
|
||||
return foundModules
|
||||
}
|
||||
const downloadModule = (downloadUrl,packageRoot,packageName) => {
|
||||
return fetch(downloadUrl).pipe(fs.createWriteStream(modulesBasePath + packageName ? packageName : extractNameFromPackage(downloadUrl)))
|
||||
}
|
||||
const getModuleProperties = async (name) => {
|
||||
const modulePath = getModulePath(name)
|
||||
const propertiesPath = modulePath + 'package.json'
|
||||
return properties = fs.existsSync(propertiesPath) ? s.parseJSON(fs.readFileSync(propertiesPath)) : {
|
||||
"name": name
|
||||
}
|
||||
}
|
||||
const installModule = async (name) => {
|
||||
//depending on module this may only work for Ubuntu
|
||||
const properties = await getModuleProperties(name);
|
||||
// check for INSTALL.js (dynamic installer)
|
||||
// check for INSTALL.sh (ubuntu only)
|
||||
}
|
||||
|
||||
initializeModules();
|
||||
initializeAllModules();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue