| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ConcatSource = require("webpack-sources").ConcatSource; | 
					
						
							|  |  |  | const OriginalSource = require("webpack-sources").OriginalSource; | 
					
						
							|  |  |  | const PrefixSource = require("webpack-sources").PrefixSource; | 
					
						
							|  |  |  | const Template = require("./Template"); | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 20:57:53 +08:00
										 |  |  | // require function shortcuts:
 | 
					
						
							|  |  |  | // __webpack_require__.s = the module id of the entry point
 | 
					
						
							|  |  |  | // __webpack_require__.c = the module cache
 | 
					
						
							|  |  |  | // __webpack_require__.m = the module functions
 | 
					
						
							|  |  |  | // __webpack_require__.p = the bundle public path
 | 
					
						
							|  |  |  | // __webpack_require__.i = the identity function used for harmony imports
 | 
					
						
							|  |  |  | // __webpack_require__.e = the chunk ensure function
 | 
					
						
							|  |  |  | // __webpack_require__.d = the exported propery define getter function
 | 
					
						
							|  |  |  | // __webpack_require__.o = Object.prototype.hasOwnProperty.call
 | 
					
						
							|  |  |  | // __webpack_require__.n = compatibility get default export
 | 
					
						
							|  |  |  | // __webpack_require__.h = the webpack hash
 | 
					
						
							|  |  |  | // __webpack_require__.oe = the uncatched error handler for the webpack runtime
 | 
					
						
							| 
									
										
										
										
											2016-08-30 02:49:11 +08:00
										 |  |  | // __webpack_require__.nc = the script nonce
 | 
					
						
							| 
									
										
										
										
											2015-06-13 17:45:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | module.exports = class MainTemplate extends Template { | 
					
						
							|  |  |  | 	constructor(outputOptions) { | 
					
						
							|  |  |  | 		super(outputOptions); | 
					
						
							|  |  |  | 		this.plugin("startup", (source, chunk, hash) => { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 			const buf = []; | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			if(chunk.entryModule) { | 
					
						
							|  |  |  | 				buf.push("// Load entry module and return exports"); | 
					
						
							| 
									
										
										
										
											2017-03-06 04:00:43 +08:00
										 |  |  | 				buf.push(`return ${this.renderRequireFunctionForModule(hash, chunk, JSON.stringify(chunk.entryModule.id))}(${this.requireFn}.s = ${JSON.stringify(chunk.entryModule.id)});`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			return this.asString(buf); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.plugin("render", (bootstrapSource, chunk, hash, moduleTemplate, dependencyTemplates) => { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 			const source = new ConcatSource(); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			source.add("/******/ (function(modules) { // webpackBootstrap\n"); | 
					
						
							|  |  |  | 			source.add(new PrefixSource("/******/", bootstrapSource)); | 
					
						
							|  |  |  | 			source.add("/******/ })\n"); | 
					
						
							|  |  |  | 			source.add("/************************************************************************/\n"); | 
					
						
							|  |  |  | 			source.add("/******/ ("); | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 			const modules = this.renderChunkModules(chunk, moduleTemplate, dependencyTemplates, "/******/ "); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			source.add(this.applyPluginsWaterfall("modules", modules, chunk, hash, moduleTemplate, dependencyTemplates)); | 
					
						
							|  |  |  | 			source.add(")"); | 
					
						
							|  |  |  | 			return source; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.plugin("local-vars", (source, chunk, hash) => { | 
					
						
							|  |  |  | 			return this.asString([ | 
					
						
							|  |  |  | 				source, | 
					
						
							|  |  |  | 				"// The module cache", | 
					
						
							|  |  |  | 				"var installedModules = {};" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.plugin("require", (source, chunk, hash) => { | 
					
						
							|  |  |  | 			return this.asString([ | 
					
						
							|  |  |  | 				source, | 
					
						
							|  |  |  | 				"// Check if module is in cache", | 
					
						
							| 
									
										
										
										
											2017-03-31 21:07:39 +08:00
										 |  |  | 				"if(installedModules[moduleId]) {", | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				this.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] = {", | 
					
						
							|  |  |  | 				this.indent(this.applyPluginsWaterfall("module-obj", "", chunk, hash, "moduleId")), | 
					
						
							|  |  |  | 				"};", | 
					
						
							|  |  |  | 				"", | 
					
						
							|  |  |  | 				this.asString(outputOptions.strictModuleExceptionHandling ? [ | 
					
						
							|  |  |  | 					"// Execute the module function", | 
					
						
							|  |  |  | 					"var threw = true;", | 
					
						
							|  |  |  | 					"try {", | 
					
						
							|  |  |  | 					this.indent([ | 
					
						
							| 
									
										
										
										
											2017-03-14 10:30:01 +08:00
										 |  |  | 						`modules[moduleId].call(module.exports, module, module.exports, ${this.renderRequireFunctionForModule(hash, chunk, "moduleId")});`, | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 						"threw = false;" | 
					
						
							|  |  |  | 					]), | 
					
						
							|  |  |  | 					"} finally {", | 
					
						
							|  |  |  | 					this.indent([ | 
					
						
							|  |  |  | 						"if(threw) delete installedModules[moduleId];" | 
					
						
							|  |  |  | 					]), | 
					
						
							|  |  |  | 					"}" | 
					
						
							|  |  |  | 				] : [ | 
					
						
							|  |  |  | 					"// Execute the module function", | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 					`modules[moduleId].call(module.exports, module, module.exports, ${this.renderRequireFunctionForModule(hash, chunk, "moduleId")});`, | 
					
						
							| 
									
										
										
										
											2016-11-10 15:52:00 +08:00
										 |  |  | 				]), | 
					
						
							| 
									
										
										
										
											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;" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.plugin("module-obj", (source, chunk, hash, varModuleId) => { | 
					
						
							|  |  |  | 			return this.asString([ | 
					
						
							|  |  |  | 				"i: moduleId,", | 
					
						
							|  |  |  | 				"l: false,", | 
					
						
							|  |  |  | 				"exports: {}" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.plugin("require-extensions", (source, chunk, hash) => { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 			const buf = []; | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			if(chunk.chunks.length > 0) { | 
					
						
							|  |  |  | 				buf.push("// This file contains only the entry chunk."); | 
					
						
							|  |  |  | 				buf.push("// The chunk loading function for additional chunks"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 				buf.push(`${this.requireFn}.e = function requireEnsure(chunkId) {`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				buf.push(this.indent(this.applyPluginsWaterfall("require-ensure", "throw new Error('Not chunk loading available');", chunk, hash, "chunkId"))); | 
					
						
							|  |  |  | 				buf.push("};"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// expose the modules object (__webpack_modules__)"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.m = modules;`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// expose the module cache"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.c = installedModules;`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// identity function for calling harmony imports with the correct context"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.i = function(value) { return value; };`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// define getter function for harmony exports"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.d = function(exports, name, getter) {`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			buf.push(this.indent([ | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 				`if(!${this.requireFn}.o(exports, name)) {`, | 
					
						
							| 
									
										
										
										
											2016-11-10 15:52:00 +08:00
										 |  |  | 				this.indent([ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 					"Object.defineProperty(exports, name, {", | 
					
						
							|  |  |  | 					this.indent([ | 
					
						
							|  |  |  | 						"configurable: false,", | 
					
						
							|  |  |  | 						"enumerable: true,", | 
					
						
							|  |  |  | 						"get: getter" | 
					
						
							|  |  |  | 					]), | 
					
						
							|  |  |  | 					"});" | 
					
						
							| 
									
										
										
										
											2016-11-10 15:52:00 +08:00
										 |  |  | 				]), | 
					
						
							|  |  |  | 				"}" | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			])); | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 			buf.push("};"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// getDefaultExport function for compatibility with non-harmony modules"); | 
					
						
							|  |  |  | 			buf.push(this.requireFn + ".n = function(module) {"); | 
					
						
							|  |  |  | 			buf.push(this.indent([ | 
					
						
							|  |  |  | 				"var getter = module && module.__esModule ?", | 
					
						
							| 
									
										
										
										
											2016-12-05 06:16:33 +08:00
										 |  |  | 				this.indent([ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 					"function getDefault() { return module['default']; } :", | 
					
						
							|  |  |  | 					"function getModuleExports() { return module; };" | 
					
						
							| 
									
										
										
										
											2016-12-05 06:16:33 +08:00
										 |  |  | 				]), | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 				`${this.requireFn}.d(getter, 'a', getter);`, | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				"return getter;" | 
					
						
							|  |  |  | 			])); | 
					
						
							|  |  |  | 			buf.push("};"); | 
					
						
							| 
									
										
										
										
											2016-06-08 06:10:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// Object.prototype.hasOwnProperty.call"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 			const publicPath = this.getPublicPath({ | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 				hash: hash | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			buf.push(""); | 
					
						
							|  |  |  | 			buf.push("// __webpack_public_path__"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 			buf.push(`${this.requireFn}.p = ${JSON.stringify(publicPath)};`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			return this.asString(buf); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-07-20 22:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		this.requireFn = "__webpack_require__"; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-08 06:10:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	render(hash, chunk, moduleTemplate, dependencyTemplates) { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 		const buf = []; | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		buf.push(this.applyPluginsWaterfall("bootstrap", "", chunk, hash, moduleTemplate, dependencyTemplates)); | 
					
						
							|  |  |  | 		buf.push(this.applyPluginsWaterfall("local-vars", "", chunk, hash)); | 
					
						
							|  |  |  | 		buf.push(""); | 
					
						
							|  |  |  | 		buf.push("// The require function"); | 
					
						
							| 
									
										
										
										
											2017-02-11 03:08:08 +08:00
										 |  |  | 		buf.push(`function ${this.requireFn}(moduleId) {`); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		buf.push(this.indent(this.applyPluginsWaterfall("require", "", chunk, hash))); | 
					
						
							|  |  |  | 		buf.push("}"); | 
					
						
							|  |  |  | 		buf.push(""); | 
					
						
							|  |  |  | 		buf.push(this.asString(this.applyPluginsWaterfall("require-extensions", "", chunk, hash))); | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 		buf.push(""); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		buf.push(this.asString(this.applyPluginsWaterfall("startup", "", chunk, hash))); | 
					
						
							| 
									
										
										
										
											2017-03-06 04:00:43 +08:00
										 |  |  | 		let source = this.applyPluginsWaterfall("render", new OriginalSource(this.prefix(buf, " \t") + "\n", `webpack/bootstrap ${hash}`), chunk, hash, moduleTemplate, dependencyTemplates); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		if(chunk.hasEntryModule()) { | 
					
						
							|  |  |  | 			source = this.applyPluginsWaterfall("render-with-entry", source, chunk, hash); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(!source) throw new Error("Compiler error: MainTemplate plugin 'render' should return something"); | 
					
						
							|  |  |  | 		chunk.rendered = true; | 
					
						
							|  |  |  | 		return new ConcatSource(source, ";"); | 
					
						
							| 
									
										
										
										
											2014-12-22 23:10:23 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-12 22:16:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	renderRequireFunctionForModule(hash, chunk, varModuleId) { | 
					
						
							|  |  |  | 		return this.applyPluginsWaterfall("module-require", this.requireFn, chunk, hash, varModuleId); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	renderAddModule(hash, chunk, varModuleId, varModule) { | 
					
						
							| 
									
										
										
										
											2017-03-06 04:00:43 +08:00
										 |  |  | 		return this.applyPluginsWaterfall("add-module", `modules[${varModuleId}] = ${varModule};`, chunk, hash, varModuleId, varModule); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-12 22:16:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	renderCurrentHashCode(hash, length) { | 
					
						
							|  |  |  | 		length = length || Infinity; | 
					
						
							|  |  |  | 		return this.applyPluginsWaterfall("current-hash", JSON.stringify(hash.substr(0, length)), length); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-17 07:56:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	entryPointInChildren(chunk) { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 		const checkChildren = (chunk, alreadyCheckedChunks) => { | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 			return chunk.chunks.some((child) => { | 
					
						
							|  |  |  | 				if(alreadyCheckedChunks.indexOf(child) >= 0) return; | 
					
						
							|  |  |  | 				alreadyCheckedChunks.push(child); | 
					
						
							|  |  |  | 				return child.hasEntryModule() || checkChildren(child, alreadyCheckedChunks); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		return checkChildren(chunk, []); | 
					
						
							| 
									
										
										
										
											2015-07-16 06:39:56 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-31 20:12:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	getPublicPath(options) { | 
					
						
							|  |  |  | 		return this.applyPluginsWaterfall("asset-path", this.outputOptions.publicPath || "", options); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-17 16:17:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	updateHash(hash) { | 
					
						
							|  |  |  | 		hash.update("maintemplate"); | 
					
						
							|  |  |  | 		hash.update("3"); | 
					
						
							|  |  |  | 		hash.update(this.outputOptions.publicPath + ""); | 
					
						
							|  |  |  | 		this.applyPlugins("hash", hash); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-20 03:35:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	updateHashForChunk(hash, chunk) { | 
					
						
							|  |  |  | 		this.updateHash(hash); | 
					
						
							|  |  |  | 		this.applyPlugins("hash-for-chunk", hash, chunk); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-25 05:17:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 	useChunkHash(chunk) { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:30:52 +08:00
										 |  |  | 		const paths = this.applyPluginsWaterfall("global-hash-paths", []); | 
					
						
							| 
									
										
										
										
											2017-01-13 04:38:38 +08:00
										 |  |  | 		return !this.applyPluginsBailResult("global-hash", chunk, paths); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | }; |