From 506766442de92f4ccf5bef0b554140631e4f232f Mon Sep 17 00:00:00 2001 From: Mathieu Bouchard Date: Thu, 9 Feb 2017 22:34:36 -0500 Subject: [PATCH 1/3] Port to webpack2 --- package.json | 2 +- webpack.config.prod.js | 34 +++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index fad4a7b..b939221 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "express": "", "form-urlencoded": "", "html-webpack-plugin": "", - "extract-text-webpack-plugin": ">=1.0.1", + "extract-text-webpack-plugin": ">=2.0.0-rc.3", "cosmos-js": "^0.7.0", "yargs": "^3.30.0" }, diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 95ae2d3..5d565be 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -15,7 +15,7 @@ module.exports = { filename: "/static/[name].js" }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), + new webpack.optimize.OccurrenceOrderPlugin(), // new webpack.DefinePlugin({ // 'process.env': { // 'NODE_ENV': JSON.stringify('production') @@ -33,27 +33,35 @@ module.exports = { new ExtractTextPlugin("/static/styles.css"), ], resolve: { - extensions: ['', '.js', '.jsx'], + extensions: ['*', '.js', '.jsx'], // Tell webpack to look for required files in bower and node - modulesDirectories: ['bower_components', 'node_modules'] + modules: ['bower_components', 'node_modules'] }, module: { loaders: [ { test: /\.jsx?$/, - loaders: ['babel?optional[]=runtime&stage=0'], + loaders: ['babel-loader?optional[]=runtime&stage=0'], include: path.join(__dirname, 'app') }, + { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?name=/static/[name]-[hash].[ext]" }, + { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?name=/static/[name]-[hash].[ext]" }, + { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?name=/static/[name]-[hash].[ext]" }, + { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?name=/static/[name]-[hash].[ext]" }, + { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?name=/static/[name]-[hash].[ext]" }, + { test: /\.jpg$/, loader: "file-loader?name=[name]-[hash].[ext]" }, + { test: /\.png$/, loader: "file-loader?name=[name]-[hash].[ext]" }, { - test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") - }, - { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/static/[name]-[hash].[ext]" }, - { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/static/[name]-[hash].[ext]" }, - { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/static/[name]-[hash].[ext]" }, - { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/static/[name]-[hash].[ext]" }, - { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/static/[name]-[hash].[ext]" }, - { test: /\.jpg$/, loader: "file?name=[name]-[hash].[ext]" }, - { test: /\.png$/, loader: "file?name=[name]-[hash].[ext]" }, + rules: [ + { + test: /\.css$/, + use: ExtractTextPlugin.extract({ + fallback: "style-loader", + use: "css-loader" + }) + } + ] + } ] } }; From 0686dab219ae2f754e3ad7166a3787ce8384348a Mon Sep 17 00:00:00 2001 From: Mathieu Bouchard Date: Thu, 9 Feb 2017 23:51:30 -0500 Subject: [PATCH 2/3] Add support to run the API behind a reverse proxy with a prefix --- app/services/base_service.js | 7 ++++--- app/services/real-time.js | 5 ++--- settings.json.sample | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/services/base_service.js b/app/services/base_service.js index e7a2f3a..f588571 100644 --- a/app/services/base_service.js +++ b/app/services/base_service.js @@ -8,17 +8,18 @@ axios.defaults.headers.common['Accept'] = 'application/json'; export default class BaseService { baseUrl() { let settings = store.get('settings'); - return URI("") .host(settings.API_URL) .scheme(`${settings.SECURE_HTTP ? 'https' : 'http'}`); } get(segment, ...params) { - return axios.get(this.baseUrl().segment(segment), ...params); + let settings = store.get('settings'); + return axios.get(this.baseUrl().segment([settings.API_PATH].concat(segment)), ...params); } post(segment, data, ...params) { - return axios.post(this.baseUrl().segment(segment), data, ...params); + let settings = store.get('settings'); + return axios.post(this.baseUrl().segment([settings.API_PATH].concat(segment)), data, ...params); } } diff --git a/app/services/real-time.js b/app/services/real-time.js index 7100c08..4ba925f 100644 --- a/app/services/real-time.js +++ b/app/services/real-time.js @@ -36,15 +36,14 @@ function real_time_factory() { var url = URI("") .host(settings.API_URL) .scheme(`${settings.SECURE_HTTP ? 'https' : 'http'}`) - .segment(['events']) + .segment([settings.API_PATH, 'events']) .search({'token': token}); var source = new EventSource(url); } else { var url = URI("") .host(settings.API_URL) .scheme(`${settings.SECURE_HTTP ? 'wss' : 'ws'}`) - .segment(['all_events', token]); - + .segment([settings.API_PATH, 'all_events', token]); var source = new WebSocket(url); } diff --git a/settings.json.sample b/settings.json.sample index a9ba7da..8ecd668 100644 --- a/settings.json.sample +++ b/settings.json.sample @@ -1,5 +1,6 @@ { "API_URL": "localhost:5417", # The API URL + "API_PATH": "/", # The API path "SECURE_HTTP": false, # Is the API protected by HTTPS? "templates": { # Templates sample "basic": { # Template name @@ -22,5 +23,5 @@ }, "EAUTH": "pam", # The configured external_auth system "FLAVOUR": "rest_cherrypy", # The netapi implementation configured on salt-master - "PATH_PREFIX": "/", # The prefix of saltpad url + "PATH_PREFIX": "/" # The prefix of saltpad url } From f956108a3f7b9d196840b5f6de89c6847e559ddb Mon Sep 17 00:00:00 2001 From: Mathieu Bouchard Date: Sat, 11 Feb 2017 16:58:43 -0500 Subject: [PATCH 3/3] Add webpack developement build --- package.json | 2 ++ webpack.config.dev.js | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index b939221..39b8be4 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,8 @@ "clean": "rimraf dist && rimraf dist.zip", "build:webpack": "NODE_ENV=production ./node_modules/webpack/bin/webpack.js --config webpack.config.prod.js", "build": "npm run clean && npm run build:webpack && zip -r dist.zip dist/* && md5sum dist.zip > dist.zip.md5 && sha1sum dist.zip > dist.zip.sha1", + "build:webpack:dev": "NODE_ENV=production ./node_modules/webpack/bin/webpack.js --config webpack.config.dev.js", + "build:dev": "npm run clean && npm run build:webpack:dev && zip -r dist.zip dist/* && md5sum dist.zip > dist.zip.md5 && sha1sum dist.zip > dist.zip.sha1", "start": "node devServer.js", "playground": "node devServer.js --env playground", "lint": "eslint src" diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 7924a1d..0ccada7 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -14,18 +14,18 @@ module.exports = { }, plugins: [ new webpack.HotModuleReplacementPlugin(), - new webpack.NoErrorsPlugin(), + new webpack.NoEmitOnErrorsPlugin(), ], resolve: { - extensions: ['', '.js', '.jsx', '.css'], + extensions: ['*', '.js', '.jsx', '.css'], // Tell webpack to look for required files in bower and node - modulesDirectories: ['bower_components', 'node_modules'] + modules: ['bower_components', 'node_modules'] }, module: { loaders: [ { test: /\.jsx?$/, - loader: 'babel', + loader: 'babel-loader', include: path.join(__dirname, 'app'), query: { optional: ['runtime'], @@ -48,13 +48,13 @@ module.exports = { { test: /\.css$/, loader: "style-loader!css-loader" }, - { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&minetype=application/font-woff" }, - { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&minetype=application/font-woff" }, - { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&minetype=application/octet-stream" }, - { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" }, - { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&minetype=image/svg+xml" }, - { test: /\.jpg$/, loader: "file" }, - { test: /\.png$/, loader: "file" }, + { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&minetype=application/font-woff" }, + { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&minetype=application/font-woff" }, + { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&minetype=application/octet-stream" }, + { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader" }, + { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&minetype=image/svg+xml" }, + { test: /\.jpg$/, loader: "file-loader" }, + { test: /\.png$/, loader: "file-loader" }, ] } }