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