| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | var MainTemplate = require("./MainTemplate"); | 
					
						
							|  |  |  | var Template = require("./Template"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function JsonpMainTemplate(outputOptions) { | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	MainTemplate.call(this, outputOptions); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | } | 
					
						
							|  |  |  | module.exports = JsonpMainTemplate; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | JsonpMainTemplate.prototype = Object.create(MainTemplate.prototype); | 
					
						
							| 
									
										
										
										
											2013-12-17 07:56:43 +08:00
										 |  |  | JsonpMainTemplate.prototype.constructor = JsonpMainTemplate; | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | JsonpMainTemplate.prototype.renderLocalVars = function(hash, chunk) { | 
					
						
							|  |  |  | 	var buf = MainTemplate.prototype.renderLocalVars.call(this, hash, chunk); | 
					
						
							|  |  |  | 	if(chunk.chunks.length > 0) { | 
					
						
							|  |  |  | 		buf.push( | 
					
						
							|  |  |  | 			"", | 
					
						
							|  |  |  | 			"// object to store loaded and loading chunks", | 
					
						
							|  |  |  | 			'// "0" means "already loaded"', | 
					
						
							|  |  |  | 			'// Array means "loading", array contains callbacks', | 
					
						
							| 
									
										
										
										
											2013-12-11 15:41:43 +08:00
										 |  |  | 			"var installedChunks = {", | 
					
						
							|  |  |  | 			this.indent( | 
					
						
							|  |  |  | 				chunk.ids.map(function(id) { | 
					
						
							|  |  |  | 					return id + ":0" | 
					
						
							|  |  |  | 				}).join(",\n") | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			"};" | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return buf; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JsonpMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) { | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	var filename = this.outputOptions.filename || "bundle.js"; | 
					
						
							|  |  |  | 	var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; | 
					
						
							| 
									
										
										
										
											2013-05-21 07:46:14 +08:00
										 |  |  | 	var chunkHashMap = {}; | 
					
						
							|  |  |  | 	(function addChunk(c) { | 
					
						
							|  |  |  | 		if(chunkHashMap[c.id]) return; | 
					
						
							|  |  |  | 		if(c.id > 0) | 
					
						
							| 
									
										
										
										
											2013-05-21 17:08:08 +08:00
										 |  |  | 			chunkHashMap[c.id] = c.renderedHash; | 
					
						
							| 
									
										
										
										
											2013-05-21 07:46:14 +08:00
										 |  |  | 		c.chunks.forEach(addChunk); | 
					
						
							|  |  |  | 	}(chunk)); | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	return [ | 
					
						
							|  |  |  | 		"// \"0\" is the signal for \"already loaded\"", | 
					
						
							|  |  |  | 		"if(installedChunks[chunkId] === 0)", | 
					
						
							|  |  |  | 		this.indent("return callback.call(null, require);"), | 
					
						
							|  |  |  | 		"", | 
					
						
							|  |  |  | 		"// 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';", | 
					
						
							| 
									
										
										
										
											2013-12-13 19:58:10 +08:00
										 |  |  | 			"script.src = " + this.requireFn + ".p + " + | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 				JSON.stringify(chunkFilename | 
					
						
							|  |  |  | 					.replace(Template.REGEXP_NAME, "")) | 
					
						
							| 
									
										
										
										
											2013-06-19 17:53:03 +08:00
										 |  |  | 				.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | 
					
						
							| 
									
										
										
										
											2013-05-21 07:46:14 +08:00
										 |  |  | 				.replace(Template.REGEXP_CHUNKHASH, "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"") | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 				.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", | 
					
						
							|  |  |  | 			"head.appendChild(script);" | 
					
						
							|  |  |  | 		]), | 
					
						
							|  |  |  | 		"}" | 
					
						
							|  |  |  | 	]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JsonpMainTemplate.prototype.renderInit = function(hash, chunk) { | 
					
						
							|  |  |  | 	var buf = MainTemplate.prototype.renderInit.call(this, hash, chunk); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	if(chunk.chunks.length > 0) { | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 		var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || "")); | 
					
						
							|  |  |  | 		buf.push( | 
					
						
							|  |  |  | 			"", | 
					
						
							|  |  |  | 			"// install a JSONP callback for chunk loading", | 
					
						
							|  |  |  | 			"window[" + JSON.stringify(jsonpFunction) + "] = function webpackJsonpCallback(chunkIds, moreModules) {", | 
					
						
							|  |  |  | 			this.indent([ | 
					
						
							|  |  |  | 				'// add "moreModules" to the modules object,', | 
					
						
							|  |  |  | 				'// then flag all "chunkIds" as loaded and fire callback', | 
					
						
							|  |  |  | 				"var moduleId, chunkId, callbacks = [];", | 
					
						
							|  |  |  | 				"while(chunkIds.length) {", | 
					
						
							|  |  |  | 				this.indent([ | 
					
						
							|  |  |  | 					"chunkId = chunkIds.shift();", | 
					
						
							|  |  |  | 					"if(installedChunks[chunkId])", | 
					
						
							|  |  |  | 					this.indent("callbacks.push.apply(callbacks, installedChunks[chunkId]);"), | 
					
						
							|  |  |  | 					"installedChunks[chunkId] = 0;" | 
					
						
							|  |  |  | 				]), | 
					
						
							|  |  |  | 				"}", | 
					
						
							| 
									
										
										
										
											2013-06-12 22:16:06 +08:00
										 |  |  | 				"for(moduleId in moreModules) {", | 
					
						
							|  |  |  | 				this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | 
					
						
							|  |  |  | 				"}", | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 				"while(callbacks.length)", | 
					
						
							| 
									
										
										
										
											2013-06-19 17:53:03 +08:00
										 |  |  | 				this.indent("callbacks.shift().call(null, " + this.requireFn + ");"), | 
					
						
							| 
									
										
										
										
											2013-12-20 06:22:36 +08:00
										 |  |  | 				(chunk.ids.indexOf(0) < 0 ? [ | 
					
						
							|  |  |  | 					"if(0 in moreModules) {", | 
					
						
							|  |  |  | 					this.indent([ | 
					
						
							|  |  |  | 						"installedModules[0] = 0;", | 
					
						
							|  |  |  | 						this.requireFn + "(0);" | 
					
						
							|  |  |  | 					]), | 
					
						
							|  |  |  | 					"}" | 
					
						
							|  |  |  | 				] : "") | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 			]), | 
					
						
							|  |  |  | 			"};" | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	return buf; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-17 07:56:43 +08:00
										 |  |  | JsonpMainTemplate.prototype.renderHotModuleReplacementInit = function(hash, chunk) { | 
					
						
							|  |  |  | 	var hotUpdateChunkFilename = this.outputOptions.hotUpdateChunkFilename; | 
					
						
							|  |  |  | 	var hotUpdateMainFilename = this.outputOptions.hotUpdateMainFilename; | 
					
						
							|  |  |  | 	var hotUpdateFunction = this.outputOptions.hotUpdateFunction || ("webpackHotUpdate" + (this.outputOptions.library || "")); | 
					
						
							|  |  |  | 	var currentHotUpdateChunkFilename = JSON.stringify(hotUpdateChunkFilename) | 
					
						
							|  |  |  | 		.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | 
					
						
							|  |  |  | 		.replace(Template.REGEXP_ID, "\" + chunkId + \""); | 
					
						
							|  |  |  | 	var currentHotUpdateMainFilename = JSON.stringify(hotUpdateMainFilename) | 
					
						
							|  |  |  | 		.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \""); | 
					
						
							|  |  |  | 	return "this[" + JSON.stringify(hotUpdateFunction) + "] = " + Template.getFunctionContent(function() { | 
					
						
							|  |  |  | 		function webpackHotUpdateCallback(chunkId, moreModules) { | 
					
						
							|  |  |  | 			hotAddUpdateChunk(chunkId, moreModules); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		function hotDownloadUpdateChunk(chunkId) { | 
					
						
							|  |  |  | 			var head = document.getElementsByTagName('head')[0]; | 
					
						
							|  |  |  | 			var script = document.createElement('script'); | 
					
						
							|  |  |  | 			script.type = 'text/javascript'; | 
					
						
							|  |  |  | 			script.charset = 'utf-8'; | 
					
						
							|  |  |  | 			script.src = $require$.p + $hotChunkFilename$; | 
					
						
							|  |  |  | 			head.appendChild(script); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		function hotDownloadManifest(callback) { | 
					
						
							|  |  |  | 			if(typeof XMLHttpRequest === "undefined") | 
					
						
							|  |  |  | 				return callback(new Error("No browser support")); | 
					
						
							|  |  |  | 			try { | 
					
						
							|  |  |  | 				var request = new XMLHttpRequest(); | 
					
						
							|  |  |  | 				request.open("GET", $require$.p + $hotMainFilename$, true); | 
					
						
							|  |  |  | 				request.send(null); | 
					
						
							|  |  |  | 			} catch(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			request.onreadystatechange = function() { | 
					
						
							|  |  |  | 				if(request.readyState !== 4) return; | 
					
						
							|  |  |  | 				if(request.status !== 200 && request.status !== 304) { | 
					
						
							|  |  |  | 					callback(); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					try { | 
					
						
							|  |  |  | 						var update = JSON.parse(request.responseText); | 
					
						
							|  |  |  | 					} catch(e) { | 
					
						
							|  |  |  | 						callback(); | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					callback(null, update); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 		.replace(/\$require\$/g, this.requireFn) | 
					
						
							|  |  |  | 		.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) | 
					
						
							|  |  |  | 		.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename) | 
					
						
							|  |  |  | 		.replace(/\$hash\$/g, JSON.stringify(hash)) | 
					
						
							| 
									
										
										
										
											2013-06-19 17:53:03 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | JsonpMainTemplate.prototype.updateHash = function(hash) { | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	MainTemplate.prototype.updateHash.call(this, hash); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	hash.update("jsonp"); | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	hash.update("3"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	hash.update(this.outputOptions.filename + ""); | 
					
						
							|  |  |  | 	hash.update(this.outputOptions.chunkFilename + ""); | 
					
						
							|  |  |  | 	hash.update(this.outputOptions.jsonpFunction + ""); | 
					
						
							| 
									
										
										
										
											2013-03-26 23:54:41 +08:00
										 |  |  | 	hash.update(this.outputOptions.library + ""); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | }; |