UNPKG

@zohodesk/client_build_tool

Version:

A CLI tool to build web applications and client libraries

49 lines (39 loc) 1.68 kB
"use strict"; const { RawSource } = require('webpack-sources'); class InjectChunkGraphPlugin { constructor(resourceHints) { this.chunkNames = resourceHints.PreloadChunkNames || []; } apply(compiler) { compiler.hooks.thisCompilation.tap('InjectChunkGraphPlugin', compilation => { compilation.hooks.processAssets.tap({ name: 'InjectChunkGraphPlugin', stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS }, () => { const stats = compilation.getStats().toJson({ all: true }); const chunkGraph = {}; this.chunkNames.forEach(chunkName => { const chunkGroup = stats.namedChunkGroups?.[chunkName]; if (!chunkGroup) { compilation.warnings.push(new Error(`[InjectChunkGraphPlugin] Chunk group "${chunkName}" not found.`)); return; } chunkGraph[chunkName] = chunkGroup.chunks; }); // Find runtime chunk file const runtimeChunk = stats.chunks.find(chunk => chunk.names?.some(n => n.includes('runtime~main'))); const runtimeChunkName = runtimeChunk.files[0]; const originalSource = compilation.assets[runtimeChunkName].source(); const newSource = originalSource.replace('__PRELOAD_CHUNK_GRAPH__', `${JSON.stringify(chunkGraph)}`); // Update the runtime asset with injected code compilation.updateAsset(runtimeChunkName, new RawSource(newSource)); if (runtimeChunkName.includes('smap/')) { compilation.updateAsset(runtimeChunkName.replace('smap/', ''), new RawSource(newSource)); } }); }); } } module.exports = InjectChunkGraphPlugin;