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.
96 lines
4.1 KiB
96 lines
4.1 KiB
2 years ago
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.normalModuleLoaderHook = exports.getCompilerHooks = exports.emitHook = exports.beforeRunHook = void 0;
|
||
|
const fs_1 = require("fs");
|
||
|
const path_1 = require("path");
|
||
|
const tapable_1 = require("tapable");
|
||
|
const webpack_sources_1 = require("webpack-sources");
|
||
|
const helpers_1 = require("./helpers");
|
||
|
const compilerHookMap = new WeakMap();
|
||
|
const getCompilerHooks = (compiler) => {
|
||
|
let hooks = compilerHookMap.get(compiler);
|
||
|
if (typeof hooks === 'undefined') {
|
||
|
hooks = {
|
||
|
afterEmit: new tapable_1.SyncWaterfallHook(['manifest']),
|
||
|
beforeEmit: new tapable_1.SyncWaterfallHook(['manifest'])
|
||
|
};
|
||
|
compilerHookMap.set(compiler, hooks);
|
||
|
}
|
||
|
return hooks;
|
||
|
};
|
||
|
exports.getCompilerHooks = getCompilerHooks;
|
||
|
const beforeRunHook = ({ emitCountMap, manifestFileName }, _, callback) => {
|
||
|
const emitCount = emitCountMap.get(manifestFileName) || 0;
|
||
|
emitCountMap.set(manifestFileName, emitCount + 1);
|
||
|
if (callback) {
|
||
|
callback();
|
||
|
}
|
||
|
};
|
||
|
exports.beforeRunHook = beforeRunHook;
|
||
|
const emitHook = function emit({ compiler, emitCountMap, manifestAssetId, manifestFileName, moduleAssets, options }, compilation) {
|
||
|
const emitCount = emitCountMap.get(manifestFileName) - 1;
|
||
|
const stats = compilation.getStats().toJson({
|
||
|
all: false,
|
||
|
assets: true,
|
||
|
cachedAssets: true,
|
||
|
ids: true,
|
||
|
publicPath: true
|
||
|
});
|
||
|
const publicPath = options.publicPath !== null ? options.publicPath : stats.publicPath;
|
||
|
const { basePath, removeKeyHash } = options;
|
||
|
emitCountMap.set(manifestFileName, emitCount);
|
||
|
const auxiliaryFiles = {};
|
||
|
let files = Array.from(compilation.chunks).reduce((prev, chunk) => helpers_1.reduceChunk(prev, chunk, options, auxiliaryFiles), []);
|
||
|
files = stats.assets.reduce((prev, asset) => helpers_1.reduceAssets(prev, asset, moduleAssets), files);
|
||
|
files = files.filter(({ name, path }) => {
|
||
|
var _a;
|
||
|
return !path.includes('hot-update') &&
|
||
|
typeof emitCountMap.get(path_1.join(((_a = compiler.options.output) === null || _a === void 0 ? void 0 : _a.path) || '<unknown>', name)) ===
|
||
|
'undefined';
|
||
|
});
|
||
|
files.forEach((file) => {
|
||
|
delete auxiliaryFiles[file.path];
|
||
|
});
|
||
|
Object.keys(auxiliaryFiles).forEach((auxiliaryFile) => {
|
||
|
files = files.concat(auxiliaryFiles[auxiliaryFile]);
|
||
|
});
|
||
|
files = files.map((file) => {
|
||
|
const normalizePath = (path) => {
|
||
|
if (!path.endsWith('/')) {
|
||
|
return `${path}/`;
|
||
|
}
|
||
|
return path;
|
||
|
};
|
||
|
const changes = {
|
||
|
name: basePath ? normalizePath(basePath) + file.name : file.name,
|
||
|
path: publicPath ? normalizePath(publicPath) + file.path : file.path
|
||
|
};
|
||
|
changes.name = removeKeyHash ? changes.name.replace(removeKeyHash, '') : changes.name;
|
||
|
return Object.assign(file, changes);
|
||
|
});
|
||
|
files = helpers_1.transformFiles(files, options);
|
||
|
let manifest = helpers_1.generateManifest(compilation, files, options);
|
||
|
const isLastEmit = emitCount === 0;
|
||
|
manifest = getCompilerHooks(compiler).beforeEmit.call(manifest);
|
||
|
if (isLastEmit) {
|
||
|
const output = options.serialize(manifest);
|
||
|
compilation.emitAsset(manifestAssetId, new webpack_sources_1.RawSource(output));
|
||
|
if (options.writeToFileEmit) {
|
||
|
fs_1.mkdirSync(path_1.dirname(manifestFileName), { recursive: true });
|
||
|
fs_1.writeFileSync(manifestFileName, output);
|
||
|
}
|
||
|
}
|
||
|
getCompilerHooks(compiler).afterEmit.call(manifest);
|
||
|
};
|
||
|
exports.emitHook = emitHook;
|
||
|
const normalModuleLoaderHook = ({ moduleAssets }, loaderContext, module) => {
|
||
|
const { emitFile } = loaderContext;
|
||
|
loaderContext.emitFile = (file, content, sourceMap) => {
|
||
|
if (module.userRequest && !moduleAssets[file]) {
|
||
|
Object.assign(moduleAssets, { [file]: path_1.join(path_1.dirname(file), path_1.basename(module.userRequest)) });
|
||
|
}
|
||
|
return emitFile.call(module, file, content, sourceMap);
|
||
|
};
|
||
|
};
|
||
|
exports.normalModuleLoaderHook = normalModuleLoaderHook;
|
||
|
//# sourceMappingURL=hooks.js.map
|