Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
DheerajKN committed Jan 24, 2020
1 parent 4067509 commit 6b2a7ea
Show file tree
Hide file tree
Showing 22 changed files with 602 additions and 0 deletions.
94 changes: 94 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
const mkdirp = require('mkdirp');
const shell = require('shelljs');
const fs = require('fs');
const arguements = require('minimist')

let appDirectory = `${process.cwd()}`

const mainContentBindings = require('./code-snippets/fileKeyBindings');
const createFileWithContent = require('./helperFunctions/createFileAndAddContent');
const getFileAndUpdateContent = require('./helperFunctions/getFileAndUpdateContent');
const createControllerAndService = require('./helperFunctions/createControllerAndService');
const styling = require('./code-snippets/styling')
const viewComponent = require('./code-snippets/view')

const cdIntoApp = () => {
return new Promise(resolve => {
shell.cd(appDirectory)
resolve()
})
}

const attachStartScript = (folderDirectory) => {
let packageFile = `${folderDirectory}/package.json`
try {
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/"scripts": {/g, `"scripts": {\n "start": "nodemon --exec babel-node app.js",`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
} catch (err) {
console.log('package error add start: "nodemon --exec babel-node app.js" manually')
}
}

const installPackages = (folderName, callback) => {
return new Promise(resolve => {
console.log("\nInstalling express, babel to provide es7 context\n")
shell.exec(`npm init -y && npm install express && npm install -D nodemon @babel/core @babel/cli @babel/preset-env @babel/node`, () => {
attachStartScript(folderName)
console.log("\nFinished installing packages\n")
console.log(`cd into ${folderName} and use futher commands like
1) --resource=phone to further orchestrate controller and service file with mapping of route.js`)
resolve()
callback()
})
})
}

const defaultRun = () => {
return new Promise(resolve => {
let promises = []
createFileWithContent.createFileWithContent(`${appDirectory}/app.js`, require('./code-snippets/app'));

Object.keys(mainContentBindings).forEach((fileName, i) => {
promises[i] = new Promise(res => {
createFileWithContent.createFileWithContent(`${appDirectory}/src/${fileName}`, mainContentBindings[fileName], err => {
if (err) { return console.log(err) }
res()
});
})
})
Promise.all(promises).then(() => { resolve() })
})
}

const addRoute = (resource) => {
getFileAndUpdateContent.updateRouteText(`${appDirectory}/src/routes/index.js`, resource)
.then(() => createControllerAndService.createControllerAndService(`${appDirectory}/src`, resource))
.catch((err) => console.log(err));
}

let arguement = arguements(process.argv.slice(2));

if (arguement.hasOwnProperty('resource')) {
addRoute(resource)
}
else {
let folderName = arguement._[0];
appDirectory += `/${folderName}`
mkdirp(appDirectory);
cdIntoApp()
installPackages(appDirectory, () => shell.exec('npm i'))
createFileWithContent.createFileWithContent(`${appDirectory}/.babelrc`, '{ "presets": ["@babel/preset-env"] }')
defaultRun()
if (arguement.hasOwnProperty('style')) {
styling.addStylingToProject(arguement.style, appDirectory)
}
if (arguement.hasOwnProperty('view')) {
viewComponent.addViewToProject(arguement.view, appDirectory)
}
}
20 changes: 20 additions & 0 deletions code-snippets/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module.exports = `import express from 'express';
import path from 'path';
import routes from './src/routes';
const PORT = process.env.PORT || 3000;
const app = express()
//Connecting static components
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/views'));
// Connect all our routes to our application
app.use('/', routes);
// Turn on that server!
app.listen(PORT, () => {
console.log(\`App listening on port \${PORT}\`);
});
`
9 changes: 9 additions & 0 deletions code-snippets/controllerSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = (resource, pluralResource) => `import {Router} from 'express';
import ${resource}Service from '../service/${resource}Service';
const ${pluralResource} = Router();
${pluralResource}.get('/', ${resource}Service.all);
${pluralResource}.get('/:${resource}Id', ${resource}Service.single);
module.exports = ${pluralResource};`
9 changes: 9 additions & 0 deletions code-snippets/fileKeyBindings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const pluralize = require('pluralize')

module.exports = {
'routes/index.js': require('./route.js'),
'controller/userController.js': require('./controllerSchema')('user', pluralize('user')),
'controller/addressController.js': require('./controllerSchema')('address', pluralize('address')),
'service/userService.js': require('./serviceSchema')('user'),
'service/addressService.js': require('./serviceSchema')('address')
}
16 changes: 16 additions & 0 deletions code-snippets/route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module.exports = `import {Router} from 'express';
const routes = Router()
routes.get('/', (req, res) => {
res.status(200).json({ message: 'Connected!' });
});
import users from '../controller/userController';
routes.use('/users', users);
import addresses from '../controller/addressController';
routes.use('/addresses', addresses);
module.exports = routes;
`
9 changes: 9 additions & 0 deletions code-snippets/serviceSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = (resource) => `module.exports = {
single: (req, res) => {
const ${resource} = req.${resource}Id;
res.status(200).json({ ${resource} });
},
all: (req, res) => {
res.status(200).json([{ ${resource}: "New York" },{ ${resource}: "Chicago" }]);
}
};`
67 changes: 67 additions & 0 deletions code-snippets/styling.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
const shell = require('shelljs')
const fs = require('fs')
const mkdirp = require('mkdirp')
const createFileAndAddContent = require('../helperFunctions/createFileAndAddContent')
const fetchFile = require('../helperFunctions/fetchContent')

module.exports.addStylingToProject = (styleName, directory) => {
const supportedStyles = ['css', 'sass', 'scss', 'less'];

if (!supportedStyles.includes(styleName)) {
console.log('Requested Style not supported choose between css|sass|scss');
exit()
}

mkdirp(directory + '/views/css');
switch (styleName) {
case 'sass':
fetchFile.fetchContent('/template/style.sass').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/sass/style.sass`, data))
shell.exec('npm i node-sass-middleware', () => {
let packageFile = `${directory}/app.js`
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/(.*)express\(\)/g, `const app = express();\nimport scssMiddleware from 'node-sass-middleware';\n\napp.use(scssMiddleware({\n src: __dirname + '/views/sass',\n dest: __dirname + '/views/css',\n debug: true,\n outputStyle: 'compressed',\n prefix: '/css'}));`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
})
break;
case 'scss':
fetchFile.fetchContent('/template/style.scss').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/scss/style.scss`, data))
shell.exec('npm i node-sass-middleware', () => {
let packageFile = `${directory}/app.js`
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/(.*)express\(\)/g, `const app = express();\nimport scssMiddleware from 'node-sass-middleware';\n\napp.use(scssMiddleware({\n src: __dirname + '/views/scss',\n dest: __dirname + '/views/css',\n debug: true,\n outputStyle: 'compressed',\n prefix: '/css'}));`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
})
break;
case 'less':
fetchFile.fetchContent('/template/style.less').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/less/style.less`, data))
shell.exec('npm i less-middleware', () => {
let packageFile = `${directory}/app.js`
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/(.*)express\(\)/g, `const app = express();\nimport lessMiddleware from 'less-middleware';\n\napp.use(lessMiddleware('/less', {\n dest: 'css',\n debug: true,\n pathRoot: path.join(__dirname, 'views')}))`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
})
break;
default:
fetchFile.fetchContent('/template/style.css').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/css/style.css`, data))
break;
}
}
62 changes: 62 additions & 0 deletions code-snippets/view.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
const shell = require('shelljs')
const fs = require('fs');
const createFileAndAddContent = require('../helperFunctions/createFileAndAddContent')
const fetchFile = require('../helperFunctions/fetchContent')

module.exports.addViewToProject = (view, directory) => {
const supportedViews = ['ejs', 'hbs'];

if (!supportedViews.includes(view)) {
console.log('Requested View not supported choose between ejs|hbs');
exit()
}

switch (view) {
case 'ejs':
fetchFile.fetchContent('/template/view.ejs').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/view.ejs`, data))
shell.exec('npm i ejs', () => {
try {
let packageFile = `${directory}/app.js`
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/(.*)express\(\)/g, `const app = express()\napp.set('view engine', 'ejs')\n\napp.get('/index', (req, res) => res.render('view', {title: 'Index'}))`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
} catch (err) {
console.log('package error')
}
})
break;
case 'hbs':
fetchFile.fetchContent('/template/layout.hbs').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/main.hbs`, data))
fetchFile.fetchContent('/template/view.hbs').then((data) =>
createFileAndAddContent.createFileWithContent(`${directory}/views/view.hbs`, data))
shell.exec('npm i express-handlebars', () => {
try {
let packageFile = `${directory}/app.js`
if (fs.existsSync(packageFile)) {
fs.readFile(packageFile, 'utf8', (err, oldContent) => {
let newContent = oldContent.replace(/(.*)express\(\)/g, `const app = express()\nimport exphbs from 'express-handlebars';\n\napp.engine('.hbs', exphbs({extname: '.hbs', layoutsDir: __dirname + '/views'}));
app.set('view engine', 'hbs')
app.get('/index', (req, res) => res.render('view', {title: 'Index'}))
`);
fs.writeFile(packageFile, newContent, (err) => {
if (err) throw err;
})
})
}
} catch (err) {
console.log('package error')
}
})
break;
default:
break;
}
}
10 changes: 10 additions & 0 deletions helperFunctions/createControllerAndService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const pluralize = require('pluralize')

const createFileWithContent = require('./createFileAndAddContent');

module.exports.createControllerAndService = (fileDirectory, resource) => {
createFileWithContent.createFileWithContent(`${fileDirectory}/controller/${resource}Controller.js`,
require('../code-snippets/controllerSchema')(resource, pluralize(resource)))
createFileWithContent.createFileWithContent(`${fileDirectory}/service/${resource}Service.js`,
require('../code-snippets/serviceSchema')(resource))
}
12 changes: 12 additions & 0 deletions helperFunctions/createFileAndAddContent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const fs = require('fs');
const mkdirp = require('mkdirp');
const getDirName = require('path').dirname;

module.exports.createFileWithContent = (filePath, content) => {
mkdirp(getDirName(filePath), function (err) {
if (err) return cb(err);
fs.writeFile(filePath, content, (err)=>{
if (err) throw err;
})
})
}
13 changes: 13 additions & 0 deletions helperFunctions/fetchContent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const fs = require('fs');
const path = require('path')

let appDirectory = path.resolve(__dirname + '/../');

module.exports.fetchContent = (filePath) => {
return new Promise((resolve, reject)=>{
fs.readFile(appDirectory+filePath, 'utf8', (err, oldContent)=>{
if(err) reject(err)
resolve(oldContent);
})
})
}
29 changes: 29 additions & 0 deletions helperFunctions/getFileAndUpdateContent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const fs = require('fs');
const pluralize = require('pluralize')

const createFileWithContent = require('./createFileAndAddContent');

module.exports.updateRouteText = (filePath, resource) => {
return new Promise((resolve, reject)=>{
try {
if (fs.existsSync(filePath)) {
fs.readFile(filePath, 'utf8', (err, oldContent)=>{
let newContent = oldContent.replace(/module.exports(.*)/g, `import ${pluralize(resource)} from '../controller/${resource}Controller';
routes.use('/${pluralize(resource)}', ${pluralize(resource)});
module.exports = routes;`);

createFileWithContent.createFileWithContent(filePath, newContent, err => {
if(err) {console.log('Error in adding data to routes file')}
})
})
resolve()
}
else {
throw 'routes/index.js file doesn\'t exists'
}
} catch(err) {
reject(err)
}
})
}
23 changes: 23 additions & 0 deletions helperFunctions/updateRouteTextWithView.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module.exports.updateRouteText = (filePath, resource) => {
return new Promise((resolve, reject)=>{
try {
if (fs.existsSync(filePath)) {
fs.readFile(filePath, 'utf8', (err, oldContent)=>{
let newContent = oldContent.replace(/module.exports(.*)/g, `routes.get('/index', function(req, res) {
res.render('view', {title: 'Index'});
});`);

createFileWithContent.createFileWithContent(filePath, newContent, err => {
if(err) {console.log('Error in adding data to routes file')}
})
})
resolve()
}
else {
throw 'routes/index.js file doesn\'t exists'
}
} catch(err) {
reject(err)
}
})
}
Loading

0 comments on commit 6b2a7ea

Please sign in to comment.