Skip to content

Commit

Permalink
feat: config file using mern.json support
Browse files Browse the repository at this point in the history
  • Loading branch information
anikethsaha committed Oct 12, 2019
1 parent c8579ec commit b77005f
Show file tree
Hide file tree
Showing 21 changed files with 279 additions and 91 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
node_modules/
package.lock.json
*-lock.*

coverage
public/js/
bin/
bin/
7 changes: 4 additions & 3 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"useTabs": true,
"tabWidth": 4,
"printWidth": 120
"useTabs": true,
"tabWidth": 4,
"printWidth": 120,
"singleQuote": true
}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"editor.formatOnSave": true
}
4 changes: 4 additions & 0 deletions mern.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"styles": "none",
"stateManager": "none"
}
144 changes: 72 additions & 72 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,74 +1,74 @@
{
"name": "MERN-Boilerplate",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "jest --forceExit ",
"client:dev": "webpack-dev-server --mode=development",
"webpack": "webpack",
"coveralls": "jest --coverage --forceExit && cat ./coverage/lcov.info | coveralls",
"server:dev": "nodemon NODE_ENV=development --inspect bin/server.js",
"watch": "webpack --watch --mode=development",
"lint": "eslint .",
"server:prod": "cross-env NODE_ENV=production node bin/server.js",
"clean": "rimraf bin && rimraf public/js/app.bundle.js public/js/app.bundle.js.map",
"slate": "rimraf node_modules && npm install",
"docker-start:dev": "npm run webpack && npm run server:dev",
"docker-start:prod": "npm run lint && npm run webpack && npm run server:prod"
},
"jest": {
"setupFilesAfterEnv": [
"<rootDir>/src/client/setupTests.js"
]
},
"author": "",
"license": "ISC",
"dependencies": {
"@babel/polyfill": "^7.4.3",
"@babel/runtime": "^7.5.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",
"cors": "^2.8.4",
"csurf": "^1.10.0",
"ejs": "^2.6.1",
"express": "^4.17.1",
"express-controller": "^0.3.2",
"express-limiter": "^1.6.1",
"express-rate-limit": "^5.0.0",
"express-session": "^1.16.1",
"helmet": "^3.18.0",
"jsonwebtoken": "^8.3.0",
"mongoose": "^5.6.8",
"owasp-password-strength-test": "^1.3.0",
"react": "^16.10.2",
"react-dom": "^16.10.2",
"react-redux": "^7.1.0",
"react-router-dom": "^5.0.1",
"redux": "^4.0.1",
"styled-components": "^4.4.0",
"winston": "^3.2.1"
},
"devDependencies": {
"@babel/core": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-runtime": "^7.4.3",
"@babel/preset-env": "^7.4.4",
"@babel/preset-es2015": "^7.0.0-beta.53",
"@babel/preset-react": "^7.0.0",
"babel-eslint": "^10.0.2",
"babel-loader": "^8.0.6",
"coveralls": "^3.0.3",
"cross-env": "^6.0.3",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"eslint": "^6.2.2",
"eslint-plugin-react": "^7.16.0",
"jest": "^24.8.0",
"nodemon": "^1.19.3",
"supertest": "^4.0.2",
"webpack": "^4.31.0",
"webpack-cli": "^3.3.5",
"webpack-dev-server": "^3.7.2",
"webpack-node-externals": "^1.7.2"
}
"name": "MERN-Boilerplate",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "jest --forceExit ",
"client:dev": "webpack-dev-server --mode=development",
"webpack": "webpack",
"coveralls": "jest --coverage --forceExit && cat ./coverage/lcov.info | coveralls",
"server:dev": "nodemon NODE_ENV=development --inspect bin/server.js",
"watch": "webpack --watch --mode=development",
"lint": "eslint .",
"server:prod": "cross-env NODE_ENV=production node bin/server.js",
"clean": "rimraf bin && rimraf public/js/app.bundle.js public/js/app.bundle.js.map",
"slate": "rimraf node_modules && npm install",
"docker-start:dev": "npm run webpack && npm run server:dev",
"docker-start:prod": "npm run lint && npm run webpack && npm run server:prod"
},
"jest": {
"setupFilesAfterEnv": [
"<rootDir>/src/client/setupTests.js"
]
},
"author": "",
"license": "ISC",
"dependencies": {
"@babel/polyfill": "^7.4.3",
"@babel/runtime": "^7.5.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",
"cors": "^2.8.4",
"csurf": "^1.10.0",
"ejs": "^2.6.1",
"express": "^4.17.1",
"express-controller": "^0.3.2",
"express-limiter": "^1.6.1",
"express-rate-limit": "^5.0.0",
"express-session": "^1.16.1",
"helmet": "^3.18.0",
"jsonwebtoken": "^8.3.0",
"mongoose": "^5.6.8",
"owasp-password-strength-test": "^1.3.0",
"react": "^16.10.2",
"react-dom": "^16.10.2",
"react-router-dom": "^5.0.1",
"rimraf": "^3.0.0",
"winston": "^3.2.1"
},
"devDependencies": {
"@babel/core": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-runtime": "^7.4.3",
"@babel/preset-env": "^7.4.4",
"@babel/preset-es2015": "^7.0.0-beta.53",
"@babel/preset-react": "^7.0.0",
"babel-eslint": "^10.0.2",
"babel-loader": "^8.0.6",
"coveralls": "^3.0.3",
"cross-env": "^6.0.3",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"eslint": "^6.2.2",
"eslint-plugin-react": "^7.16.0",
"jest": "^24.8.0",
"ncp": "^2.0.0",
"nodemon": "^1.19.3",
"supertest": "^4.0.2",
"webpack": "^4.31.0",
"webpack-cli": "^3.3.5",
"webpack-dev-server": "^3.7.2",
"webpack-node-externals": "^1.7.2",
"write-json-file": "^4.2.0"
}
}
1 change: 1 addition & 0 deletions public/css/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/* add your styles here and then add them to your components using classname or id*/
23 changes: 23 additions & 0 deletions scripts/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const config = require('../mern.json');
const runStyleHandler = require('./styleHandler');
const runStateManangerHandler = require('./stateManagerHandler');
const errReporter = require('./utils/errorReporter')
const runScripts = ({ styles, stateManager }) => {
console.log('[MERN]: config options passed');
console.log('[MERN]: styling using :', styles);
console.log('[MERN]: state management using :', stateManager);

runStyleHandler(styles)
.then(res => {
console.log('[MERN]: Styling Done 🎉')
runStateManangerHandler(stateManager)
.then(res => {
console.log('[MERN]: State Manager done 🎉');
console.log(`[MERN]: Please do npm/yarn install to install the new packages added to the project`)
})
.catch(err => errReporter(err))
})
.catch(err => errReporter(err))
};

runScripts(config);
49 changes: 49 additions & 0 deletions scripts/stateManagerHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const { resolve } = require('path');
const errorReporter = require('./utils/errorReporter');
const { writeFile, mkdir, existsSync,copyFile } = require('fs');
const {ncp} = require('ncp');
const rimraf = require("rimraf");
const writeJsonFile = require('write-json-file');
const reduxHandler = () => new Promise((res,rej) => {
const pkgJson = require('../package.json');
pkgJson.dependencies = {
...pkgJson.dependencies,
"react-redux": "^7.1.0",
"redux": "^4.0.1",
};
writeJsonFile(resolve(__dirname,'../package.json'), pkgJson);
const source = resolve(__dirname,'./templates/stateManager/redux')
const destination = resolve(__dirname,'../src/client')

console.log('[MERN]: Deleting store folder (if any)')

rimraf.sync(`${destination}/store`)
console.log('[MERN]: Copying redux template')
ncp(`${source}/store`, `${destination}/store`, (err) =>{
if (err) {
errorReporter(err);
rej({err:1})
}
console.log('[MERN]: Copying Success')
console.log('[MERN]: Replacing the root.jsx component')
copyFile(resolve(`${source}/root.jsx`), `${destination}/root.jsx`, (err) => {
if (err) {
errorReporter(err);
rej({err:1})
}
console.log('[MERN]: root.jsx Copied succesfully');
res(0)
});
});
})

module.exports = stateManager =>
new Promise((res, rej) => {
if (stateManager === 'redux'){
reduxHandler()
.then(_ => res(0))
.catch(_ => rej(_))
}else if(stateManager === 'none'){
res(0)
}else rej({"error" : "Wrong config file options for stateManager"})
});
91 changes: 91 additions & 0 deletions scripts/styleHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
const { resolve } = require('path');
const errorReporter = require('./utils/errorReporter');
const { writeFile, mkdir, existsSync } = require('fs');
const {ncp} = require('ncp');
const rimraf = require("rimraf");
const writeJsonFile = require('write-json-file');


const handleNoneStyles = () => {
let styleSheetOutputPath = resolve(__dirname, '../public/css');
if (!existsSync(styleSheetOutputPath)) {
return new Promise((res,rej) => {
mkdir(styleSheetOutputPath, err => {
if (err) {
errorReporter(err)
rej(err)
};
writeFile(
`${styleSheetOutputPath}/style.css`,
`/* add your styles here and then add them to your components using classname or id*/`,
err => {
if (err) {
errorReporter(err)
rej(err)
}else {
console.log('[MERN]: added style sheet in your public/css folder')
res(0)
}
}
)
})
})
}else{
return new Promise((res,rej) => {
writeFile(
`${styleSheetOutputPath}/style.css`,
`/* add your styles here and then add them to your components using classname or id*/`,
err => {
if (err) {
errorReporter(err)
rej(err)
}else {
console.log('[MERN]: added style sheet in your public/css folder')
res(0)
}
}
)
})
}
}
const handleStyledComponentStyles = () => {
const pkgJson = require('../package.json');
pkgJson.dependencies = {
...pkgJson.dependencies,
'styled-components': '^4.4.0'
};
writeJsonFile(resolve(__dirname,'../package.json'), pkgJson);
const source = resolve(__dirname,'./templates/styles/styled-components/hello')
const destination = resolve(__dirname,'../src/client/components/hello')
console.log('[MERN]: Deleting existing default components (if any)')

return new Promise((res,rej) => {
rimraf.sync(destination)
console.log('[MERN]: Copying styled-component template')
ncp(source, destination, (err) =>{
if (err) {
errorReporter(err);
rej({err:1})
}
console.log('[MERN]: Copying Success')
res(0)
});
})


}



module.exports = (style) => new Promise((_resolve, _reject) => {
if (style === 'none') {
handleNoneStyles()
.then(res => _resolve(0))
.catch(err => _reject(err))
}else if (style === 'styled-components') {
handleStyledComponentStyles()
.then(res => _resolve(0))
.catch(err => _reject(err))
}else _reject({"error" : "Wrong config file for styles"})
})

13 changes: 13 additions & 0 deletions scripts/templates/stateManager/redux/root.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import React from "react";
import { Provider } from "react-redux";

import store from "./store";

class Root extends React.Component {
render() {
const { children } = this.props;
return <Provider store={store}>{children}</Provider>;
}
}

export default Root;
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
7 changes: 7 additions & 0 deletions scripts/templates/styles/styled-components/hello/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import React from 'react';

const Hello = () => (
<div>Hello</div>
);

export default Hello;
6 changes: 6 additions & 0 deletions scripts/utils/errorReporter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const { stdout, exit } = require('process');
module.exports = err => {
console.log(err)
stdout.write(`\n[MERN]:Please take a look at the readme or create an issue `);
exit(1);
};
6 changes: 2 additions & 4 deletions src/client/components/hello/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import React from 'react';
import { Container } from './style';

const Hello = () => (
<Container>Hello</Container>
);
const Hello = () => <div>Hello</div>


export default Hello;
6 changes: 0 additions & 6 deletions src/client/components/hello/style.js

This file was deleted.

Loading

0 comments on commit b77005f

Please sign in to comment.