| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 23:09:32 +08:00
										 |  |  | const { SyncWaterfallHook, SyncHook } = require("tapable"); | 
					
						
							| 
									
										
										
										
											2018-03-22 19:05:58 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	ConcatSource, | 
					
						
							|  |  |  | 	OriginalSource, | 
					
						
							|  |  |  | 	PrefixSource, | 
					
						
							|  |  |  | 	RawSource | 
					
						
							|  |  |  | } = require("webpack-sources"); | 
					
						
							| 
									
										
										
										
											2018-11-05 21:36:15 +08:00
										 |  |  | const RuntimeGlobals = require("./RuntimeGlobals"); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | const Template = require("./Template"); | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | /** @typedef {import("webpack-sources").ConcatSource} ConcatSource */ | 
					
						
							| 
									
										
										
										
											2018-07-02 22:18:49 +08:00
										 |  |  | /** @typedef {import("webpack-sources").Source} Source */ | 
					
						
							| 
									
										
										
										
											2018-04-24 21:44:50 +08:00
										 |  |  | /** @typedef {import("./ModuleTemplate")} ModuleTemplate */ | 
					
						
							|  |  |  | /** @typedef {import("./Chunk")} Chunk */ | 
					
						
							|  |  |  | /** @typedef {import("./Module")} Module} */ | 
					
						
							| 
									
										
										
										
											2018-06-25 16:44:54 +08:00
										 |  |  | /** @typedef {import("./util/createHash").Hash} Hash} */ | 
					
						
							| 
									
										
										
										
											2018-07-11 19:05:13 +08:00
										 |  |  | /** @typedef {import("./DependencyTemplates")} DependencyTemplates} */ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | /** @typedef {import("./ModuleTemplate").RenderContext} RenderContext} */ | 
					
						
							|  |  |  | /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate} */ | 
					
						
							|  |  |  | /** @typedef {import("./ModuleGraph")} ModuleGraph} */ | 
					
						
							|  |  |  | /** @typedef {import("./ChunkGraph")} ChunkGraph} */ | 
					
						
							|  |  |  | /** @typedef {import("./Template").RenderManifestOptions} RenderManifestOptions} */ | 
					
						
							|  |  |  | /** @typedef {import("./Template").RenderManifestEntry} RenderManifestEntry} */ | 
					
						
							| 
									
										
										
										
											2018-05-01 23:47:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  |  * @typedef {Object} MainRenderContext | 
					
						
							|  |  |  |  * @property {Chunk} chunk the chunk | 
					
						
							|  |  |  |  * @property {DependencyTemplates} dependencyTemplates the dependency templates | 
					
						
							|  |  |  |  * @property {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							|  |  |  |  * @property {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @property {ChunkGraph} chunkGraph the chunk graph | 
					
						
							|  |  |  |  * @property {string} hash hash to be used for render call | 
					
						
							| 
									
										
										
										
											2018-05-01 23:47:14 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-01 23:47:14 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  |  * @typedef {Object} RenderBootstrapContext | 
					
						
							|  |  |  |  * @property {Chunk} chunk the chunk | 
					
						
							|  |  |  |  * @property {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							|  |  |  |  * @property {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @property {ChunkGraph} chunkGraph the chunk graph | 
					
						
							|  |  |  |  * @property {string} hash hash to be used for render call | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} UpdateHashForChunkContext | 
					
						
							|  |  |  |  * @property {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							|  |  |  |  * @property {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @property {ChunkGraph} chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2018-05-01 23:47:14 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 14:27:44 +08:00
										 |  |  | module.exports = class MainTemplate { | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2018-05-08 20:31:51 +08:00
										 |  |  | 	 * @param {TODO=} outputOptions output options for the MainTemplate | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	constructor(outputOptions) { | 
					
						
							| 
									
										
										
										
											2018-05-08 20:31:51 +08:00
										 |  |  | 		/** @type {TODO?} */ | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | 		this.outputOptions = outputOptions || {}; | 
					
						
							| 
									
										
										
										
											2018-07-30 20:25:40 +08:00
										 |  |  | 		this.hooks = Object.freeze({ | 
					
						
							| 
									
										
										
										
											2018-05-08 20:31:51 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<TODO[], RenderManifestOptions>} */ | 
					
						
							| 
									
										
										
										
											2018-01-24 16:39:49 +08:00
										 |  |  | 			renderManifest: new SyncWaterfallHook(["result", "options"]), | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<Source, ModuleTemplate, MainRenderContext>} */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			modules: new SyncWaterfallHook([ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				"source", | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				"moduleTemplate", | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				"renderContext" | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			]), | 
					
						
							| 
									
										
										
										
											2018-11-29 21:13:02 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<Source, ModuleTemplate, MainRenderContext>} */ | 
					
						
							|  |  |  | 			runtimeModules: new SyncWaterfallHook([ | 
					
						
							|  |  |  | 				"source", | 
					
						
							|  |  |  | 				"moduleTemplate", | 
					
						
							|  |  |  | 				"renderContext" | 
					
						
							|  |  |  | 			]), | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, RenderBootstrapContext>} */ | 
					
						
							|  |  |  | 			bootstrap: new SyncWaterfallHook(["source", "renderContext"]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, Chunk, string>} */ | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 			localVars: new SyncWaterfallHook(["source", "chunk", "hash"]), | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, RenderBootstrapContext>} */ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			require: new SyncWaterfallHook(["source", "renderContext"]), | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, RenderBootstrapContext>} */ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			requireExtensions: new SyncWaterfallHook(["source", "renderContext"]), | 
					
						
							| 
									
										
										
										
											2018-07-02 22:18:49 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, Chunk, string>} */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			beforeStartup: new SyncWaterfallHook(["source", "chunk", "hash"]), | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, RenderBootstrapContext>} */ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			startup: new SyncWaterfallHook(["source", "renderContext"]), | 
					
						
							|  |  |  | 			/** @type {SyncWaterfallHook<Source, ModuleTemplate, MainRenderContext>} */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			render: new SyncWaterfallHook([ | 
					
						
							|  |  |  | 				"source", | 
					
						
							|  |  |  | 				"moduleTemplate", | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				"renderContext" | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<Source, Chunk, string>} */ | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 			renderWithEntry: new SyncWaterfallHook(["source", "chunk", "hash"]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, Chunk, string, number|string>} */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			moduleRequire: new SyncWaterfallHook([ | 
					
						
							|  |  |  | 				"source", | 
					
						
							|  |  |  | 				"chunk", | 
					
						
							|  |  |  | 				"hash", | 
					
						
							|  |  |  | 				"moduleIdExpression" | 
					
						
							|  |  |  | 			]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncWaterfallHook<string, object>} */ | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 			assetPath: new SyncWaterfallHook(["path", "options"]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncHook<Hash>} */ | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 			hash: new SyncHook(["hash"]), | 
					
						
							| 
									
										
										
										
											2018-11-02 22:39:51 +08:00
										 |  |  | 			/** @type {SyncHook<Hash, Chunk>} */ | 
					
						
							| 
									
										
										
										
											2018-10-23 23:09:32 +08:00
										 |  |  | 			hashForChunk: new SyncHook(["hash", "chunk"]) | 
					
						
							| 
									
										
										
										
											2018-07-30 20:25:40 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		this.hooks.startup.tap( | 
					
						
							|  |  |  | 			"MainTemplate", | 
					
						
							|  |  |  | 			(source, { chunk, hash, chunkGraph }) => { | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 				const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements( | 
					
						
							|  |  |  | 					chunk | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				if (runtimeRequirements.has(RuntimeGlobals.startup)) { | 
					
						
							| 
									
										
										
										
											2018-11-23 16:37:33 +08:00
										 |  |  | 					return Template.asString([ | 
					
						
							|  |  |  | 						"// run modules when ready", | 
					
						
							|  |  |  | 						`return ${RuntimeGlobals.startup}();` | 
					
						
							|  |  |  | 					]); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				/** @type {string[]} */ | 
					
						
							|  |  |  | 				if (chunkGraph.getNumberOfEntryModules(chunk) > 0) { | 
					
						
							| 
									
										
										
										
											2018-11-23 16:37:33 +08:00
										 |  |  | 					const buf = []; | 
					
						
							|  |  |  | 					const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements( | 
					
						
							| 
									
										
										
										
											2018-11-20 16:51:45 +08:00
										 |  |  | 						chunk | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 					buf.push("// Load entry module and return exports"); | 
					
						
							|  |  |  | 					let i = chunkGraph.getNumberOfEntryModules(chunk); | 
					
						
							|  |  |  | 					for (const entryModule of chunkGraph.getChunkEntryModulesIterable( | 
					
						
							|  |  |  | 						chunk | 
					
						
							|  |  |  | 					)) { | 
					
						
							|  |  |  | 						const mayReturn = --i === 0 ? "return " : ""; | 
					
						
							| 
									
										
										
										
											2018-08-28 17:56:48 +08:00
										 |  |  | 						const moduleId = chunkGraph.getModuleId(entryModule); | 
					
						
							| 
									
										
										
										
											2018-11-20 16:51:45 +08:00
										 |  |  | 						let moduleIdExpr = JSON.stringify(moduleId); | 
					
						
							|  |  |  | 						if (runtimeRequirements.has(RuntimeGlobals.entryModuleId)) { | 
					
						
							|  |  |  | 							moduleIdExpr = `${ | 
					
						
							|  |  |  | 								RuntimeGlobals.entryModuleId | 
					
						
							|  |  |  | 							} = ${moduleIdExpr}`;
 | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 						buf.push(`${mayReturn}__webpack_require__(${moduleIdExpr});`); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-11-23 16:37:33 +08:00
										 |  |  | 					return Template.asString(buf); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-11-23 16:37:33 +08:00
										 |  |  | 				return source; | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		this.hooks.render.tap( | 
					
						
							|  |  |  | 			"MainTemplate", | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			(bootstrapSource, moduleTemplate, renderContext) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const source = new ConcatSource(); | 
					
						
							| 
									
										
										
										
											2018-11-29 21:13:02 +08:00
										 |  |  | 				source.add( | 
					
						
							|  |  |  | 					"/******/ (function(modules, runtime) { // webpackBootstrap\n" | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				source.add('/******/"use strict";\n'); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				source.add(new PrefixSource("/******/", bootstrapSource)); | 
					
						
							|  |  |  | 				source.add("/******/ })\n"); | 
					
						
							|  |  |  | 				source.add( | 
					
						
							|  |  |  | 					"/************************************************************************/\n" | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				source.add("/******/ ("); | 
					
						
							|  |  |  | 				source.add( | 
					
						
							|  |  |  | 					this.hooks.modules.call( | 
					
						
							|  |  |  | 						new RawSource(""), | 
					
						
							|  |  |  | 						moduleTemplate, | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 						renderContext | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-11-29 21:13:02 +08:00
										 |  |  | 				const runtimeModules = renderContext.chunkGraph.getChunkRuntimeModulesInOrder( | 
					
						
							|  |  |  | 					renderContext.chunk | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				if (runtimeModules.length > 0) { | 
					
						
							|  |  |  | 					source.add(","); | 
					
						
							|  |  |  | 					source.add( | 
					
						
							|  |  |  | 						Template.renderChunkRuntimeModules(runtimeModules, renderContext) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				source.add(")"); | 
					
						
							|  |  |  | 				return source; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-12-14 04:35:39 +08:00
										 |  |  | 		this.hooks.localVars.tap("MainTemplate", (source, chunk, hash) => { | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | 			return Template.asString([ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				source, | 
					
						
							|  |  |  | 				"// The module cache", | 
					
						
							|  |  |  | 				"var installedModules = {};" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		this.hooks.require.tap("MainTemplate", (source, renderContext) => { | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 			const { chunk, chunkGraph } = renderContext; | 
					
						
							|  |  |  | 			const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk); | 
					
						
							|  |  |  | 			const moduleExecution = runtimeRequirements.has( | 
					
						
							|  |  |  | 				RuntimeGlobals.interceptModuleExecution | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 				? Template.asString([ | 
					
						
							|  |  |  | 						"const execOptions = { id: moduleId, module: module, factory: modules[moduleId], require: __webpack_require__ };", | 
					
						
							|  |  |  | 						`${ | 
					
						
							|  |  |  | 							RuntimeGlobals.interceptModuleExecution | 
					
						
							|  |  |  | 						}.forEach(function(handler) { handler(execOptions); });`,
 | 
					
						
							|  |  |  | 						"module = execOptions.module;", | 
					
						
							|  |  |  | 						"execOptions.factory.call(module.exports, module, module.exports, execOptions.require);" | 
					
						
							|  |  |  | 				  ]) | 
					
						
							|  |  |  | 				: Template.asString([ | 
					
						
							|  |  |  | 						"modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);" | 
					
						
							|  |  |  | 				  ]); | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | 			return Template.asString([ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				source, | 
					
						
							|  |  |  | 				"// Check if module is in cache", | 
					
						
							| 
									
										
										
										
											2017-03-31 21:07:39 +08:00
										 |  |  | 				"if(installedModules[moduleId]) {", | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | 				Template.indent("return installedModules[moduleId].exports;"), | 
					
						
							| 
									
										
										
										
											2017-03-31 21:07:39 +08:00
										 |  |  | 				"}", | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				"// Create a new module (and put it into the cache)", | 
					
						
							|  |  |  | 				"var module = installedModules[moduleId] = {", | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 				Template.indent(["i: moduleId,", "l: false,", "exports: {}"]), | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				"};", | 
					
						
							|  |  |  | 				"", | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 				outputOptions.strictModuleExceptionHandling | 
					
						
							|  |  |  | 					? Template.asString([ | 
					
						
							|  |  |  | 							"// Execute the module function", | 
					
						
							|  |  |  | 							"var threw = true;", | 
					
						
							|  |  |  | 							"try {", | 
					
						
							|  |  |  | 							Template.indent([moduleExecution, "threw = false;"]), | 
					
						
							|  |  |  | 							"} finally {", | 
					
						
							|  |  |  | 							Template.indent(["if(threw) delete installedModules[moduleId];"]), | 
					
						
							|  |  |  | 							"}" | 
					
						
							|  |  |  | 					  ]) | 
					
						
							|  |  |  | 					: Template.asString([ | 
					
						
							|  |  |  | 							"// Execute the module function", | 
					
						
							|  |  |  | 							moduleExecution | 
					
						
							|  |  |  | 					  ]), | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				"", | 
					
						
							|  |  |  | 				"// Flag the module as loaded", | 
					
						
							|  |  |  | 				"module.l = true;", | 
					
						
							|  |  |  | 				"", | 
					
						
							|  |  |  | 				"// Return the exports of the module", | 
					
						
							|  |  |  | 				"return module.exports;" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		this.hooks.requireExtensions.tap( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			"MainTemplate", | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			(source, renderContext) => { | 
					
						
							| 
									
										
										
										
											2018-11-20 19:05:12 +08:00
										 |  |  | 				const { chunk, chunkGraph } = renderContext; | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				const buf = []; | 
					
						
							| 
									
										
										
										
											2018-11-20 19:05:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-23 16:37:33 +08:00
										 |  |  | 				const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements( | 
					
						
							| 
									
										
										
										
											2018-11-20 16:31:36 +08:00
										 |  |  | 					chunk | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-11-20 19:05:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-20 16:31:36 +08:00
										 |  |  | 				if (runtimeRequirements.has(RuntimeGlobals.moduleFactories)) { | 
					
						
							|  |  |  | 					buf.push(""); | 
					
						
							|  |  |  | 					buf.push("// expose the modules object (__webpack_modules__)"); | 
					
						
							|  |  |  | 					buf.push(`${RuntimeGlobals.moduleFactories} = modules;`); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-20 16:44:35 +08:00
										 |  |  | 				if (runtimeRequirements.has(RuntimeGlobals.moduleCache)) { | 
					
						
							|  |  |  | 					buf.push(""); | 
					
						
							|  |  |  | 					buf.push("// expose the module cache"); | 
					
						
							|  |  |  | 					buf.push(`${RuntimeGlobals.moduleCache} = installedModules;`); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-28 20:07:40 +08:00
										 |  |  | 				if (runtimeRequirements.has(RuntimeGlobals.interceptModuleExecution)) { | 
					
						
							|  |  |  | 					buf.push(""); | 
					
						
							|  |  |  | 					buf.push("// expose the module execution interceptor"); | 
					
						
							|  |  |  | 					buf.push(`${RuntimeGlobals.interceptModuleExecution} = [];`); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 				return Template.asString(buf); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-11-05 20:13:05 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-20 22:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-05 20:13:05 +08:00
										 |  |  | 	get requireFn() { | 
					
						
							|  |  |  | 		return "__webpack_require__"; | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-08 06:10:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2018-05-01 23:47:14 +08:00
										 |  |  | 	 * @param {RenderManifestOptions} options render manifest options | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 	 * @returns {RenderManifestEntry[]} returns render manifest | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-10-30 20:56:57 +08:00
										 |  |  | 	getRenderManifest(options) { | 
					
						
							|  |  |  | 		const result = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-24 16:39:49 +08:00
										 |  |  | 		this.hooks.renderManifest.call(result, options); | 
					
						
							| 
									
										
										
										
											2017-10-30 20:56:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return result; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	 * @param {RenderBootstrapContext} renderContext options object | 
					
						
							| 
									
										
										
										
											2018-09-14 05:25:26 +08:00
										 |  |  | 	 * @returns {string[]} the generated source of the bootstrap code | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	renderBootstrap(renderContext) { | 
					
						
							|  |  |  | 		const { hash, chunk } = renderContext; | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 		const buf = []; | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 		buf.push(this.hooks.bootstrap.call("", renderContext)); | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 		buf.push(this.hooks.localVars.call("", chunk, hash)); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		buf.push(""); | 
					
						
							|  |  |  | 		buf.push("// The require function"); | 
					
						
							| 
									
										
										
										
											2018-11-05 20:13:05 +08:00
										 |  |  | 		buf.push(`function __webpack_require__(moduleId) {`); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		buf.push(Template.indent(this.hooks.require.call("", renderContext))); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		buf.push("}"); | 
					
						
							|  |  |  | 		buf.push(""); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		buf.push( | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			Template.asString(this.hooks.requireExtensions.call("", renderContext)) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 		buf.push(""); | 
					
						
							| 
									
										
										
										
											2018-11-29 21:13:02 +08:00
										 |  |  | 		if ( | 
					
						
							|  |  |  | 			renderContext.chunkGraph.getNumberOfRuntimeModules(renderContext.chunk) > | 
					
						
							|  |  |  | 			0 | 
					
						
							|  |  |  | 		) { | 
					
						
							|  |  |  | 			buf.push("// initialize runtime"); | 
					
						
							|  |  |  | 			buf.push("runtime(__webpack_require__);"); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		buf.push(Template.asString(this.hooks.beforeStartup.call("", chunk, hash))); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		buf.push(Template.asString(this.hooks.startup.call("", renderContext))); | 
					
						
							| 
									
										
										
										
											2018-09-14 05:25:26 +08:00
										 |  |  | 		return buf; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	 * @param {MainRenderContext} renderContext options object | 
					
						
							| 
									
										
										
										
											2018-09-14 05:25:26 +08:00
										 |  |  | 	 * @returns {ConcatSource} the newly generated source from rendering | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	render(moduleTemplate, renderContext) { | 
					
						
							|  |  |  | 		const { hash, chunk, chunkGraph } = renderContext; | 
					
						
							|  |  |  | 		const buf = this.renderBootstrap(renderContext); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		let source = this.hooks.render.call( | 
					
						
							|  |  |  | 			new OriginalSource( | 
					
						
							|  |  |  | 				Template.prefix(buf, " \t") + "\n", | 
					
						
							|  |  |  | 				"webpack/bootstrap" | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			moduleTemplate, | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 			renderContext | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 		if (chunkGraph.getNumberOfEntryModules(chunk) > 0) { | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 			source = this.hooks.renderWithEntry.call(source, chunk, hash); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		if (!source) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			throw new Error( | 
					
						
							|  |  |  | 				"Compiler error: MainTemplate plugin 'render' should return something" | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		chunk.rendered = true; | 
					
						
							|  |  |  | 		return new ConcatSource(source, ";"); | 
					
						
							| 
									
										
										
										
											2014-12-22 23:10:23 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-12 22:16:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param {object} options get public path options | 
					
						
							| 
									
										
										
										
											2018-05-08 20:31:51 +08:00
										 |  |  | 	 * @returns {string} hook call | 
					
						
							| 
									
										
										
										
											2018-04-21 08:35:02 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	getPublicPath(options) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		return this.hooks.assetPath.call( | 
					
						
							|  |  |  | 			this.outputOptions.publicPath || "", | 
					
						
							|  |  |  | 			options | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	getAssetPath(path, options) { | 
					
						
							|  |  |  | 		return this.hooks.assetPath.call(path, options); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-17 16:17:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-25 16:44:54 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Updates hash with information from this template | 
					
						
							|  |  |  | 	 * @param {Hash} hash the hash to update | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	updateHash(hash) { | 
					
						
							|  |  |  | 		hash.update("maintemplate"); | 
					
						
							|  |  |  | 		hash.update("3"); | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 		this.hooks.hash.call(hash); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-20 03:35:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-25 16:44:54 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Updates hash with chunk-specific information from this template | 
					
						
							|  |  |  | 	 * @param {Hash} hash the hash to update | 
					
						
							|  |  |  | 	 * @param {Chunk} chunk the chunk | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	 * @param {UpdateHashForChunkContext} context options object | 
					
						
							| 
									
										
										
										
											2018-06-25 16:44:54 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 	updateHashForChunk(hash, chunk, context) { | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		this.updateHash(hash); | 
					
						
							| 
									
										
										
										
											2017-11-29 01:43:01 +08:00
										 |  |  | 		this.hooks.hashForChunk.call(hash, chunk); | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 		for (const line of this.renderBootstrap({ | 
					
						
							|  |  |  | 			hash: "0000", | 
					
						
							| 
									
										
										
										
											2018-09-14 05:25:26 +08:00
										 |  |  | 			chunk, | 
					
						
							| 
									
										
										
										
											2018-09-15 19:10:58 +08:00
										 |  |  | 			chunkGraph: context.chunkGraph, | 
					
						
							|  |  |  | 			moduleGraph: context.moduleGraph, | 
					
						
							|  |  |  | 			runtimeTemplate: context.runtimeTemplate | 
					
						
							|  |  |  | 		})) { | 
					
						
							| 
									
										
										
										
											2018-09-14 05:25:26 +08:00
										 |  |  | 			hash.update(line); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | }; |