| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | '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;};
 |