From a8f91e1a68115b1fc99f1781f3af13a1d5669173 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy Date: Sat, 13 Aug 2016 13:43:14 -0700 Subject: [PATCH 01/18] Fixes 438 --- .babelrc | 6 ++++++ start.js => bin/server.js | 13 ++++++------- bin/server.prod.js | 18 ++++++++++++++++++ docker/supervisord.conf | 2 +- package.json | 11 ++++++++--- client.js => src/client.js | 6 +++--- src/containers/Home/index.js | 1 - server.js => src/server.js | 16 ++++++++-------- webpack/dev.config.js | 8 ++++---- webpack/prod.config.js | 5 ++++- webpack/webpack-dev-server.js | 33 +++++++++++++++++++++++++++++++++ 11 files changed, 91 insertions(+), 28 deletions(-) rename start.js => bin/server.js (79%) create mode 100644 bin/server.prod.js rename client.js => src/client.js (93%) rename server.js => src/server.js (89%) create mode 100644 webpack/webpack-dev-server.js diff --git a/.babelrc b/.babelrc index eafcfa0d6..e942b926d 100644 --- a/.babelrc +++ b/.babelrc @@ -11,6 +11,12 @@ "plugins": [ "typecheck" ] + }, + "production": { + "plugins": [ + "transform-react-inline-elements", + "transform-react-constant-elements" + ] } } } diff --git a/start.js b/bin/server.js similarity index 79% rename from start.js rename to bin/server.js index cf7b827a4..7d52b1cd3 100644 --- a/start.js +++ b/bin/server.js @@ -3,7 +3,10 @@ require('app-module-path').addPath(__dirname); require('app-module-path').addPath('./src'); var fs = require('fs'); +var path = require('path'); +var webpackIsomorphicTools = require('webpack-isomorphic-tools'); var babelrc = fs.readFileSync('./.babelrc'); +var rootDir = path.resolve(__dirname, '..'); var config; try { @@ -30,12 +33,8 @@ if (__DEVELOPMENT__) { } } -var webpackIsomorphicTools = require('webpack-isomorphic-tools'); -// this must be equal to your Webpack configuration "context" parameter -var rootPath = require('path').resolve(__dirname, './') - -global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('./webpack/isomorphic-tools-configuration')) +global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('../webpack/isomorphic-tools-configuration')) .development(process.env.NODE_ENV === 'development') -.server(rootPath, function() { - require('./server.js')(); +.server(rootDir, function() { + require('../src/server.js')(); }); diff --git a/bin/server.prod.js b/bin/server.prod.js new file mode 100644 index 000000000..925711809 --- /dev/null +++ b/bin/server.prod.js @@ -0,0 +1,18 @@ +require('dotenv').load(); +require('app-module-path').addPath(__dirname); +require('app-module-path').addPath('./src'); + +var path = require('path'); +var rootDir = path.resolve(__dirname, '../dist'); + +global.__CLIENT__ = false; +global.__SERVER__ = true; +global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production'; + +var webpackIsomorphicTools = require('webpack-isomorphic-tools'); + +global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('./webpack/isomorphic-tools-configuration')) +.development(__DEVELOPMENT__) +.server(rootDir, function() { + require('../dist/server.js')(); +}); diff --git a/docker/supervisord.conf b/docker/supervisord.conf index 2ef1739b1..54d4bd035 100644 --- a/docker/supervisord.conf +++ b/docker/supervisord.conf @@ -2,7 +2,7 @@ nodaemon=true [program:pm2] -command=pm2 start /quran/start.js -i 0 --no-daemon +command=pm2 start /quran/bin/server.prod.js -i 0 --no-daemon directory=/quran redirect_stderr=true stdout_logfile=/dev/stdout diff --git a/package.json b/package.json index fb9313fe6..351112950 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,11 @@ "posttest:dev:functional": "bash tests/functional/test.sh stop", "test:dev:lint": "node_modules/eslint/bin/eslint.js ./src/scripts/**/*.js", "test:stylelint": "node_modules/stylelint/dist/cli.js './src/**/*.scss' --config webpack/.stylelintrc", - "dev": "node webpack/dev-server.js & PORT=8000 node start.js", + "dev": "env NODE_PATH='./src' PORT=8000 UV_THREADPOOL_SIZE=100 node webpack/webpack-dev-server.js & PORT=8000 node ./bin/server.js", "start": "NODE_PATH=\"./src\" node ./start", - "build": "node ./node_modules/webpack/bin/webpack.js --config webpack/prod.config.js", + "build": "npm run build:client & npm run build:server", + "build:server": "babel src -d dist -D", + "build:client": "node ./node_modules/webpack/bin/webpack.js --config webpack/prod.config.js", "validate": "npm ls", "analyze:build": "env NODE_ENV=production ./node_modules/webpack/bin/webpack.js --json --config webpack/prod.config.js > bundle-stats.json", "analyze:json": "webpack-bundle-size-analyzer bundle-stats.json" @@ -33,7 +35,9 @@ "babel-plugin-add-module-exports": "^0.1.4", "babel-plugin-system-import-transformer": "^2.0.0", "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-react-constant-elements": "^6.9.1", "babel-plugin-transform-react-display-name": "^6.5.0", + "babel-plugin-transform-react-inline-elements": "^6.8.0", "babel-plugin-transform-runtime": "^6.7.5", "babel-plugin-typecheck": "^3.8.0", "babel-polyfill": "^6.7.4", @@ -158,7 +162,8 @@ "wdio-mocha-framework": "^0.3.7", "wdio-spec-reporter": "0.0.3", "webdriverio": "4.2.1", - "webpack-dev-server": "^1.6.5" + "webpack-dev-server": "^1.6.5", + "webpack-hot-middleware": "^2.12.2" }, "pre-commit": [ "test:dev:lint", diff --git a/client.js b/src/client.js similarity index 93% rename from client.js rename to src/client.js index b4491dd80..e913d3a1f 100644 --- a/client.js +++ b/src/client.js @@ -16,9 +16,9 @@ import { syncHistoryWithStore } from 'react-router-redux'; import debug from 'debug'; import config from 'config'; -import ApiClient from './src/helpers/ApiClient'; -import createStore from './src/redux/create'; -import routes from './src/routes'; +import ApiClient from './helpers/ApiClient'; +import createStore from './redux/create'; +import routes from './routes'; const client = new ApiClient(); const store = createStore(browserHistory, client, window.reduxData); diff --git a/src/containers/Home/index.js b/src/containers/Home/index.js index 50fb5f230..ee5a2e790 100644 --- a/src/containers/Home/index.js +++ b/src/containers/Home/index.js @@ -188,4 +188,3 @@ const AsyncHome = asyncConnect([{ }])(Home); export default connect(state => ({surahs: state.surahs.entities}))(AsyncHome); - diff --git a/server.js b/src/server.js similarity index 89% rename from server.js rename to src/server.js index 9c1a781a8..a20057858 100644 --- a/server.js +++ b/src/server.js @@ -11,22 +11,22 @@ import raven from 'raven'; import errorhandler from 'errorhandler'; import config from 'config'; -import expressConfig from 'server/config/express'; +import expressConfig from '../server/config/express'; const pretty = new PrettyError(); const server = express(); expressConfig(server); -import routes from './src/routes'; -import ApiClient from './src/helpers/ApiClient'; -import createStore from './src/redux/create'; -import debug from './src/helpers/debug'; +import routes from './routes'; +import ApiClient from './helpers/ApiClient'; +import createStore from './redux/create'; +import debug from './helpers/debug'; -import Html from './src/helpers/Html'; +import Html from './helpers/Html'; -import { setUserAgent } from './src/redux/actions/audioplayer.js'; -import { setOption } from './src/redux/actions/options.js'; +import { setUserAgent } from './redux/actions/audioplayer.js'; +import { setOption } from './redux/actions/options.js'; // Use varnish for the static routes, which will cache too server.use(raven.middleware.express.requestHandler(config.sentryServer)); diff --git a/webpack/dev.config.js b/webpack/dev.config.js index 617712bfc..d40d2906a 100644 --- a/webpack/dev.config.js +++ b/webpack/dev.config.js @@ -7,7 +7,7 @@ var IsomorphicPlugin = require('webpack-isomorphic-tools/plugin'); var webpackIsomorphicToolsPlugin = new IsomorphicPlugin(require('./isomorphic-tools-configuration')); module.exports = { - context: path.join(process.env.PWD, './'), + context: path.resolve(__dirname, '..'), resolve: { extensions: ['', '.js'], modules: [ @@ -16,14 +16,14 @@ module.exports = { ] }, entry: [ - 'webpack-dev-server/client?http://localhost:8001', + 'webpack-hot-middleware/client?path=http://localhost:8001/__webpack_hmr', 'webpack/hot/only-dev-server', 'bootstrap-sass!./bootstrap.config.js', - './client.js' + './src/client.js' ], output: { path: path.resolve('./build'), - publicPath: '/public/', + publicPath: 'http://localhost:8001/public/', filename: 'main.js' }, module: { diff --git a/webpack/prod.config.js b/webpack/prod.config.js index 2059f3c6a..a51d12990 100644 --- a/webpack/prod.config.js +++ b/webpack/prod.config.js @@ -20,6 +20,7 @@ module.exports = { sourceMapFilename: '[name]-[chunkhash].map.js' }, + context: path.resolve(__dirname, '../src'), devtool: 'cheap-source-map', debug: false, target: 'web', @@ -52,7 +53,9 @@ module.exports = { 'transform-runtime', 'add-module-exports', 'transform-decorators-legacy', - 'transform-react-display-name' + 'transform-react-display-name', + "transform-react-inline-elements", + "transform-react-constant-elements" ] } } diff --git a/webpack/webpack-dev-server.js b/webpack/webpack-dev-server.js new file mode 100644 index 000000000..bc95ade44 --- /dev/null +++ b/webpack/webpack-dev-server.js @@ -0,0 +1,33 @@ +var Express = require('express'); +var webpack = require('webpack'); + +var config = require('../src/config'); +var webpackConfig = require('./dev.config'); +var compiler = webpack(webpackConfig); + +var host = config.host || 'localhost'; +var port = (Number(config.port) + 1) || 3001; +var serverOptions = { + contentBase: 'http://' + host + ':' + port, + quiet: true, + noInfo: true, + hot: true, + inline: true, + lazy: false, + publicPath: webpackConfig.output.publicPath, + headers: {'Access-Control-Allow-Origin': '*'}, + stats: {colors: true} +}; + +var app = new Express(); + +app.use(require('webpack-dev-middleware')(compiler, serverOptions)); +app.use(require('webpack-hot-middleware')(compiler)); + +app.listen(port, function onAppListening(err) { + if (err) { + console.error(err); + } else { + console.info('==> 🚧 Webpack development server listening on port %s', port); + } +}); From 16a21ae2baddb3dd3cef96491d785d0bed377c6a Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy Date: Sat, 13 Aug 2016 15:57:31 -0700 Subject: [PATCH 02/18] babel cli --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 351112950..866654789 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "app-module-path": "^1.0.2", "autoprefixer-loader": "^3.1.0", "babel": "^6.5.2", + "babel-cli": "^6.11.4", "babel-core": "^6.13.2", "babel-loader": "^6.2.4", "babel-plugin-add-module-exports": "^0.1.4", From c9dc8791fcc846f96beacedd4f15717a1754417c Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy Date: Sat, 13 Aug 2016 18:42:20 -0700 Subject: [PATCH 03/18] pass --- src/containers/Surah/Header/index.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/containers/Surah/Header/index.js b/src/containers/Surah/Header/index.js index 86a4184dd..f178c4204 100644 --- a/src/containers/Surah/Header/index.js +++ b/src/containers/Surah/Header/index.js @@ -2,33 +2,37 @@ import React, { PropTypes } from 'react'; import Grid from 'react-bootstrap/lib/Grid'; import Navbar from 'react-bootstrap/lib/Navbar'; +const Header = Navbar.Header; +const Brand = Navbar.Brand; +const Toggle = Navbar.Toggle; +const Collapse = Navbar.Collapse; import debug from '../../../helpers/debug'; import Title from '../../../containers/Surah/Title'; -const Header = ({ surah, children }) => { - debug('component:Header', 'Render'); +const SurahHeader = ({ surah, children }) => { + debug('component:SurahHeader', 'Render'); return ( - - +
+ - </Navbar.Brand> - <Navbar.Toggle /> - </Navbar.Header> - <Navbar.Collapse> + </Brand> + <Toggle /> + </Header> + <Collapse> <Grid fluid> {children} </Grid> - </Navbar.Collapse> + </Collapse> </Navbar> ); }; -Header.propTypes = { +SurahHeader.propTypes = { surah: PropTypes.object.isRequired, children: PropTypes.any }; -export default Header; +export default SurahHeader; From 289c39db053ce2c7e33326d940696ad46fd4fb57 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sat, 13 Aug 2016 18:45:12 -0700 Subject: [PATCH 04/18] tools pass --- bin/server.prod.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/server.prod.js b/bin/server.prod.js index 925711809..028018e7e 100644 --- a/bin/server.prod.js +++ b/bin/server.prod.js @@ -11,7 +11,7 @@ global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production'; var webpackIsomorphicTools = require('webpack-isomorphic-tools'); -global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('./webpack/isomorphic-tools-configuration')) +global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('../webpack/isomorphic-tools-configuration')) .development(__DEVELOPMENT__) .server(rootDir, function() { require('../dist/server.js')(); From 0684cc018a7c2db6e7e1d0b81eb5ee05c82c3abf Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sat, 13 Aug 2016 18:49:13 -0700 Subject: [PATCH 05/18] Kick --- bin/server.prod.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/server.prod.js b/bin/server.prod.js index 028018e7e..12af605d9 100644 --- a/bin/server.prod.js +++ b/bin/server.prod.js @@ -2,6 +2,7 @@ require('dotenv').load(); require('app-module-path').addPath(__dirname); require('app-module-path').addPath('./src'); +var webpackIsomorphicTools = require('webpack-isomorphic-tools'); var path = require('path'); var rootDir = path.resolve(__dirname, '../dist'); @@ -9,8 +10,6 @@ global.__CLIENT__ = false; global.__SERVER__ = true; global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production'; -var webpackIsomorphicTools = require('webpack-isomorphic-tools'); - global.webpack_isomorphic_tools = new webpackIsomorphicTools(require('../webpack/isomorphic-tools-configuration')) .development(__DEVELOPMENT__) .server(rootDir, function() { From 40f8d78c27a058732ce6098ef999b3290aef9109 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sat, 13 Aug 2016 18:55:49 -0700 Subject: [PATCH 06/18] Docker changes --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a4940e069..15e02b806 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,8 @@ RUN cp -a /tmp/node_modules /quran WORKDIR /quran ADD . /quran/ -RUN npm run build +RUN npm run build:client +RUN npm run build:server # ssh keys WORKDIR /root From d5a33e1b53e8351324b958768fc7ca91168c6845 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sat, 13 Aug 2016 18:59:13 -0700 Subject: [PATCH 07/18] kick --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 6a1319621..71c29abb7 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,6 @@ subl bundle-stats.json #so that you can the output analyze-bundle-size bundle-stats.json ``` -## [View project issues on waffle.io...](https://waffle.io/quran/quran.com-frontend) - [Reactjs]: https://facebook.github.io/react/docs/getting-started.html [Redux]: http://redux.js.org/ [Expressjs]: http://expressjs.com/en/starter/hello-world.html From 6f3ac0dea23cc37bc043b760754d5f67c7e6e286 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sat, 13 Aug 2016 23:53:08 -0700 Subject: [PATCH 08/18] changes --- Dockerfile | 3 +++ bin/server.js | 2 +- bin/server.prod.js | 2 +- webpack/prod.config.js | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 15e02b806..6859241af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ ENV API_URL http://api.quran.com:3000 ENV SENTRY_KEY_CLIENT https://44c105328ae544ae9928f9eb74b40061@app.getsentry.com/80639 ENV SENTRY_KEY_SERVER https://44c105328ae544ae9928f9eb74b40061:41ca814d33124e04ab450104c3938cb1@app.getsentry.com/80639 ENV PORT 8000 +ENV NODE_PATH "./src" RUN apt-get -y update && apt-get -y install supervisor ssh rsync @@ -39,5 +40,7 @@ RUN rsync --update --progress -raz . ahmedre@rsync.keycdn.com:zones/assets/ # go back to /quran WORKDIR /quran +ENV NODE_PATH "./dist" + EXPOSE 8000 CMD ["supervisord", "--nodaemon", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/bin/server.js b/bin/server.js index 7d52b1cd3..7260f3636 100644 --- a/bin/server.js +++ b/bin/server.js @@ -1,6 +1,6 @@ require('dotenv').load(); require('app-module-path').addPath(__dirname); -require('app-module-path').addPath('./src'); +require('app-module-path').addPath('../src'); var fs = require('fs'); var path = require('path'); diff --git a/bin/server.prod.js b/bin/server.prod.js index 12af605d9..6695c6c4f 100644 --- a/bin/server.prod.js +++ b/bin/server.prod.js @@ -1,6 +1,6 @@ require('dotenv').load(); require('app-module-path').addPath(__dirname); -require('app-module-path').addPath('./src'); +require('app-module-path').addPath('../dist'); var webpackIsomorphicTools = require('webpack-isomorphic-tools'); var path = require('path'); diff --git a/webpack/prod.config.js b/webpack/prod.config.js index a51d12990..faa4ae3b7 100644 --- a/webpack/prod.config.js +++ b/webpack/prod.config.js @@ -27,7 +27,7 @@ module.exports = { cache: false, entry: [ 'bootstrap-sass!./bootstrap.config.prod.js', - './client.js', + './src/client.js', ], stats: { colors: true, From 0d94ae5e1e5373feb8b1afbbdce891697ff38736 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:02:03 -0700 Subject: [PATCH 09/18] fix --- bootstrap.config.js | 64 ---------------------------------------- bootstrap.config.prod.js | 4 --- webpack/dev.config.js | 2 +- webpack/prod.config.js | 2 +- 4 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 bootstrap.config.js delete mode 100644 bootstrap.config.prod.js diff --git a/bootstrap.config.js b/bootstrap.config.js deleted file mode 100644 index f7569489d..000000000 --- a/bootstrap.config.js +++ /dev/null @@ -1,64 +0,0 @@ -module.exports = { - "verbose": false, - "debug": false, - "preBootstrapCustomizations": "./src/styles/variables.scss", - "mainSass": "./src/styles/main.scss", - "scripts": { - "transition": false, - "alert": false, - "button": false, - "carousel": false, - "collapse": false, - "dropdown": true, - "modal": true, - "tooltip": true, - "popover": true, - "scrollspy": false, - "tab": false, - "affix": false - }, - "styles": { - "mixins": true, - - "normalize": true, - "print": false, - - "scaffolding": true, - "type": true, - "code": true, - "grid": true, - "tables": true, - "forms": true, - "buttons": true, - - "component-animations": true, - "glyphicons": false, - "dropdowns": true, - "button-groups": false, - "input-groups": false, - "navs": true, - "navbar": true, - "breadcrumbs": false, - "pagination": true, - "pager": true, - "labels": true, - "badges": true, - "jumbotron": false, - "thumbnails": false, - "alerts": false, - "progress-bars": false, - "media": false, - "list-group": false, - "panels": true, - "wells": false, - "close": true, - - "modals": true, - "tooltip": true, - "popovers": true, - "carousel": false, - - "utilities": true, - "responsive-utilities": true - } -}; diff --git a/bootstrap.config.prod.js b/bootstrap.config.prod.js deleted file mode 100644 index e4735b2e0..000000000 --- a/bootstrap.config.prod.js +++ /dev/null @@ -1,4 +0,0 @@ -const bootstrapConfig = require('./bootstrap.config.js'); -const ExtractTextPlugin = require('extract-text-webpack-plugin'); -bootstrapConfig.styleLoader = ExtractTextPlugin.extract({fallbackLoader: 'style-loader', loader: 'css-loader!sass-loader'}); -module.exports = bootstrapConfig; diff --git a/webpack/dev.config.js b/webpack/dev.config.js index d40d2906a..d96018c87 100644 --- a/webpack/dev.config.js +++ b/webpack/dev.config.js @@ -18,7 +18,7 @@ module.exports = { entry: [ 'webpack-hot-middleware/client?path=http://localhost:8001/__webpack_hmr', 'webpack/hot/only-dev-server', - 'bootstrap-sass!./bootstrap.config.js', + 'bootstrap-sass!./src/styles/bootstrap.config.js', './src/client.js' ], output: { diff --git a/webpack/prod.config.js b/webpack/prod.config.js index faa4ae3b7..83088b95c 100644 --- a/webpack/prod.config.js +++ b/webpack/prod.config.js @@ -26,7 +26,7 @@ module.exports = { target: 'web', cache: false, entry: [ - 'bootstrap-sass!./bootstrap.config.prod.js', + 'bootstrap-sass!./src/styles/bootstrap.config.prod.js', './src/client.js', ], stats: { From 36e2a2c83b8a3ee11b37e2b3b41d56d9523fea72 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:06:26 -0700 Subject: [PATCH 10/18] fix --- webpack/prod.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webpack/prod.config.js b/webpack/prod.config.js index 83088b95c..c6207f097 100644 --- a/webpack/prod.config.js +++ b/webpack/prod.config.js @@ -26,8 +26,8 @@ module.exports = { target: 'web', cache: false, entry: [ - 'bootstrap-sass!./src/styles/bootstrap.config.prod.js', - './src/client.js', + 'bootstrap-sass!./styles/bootstrap.config.prod.js', + './client.js', ], stats: { colors: true, From 27a6acf9391829038a6be38926c4f837bd34be78 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:11:05 -0700 Subject: [PATCH 11/18] moved files --- src/styles/bootstrap.config.js | 64 +++++++++++++++++++++++++++++ src/styles/bootstrap.config.prod.js | 4 ++ 2 files changed, 68 insertions(+) create mode 100644 src/styles/bootstrap.config.js create mode 100644 src/styles/bootstrap.config.prod.js diff --git a/src/styles/bootstrap.config.js b/src/styles/bootstrap.config.js new file mode 100644 index 000000000..f7569489d --- /dev/null +++ b/src/styles/bootstrap.config.js @@ -0,0 +1,64 @@ +module.exports = { + "verbose": false, + "debug": false, + "preBootstrapCustomizations": "./src/styles/variables.scss", + "mainSass": "./src/styles/main.scss", + "scripts": { + "transition": false, + "alert": false, + "button": false, + "carousel": false, + "collapse": false, + "dropdown": true, + "modal": true, + "tooltip": true, + "popover": true, + "scrollspy": false, + "tab": false, + "affix": false + }, + "styles": { + "mixins": true, + + "normalize": true, + "print": false, + + "scaffolding": true, + "type": true, + "code": true, + "grid": true, + "tables": true, + "forms": true, + "buttons": true, + + "component-animations": true, + "glyphicons": false, + "dropdowns": true, + "button-groups": false, + "input-groups": false, + "navs": true, + "navbar": true, + "breadcrumbs": false, + "pagination": true, + "pager": true, + "labels": true, + "badges": true, + "jumbotron": false, + "thumbnails": false, + "alerts": false, + "progress-bars": false, + "media": false, + "list-group": false, + "panels": true, + "wells": false, + "close": true, + + "modals": true, + "tooltip": true, + "popovers": true, + "carousel": false, + + "utilities": true, + "responsive-utilities": true + } +}; diff --git a/src/styles/bootstrap.config.prod.js b/src/styles/bootstrap.config.prod.js new file mode 100644 index 000000000..e4735b2e0 --- /dev/null +++ b/src/styles/bootstrap.config.prod.js @@ -0,0 +1,4 @@ +const bootstrapConfig = require('./bootstrap.config.js'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +bootstrapConfig.styleLoader = ExtractTextPlugin.extract({fallbackLoader: 'style-loader', loader: 'css-loader!sass-loader'}); +module.exports = bootstrapConfig; From 3e5601dd3e17d0ffbcbb6a5ae6bc042260e927a7 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:14:48 -0700 Subject: [PATCH 12/18] fix --- src/styles/fonts/_fonts.scss | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/styles/fonts/_fonts.scss b/src/styles/fonts/_fonts.scss index c1ef8d838..5a4795d2f 100644 --- a/src/styles/fonts/_fonts.scss +++ b/src/styles/fonts/_fonts.scss @@ -1,29 +1,29 @@ @font-face{ font-family: 'Montserrat'; - src: url('./static/fonts/montserrat/Montserrat-Regular.otf'); + src: url('../../static/fonts/montserrat/Montserrat-Regular.otf'); } @font-face{ font-family: 'Montserrat'; - src: url('./static/fonts/montserrat/Montserrat-Bold.otf'); + src: url('../../static/fonts/montserrat/Montserrat-Bold.otf'); font-weight: 700; } @font-face{ font-family: 'Montserrat'; - src: url('./static/fonts/montserrat/Montserrat-Light.otf'); + src: url('../../static/fonts/montserrat/Montserrat-Light.otf'); font-weight: 300; } @font-face{ font-family: 'Montserrat'; - src: url('./static/fonts/montserrat/Montserrat-Hairline.otf'); + src: url('../../static/fonts/montserrat/Montserrat-Hairline.otf'); font-weight: 100; } @font-face{ font-family: 'Montserrat'; - src: url('./static/fonts/montserrat/Montserrat-Black.otf'); + src: url('../../static/fonts/montserrat/Montserrat-Black.otf'); font-weight: 600; } @@ -39,11 +39,11 @@ @font-face { font-family: "SSStandard"; - src: url('./static/fonts/ss-standard/ss-standard.eot'); - src: url('./static/fonts/ss-standard/ss-standard.eot?#iefix') format('embedded-opentype'), - url('./static/fonts/ss-standard/ss-standard.woff') format('woff'), - url('./static/fonts/ss-standard/ss-standard.ttf') format('truetype'), - url('./static/fonts/ss-standard/ss-standard.svg#SSStandard') format('svg'); + src: url('../../static/fonts/ss-standard/ss-standard.eot'); + src: url('../../static/fonts/ss-standard/ss-standard.eot?#iefix') format('embedded-opentype'), + url('../../static/fonts/ss-standard/ss-standard.woff') format('woff'), + url('../../static/fonts/ss-standard/ss-standard.ttf') format('truetype'), + url('../../static/fonts/ss-standard/ss-standard.svg#SSStandard') format('svg'); font-weight: normal; font-style: normal; } From f1b4835af5ec80e9a05634b4e3de950d7df7a99a Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:23:04 -0700 Subject: [PATCH 13/18] fix --- server/config/express.js | 57 ---------------------------------------- server/config/sitemap.js | 56 --------------------------------------- server/config/support.js | 13 --------- src/server.js | 2 +- 4 files changed, 1 insertion(+), 127 deletions(-) delete mode 100644 server/config/express.js delete mode 100644 server/config/sitemap.js delete mode 100644 server/config/support.js diff --git a/server/config/express.js b/server/config/express.js deleted file mode 100644 index c8c00b3d5..000000000 --- a/server/config/express.js +++ /dev/null @@ -1,57 +0,0 @@ -import express from 'express'; -import path from 'path'; -import compression from 'compression'; -import bodyParser from 'body-parser'; -import logger from 'morgan'; -import favicon from 'serve-favicon'; -import useragent from 'express-useragent'; -import cookieParser from 'cookie-parser'; -import cors from 'cors'; -import httpProxy from 'http-proxy'; - -import sitemap from './sitemap'; -import support from './support'; - -const proxyApi = httpProxy.createProxyServer({ - target: process.env.API_URL, - secure: true -}); - -proxyApi.on('error', (error, req, res) => { - let json; - if (error.code !== 'ECONNRESET') { - console.error('proxy error', error); - } - if (!res.headersSent) { - res.writeHead(500, {'content-type': 'application/json'}); - } - - json = {error: 'proxy_error', reason: error.message}; - res.end(JSON.stringify(json)); -}); - -export default function(server) { - server.use(compression()); - server.use(bodyParser.json()); - server.use(logger('dev')); - server.use(useragent.express()); - server.use(cookieParser()); - server.use(cors()); - - // Static content - server.use(favicon(path.join((process.env.PWD || process.env.pm_cwd) , '/static/images/favicon.ico'))); - server.use(express.static(path.join(process.env.PWD || process.env.pm_cwd, '/static'))); - server.use('/public', express.static(path.join((process.env.PWD || process.env.pm_cwd), '/static/dist'))); - // server.use('/build', express.static(path.join((process.env.PWD || process.env.pm_cwd), '/static/dist'))); - - sitemap(server); - support(server); - - server.get(/^\/(images|fonts)\/.*/, function(req, res) { - res.redirect(301, '//quran-1f14.kxcdn.com' + req.path); - }); - - server.use('/api', (req, res) => { - proxyApi.web(req, res); - }); -} diff --git a/server/config/sitemap.js b/server/config/sitemap.js deleted file mode 100644 index 71fed94d2..000000000 --- a/server/config/sitemap.js +++ /dev/null @@ -1,56 +0,0 @@ -import sitemap from 'sitemap'; - -import ApiClient from '../../src/helpers/ApiClient'; - - -export default (server) => { - server.get('/sitemap.xml', (req, res) => { - const client = new ApiClient(req); - const urls = []; - - client.get('/api/v2/surahs').then(surahs => { - surahs.forEach(surah => { - Array.apply(null, {length: surah.ayat}).forEach((_, index) => { - const ayahId = index + 1; - - urls.push({ - url: `/${surah.id}/${ayahId}`, - changefreq: 'weekly', - priority: 1 - }); - - urls.push({ - url: `/${surah.id}/${ayahId}-${ayahId + 9}`, - changefreq: 'weekly', - priority: 1 - }); - }); - - urls.push({ - url: `/${surah.id}`, - changefreq: 'weekly', - priority: 1 - }); - }); - - - const xml = sitemap.createSitemap({ - hostname: 'https://quran.com', - cacheTime: 600000, // 600 sec cache period - urls: [ - ...urls, - { url: '/about', changefreq: 'monthly', priority: 0.3 }, - { url: '/contactus', changefreq: 'monthly', priority: 0.3 }, - { url: '/contact', changefreq: 'monthly', priority: 0.3 }, - { url: '/donations', changefreq: 'monthly', priority: 0.3 }, - { url: '/contributions', changefreq: 'monthly', priority: 0.3 }, - - { url: '/search', changefreq: 'weekly', priority: 0.8 } - ] - }); - - res.header('Content-Type', 'application/xml'); - res.send(xml.toString()); - }).catch(err => console.trace(err)); - }); -}; diff --git a/server/config/support.js b/server/config/support.js deleted file mode 100644 index f16d1aaaa..000000000 --- a/server/config/support.js +++ /dev/null @@ -1,13 +0,0 @@ -import superagent from 'superagent'; - -export default (server) => { - server.post('/support', (req, res) => { - superagent - .post('https://quran.zendesk.com/api/v2/tickets.json') - .send({ ticket: req.body }) - .auth('mmahalwy@gmail.com/token', 'aGGdpbEgkcKgpGscrqq8QU6z8wsdrlrTCKWHMJoz') - .end((err, { body }) => { - res.send(body || err); - }); - }); -} diff --git a/src/server.js b/src/server.js index a20057858..0c35c5d6c 100644 --- a/src/server.js +++ b/src/server.js @@ -11,7 +11,7 @@ import raven from 'raven'; import errorhandler from 'errorhandler'; import config from 'config'; -import expressConfig from '../server/config/express'; +import expressConfig from './server/config/express'; const pretty = new PrettyError(); const server = express(); From bf0867a6cea32c58ebed4b170ad8835beffd434f Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:23:19 -0700 Subject: [PATCH 14/18] moved files --- src/server/config/express.js | 57 ++++++++++++++++++++++++++++++++++++ src/server/config/sitemap.js | 56 +++++++++++++++++++++++++++++++++++ src/server/config/support.js | 13 ++++++++ 3 files changed, 126 insertions(+) create mode 100644 src/server/config/express.js create mode 100644 src/server/config/sitemap.js create mode 100644 src/server/config/support.js diff --git a/src/server/config/express.js b/src/server/config/express.js new file mode 100644 index 000000000..c8c00b3d5 --- /dev/null +++ b/src/server/config/express.js @@ -0,0 +1,57 @@ +import express from 'express'; +import path from 'path'; +import compression from 'compression'; +import bodyParser from 'body-parser'; +import logger from 'morgan'; +import favicon from 'serve-favicon'; +import useragent from 'express-useragent'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import httpProxy from 'http-proxy'; + +import sitemap from './sitemap'; +import support from './support'; + +const proxyApi = httpProxy.createProxyServer({ + target: process.env.API_URL, + secure: true +}); + +proxyApi.on('error', (error, req, res) => { + let json; + if (error.code !== 'ECONNRESET') { + console.error('proxy error', error); + } + if (!res.headersSent) { + res.writeHead(500, {'content-type': 'application/json'}); + } + + json = {error: 'proxy_error', reason: error.message}; + res.end(JSON.stringify(json)); +}); + +export default function(server) { + server.use(compression()); + server.use(bodyParser.json()); + server.use(logger('dev')); + server.use(useragent.express()); + server.use(cookieParser()); + server.use(cors()); + + // Static content + server.use(favicon(path.join((process.env.PWD || process.env.pm_cwd) , '/static/images/favicon.ico'))); + server.use(express.static(path.join(process.env.PWD || process.env.pm_cwd, '/static'))); + server.use('/public', express.static(path.join((process.env.PWD || process.env.pm_cwd), '/static/dist'))); + // server.use('/build', express.static(path.join((process.env.PWD || process.env.pm_cwd), '/static/dist'))); + + sitemap(server); + support(server); + + server.get(/^\/(images|fonts)\/.*/, function(req, res) { + res.redirect(301, '//quran-1f14.kxcdn.com' + req.path); + }); + + server.use('/api', (req, res) => { + proxyApi.web(req, res); + }); +} diff --git a/src/server/config/sitemap.js b/src/server/config/sitemap.js new file mode 100644 index 000000000..71fed94d2 --- /dev/null +++ b/src/server/config/sitemap.js @@ -0,0 +1,56 @@ +import sitemap from 'sitemap'; + +import ApiClient from '../../src/helpers/ApiClient'; + + +export default (server) => { + server.get('/sitemap.xml', (req, res) => { + const client = new ApiClient(req); + const urls = []; + + client.get('/api/v2/surahs').then(surahs => { + surahs.forEach(surah => { + Array.apply(null, {length: surah.ayat}).forEach((_, index) => { + const ayahId = index + 1; + + urls.push({ + url: `/${surah.id}/${ayahId}`, + changefreq: 'weekly', + priority: 1 + }); + + urls.push({ + url: `/${surah.id}/${ayahId}-${ayahId + 9}`, + changefreq: 'weekly', + priority: 1 + }); + }); + + urls.push({ + url: `/${surah.id}`, + changefreq: 'weekly', + priority: 1 + }); + }); + + + const xml = sitemap.createSitemap({ + hostname: 'https://quran.com', + cacheTime: 600000, // 600 sec cache period + urls: [ + ...urls, + { url: '/about', changefreq: 'monthly', priority: 0.3 }, + { url: '/contactus', changefreq: 'monthly', priority: 0.3 }, + { url: '/contact', changefreq: 'monthly', priority: 0.3 }, + { url: '/donations', changefreq: 'monthly', priority: 0.3 }, + { url: '/contributions', changefreq: 'monthly', priority: 0.3 }, + + { url: '/search', changefreq: 'weekly', priority: 0.8 } + ] + }); + + res.header('Content-Type', 'application/xml'); + res.send(xml.toString()); + }).catch(err => console.trace(err)); + }); +}; diff --git a/src/server/config/support.js b/src/server/config/support.js new file mode 100644 index 000000000..f16d1aaaa --- /dev/null +++ b/src/server/config/support.js @@ -0,0 +1,13 @@ +import superagent from 'superagent'; + +export default (server) => { + server.post('/support', (req, res) => { + superagent + .post('https://quran.zendesk.com/api/v2/tickets.json') + .send({ ticket: req.body }) + .auth('mmahalwy@gmail.com/token', 'aGGdpbEgkcKgpGscrqq8QU6z8wsdrlrTCKWHMJoz') + .end((err, { body }) => { + res.send(body || err); + }); + }); +} From d58117f415c77d10ade517498cb53a696cbe76f0 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:26:52 -0700 Subject: [PATCH 15/18] eslint --- src/styles/bootstrap.config.js | 1 + src/styles/bootstrap.config.prod.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/styles/bootstrap.config.js b/src/styles/bootstrap.config.js index f7569489d..f15d048c9 100644 --- a/src/styles/bootstrap.config.js +++ b/src/styles/bootstrap.config.js @@ -1,3 +1,4 @@ +/* eslint-disable */ module.exports = { "verbose": false, "debug": false, diff --git a/src/styles/bootstrap.config.prod.js b/src/styles/bootstrap.config.prod.js index e4735b2e0..a2e1c670e 100644 --- a/src/styles/bootstrap.config.prod.js +++ b/src/styles/bootstrap.config.prod.js @@ -1,3 +1,4 @@ +/* eslint-disable */ const bootstrapConfig = require('./bootstrap.config.js'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); bootstrapConfig.styleLoader = ExtractTextPlugin.extract({fallbackLoader: 'style-loader', loader: 'css-loader!sass-loader'}); From 6ae258b4a92eb58208b981f89d0142a69570ad57 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:28:32 -0700 Subject: [PATCH 16/18] silly me --- src/server/config/sitemap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/sitemap.js b/src/server/config/sitemap.js index 71fed94d2..e94f4d7eb 100644 --- a/src/server/config/sitemap.js +++ b/src/server/config/sitemap.js @@ -1,6 +1,6 @@ import sitemap from 'sitemap'; -import ApiClient from '../../src/helpers/ApiClient'; +import ApiClient from '../../helpers/ApiClient'; export default (server) => { From 8ff5ffefd7c9848e3cf8cf40ec17579b1e3b2004 Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:33:07 -0700 Subject: [PATCH 17/18] fix --- .babelrc | 3 ++- bin/server.js | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.babelrc b/.babelrc index e942b926d..a178a812b 100644 --- a/.babelrc +++ b/.babelrc @@ -4,7 +4,8 @@ "transform-runtime", "add-module-exports", "transform-decorators-legacy", - "transform-react-display-name" + "transform-react-display-name", + ["system-import-transformer", {"modules": "common"}] ], "env": { "development": { diff --git a/bin/server.js b/bin/server.js index 7260f3636..d15b1ea68 100644 --- a/bin/server.js +++ b/bin/server.js @@ -16,8 +16,6 @@ try { console.error(err); } -config.plugins.push(['system-import-transformer', {modules: 'common'}]); - require('babel-register')(config); global.__CLIENT__ = false; From e61906b547cd3062b81337df9158710e3d698ffc Mon Sep 17 00:00:00 2001 From: Mohamed El Mahallawy <mmahalwy@gmail.com> Date: Sun, 14 Aug 2016 00:50:09 -0700 Subject: [PATCH 18/18] fixed dev --- .gitignore | 4 +++- package.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c2d5dcfa6..135ab60a2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,10 @@ build node_modules /node_modules static/dist +dist test-results.xml npm-debug.log +npm-debug.log.* webpack-stats.json webpack-assets.json bundle-stats.json @@ -12,4 +14,4 @@ selenium-debug.log tests/functional/output/* test/functional/screenshots/* .ssh -webpack-stats.debug.json \ No newline at end of file +webpack-stats.debug.json diff --git a/package.json b/package.json index 866654789..a43dd4f5a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "posttest:dev:functional": "bash tests/functional/test.sh stop", "test:dev:lint": "node_modules/eslint/bin/eslint.js ./src/scripts/**/*.js", "test:stylelint": "node_modules/stylelint/dist/cli.js './src/**/*.scss' --config webpack/.stylelintrc", - "dev": "env NODE_PATH='./src' PORT=8000 UV_THREADPOOL_SIZE=100 node webpack/webpack-dev-server.js & PORT=8000 node ./bin/server.js", + "dev": "env NODE_PATH='./src' PORT=8000 UV_THREADPOOL_SIZE=100 node webpack/webpack-dev-server.js & env NODE_PATH='./src' PORT=8000 node ./bin/server.js", "start": "NODE_PATH=\"./src\" node ./start", "build": "npm run build:client & npm run build:server", "build:server": "babel src -d dist -D",