| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const Parser = require("./Parser");const Template = require("./Template");const { ConcatSource } = require("webpack-sources");const JavascriptGenerator = require("./JavascriptGenerator");const createHash = require("./util/createHash");class JavascriptModulesPlugin {	apply(compiler) {		compiler.hooks.compilation.tap(			"JavascriptModulesPlugin",			(compilation, { normalModuleFactory }) => {				normalModuleFactory.hooks.createParser					.for("javascript/auto")					.tap("JavascriptModulesPlugin", options => {						return new Parser(options, "auto");					});				normalModuleFactory.hooks.createParser					.for("javascript/dynamic")					.tap("JavascriptModulesPlugin", options => {						return new Parser(options, "script");					});				normalModuleFactory.hooks.createParser					.for("javascript/esm")					.tap("JavascriptModulesPlugin", options => {						return new Parser(options, "module");					});				normalModuleFactory.hooks.createGenerator					.for("javascript/auto")					.tap("JavascriptModulesPlugin", () => {						return new JavascriptGenerator();					});				normalModuleFactory.hooks.createGenerator					.for("javascript/dynamic")					.tap("JavascriptModulesPlugin", () => {						return new JavascriptGenerator();					});				normalModuleFactory.hooks.createGenerator					.for("javascript/esm")					.tap("JavascriptModulesPlugin", () => {						return new JavascriptGenerator();					});				compilation.mainTemplate.hooks.renderManifest.tap(					"JavascriptModulesPlugin",					(result, options) => {						const chunk = options.chunk;						const hash = options.hash;						const fullHash = options.fullHash;						const outputOptions = options.outputOptions;						const moduleTemplates = options.moduleTemplates;						const dependencyTemplates = options.dependencyTemplates;						const filenameTemplate =							chunk.filenameTemplate || outputOptions.filename;						const useChunkHash = compilation.mainTemplate.useChunkHash(chunk);						result.push({							render: () =>								compilation.mainTemplate.render(									hash,									chunk,									moduleTemplates.javascript,									dependencyTemplates								),							filenameTemplate,							pathOptions: {								noChunkHash: !useChunkHash,								contentHashType: "javascript",								chunk							},							identifier: `chunk${chunk.id}`,							hash: useChunkHash ? chunk.hash : fullHash						});						return result;					}				);				compilation.mainTemplate.hooks.modules.tap(					"JavascriptModulesPlugin",					(source, chunk, hash, moduleTemplate, dependencyTemplates) => {						return Template.renderChunkModules(							chunk,							m => typeof m.source === "function",							moduleTemplate,							dependencyTemplates,							"/******/ "						);					}				);				compilation.chunkTemplate.hooks.renderManifest.tap(					"JavascriptModulesPlugin",					(result, options) => {						const chunk = options.chunk;						const outputOptions = options.outputOptions;						const moduleTemplates = options.moduleTemplates;						const dependencyTemplates = options.dependencyTemplates;						const filenameTemplate =							chunk.filenameTemplate || outputOptions.chunkFilename;						result.push({							render: () =>								this.renderJavascript(									compilation.chunkTemplate,									chunk,									moduleTemplates.javascript,									dependencyTemplates								),							filenameTemplate,							pathOptions: {								chunk,								contentHashType: "javascript"							},							identifier: `chunk${chunk.id}`,							hash: chunk.hash						});						return result;					}				);				compilation.hooks.contentHash.tap("JavascriptModulesPlugin", chunk => {					const outputOptions = compilation.outputOptions;					const {						hashSalt,						hashDigest,						hashDigestLength,						hashFunction					} = outputOptions;					const hash = createHash(hashFunction);					if (hashSalt) hash.update(hashSalt);					const template = chunk.hasRuntime()						? compilation.mainTemplate						: compilation.chunkTemplate;					hash.update(`${chunk.id} `);					hash.update(chunk.ids ? chunk.ids.join(",") : "");					template.updateHashForChunk(						hash,						chunk,						compilation.moduleTemplates.javascript,						compilation.dependencyTemplates					);					for (const m of chunk.modulesIterable) {						if (typeof m.source === "function") {							hash.update(m.hash);						}					}					const digest = /** @type {string} */ (hash.digest(hashDigest));					chunk.contentHash.javascript = digest.substr(0, hashDigestLength);				});			}		);	}	renderJavascript(chunkTemplate, chunk, moduleTemplate, dependencyTemplates) {		const moduleSources = Template.renderChunkModules(			chunk,			m => typeof m.source === "function",			moduleTemplate,			dependencyTemplates		);		const core = chunkTemplate.hooks.modules.call(			moduleSources,			chunk,			moduleTemplate,			dependencyTemplates		);		let source = chunkTemplate.hooks.render.call(			core,			chunk,			moduleTemplate,			dependencyTemplates		);		if (chunk.hasEntryModule()) {			source = chunkTemplate.hooks.renderWithEntry.call(source, chunk);		}		chunk.rendered = true;		return new ConcatSource(source, ";");	}}module.exports = JavascriptModulesPlugin;
 |