loadax
Version:
Universal powerful solution for creating web app
291 lines (274 loc) • 10.1 kB
JavaScript
require('dotenv').config()
const { exec } = require("child_process")
const fs = require('fs')
const fse = require('fs-extra')
const args = process.argv.slice(2)
const packages = "regenerator-runtime css-loader dotenv-webpack copy-webpack-plugin html-minimizer-webpack-plugin html-webpack-plugin mini-css-extract-plugin os-browserify postcss-loader sass sass-loader style-loader terser-webpack-plugin ts-loader typescript webpack webpack-cli webpack-dev-middleware webpack-dev-server webpack-hot-middleware babel-loader @babel/core @babel/cli @babel/preset-typescript @babel/preset-env @babel/plugin-transform-react-jsx imports-loader"
const char = ["/","-", "\\", "|"]
let started = null
let current = 0
const startLoading = async (command) => exec(command, (serror, sstdout, sstderr) => {
if (serror) {
console.log(serror)
clearInterval(started)
process.exit(1)
}
if (sstdout) {
process.stdout.write("\r\x1b[K")
console.log('Loadax main app ready to use')
clearInterval(started)
creaetAppFiles()
process.exit(0)
}
})
const startProcessing = (timeout = 100) => {
started = setInterval(() => {
current++
if (current > 3) current = 0
process.stdout.write("\r\x1b[K")
process.stdout.write(char[current]);
}, timeout)
}
const createInstace = () => {
exec('yarn', (error, stdout, stderr) => {
console.log('Start installing Loadax Application')
crateScripts()
startLoading(error ? `npm install ${packages} --save-dev` : `yarn add -D ${packages}`)
startProcessing()
})
}
const creaetAppFiles = () => {
let pathToRoot = ""
let pathToPublic = ""
let pathToEnv = ""
let pathToGitignore = ""
let pathResult = ""
let publicResult = ""
let evnResult = ""
let gitignoreResult = ""
if (callFormNodeModule()) {
pathToRoot = process.cwd() + "/root"
pathToPublic = process.cwd() + "/public"
pathToEnv = process.cwd() + "/root/.env.production"
pathToGitignore = process.cwd() + "/gitignore"
pathResult = process.cwd() + "/../.."
publicResult = process.cwd() + "/../../public"
evnResult = process.cwd() + "/../../.env"
gitignoreResult = process.cwd() + "/../../.gitignore"
} else {
pathToRoot = process.cwd() + "/node_modules/loadax/root"
pathToPublic = process.cwd() + "/node_modules/loadax/public"
pathToEnv = process.cwd() + "/node_modules/loadax/root/.env.production"
pathToGitignore = process.cwd() + "/node_modules/loadax/gitignore"
pathResult = process.cwd()
publicResult = process.cwd() + "/public"
evnResult = process.cwd() + "/.env"
gitignoreResult = process.cwd() + "/.gitignore"
}
fse.copySync(pathToPublic, publicResult)
fse.copySync(pathToEnv, evnResult)
fse.copySync(pathToGitignore, gitignoreResult)
fse.copySync(pathToRoot, pathResult)
}
const loadaxInfo = () => {
let version = ""
if (callFormNodeModule()) {
version = process.cwd() + "/package.json"
} else {
version = process.cwd() + "/node_modules/loadax/package.json"
}
console.log(`Loadax version: ${require(version).version}. Example of Loadax actions command executing from terminal:\n$: loadax [action] [..args]\n`)
console.log(`docker - create Docker file for Loadax`)
console.log(`build - build loadax application module`)
console.log(`pwa - create PWA file for Loadax \"asPwa\" mode`)
console.log(`add:app - add Loadax default app template`)
console.log(`add:tests - add full testing`)
console.log(`add:test:unit - added Loadax unit testing`)
console.log(`add:test:system - added Loadax system testing`)
console.log(`add:test:e2e - added Loadax function testing`)
}
const callFormNodeModule = () => {
return process.cwd().includes('node_modules')
}
const loadaxDocker = () => {
let loadaxDockerPath = ""
try {
if (callFormNodeModule()) {
loadaxDockerPath = process.cwd() + "/../../Dockerfile"
} else {
loadaxDockerPath = process.cwd() + "/Dockerfile"
}
if(fse.pathExistsSync(loadaxDockerPath)) {
console.log('Dockerfile already exist')
} else {
let resultPath = ""
if (callFormNodeModule()) {
resultPath = process.cwd() + `/src/Dockerfile`
} else {
resultPath = process.cwd() + "/node_modules/loadax/src/Dockerfile"
}
fse.copySync(resultPath, loadaxDockerPath)
console.log('Created Dockerfile for Loadax')
}
} catch (e) {
console.warn(e.message)
process.exit(1)
}
}
const crateScripts = () => {
let loadaxrcJson = ""
if (callFormNodeModule()) {
loadaxrcJson = process.cwd() + "/../../package.json"
} else {
loadaxrcJson = process.cwd() + "/package.json"
}
if (fse.pathExistsSync(loadaxrcJson)) {
let jsonPack = fse.readJsonSync(loadaxrcJson)
if(!jsonPack.scripts) {
jsonPack.scripts = {}
}
jsonPack.scripts["build"] = "webpack --node-env production && loadax build"
jsonPack.scripts["dev"] = "webpack serve --node-env development"
fse.writeJsonSync(loadaxrcJson, jsonPack)
console.log('Added Loadax scripts')
} else {
console.error('package.json is not exist. Please use npm init before added packages')
process.exit(1)
}
}
const validatePackageJson = () => {
let loadaxrcJson = ""
if (callFormNodeModule()) {
loadaxrcJson = process.cwd() + "/../../package.json"
} else {
loadaxrcJson = process.cwd() + "/package.json"
}
if(!fse.pathExistsSync(loadaxrcJson)) {
console.error('package.json is not exist. Please use npm init before added packages')
process.exit(1)
}
}
const loadaxCreateCfg = () => {
let loadaxrcPath = ""
try {
if (callFormNodeModule()) {
loadaxrcPath = process.cwd() + "/../../loadax.config.js"
} else {
loadaxrcPath = process.cwd() + "/loadax.config.js"
}
if (fse.pathExistsSync(loadaxrcPath)) {
console.log('loadax config already exist')
} else {
let resultPath = ""
if (callFormNodeModule()) {
resultPath = process.cwd() + `/src/loadax.config.js`
} else {
resultPath = process.cwd() + "/node_modules/loadax/src/loadax.config.js"
}
fse.copySync(resultPath, loadaxrcPath)
console.log('Created loadax.config.js configuration file')
}
} catch (e) {
console.warn(e.message)
process.exit(1)
}
}
const loadaxBuild = () => {
const path = process.cwd()+"/loadax.config.js"
try {
const manifest = require(path)
let fileManifest = {}
if (manifest.module.type === 0) {
const html = fs.readFileSync(process.cwd()+`/${manifest.module.source}`, "utf8")
fileManifest.html = html.toString()
} else {
fileManifest.version = manifest.module.version
fileManifest.name = manifest.module.name
fileManifest.type = manifest.module.type
fileManifest.route = manifest.module.route
fileManifest.children = manifest.module.children
fileManifest.path = manifest.module.path
fileManifest.css = manifest.module.css
}
fs.writeFileSync(process.cwd()+`/${manifest.dist}`, JSON.stringify(fileManifest), {encoding: "utf8"});
fs.unlinkSync(process.cwd()+`/${manifest.module.source}`)
} catch (e) {
console.warn('error: ' + e.message)
process.exit(1)
}
}
const createModule = () => {
const pwaPath = process.cwd()+ "/public/main/ws-loadax.js"
if(!fse.pathExistsSync(pwaPath)) {
try {
fse.copySync(process.cwd() + "/node_modules/loadax/ws-loadax.js", process.cwd()+ "/public/main/ws-loadax.js")
console.log('Pwa module created')
} catch (e) {
console.warn(e.message)
process.exit(1)
}
} else {
console.warn('Pwa module already created. Delete old files and try again')
}
}
const wip = () => {
console.log('WIP: Work in progress')
}
const executeCliCommand = (command) => {
switch (command) {
case 'valid':
validatePackageJson()
process.exit(0)
break;
case 'init':
loadaxCreateCfg()
process.exit(0)
break;
case 'build':
loadaxBuild()
process.exit(0)
break;
case 'docker':
loadaxDocker()
process.exit(0)
break;
case 'create-instance':
createInstace()
break;
case 'create-module':
createModule()
process.exit(0)
break;
case 'add:app':
wip()
process.exit(0)
break;
case 'add:app:router':
wip()
process.exit(0)
break;
case 'add:tests':
wip()
process.exit(0)
break;
case 'add:test:unit':
wip()
process.exit(0)
break;
case 'add:test:system':
wip()
process.exit(0)
break;
case 'add:test:e2e':
wip()
process.exit(0)
break;
default:
loadaxInfo();
process.exit()
break;
}
}
executeCliCommand(args[0])