diff --git a/client/app.js b/client/app.jsx similarity index 100% rename from client/app.js rename to client/app.jsx diff --git a/package.json b/package.json index df04c7fc..8e3bd71b 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,14 @@ "test": "mocha --recursive", "test-all": "mocha --recursive", "start": "node index.js", - "start-dev": "nodemon index.js", + "start-dev": "nodemon server/index.js", "lint": "eslint .", "fix": "eslint . --fix", "precommit": "eslint .", "babel": "babel", "build-dev": "webpack --config webpack.dev.js", + "build-dev-client": "webpack --config webpack.dev.client.js", + "build-dev-server": "webpack --config webpack.dev.server.js", "build": "webpack --config webpack.prod.js" }, "repository": { diff --git a/server.js b/server.js deleted file mode 100644 index d5f772b4..00000000 --- a/server.js +++ /dev/null @@ -1,98 +0,0 @@ -// app dependencies -const express = require('express'); -const bodyParser = require('body-parser'); -const expressHandlebars = require('express-handlebars'); -const Handlebars = require('handlebars'); -const helmet = require('helmet'); -const passport = require('passport'); -const { serializeSpeechUser, deserializeSpeechUser } = require('./server/helpers/authHelpers.js'); -const cookieSession = require('cookie-session'); -const http = require('http'); -// logging dependencies -const logger = require('winston'); - -function SpeechServer () { - this.configureMysql = (mysqlConfig) => { - require('./config/mysqlConfig.js').configure(mysqlConfig); - }; - this.configureSite = (siteConfig) => { - require('./config/siteConfig.js').configure(siteConfig); - this.sessionKey = siteConfig.auth.sessionKey; - this.PORT = siteConfig.details.port; - }; - this.configureSlack = (slackConfig) => { - require('./config/slackConfig.js').configure(slackConfig); - }; - this.createApp = () => { - // create an Express application - const app = express(); - - // trust the proxy to get ip address for us - app.enable('trust proxy'); - - // add middleware - app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties - app.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory - app.use(bodyParser.json()); // 'body parser' for parsing application/json - app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded - app.use((req, res, next) => { // custom logging middleware to log all incoming http requests - logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`); - next(); - }); - - // configure passport - passport.serializeUser(serializeSpeechUser); - passport.deserializeUser(deserializeSpeechUser); - const localSignupStrategy = require('./server/passport/local-signup.js'); - const localLoginStrategy = require('./server/passport/local-login.js'); - passport.use('local-signup', localSignupStrategy); - passport.use('local-login', localLoginStrategy); - // initialize passport - app.use(cookieSession({ - name : 'session', - keys : [this.sessionKey], - maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours - })); - app.use(passport.initialize()); - app.use(passport.session()); - - // configure handlebars & register it with express app - const hbs = expressHandlebars.create({ - defaultLayout: 'embed', - handlebars : Handlebars, - }); - app.engine('handlebars', hbs.engine); - app.set('view engine', 'handlebars'); - - // set the routes on the app - require('./server/routes/auth-routes.js')(app); - require('./server/routes/api-routes.js')(app); - require('./server/routes/page-routes.js')(app); - require('./server/routes/asset-routes.js')(app); - require('./server/routes/fallback-routes.js')(app); - - this.app = app; - }; - this.initialize = () => { - require('./server/helpers/configureLogger.js')(logger); - require('./server/helpers/configureSlack.js')(logger); - this.createApp(); - this.server = http.Server(this.app); - }; - this.start = () => { - const db = require('./server/models/index'); - // sync sequelize - db.sequelize.sync() - // start the server - .then(() => { - this.server.listen(this.PORT, () => { - logger.info(`Server is listening on PORT ${this.PORT}`); - }); - }) - .catch((error) => { - logger.error(`Startup Error:`, error); - }); - }; -}; - -module.exports = SpeechServer; diff --git a/server/server.js b/server/server.js new file mode 100644 index 00000000..cd3da657 --- /dev/null +++ b/server/server.js @@ -0,0 +1,81 @@ +// app dependencies +const express = require('express'); +const bodyParser = require('body-parser'); +const expressHandlebars = require('express-handlebars'); +const Handlebars = require('handlebars'); +const helmet = require('helmet'); +const passport = require('passport'); +const { serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js'); +const cookieSession = require('cookie-session'); +const http = require('http'); +// logging dependencies +const logger = require('winston'); + +const {auth: { sessionKey }, details: { port: PORT }} = require('../config/siteConfig.js'); + +// create an Express application +const app = express(); + +// trust the proxy to get ip address for us +app.enable('trust proxy'); + +// add middleware +app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties +app.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory +app.use(bodyParser.json()); // 'body parser' for parsing application/json +app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded +app.use((req, res, next) => { // custom logging middleware to log all incoming http requests + logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`); + next(); +}); + +// configure passport +passport.serializeUser(serializeSpeechUser); +passport.deserializeUser(deserializeSpeechUser); +const localSignupStrategy = require('./passport/local-signup.js'); +const localLoginStrategy = require('./passport/local-login.js'); +passport.use('local-signup', localSignupStrategy); +passport.use('local-login', localLoginStrategy); +// initialize passport +app.use(cookieSession({ + name : 'session', + keys : [sessionKey], + maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours +})); +app.use(passport.initialize()); +app.use(passport.session()); + +// configure handlebars & register it with express app +const hbs = expressHandlebars.create({ + defaultLayout: 'embed', + handlebars : Handlebars, +}); +app.engine('handlebars', hbs.engine); +app.set('view engine', 'handlebars'); + +// set the routes on the app +require('./routes/auth-routes.js')(app); +require('./routes/api-routes.js')(app); +require('./routes/page-routes.js')(app); +require('./routes/asset-routes.js')(app); +require('./routes/fallback-routes.js')(app); + +// create server +const server = http.Server(app); + +// configure logger +require('./helpers/configureLogger.js')(logger); +require('./helpers/configureSlack.js')(logger); + +// sync sequelize +const db = require('./models/index'); +db.sequelize.sync() + // start the server + .then(() => { + server.listen(PORT, () => { + logger.info(`Server is listening on PORT ${PORT}`); + }); + }) + .catch((error) => { + logger.error(`Startup Error:`, error); + }); diff --git a/webpack.client.common.js b/webpack.client.common.js index a8447be0..8370a688 100644 --- a/webpack.client.common.js +++ b/webpack.client.common.js @@ -1,5 +1,5 @@ const Path = require('path'); -const REACT_ROOT = Path.resolve(__dirname, 'client/'); +const CLIENT_ROOT = Path.resolve(__dirname, 'client/'); module.exports = { target: 'web', @@ -23,7 +23,7 @@ module.exports = { }, resolve: { modules: [ - REACT_ROOT, + CLIENT_ROOT, 'node_modules', __dirname, ], diff --git a/webpack.dev.client.js b/webpack.dev.client.js new file mode 100644 index 00000000..ad9be8bc --- /dev/null +++ b/webpack.dev.client.js @@ -0,0 +1,11 @@ +const clientBaseConfig = require('./webpack.client.common.js'); +const merge = require('webpack-merge'); + +const devBuildConfig = { + watch : true, + devtool: 'inline-source-map', +}; + +module.exports = [ + merge(clientBaseConfig, devBuildConfig), +]; diff --git a/webpack.dev.server.js b/webpack.dev.server.js new file mode 100644 index 00000000..b8c812e3 --- /dev/null +++ b/webpack.dev.server.js @@ -0,0 +1,11 @@ +const serverBaseConfig = require('./webpack.server.common.js'); +const merge = require('webpack-merge'); + +const devBuildConfig = { + watch : true, + devtool: 'inline-source-map', +}; + +module.exports = [ + merge(serverBaseConfig, devBuildConfig), +]; diff --git a/webpack.server.common.js b/webpack.server.common.js index 1c73080d..c631af87 100644 --- a/webpack.server.common.js +++ b/webpack.server.common.js @@ -1,6 +1,6 @@ const Path = require('path'); const nodeExternals = require('webpack-node-externals'); -const REACT_ROOT = Path.resolve(__dirname, 'client/'); +const CLIENT_ROOT = Path.resolve(__dirname, 'client/'); module.exports = { target: 'node', @@ -8,10 +8,10 @@ module.exports = { __dirname: false, }, externals: [nodeExternals()], - entry : ['babel-polyfill', 'whatwg-fetch', './server.js'], + entry : ['babel-polyfill', 'whatwg-fetch', './server/server.js'], output : { - path : Path.join(__dirname, '/'), - publicPath : '/', + path : Path.join(__dirname, 'server/'), + publicPath : 'server/', filename : 'index.js', library : '', libraryTarget: 'commonjs-module', @@ -34,7 +34,7 @@ module.exports = { }, resolve: { modules: [ - REACT_ROOT, + CLIENT_ROOT, 'node_modules', __dirname, ],