You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							106 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							106 lines
						
					
					
						
							2.3 KiB
						
					
					
				'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; | 
						|
};
 | 
						|
 |