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