| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | var Template = require("./Template"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function JsonpMainTemplatePlugin() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = JsonpMainTemplatePlugin; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JsonpMainTemplatePlugin.prototype.constructor = JsonpMainTemplatePlugin; | 
					
						
							|  |  |  | JsonpMainTemplatePlugin.prototype.apply = function(mainTemplate) { | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 	mainTemplate.plugin("local-vars", function(source, chunk) { | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 		if(chunk.chunks.length > 0) { | 
					
						
							|  |  |  | 			return this.asString([ | 
					
						
							|  |  |  | 				source, | 
					
						
							|  |  |  | 				"", | 
					
						
							|  |  |  | 				"// object to store loaded and loading chunks", | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 				"// \"0\" means \"already loaded\"", | 
					
						
							|  |  |  | 				"// Array means \"loading\", array contains callbacks", | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 				"var installedChunks = {", | 
					
						
							|  |  |  | 				this.indent( | 
					
						
							|  |  |  | 					chunk.ids.map(function(id) { | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 						return id + ":0"; | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 					}).join(",\n") | 
					
						
							|  |  |  | 				), | 
					
						
							|  |  |  | 				"};" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return source; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	mainTemplate.plugin("require-ensure", function(_, chunk, hash) { | 
					
						
							|  |  |  | 		var filename = this.outputOptions.filename || "bundle.js"; | 
					
						
							|  |  |  | 		var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; | 
					
						
							| 
									
										
										
										
											2014-11-02 19:48:15 +08:00
										 |  |  | 		var chunkMaps = chunk.getChunkMaps(); | 
					
						
							| 
									
										
										
										
											2015-04-17 21:57:42 +08:00
										 |  |  | 		var crossOriginLoading = this.outputOptions.crossOriginLoading; | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 		return this.asString([ | 
					
						
							|  |  |  | 			"// \"0\" is the signal for \"already loaded\"", | 
					
						
							|  |  |  | 			"if(installedChunks[chunkId] === 0)", | 
					
						
							|  |  |  | 			this.indent("return callback.call(null, " + this.requireFn + ");"), | 
					
						
							|  |  |  | 			"", | 
					
						
							|  |  |  | 			"// an array means \"currently loading\".", | 
					
						
							|  |  |  | 			"if(installedChunks[chunkId] !== undefined) {", | 
					
						
							|  |  |  | 			this.indent("installedChunks[chunkId].push(callback);"), | 
					
						
							|  |  |  | 			"} else {", | 
					
						
							|  |  |  | 			this.indent([ | 
					
						
							|  |  |  | 				"// start chunk loading", | 
					
						
							|  |  |  | 				"installedChunks[chunkId] = [callback];", | 
					
						
							|  |  |  | 				"var head = document.getElementsByTagName('head')[0];", | 
					
						
							|  |  |  | 				"var script = document.createElement('script');", | 
					
						
							|  |  |  | 				"script.type = 'text/javascript';", | 
					
						
							|  |  |  | 				"script.charset = 'utf-8';", | 
					
						
							| 
									
										
										
										
											2014-10-14 19:56:52 +08:00
										 |  |  | 				"script.async = true;", | 
					
						
							| 
									
										
										
										
											2015-04-17 21:57:42 +08:00
										 |  |  | 				crossOriginLoading ? "script.crossOrigin = '" + crossOriginLoading + "';" : "", | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 				"script.src = " + this.requireFn + ".p + " + | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 					this.applyPluginsWaterfall("asset-path", JSON.stringify(chunkFilename), { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 						hash: "\" + " + this.renderCurrentHashCode(hash) + " + \"", | 
					
						
							| 
									
										
										
										
											2014-10-28 18:51:18 +08:00
										 |  |  | 						hashWithLength: function(length) { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 							return "\" + " + this.renderCurrentHashCode(hash, length) + " + \""; | 
					
						
							|  |  |  | 						}.bind(this), | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 						chunk: { | 
					
						
							|  |  |  | 							id: "\" + chunkId + \"", | 
					
						
							| 
									
										
										
										
											2014-11-02 19:48:15 +08:00
										 |  |  | 							hash: "\" + " + JSON.stringify(chunkMaps.hash) + "[chunkId] + \"", | 
					
						
							| 
									
										
										
										
											2014-09-12 01:25:18 +08:00
										 |  |  | 							hashWithLength: function(length) { | 
					
						
							|  |  |  | 								var shortChunkHashMap = {}; | 
					
						
							| 
									
										
										
										
											2014-11-02 19:48:15 +08:00
										 |  |  | 								Object.keys(chunkMaps.hash).forEach(function(chunkId) { | 
					
						
							|  |  |  | 									if(typeof chunkMaps.hash[chunkId] === "string") | 
					
						
							|  |  |  | 										shortChunkHashMap[chunkId] = chunkMaps.hash[chunkId].substr(0, length); | 
					
						
							| 
									
										
										
										
											2014-09-12 01:25:18 +08:00
										 |  |  | 								}); | 
					
						
							|  |  |  | 								return "\" + " + JSON.stringify(shortChunkHashMap) + "[chunkId] + \""; | 
					
						
							|  |  |  | 							}, | 
					
						
							| 
									
										
										
										
											2014-11-02 19:48:15 +08:00
										 |  |  | 							name: "\" + (" + JSON.stringify(chunkMaps.name) + "[chunkId]||chunkId) + \"" | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					}) + ";", | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 				"head.appendChild(script);" | 
					
						
							|  |  |  | 			]), | 
					
						
							|  |  |  | 			"}" | 
					
						
							|  |  |  | 		]); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	mainTemplate.plugin("bootstrap", function(source, chunk, hash) { | 
					
						
							|  |  |  | 		if(chunk.chunks.length > 0) { | 
					
						
							| 
									
										
										
										
											2014-08-04 22:25:33 +08:00
										 |  |  | 			var jsonpFunction = this.outputOptions.jsonpFunction || Template.toIdentifier("webpackJsonp" + (this.outputOptions.library || "")); | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 			return this.asString([ | 
					
						
							|  |  |  | 				source, | 
					
						
							|  |  |  | 				"", | 
					
						
							|  |  |  | 				"// install a JSONP callback for chunk loading", | 
					
						
							|  |  |  | 				"var parentJsonpFunction = window[" + JSON.stringify(jsonpFunction) + "];", | 
					
						
							|  |  |  | 				"window[" + JSON.stringify(jsonpFunction) + "] = function webpackJsonpCallback(chunkIds, moreModules) {", | 
					
						
							|  |  |  | 				this.indent([ | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 					"// add \"moreModules\" to the modules object,", | 
					
						
							|  |  |  | 					"// then flag all \"chunkIds\" as loaded and fire callback", | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 					"var moduleId, chunkId, i = 0, callbacks = [];", | 
					
						
							|  |  |  | 					"for(;i < chunkIds.length; i++) {", | 
					
						
							|  |  |  | 					this.indent([ | 
					
						
							|  |  |  | 						"chunkId = chunkIds[i];", | 
					
						
							|  |  |  | 						"if(installedChunks[chunkId])", | 
					
						
							|  |  |  | 						this.indent("callbacks.push.apply(callbacks, installedChunks[chunkId]);"), | 
					
						
							|  |  |  | 						"installedChunks[chunkId] = 0;" | 
					
						
							|  |  |  | 					]), | 
					
						
							|  |  |  | 					"}", | 
					
						
							|  |  |  | 					"for(moduleId in moreModules) {", | 
					
						
							|  |  |  | 					this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | 
					
						
							|  |  |  | 					"}", | 
					
						
							|  |  |  | 					"if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);", | 
					
						
							|  |  |  | 					"while(callbacks.length)", | 
					
						
							|  |  |  | 					this.indent("callbacks.shift().call(null, " + this.requireFn + ");"), | 
					
						
							|  |  |  | 					(this.entryPointInChildren(chunk) ? [ | 
					
						
							|  |  |  | 						"if(moreModules[0]) {", | 
					
						
							|  |  |  | 						this.indent([ | 
					
						
							|  |  |  | 							"installedModules[0] = 0;", | 
					
						
							| 
									
										
										
										
											2014-12-22 23:10:23 +08:00
										 |  |  | 							"return " + this.requireFn + "(0);" | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 						]), | 
					
						
							|  |  |  | 						"}" | 
					
						
							|  |  |  | 					] : "") | 
					
						
							|  |  |  | 				]), | 
					
						
							|  |  |  | 				"};" | 
					
						
							|  |  |  | 			]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return source; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	mainTemplate.plugin("hot-bootstrap", function(source, chunk, hash) { | 
					
						
							|  |  |  | 		var hotUpdateChunkFilename = this.outputOptions.hotUpdateChunkFilename; | 
					
						
							|  |  |  | 		var hotUpdateMainFilename = this.outputOptions.hotUpdateMainFilename; | 
					
						
							| 
									
										
										
										
											2014-08-04 22:25:33 +08:00
										 |  |  | 		var hotUpdateFunction = this.outputOptions.hotUpdateFunction || Template.toIdentifier("webpackHotUpdate" + (this.outputOptions.library || "")); | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 		var currentHotUpdateChunkFilename = this.applyPluginsWaterfall("asset-path", JSON.stringify(hotUpdateChunkFilename), { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 			hash: "\" + " + this.renderCurrentHashCode(hash) + " + \"", | 
					
						
							| 
									
										
										
										
											2014-10-28 18:51:18 +08:00
										 |  |  | 			hashWithLength: function(length) { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 				return "\" + " + this.renderCurrentHashCode(hash, length) + " + \""; | 
					
						
							|  |  |  | 			}.bind(this), | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 			chunk: { | 
					
						
							|  |  |  | 				id: "\" + chunkId + \"" | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		var currentHotUpdateMainFilename = this.applyPluginsWaterfall("asset-path", JSON.stringify(hotUpdateMainFilename), { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 			hash: "\" + " + this.renderCurrentHashCode(hash) + " + \"", | 
					
						
							| 
									
										
										
										
											2014-10-28 18:51:18 +08:00
										 |  |  | 			hashWithLength: function(length) { | 
					
						
							| 
									
										
										
										
											2014-11-03 15:02:02 +08:00
										 |  |  | 				return "\" + " + this.renderCurrentHashCode(hash, length) + " + \""; | 
					
						
							|  |  |  | 			}.bind(this) | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return source + "\n" + | 
					
						
							| 
									
										
										
										
											2014-08-25 16:19:04 +08:00
										 |  |  | 			"var parentHotUpdateCallback = this[" + JSON.stringify(hotUpdateFunction) + "];\n" + | 
					
						
							| 
									
										
										
										
											2015-04-29 05:38:41 +08:00
										 |  |  | 			"this[" + JSON.stringify(hotUpdateFunction) + "] = " + Template.getFunctionContent(require("./JsonpMainTemplate.runtime.js")) | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 			.replace(/\$require\$/g, this.requireFn) | 
					
						
							|  |  |  | 			.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) | 
					
						
							|  |  |  | 			.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename) | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 			.replace(/\$hash\$/g, JSON.stringify(hash)); | 
					
						
							| 
									
										
										
										
											2014-06-03 03:23:53 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 	mainTemplate.plugin("hash", function(hash) { | 
					
						
							|  |  |  | 		hash.update("jsonp"); | 
					
						
							|  |  |  | 		hash.update("4"); | 
					
						
							|  |  |  | 		hash.update(this.outputOptions.filename + ""); | 
					
						
							|  |  |  | 		hash.update(this.outputOptions.chunkFilename + ""); | 
					
						
							|  |  |  | 		hash.update(this.outputOptions.jsonpFunction + ""); | 
					
						
							|  |  |  | 		hash.update(this.outputOptions.library + ""); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; |