| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | 'use strict';const mime = require('mime');const createContext = require('./lib/context');const middleware = require('./lib/middleware');const reporter = require('./lib/reporter');const { setFs, toDisk } = require('./lib/fs');const { getFilenameFromUrl, noop, ready } = require('./lib/util');const defaults = {  logLevel: 'info',  logTime: false,  logger: null,  mimeTypes: null,  reporter,  stats: {    colors: true,    context: process.cwd(),  },  watchOptions: {    aggregateTimeout: 200,  },  writeToDisk: false,};module.exports = function wdm(compiler, opts) {  const options = Object.assign({}, defaults, opts);  // defining custom MIME type  if (options.mimeTypes) {    const typeMap = options.mimeTypes.typeMap || options.mimeTypes;    const force = !!options.mimeTypes.force;    mime.define(typeMap, force);  }  const context = createContext(compiler, options);  // start watching  if (!options.lazy) {    context.watching = compiler.watch(options.watchOptions, (err) => {      if (err) {        context.log.error(err.stack || err);        if (err.details) {          context.log.error(err.details);        }      }    });  } else {    if (typeof options.filename === 'string') {      const filename = options.filename        .replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') // eslint-disable-line no-useless-escape        .replace(/\\\[[a-z]+\\\]/gi, '.+');      options.filename = new RegExp(`^[/]{0,1}${filename}$`);    }    context.state = true;  }  if (options.writeToDisk) {    toDisk(context);  }  setFs(context, compiler);  return Object.assign(middleware(context), {    close(callback) {      // eslint-disable-next-line no-param-reassign      callback = callback || noop;      if (context.watching) {        context.watching.close(callback);      } else {        callback();      }    },    context,    fileSystem: context.fs,    getFilenameFromUrl: getFilenameFromUrl.bind(      this,      context.options.publicPath,      context.compiler    ),    invalidate(callback) {      // eslint-disable-next-line no-param-reassign      callback = callback || noop;      if (context.watching) {        ready(context, callback, {});        context.watching.invalidate();      } else {        callback();      }    },    waitUntilValid(callback) {      // eslint-disable-next-line no-param-reassign      callback = callback || noop;      ready(context, callback, {});    },  });};
 |