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