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