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
"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
|