diff --git a/dev-scripts/dev.js b/dev-scripts/dev.js new file mode 100644 index 00000000..000a1bfd --- /dev/null +++ b/dev-scripts/dev.js @@ -0,0 +1,76 @@ +const webpack = require('webpack') +const WebpackDevServer = require('webpack-dev-server') +const config = require('../webpack.config') +const signale = require('signale') +const { spawn } = require('child_process') +const electron = require('electron') +const port = 8080 +let server = null +let firstRun = true + +const options = { + publicPath: config.output.publicPath, + hot: true, + inline: true, + quiet: true +} + +function startServer () { + config.plugins.push(new webpack.HotModuleReplacementPlugin()) + config.entry.main.unshift( + `webpack-dev-server/client?http://localhost:${port}/`, + 'webpack/hot/dev-server' + ) + const compiler = webpack(config) + server = new WebpackDevServer(compiler, options) + + return new Promise((resolve, reject) => { + server.listen(port, 'localhost', function (err) { + if (err) { + reject(err) + } + signale.success(`Webpack Dev Server listening at localhost:${port}`) + signale.watch(`Waiting for webpack to bundle...`) + compiler.plugin('done', stats => { + if (!stats.hasErrors()) { + signale.success(`Bundle success !`) + resolve() + } else { + if (!firstRun) { + console.log(stats.compilation.errors[0]) + } else { + firstRun = false + reject(stats.compilation.errors[0]) + } + } + }) + }) + }) +} + +function startElectron () { + spawn(electron, ['--hot', './index.js']) + .on('close', () => { + server.close() + }) + .on('error', err => { + signale.error(err) + server.close() + }) + .on('disconnect', () => { + server.close() + }) + .on('exit', () => { + server.close() + }) +} + +startServer() + .then(() => { + startElectron() + signale.success('Electron started') + }) + .catch(err => { + signale.error(err) + process.exit(1) + }) diff --git a/package-lock.json b/package-lock.json index b5279b56..2150fcd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15189,6 +15189,63 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "signale": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.2.1.tgz", + "integrity": "sha512-yY7GbeTGqDLC2ggcXR9hyzcgZnNT+cooPAizWRpUOHYd0DtNVRXhMqM3+F6ZbKav9oCg1r/YtJaB250IAhn/Hg==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "single-line-log": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", diff --git a/package.json b/package.json index 4aa078ff..a344684b 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,12 @@ "license": "GPL-3.0", "scripts": { "start": "electron ./index.js", - "hot": "electron ./index.js --hot", - "webpack": "webpack-dev-server --hot --inline --config webpack.config.js", "compile": "grunt compile", "test": "PWD=$(pwd) NODE_ENV=test ava --serial", "jest": "jest", "fix": "eslint . --fix", "lint": "eslint .", - "dev-start": "concurrently --kill-others \"npm run webpack\" \"npm run hot\"" + "dev-start": "node dev-scripts/dev.js" }, "config": { "electron-version": "2.0.3" @@ -144,6 +142,7 @@ "react-router": "^2.4.0", "react-router-redux": "^4.0.4", "react-test-renderer": "^15.6.2", + "signale": "^1.2.1", "standard": "^8.4.0", "style-loader": "^0.12.4", "stylus": "^0.52.4", diff --git a/webpack-skeleton.js b/webpack-skeleton.js index aca0791f..21d75503 100644 --- a/webpack-skeleton.js +++ b/webpack-skeleton.js @@ -4,20 +4,24 @@ const NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin') var config = { entry: { - main: './browser/main/index.js' + main: ['./browser/main/index.js'] }, resolve: { extensions: ['', '.js', '.jsx', '.styl'], - packageMains: ['webpack', 'browser', 'web', 'browserify', ['jam', 'main'], 'main'], + packageMains: [ + 'webpack', + 'browser', + 'web', + 'browserify', + ['jam', 'main'], + 'main' + ], alias: { - 'lib': path.join(__dirname, 'lib'), - 'browser': path.join(__dirname, 'browser') + lib: path.join(__dirname, 'lib'), + browser: path.join(__dirname, 'browser') } }, - plugins: [ - new webpack.NoErrorsPlugin(), - new NodeTargetPlugin() - ], + plugins: [new webpack.NoErrorsPlugin(), new NodeTargetPlugin()], stylus: { use: [require('nib')()], import: [ @@ -43,14 +47,13 @@ var config = { react: 'var React', 'react-dom': 'var ReactDOM', 'react-redux': 'var ReactRedux', - 'codemirror': 'var CodeMirror', - 'redux': 'var Redux', - 'raphael': 'var Raphael', - 'flowchart': 'var flowchart', + codemirror: 'var CodeMirror', + redux: 'var Redux', + raphael: 'var Raphael', + flowchart: 'var flowchart', 'sequence-diagram': 'var Diagram' } ] } module.exports = config -