1 | 'use strict';
|
2 |
|
3 | var _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 |
|
5 | function _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 |
|
8 | const fs = require('fs-extra');
|
9 | const openBrowser = require('react-dev-utils/openBrowser');
|
10 | const webpack = require('webpack');
|
11 | const WebpackDevServer = require('webpack-dev-server');
|
12 |
|
13 | const 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 |
|
24 | function 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 |
|
40 | const 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 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 |
|
136 | module.exports = plugin; |
\ | No newline at end of file |