| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | 'use strict';const fs = require('fs');const path = require('path');const MemoryFileSystem = require('memory-fs');const mkdirp = require('mkdirp');const { colors } = require('webpack-log');const DevMiddlewareError = require('./DevMiddlewareError');module.exports = {  toDisk(context) {    const compilers = context.compiler.compilers || [context.compiler];    for (const compiler of compilers) {      compiler.hooks.emit.tap('WebpackDevMiddleware', (compilation) => {        if (compiler.hasWebpackDevMiddlewareAssetEmittedCallback) {          return;        }        compiler.hooks.assetEmitted.tapAsync(          'WebpackDevMiddleware',          (file, info, callback) => {            let targetPath = null;            let content = null;            // webpack@5            if (info.compilation) {              ({ targetPath, content } = info);            } else {              let targetFile = file;              const queryStringIdx = targetFile.indexOf('?');              if (queryStringIdx >= 0) {                targetFile = targetFile.substr(0, queryStringIdx);              }              let { outputPath } = compiler;              // TODO Why? Need remove in future major release              if (outputPath === '/') {                outputPath = compiler.context;              }              outputPath = compilation.getPath(outputPath, {});              content = info;              targetPath = path.join(outputPath, targetFile);            }            const { writeToDisk: filter } = context.options;            const allowWrite =              filter && typeof filter === 'function'                ? filter(targetPath)                : true;            if (!allowWrite) {              return callback();            }            const { log } = context;            const dir = path.dirname(targetPath);            return mkdirp(dir, (mkdirpError) => {              if (mkdirpError) {                return callback(mkdirpError);              }              return fs.writeFile(targetPath, content, (writeFileError) => {                if (writeFileError) {                  return callback(writeFileError);                }                log.debug(                  colors.cyan(                    `Asset written to disk: ${path.relative(                      process.cwd(),                      targetPath                    )}`                  )                );                return callback();              });            });          }        );        compiler.hasWebpackDevMiddlewareAssetEmittedCallback = true;      });    }  },  setFs(context, compiler) {    if (      typeof compiler.outputPath === 'string' &&      !path.posix.isAbsolute(compiler.outputPath) &&      !path.win32.isAbsolute(compiler.outputPath)    ) {      throw new DevMiddlewareError(        '`output.path` needs to be an absolute path or `/`.'      );    }    let fileSystem;    // store our files in memory    const isConfiguredFs = context.options.fs;    const isMemoryFs =      !isConfiguredFs &&      !compiler.compilers &&      compiler.outputFileSystem instanceof MemoryFileSystem;    if (isConfiguredFs) {      // eslint-disable-next-line no-shadow      const { fs } = context.options;      if (typeof fs.join !== 'function') {        // very shallow check        throw new Error(          'Invalid options: options.fs.join() method is expected'        );      }      // eslint-disable-next-line no-param-reassign      compiler.outputFileSystem = fs;      fileSystem = fs;    } else if (isMemoryFs) {      fileSystem = compiler.outputFileSystem;    } else {      fileSystem = new MemoryFileSystem();      // eslint-disable-next-line no-param-reassign      compiler.outputFileSystem = fileSystem;    }    // eslint-disable-next-line no-param-reassign    context.fs = fileSystem;  },};
 |