| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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', | 
					
						
							|  |  |  | 			"var installedChunks = {0:0};" | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	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';", | 
					
						
							|  |  |  | 			"script.src = modules.c + " +  | 
					
						
							|  |  |  | 				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-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-06-19 17:53:03 +08:00
										 |  |  | JsonpMainTemplate.prototype.renderCurrentHashCode = function(hash) { | 
					
						
							|  |  |  | 	return JSON.stringify(hash); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | }; |