/ lib / modules / pipeline / webpackProcess.js
webpackProcess.js
 1  const constants = require('../../constants');
 2  const fs = require('../../core/fs');
 3  const ProcessWrapper = require('../../core/processes/processWrapper');
 4  const webpack = require('webpack');
 5  const writeFile = require('util').promisify(require('fs').writeFile);
 6  const {errorMessage} = require('../../utils/utils');
 7  const WebpackConfigReader = require('./webpackConfigReader');
 8  
 9  let webpackProcess;
10  
11  class WebpackProcess extends ProcessWrapper {
12    constructor(options) {
13      super(options);
14      this.webpackConfigName = options.webpackConfigName;
15      this.pipelineConfig = options.pipelineConfig;
16    }
17  
18    async build(assets, importsList, callback) {
19      try {
20        await this.webpackRun(assets, importsList, callback);
21      } catch (e) {
22        callback(errorMessage(e));
23      }
24    }
25  
26    async webpackRun(assets, importsList, callback) {
27      try {
28        await writeFile(
29          fs.dappPath('.embark/embark-aliases.json'),
30          JSON.stringify(importsList)
31        );
32        await writeFile(
33          fs.dappPath('.embark/embark-assets.json'),
34          JSON.stringify(assets)
35        );
36        await writeFile(
37          fs.dappPath('.embark/embark-pipeline.json'),
38          JSON.stringify(this.pipelineConfig)
39        );
40      } catch (e) {
41        return callback(errorMessage(e));
42      }
43  
44      const configReader = new WebpackConfigReader({webpackConfigName: this.webpackConfigName});
45      configReader.readConfig((err, config) => {
46        if (err) {
47          return callback(err);
48        }
49  
50        if (typeof config !== 'object' || config === null) {
51          return callback('bad webpack config, the resolved config was null or not an object');
52        }
53  
54        webpack(config).run(async (err, stats) => {
55          if (err) {
56            return callback(errorMessage(err));
57          }
58          if (!config.stats || config.stats === 'none') {
59            return callback();
60          }
61          try {
62            this._log('info', 'writing file ' + ('.embark/stats.report').bold.dim);
63            await writeFile(
64              fs.dappPath('.embark/stats.report'),
65              stats.toString(config.stats)
66            );
67            this._log('info', 'writing file ' + ('.embark/stats.json').bold.dim);
68            await writeFile(
69              fs.dappPath('.embark/stats.json'),
70              JSON.stringify(stats.toJson(config.stats))
71            );
72            if (stats.hasErrors()) {
73              const errors = stats.toJson(config.stats).errors.join('\n');
74              return callback(errors);
75            }
76            callback();
77          } catch (e) {
78            return callback(errorMessage(e));
79          }
80        });
81      });
82    }
83  }
84  
85  process.on('message', (msg) => {
86    if (msg.action === constants.pipeline.init) {
87      webpackProcess = new WebpackProcess(msg.options);
88      return process.send({result: constants.pipeline.initiated});
89    }
90  
91    if (msg.action === constants.pipeline.build) {
92      return webpackProcess.build(msg.assets, msg.importsList, (err) => {
93        process.send({result: constants.pipeline.built, error: err});
94      });
95    }
96  });