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 });