| '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); |
| |
| if (options.lazy) { |
| 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}$`); |
| } |
| } |
| |
| // 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 { |
| 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, {}); |
| }, |
| }); |
| }; |