Skip to content

Commit 2702efb

Browse files
committed
fix(v5): webpack v5 compatibility
1 parent 100cbe2 commit 2702efb

19 files changed

+258
-147
lines changed

lib/helpers.js

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,25 +53,28 @@ const reduceAssets = (files, asset, moduleAssets) => {
5353
};
5454

5555
const reduceChunk = (files, chunk, options) =>
56-
chunk.files.reduce((prev, path) => {
57-
let name = chunk.name ? chunk.name : null;
58-
// chunk name, or for nameless chunks, just map the files directly.
59-
name = name
60-
? options.useEntryKeys && !path.endsWith('.map')
61-
? name
62-
: `${name}.${getFileType(path, options)}`
63-
: path;
56+
Array.of(...Array.from(chunk.files), ...Array.from(chunk.auxiliaryFiles || [])).reduce(
57+
(prev, path) => {
58+
let name = chunk.name ? chunk.name : null;
59+
// chunk name, or for nameless chunks, just map the files directly.
60+
name = name
61+
? options.useEntryKeys && !path.endsWith('.map')
62+
? name
63+
: `${name}.${getFileType(path, options)}`
64+
: path;
6465

65-
return prev.concat({
66-
path,
67-
chunk,
68-
name,
69-
isInitial: chunk.isOnlyInitial(),
70-
isChunk: true,
71-
isAsset: false,
72-
isModuleAsset: false
73-
});
74-
}, files);
66+
return prev.concat({
67+
path,
68+
chunk,
69+
name,
70+
isInitial: chunk.isOnlyInitial(),
71+
isChunk: true,
72+
isAsset: false,
73+
isModuleAsset: false
74+
});
75+
},
76+
files
77+
);
7578

7679
const standardizeFilePaths = (file) => {
7780
const result = Object.assign({}, file);

lib/hooks.js

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ const { mkdirSync, writeFileSync } = require('fs');
22
const { basename, dirname, join } = require('path');
33

44
const { SyncWaterfallHook } = require('tapable');
5+
const webpack = require('webpack');
6+
// eslint-disable-next-line global-require
7+
const { RawSource } = webpack.sources || require('webpack-sources');
58

69
const { generateManifest, reduceAssets, reduceChunk, transformFiles } = require('./helpers');
710

@@ -35,15 +38,23 @@ const emitHook = function emit(
3538
) {
3639
const emitCount = emitCountMap.get(manifestFileName) - 1;
3740
// Disable everything we don't use, add asset info, show cached assets
38-
const stats = compilation
39-
.getStats()
40-
.toJson({ all: false, assets: true, cachedAssets: true, ids: true, publicPath: true });
41+
const stats = compilation.getStats().toJson({
42+
// all: false,
43+
assets: true,
44+
cachedAssets: true,
45+
ids: true,
46+
publicPath: true
47+
});
48+
4149
const publicPath = options.publicPath !== null ? options.publicPath : stats.publicPath;
4250
const { basePath, removeKeyHash } = options;
4351

4452
emitCountMap.set(manifestFileName, emitCount);
4553

46-
let files = compilation.chunks.reduce((prev, chunk) => reduceChunk(prev, chunk, options), []);
54+
let files = Array.from(compilation.chunks).reduce(
55+
(prev, chunk) => reduceChunk(prev, chunk, options),
56+
[]
57+
);
4758

4859
// module assets don't show up in assetsByChunkName, we're getting them this way
4960
files = stats.assets.reduce((prev, asset) => reduceAssets(prev, asset, moduleAssets), files);
@@ -79,17 +90,19 @@ const emitHook = function emit(
7990

8091
if (isLastEmit) {
8192
const output = options.serialize(manifest);
82-
83-
Object.assign(compilation.assets, {
84-
[manifestAssetId]: {
85-
source() {
86-
return output;
87-
},
88-
size() {
89-
return output.length;
90-
}
91-
}
92-
});
93+
//
94+
// Object.assign(compilation.assets, {
95+
// [manifestAssetId]: {
96+
// source() {
97+
// return output;
98+
// },
99+
// size() {
100+
// return output.length;
101+
// }
102+
// }
103+
// });
104+
//
105+
compilation.emitAsset(manifestAssetId, new RawSource(output));
93106

94107
if (options.writeToFileEmit) {
95108
mkdirSync(dirname(manifestFileName), { recursive: true });
@@ -100,10 +113,17 @@ const emitHook = function emit(
100113
getCompilerHooks(compiler).afterEmit.call(manifest);
101114
};
102115

103-
const moduleAssetHook = ({ moduleAssets }, module, file) => {
104-
if (module.userRequest) {
105-
Object.assign(moduleAssets, { [file]: join(dirname(file), basename(module.userRequest)) });
106-
}
116+
const normalModuleLoaderHook = ({ moduleAssets }, loaderContext, module) => {
117+
const { emitFile } = loaderContext;
118+
119+
// eslint-disable-next-line no-param-reassign
120+
loaderContext.emitFile = (file, content, sourceMap) => {
121+
if (module.userRequest && !moduleAssets[file]) {
122+
Object.assign(moduleAssets, { [file]: join(dirname(file), basename(module.userRequest)) });
123+
}
124+
125+
return emitFile.call(module, file, content, sourceMap);
126+
};
107127
};
108128

109-
module.exports = { beforeRunHook, emitHook, getCompilerHooks, moduleAssetHook };
129+
module.exports = { beforeRunHook, emitHook, getCompilerHooks, normalModuleLoaderHook };

lib/index.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
const { relative, resolve } = require('path');
22

3-
const { beforeRunHook, emitHook, getCompilerHooks, moduleAssetHook } = require('./hooks');
3+
const webpack = require('webpack');
4+
const NormalModule = require('webpack/lib/NormalModule');
5+
6+
const { beforeRunHook, emitHook, getCompilerHooks, normalModuleLoaderHook } = require('./hooks');
47

58
const emitCountMap = new Map();
69

@@ -19,6 +22,7 @@ const defaults = {
1922
},
2023
sort: null,
2124
transformExtensions: /^(gz|map)$/i,
25+
useEntryKeys: false,
2226
writeToFileEmit: false
2327
};
2428

@@ -40,16 +44,27 @@ class WebpackManifestPlugin {
4044
moduleAssets,
4145
options: this.options
4246
});
43-
const moduleAsset = moduleAssetHook.bind(this, { moduleAssets });
47+
const normalModuleLoader = normalModuleLoaderHook.bind(this, { moduleAssets });
4448
const hookOptions = {
4549
name: 'WebpackManifestPlugin',
4650
stage: Infinity
4751
};
4852

4953
compiler.hooks.compilation.tap(hookOptions, (compilation) => {
50-
compilation.hooks.moduleAsset.tap(hookOptions, moduleAsset);
54+
const hook = !NormalModule.getCompilationHooks
55+
? compilation.hooks.normalModuleLoader
56+
: NormalModule.getCompilationHooks(compilation).loader;
57+
hook.tap(hookOptions, normalModuleLoader);
5158
});
52-
compiler.hooks.emit.tap(hookOptions, emit);
59+
60+
if (webpack.version.startsWith('4')) {
61+
compiler.hooks.emit.tap(hookOptions, emit);
62+
} else {
63+
compiler.hooks.thisCompilation.tap(hookOptions, (compilation) => {
64+
compilation.hooks.processAssets.tap(hookOptions, () => emit(compilation));
65+
});
66+
}
67+
5368
compiler.hooks.run.tap(hookOptions, beforeRun);
5469
compiler.hooks.watchRun.tap(hookOptions, beforeRun);
5570
}

0 commit comments

Comments
 (0)