UNPKG

loadax

Version:

Universal powerful solution for creating web app

291 lines (274 loc) 10.1 kB
#!/usr/bin/env node "use strict" 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])