| 'use strict'; |
| |
| const weblog = require('webpack-log'); |
| |
| module.exports = function ctx(compiler, options) { |
| const context = { |
| state: false, |
| webpackStats: null, |
| callbacks: [], |
| options, |
| compiler, |
| watching: null, |
| forceRebuild: false, |
| }; |
| |
| if (options.logger) { |
| context.log = options.logger; |
| } else { |
| context.log = weblog({ |
| level: options.logLevel || 'info', |
| name: 'wdm', |
| timestamp: options.logTime, |
| }); |
| } |
| |
| const { log } = context; |
| |
| function done(stats) { |
| // We are now on valid state |
| context.state = true; |
| context.webpackStats = stats; |
| |
| // Do the stuff in nextTick, because bundle may be invalidated |
| // if a change happened while compiling |
| process.nextTick(() => { |
| // check if still in valid state |
| if (!context.state) { |
| return; |
| } |
| |
| // print webpack output |
| context.options.reporter(context.options, { |
| log, |
| state: true, |
| stats, |
| }); |
| |
| // execute callback that are delayed |
| const cbs = context.callbacks; |
| context.callbacks = []; |
| cbs.forEach((cb) => { |
| cb(stats); |
| }); |
| }); |
| |
| // In lazy mode, we may issue another rebuild |
| if (context.forceRebuild) { |
| context.forceRebuild = false; |
| rebuild(); |
| } |
| } |
| |
| function invalid(callback) { |
| if (context.state) { |
| context.options.reporter(context.options, { |
| log, |
| state: false, |
| }); |
| } |
| |
| // We are now in invalid state |
| context.state = false; |
| if (typeof callback === 'function') { |
| callback(); |
| } |
| } |
| |
| function rebuild() { |
| if (context.state) { |
| context.state = false; |
| context.compiler.run((err) => { |
| if (err) { |
| log.error(err.stack || err); |
| if (err.details) { |
| log.error(err.details); |
| } |
| } |
| }); |
| } else { |
| context.forceRebuild = true; |
| } |
| } |
| |
| context.rebuild = rebuild; |
| context.compiler.hooks.invalid.tap('WebpackDevMiddleware', invalid); |
| context.compiler.hooks.run.tap('WebpackDevMiddleware', invalid); |
| context.compiler.hooks.done.tap('WebpackDevMiddleware', done); |
| context.compiler.hooks.watchRun.tap( |
| 'WebpackDevMiddleware', |
| (comp, callback) => { |
| invalid(callback); |
| } |
| ); |
| |
| return context; |
| }; |