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.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							2.4 KiB
						
					
					
				'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, {}); | 
						|
    }, | 
						|
  }); | 
						|
};
 | 
						|
 |