conative-nodejs
Version:
Conative's Node.js Generator
115 lines (97 loc) • 3.88 kB
JavaScript
const { Command } = require('commander');
const program = new Command();
const path = require("path");
const fs = require('fs');
const ejs = require('ejs');
const VERSION = require('../package.json').version;
// Commander setting area
program
.usage('conative-nodejs [options] -n [Path/Dirname]')
.requiredOption('-n, --name <name>', 'Input path/directory name')
.option('-s, --strict', 'use strict mode')
.version(VERSION, '-v, -ver', 'output the current version')
.showHelpAfterError()
.parse();
// Get dir name
const dirName = program.opts().name;
try{
/**
* If file exists, throw error.
* todo : overwrite Y/N
*/
if(fs.existsSync(dirName)) {
throw ("File already exists!!");
}else{
(async () => {
// First, Create Directory
await createDir(dirName);
// Next, Rendering EJS
// Config area.
await ejsRender("package", "/package.json", {projectName: "default"});
await ejsRender("env", "/.env");
await ejsRender("gitIgnore", "/.gitignore");
await ejsRender("dbConnect", "/src/config/dbConnection.js");
// Base area.
await ejsRender("app", "/src/app.js");
await ejsRender("www", "/src/bin/www");
// Router area.
await ejsRender("router", "/src/routers/index.js");
await ejsRender("routerTest", "/src/routers/test.js");
// Controller & Service & Model area.
await ejsRender("controller", "/src/controllers/indexController.js");
await ejsRender("service", "/src/services/indexService.js");
await ejsRender("model", "/src/models/testDAO.js");
// View area.
await ejsRender("view", "/src/views/index.ejs", {testStr: "%= test %"});
await ejsRender("viewError", "/src/views/error.ejs", {
errorArr: [
"%= message %",
"%= error.status %",
"%= error.stack %"
]
});
})()
.then(() => {
console.log("Project start : \x1b[31mnpm run start\x1b[0m");
console.log("Check your browser! - \x1b[31mlocalhost:8080\x1b[0m\n\n");
console.log("And, if you want connect DB or change Port,");
console.log("You check \x1b[31mproject/.env\x1b[0m file.\n\n");
console.log("And... Thank you for downloading! Happy Programming :)");
});
}
} catch(error) {
console.error("Sorry. An error occurred >> ", error);
}
/**
* @param {String} name now file exists ../templates/[filename]
* @param {String} filePath project file will saved [dir/filename]
*/
async function ejsRender(name, filePath, renderOption = {}) {
// default setting
renderOption.view = true;
renderOption.strict = program.opts().strict;
const target = path.join(__dirname,'..','lib',`${name}.ejs`);
await ejs.renderFile(target, renderOption, "locals", function(err, str) {
if(err != undefined) {
throw err;
}
fs.writeFileSync(`${dirName}${filePath}`, str, 'utf8');
});
}
/**
* @param {String} dirName Root of the file to be created
* Making Directory
*/
async function createDir(dirName) {
fs.mkdirSync(`${dirName}`);
fs.mkdirSync(`${dirName}/src`);
fs.mkdirSync(`${dirName}/src/bin`);
fs.mkdirSync(`${dirName}/src/config`);
fs.mkdirSync(`${dirName}/src/controllers`);
fs.mkdirSync(`${dirName}/src/services`);
fs.mkdirSync(`${dirName}/src/models`);
fs.mkdirSync(`${dirName}/src/routers`);
fs.mkdirSync(`${dirName}/src/views`);
}
;