UNPKG

4.63 kBJavaScriptView Raw
1'use strict';
2
3var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
4
5function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
6
7/* eslint-disable global-require, no-console */
8const fs = require('fs-extra');
9const openBrowser = require('react-dev-utils/openBrowser');
10const webpack = require('webpack');
11const WebpackDevServer = require('webpack-dev-server');
12
13const configurations = {
14 client: {
15 development: require('./config/client/development'),
16 production: require('./config/client/production')
17 },
18 server: {
19 development: require('./config/server/development'),
20 production: require('./config/server/production')
21 }
22};
23
24function createRunOnceCompiler(webpackConfig) {
25 return new Promise((resolve, reject) => {
26 try {
27 webpack(webpackConfig, (err, stats) => {
28 if (err || stats.hasErrors()) {
29 return reject(err);
30 }
31
32 return resolve();
33 });
34 } catch (e) {
35 reject(e);
36 }
37 });
38}
39
40const plugin = (env, runOnce = false, logger) => {
41 let clientLogger;
42 let serverLogger;
43 const { env: envVariables, settings } = env.getConfiguration();
44 let serverCompiler;
45 let clientDevServer;
46
47 return {
48 build() {
49 return _asyncToGenerator(function* () {
50 clientLogger = logger.createGroup('client');
51 serverLogger = logger.createGroup('server');
52 const clientConfig = configurations.client[env.getName()](env, clientLogger);
53 const serverConfig = configurations.server[env.getName()](env, serverLogger);
54
55 fs.removeSync(settings.client.bundleDir);
56 fs.removeSync(settings.server.bundleDir);
57
58 const compilers = [createRunOnceCompiler(clientConfig), createRunOnceCompiler(serverConfig)];
59
60 return yield Promise.all(compilers);
61 })();
62 },
63
64 start() {
65 return _asyncToGenerator(function* () {
66 clientLogger = logger.createGroup('client');
67 serverLogger = logger.createGroup('server');
68 const clientConfig = configurations.client[env.getName()](env, clientLogger);
69 const serverConfig = configurations.server[env.getName()](env, serverLogger);
70
71 return new Promise(function (resolve, reject) {
72 try {
73 const clientCompiler = webpack(clientConfig);
74
75 clientDevServer = new WebpackDevServer(clientCompiler, {
76 clientLogLevel: 'none',
77 contentBase: envVariables.PUBLIC_DIR,
78 historyApiFallback: {
79 disableDotRule: true
80 },
81 https: settings.client.protocol === 'https',
82 host: 'localhost',
83 hot: true,
84 proxy: {
85 '!(/__webpack_hmr|**/*.*)': `http://localhost:${ envVariables.SERVER_PORT }`
86 },
87 publicPath: '/',
88 quiet: true,
89 watchOptions: {
90 ignored: /node_modules/
91 }
92 });
93
94 clientDevServer.listen(envVariables.SERVER_PORT - 1, function (err) {
95 if (err) {
96 console.log(err);
97 return reject(err);
98 }
99
100 return openBrowser(`${ settings.client.protocol || 'http' }://localhost:${ envVariables.SERVER_PORT - 1 }/`);
101 });
102
103 serverCompiler = webpack(_extends({}, serverConfig, {
104 watchOptions: {
105 ignored: /node_modules/
106 }
107 })).watch({}, function () {});
108 } catch (e) {
109 reject(e);
110 }
111
112 resolve();
113 });
114 })();
115 },
116
117 terminate() {
118 return _asyncToGenerator(function* () {
119 clientLogger.remove();
120 serverLogger.remove();
121
122 if (serverCompiler) {
123 return Promise.all([new Promise(function (resolve) {
124 return serverCompiler.close(resolve);
125 }), new Promise(function (resolve) {
126 return clientDevServer.close(resolve);
127 })]);
128 }
129
130 return true;
131 })();
132 }
133 };
134};
135
136module.exports = plugin;
\No newline at end of file