mirror of https://github.com/webpack/webpack.git
				
				
				
			refactored MainTemplate to plugin interface
This commit is contained in:
		
							parent
							
								
									bf7922c7fd
								
							
						
					
					
						commit
						3247725ba3
					
				|  | @ -1,47 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function AmdMainTemplateDecorator(mainTemplate, name) { | ||||
| 	this.mainTemplate = mainTemplate; | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = AmdMainTemplateDecorator; | ||||
| AmdMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates); | ||||
| 	var externals = chunk.modules.filter(function(m) { | ||||
| 		return m.external; | ||||
| 	}); | ||||
| 	var externalsDepsArray = JSON.stringify(externals.map(function(m) { | ||||
| 		return typeof m.request === "object" ? m.request.amd : m.request; | ||||
| 	})); | ||||
| 	var externalsArguments = externals.map(function(m) { | ||||
| 		return "__WEBPACK_EXTERNAL_MODULE_" + m.id + "__"; | ||||
| 	}).join(", "); | ||||
| 	if(this.name) { | ||||
| 		var name = this.name | ||||
| 			.replace(Template.REGEXP_HASH, hash) | ||||
| 			.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 			.replace(Template.REGEXP_ID, chunk.id) | ||||
| 			.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 		return new ConcatSource("define(" + JSON.stringify(name) + ", " + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});"); | ||||
| 	} else if(externalsArguments) { | ||||
| 		return new ConcatSource("define(" + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});"); | ||||
| 	} else { | ||||
| 		return new ConcatSource("define(function() { return ", source, "});"); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| AmdMainTemplateDecorator.prototype.useChunkHash = function(chunk) { | ||||
| 	if(!this.mainTemplate.useChunkHash || !this.mainTemplate.useChunkHash(chunk)) return false; | ||||
| 	return !Template.REGEXP_HASH.test(this.name || ""); | ||||
| }; | ||||
| 
 | ||||
| AmdMainTemplateDecorator.prototype.updateHash = function(hash) { | ||||
| 	hash.update("exports amd"); | ||||
| 	hash.update(this.name + ""); | ||||
| 	this.mainTemplate.updateHash(hash); | ||||
| }; | ||||
|  | @ -0,0 +1,44 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function AmdMainTemplatePlugin(name) { | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = AmdMainTemplatePlugin; | ||||
| AmdMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	mainTemplate.plugin("render", function(source, chunk, hash, moduleTemplate, dependencyTemplates) { | ||||
| 		var externals = chunk.modules.filter(function(m) { | ||||
| 			return m.external; | ||||
| 		}); | ||||
| 		var externalsDepsArray = JSON.stringify(externals.map(function(m) { | ||||
| 			return typeof m.request === "object" ? m.request.amd : m.request; | ||||
| 		})); | ||||
| 		var externalsArguments = externals.map(function(m) { | ||||
| 			return "__WEBPACK_EXTERNAL_MODULE_" + m.id + "__"; | ||||
| 		}).join(", "); | ||||
| 		if(this.name) { | ||||
| 			var name = this.name | ||||
| 				.replace(Template.REGEXP_HASH, hash) | ||||
| 				.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 				.replace(Template.REGEXP_ID, chunk.id) | ||||
| 				.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 			return new ConcatSource("define(" + JSON.stringify(name) + ", " + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});"); | ||||
| 		} else if(externalsArguments) { | ||||
| 			return new ConcatSource("define(" + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});"); | ||||
| 		} else { | ||||
| 			return new ConcatSource("define(function() { return ", source, "});"); | ||||
| 		} | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("global-hash", function(chunk) { | ||||
| 		if(Template.REGEXP_HASH.test(this.name || "")) | ||||
| 			return true; | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("exports amd"); | ||||
| 		hash.update(this.name + ""); | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -15,20 +15,24 @@ var ArrayMap = require("./ArrayMap"); | |||
| var Chunk = require("./Chunk"); | ||||
| var Stats = require("./Stats"); | ||||
| var Template = require("./Template"); | ||||
| var MainTemplate = require("./MainTemplate"); | ||||
| 
 | ||||
| function Compilation(compiler) { | ||||
| 	Tapable.call(this); | ||||
| 	this.compiler = compiler; | ||||
| 	this.mainTemplate = compiler.mainTemplate; | ||||
| 	this.chunkTemplate = compiler.chunkTemplate; | ||||
| 	this.hotUpdateChunkTemplate = compiler.hotUpdateChunkTemplate; | ||||
| 	this.moduleTemplate = compiler.moduleTemplate; | ||||
| 	this.resolvers = compiler.resolvers; | ||||
| 	this.inputFileSystem = compiler.inputFileSystem; | ||||
| 
 | ||||
| 	var options = this.options = compiler.options; | ||||
| 	this.outputOptions = options && options.output; | ||||
| 	this.bail = options && options.bail; | ||||
| 	this.profile = options && options.profile; | ||||
| 
 | ||||
| 	this.mainTemplate = new MainTemplate(this.outputOptions); | ||||
| 	this.chunkTemplate = compiler.chunkTemplate; | ||||
| 	this.hotUpdateChunkTemplate = compiler.hotUpdateChunkTemplate; | ||||
| 	this.moduleTemplate = compiler.moduleTemplate; | ||||
| 
 | ||||
| 	this.entries = []; | ||||
| 	this.preparedChunks = []; | ||||
| 	this.chunks = []; | ||||
|  |  | |||
|  | @ -122,7 +122,7 @@ Watching.prototype.close = function(callback) { | |||
| 
 | ||||
| function Compiler() { | ||||
| 	Tapable.call(this); | ||||
| 	this.mainTemplate = this.chunkTemplate = this.moduleTemplate = null; | ||||
| 	this.chunkTemplate = this.moduleTemplate = null; | ||||
| 
 | ||||
| 	this.outputPath = ""; | ||||
| 	this.outputFileSystem = null; | ||||
|  | @ -305,11 +305,10 @@ Compiler.prototype.readRecords = function readRecords(callback) { | |||
| Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions) { | ||||
| 	var childCompiler = new Compiler(); | ||||
| 	for(var name in this._plugins) { | ||||
| 		if(["make", "compile", "emit", "after-emit", "invalid", "done"].indexOf(name) < 0) | ||||
| 		if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0) | ||||
| 			childCompiler._plugins[name] = this._plugins[name].slice(); | ||||
| 	} | ||||
| 	childCompiler.name = compilerName; | ||||
| 	childCompiler.mainTemplate = this.mainTemplate; | ||||
| 	childCompiler.chunkTemplate = this.chunkTemplate; | ||||
| 	childCompiler.moduleTemplate = this.moduleTemplate; | ||||
| 	childCompiler.outputPath = this.outputPath; | ||||
|  | @ -343,6 +342,7 @@ Compiler.prototype.newCompilation = function(params) { | |||
| 	compilation.contextTimestamps = this.contextTimestamps; | ||||
| 	compilation.name = this.name; | ||||
| 	compilation.records = this.records; | ||||
| 	this.applyPlugins("this-compilation", compilation, params); | ||||
| 	this.applyPlugins("compilation", compilation, params); | ||||
| 	return compilation; | ||||
| }; | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) { | |||
| 	var hotUpdateMainFilename = compiler.options.output.hotUpdateMainFilename; | ||||
| 	compiler.plugin("compilation", function(compilation, params) { | ||||
| 		var hotUpdateChunkTemplate = compilation.compiler.hotUpdateChunkTemplate; | ||||
| 		if(!hotUpdateChunkTemplate && !compilation.mainTemplate.renderHotModuleReplacementInit) return; | ||||
| 		if(!hotUpdateChunkTemplate) return; | ||||
| 
 | ||||
| 		var normalModuleFactory = params.normalModuleFactory; | ||||
| 		var contextModuleFactory = params.contextModuleFactory; | ||||
|  | @ -107,41 +107,43 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) { | |||
| 		var mainTemplate = compilation.mainTemplate; | ||||
| 		compilation.mainTemplate = Object.create(mainTemplate); | ||||
| 
 | ||||
| 		compilation.mainTemplate.updateHash = function(hash) { | ||||
| 		compilation.mainTemplate.plugin("hash", function(hash) { | ||||
| 			hash.update("HotMainTemplateDecorator"); | ||||
| 			mainTemplate.updateHash(hash); | ||||
| 		}; | ||||
| 		}); | ||||
| 
 | ||||
| 		compilation.mainTemplate.renderRequireFunctionForModule = function(hash, chunk, varModuleId) { | ||||
| 		compilation.mainTemplate.plugin("module-require", function(_, chunk, hash, varModuleId) { | ||||
| 			return "hotCreateRequire(" + varModuleId + ")"; | ||||
| 		}; | ||||
| 		}); | ||||
| 
 | ||||
| 		compilation.mainTemplate.renderInit = function(hash, chunk) { | ||||
| 			var buf = mainTemplate.renderInit(hash, chunk); | ||||
| 			buf = buf.concat(this.renderHotModuleReplacementInit(hash, chunk)); | ||||
| 			buf.push("\n\n"); | ||||
| 			buf.push(hotInitCode | ||||
| 				.replace(/\$require\$/g, this.requireFn) | ||||
| 				.replace(/\$hash\$/g, JSON.stringify(hash)) | ||||
| 				.replace(/\/\*foreachInstalledChunks\*\//g, chunk.chunks.length > 0 ? "for(var chunkId in installedChunks)" : "var chunkId = 0;")); | ||||
| 			return buf; | ||||
| 		}; | ||||
| 		compilation.mainTemplate.plugin("bootstrap", function(source, chunk, hash) { | ||||
| 			source = this.applyPluginsWaterfall("hot-bootstrap", source, chunk, hash); | ||||
| 			return this.asString([ | ||||
| 				source, | ||||
| 				"", | ||||
| 				hotInitCode | ||||
| 					.replace(/\$require\$/g, this.requireFn) | ||||
| 					.replace(/\$hash\$/g, JSON.stringify(hash)) | ||||
| 					.replace(/\/\*foreachInstalledChunks\*\//g, chunk.chunks.length > 0 ? "for(var chunkId in installedChunks)" : "var chunkId = 0;") | ||||
| 			]); | ||||
| 		}); | ||||
| 
 | ||||
| 		compilation.mainTemplate.useChunkHash = false; | ||||
| 		compilation.mainTemplate.plugin("global-hash", function() { | ||||
| 			return true; | ||||
| 		}); | ||||
| 
 | ||||
| 		compilation.mainTemplate.renderCurrentHashCode = function(hash) { | ||||
| 		compilation.mainTemplate.plugin("current-hash", function() { | ||||
| 			return "hotCurrentHash"; | ||||
| 		}; | ||||
| 		}); | ||||
| 
 | ||||
| 		compilation.mainTemplate.renderModule = function(hash, chunk, varModuleId) { | ||||
| 			var buf = mainTemplate.renderModule(hash, chunk, varModuleId); | ||||
| 			buf.push(buf.pop() + ","); | ||||
| 			buf.push("hot: hotCreateModule(" + varModuleId + "),"); | ||||
| 			buf.push("parents: [hotCurrentParent],"); | ||||
| 			buf.push("data: hotCurrentModuleData[" + varModuleId + "],"); | ||||
| 			buf.push("children: []"); | ||||
| 			return buf; | ||||
| 		}; | ||||
| 		compilation.mainTemplate.plugin("module-obj", function(source, chunk, hash, varModuleId) { | ||||
| 			return this.asString([ | ||||
| 				source + ",", | ||||
| 				"hot: hotCreateModule(" + varModuleId + "),", | ||||
| 				"parents: [hotCurrentParent],", | ||||
| 				"data: hotCurrentModuleData[" + varModuleId + "],", | ||||
| 				"children: []" | ||||
| 			]); | ||||
| 		}); | ||||
| 
 | ||||
| 	}); | ||||
| 	compiler.parser.plugin("evaluate Identifier module.hot", function(expr) { | ||||
|  |  | |||
|  | @ -1,32 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function JsonpExportMainTemplateDecorator(mainTemplate, name) { | ||||
| 	this.mainTemplate = mainTemplate; | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = JsonpExportMainTemplateDecorator; | ||||
| JsonpExportMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates); | ||||
| 	var name = (this.name || "") | ||||
| 		.replace(Template.REGEXP_HASH, hash) | ||||
| 		.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 		.replace(Template.REGEXP_ID, chunk.id) | ||||
| 		.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 	return new ConcatSource(name + "(", source, ");"); | ||||
| }; | ||||
| 
 | ||||
| SetVarMainTemplateDecorator.prototype.useChunkHash = function(chunk) { | ||||
| 	if(!this.mainTemplate.useChunkHash || !this.mainTemplate.useChunkHash(chunk)) return false; | ||||
| 	return !Template.REGEXP_HASH.test(this.name || ""); | ||||
| }; | ||||
| 
 | ||||
| JsonpExportMainTemplateDecorator.prototype.updateHash = function(hash) { | ||||
| 	hash.update("jsonp export"); | ||||
| 	hash.update(this.name + ""); | ||||
| 	this.mainTemplate.updateHash(hash); | ||||
| }; | ||||
|  | @ -0,0 +1,29 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function JsonpExportMainTemplatePlugin(name) { | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = JsonpExportMainTemplatePlugin; | ||||
| JsonpExportMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	mainTemplate.plugin("render", function(source, chunk, hash) { | ||||
| 		var name = (this.name || "") | ||||
| 			.replace(Template.REGEXP_HASH, hash) | ||||
| 			.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 			.replace(Template.REGEXP_ID, chunk.id) | ||||
| 			.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 		return new ConcatSource(name + "(", source, ");"); | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("global-hash", function(chunk) { | ||||
| 		if(Template.REGEXP_HASH.test(this.name || "")) | ||||
| 			return true; | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("jsonp export"); | ||||
| 		hash.update(this.name + ""); | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -1,181 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var MainTemplate = require("./MainTemplate"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function JsonpMainTemplate(outputOptions) { | ||||
| 	MainTemplate.call(this, outputOptions); | ||||
| } | ||||
| module.exports = JsonpMainTemplate; | ||||
| 
 | ||||
| JsonpMainTemplate.prototype = Object.create(MainTemplate.prototype); | ||||
| JsonpMainTemplate.prototype.constructor = JsonpMainTemplate; | ||||
| 
 | ||||
| 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 = {", | ||||
| 			this.indent( | ||||
| 				chunk.ids.map(function(id) { | ||||
| 					return id + ":0" | ||||
| 				}).join(",\n") | ||||
| 			), | ||||
| 			"};" | ||||
| 		); | ||||
| 	} | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| JsonpMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) { | ||||
| 	var filename = this.outputOptions.filename || "bundle.js"; | ||||
| 	var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; | ||||
| 	var chunkHashMap = {}; | ||||
| 	(function addChunk(c) { | ||||
| 		if(c.id in chunkHashMap) return; | ||||
| 		if(c.entry) | ||||
| 			chunkHashMap[c.id] = undefined; | ||||
| 		else | ||||
| 			chunkHashMap[c.id] = c.renderedHash; | ||||
| 		c.chunks.forEach(addChunk); | ||||
| 	}(chunk)); | ||||
| 	return [ | ||||
| 		"// \"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';", | ||||
| 			"script.src = " + this.requireFn + ".p + " + | ||||
| 				JSON.stringify(chunkFilename | ||||
| 					.replace(Template.REGEXP_NAME, "")) | ||||
| 				.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | ||||
| 				.replace(Template.REGEXP_CHUNKHASH, "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"") | ||||
| 				.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", | ||||
| 			"head.appendChild(script);" | ||||
| 		]), | ||||
| 		"}" | ||||
| 	]; | ||||
| }; | ||||
| 
 | ||||
| JsonpMainTemplate.prototype.renderInit = function(hash, chunk) { | ||||
| 	var buf = MainTemplate.prototype.renderInit.call(this, hash, chunk); | ||||
| 	if(chunk.chunks.length > 0) { | ||||
| 		var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || "")); | ||||
| 		buf.push( | ||||
| 			"", | ||||
| 			"// install a JSONP callback for chunk loading", | ||||
| 			"var parentJsonpFunction = window[" + JSON.stringify(jsonpFunction) + "];", | ||||
| 			"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, 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;", | ||||
| 						this.requireFn + "(0);" | ||||
| 					]), | ||||
| 					"}" | ||||
| 				] : "") | ||||
| 			]), | ||||
| 			"};" | ||||
| 		); | ||||
| 	} | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| 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)) | ||||
| }; | ||||
| 
 | ||||
| JsonpMainTemplate.prototype.updateHash = function(hash) { | ||||
| 	MainTemplate.prototype.updateHash.call(this, hash); | ||||
| 	hash.update("jsonp"); | ||||
| 	hash.update("3"); | ||||
| 	hash.update(this.outputOptions.filename + ""); | ||||
| 	hash.update(this.outputOptions.chunkFilename + ""); | ||||
| 	hash.update(this.outputOptions.jsonpFunction + ""); | ||||
| 	hash.update(this.outputOptions.library + ""); | ||||
| }; | ||||
|  | @ -0,0 +1,173 @@ | |||
| /* | ||||
| 	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) { | ||||
| 	mainTemplate.plugin("local-vars", function(source, chunk, hash) { | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			return this.asString([ | ||||
| 				source, | ||||
| 				"", | ||||
| 				"// object to store loaded and loading chunks", | ||||
| 				'// "0" means "already loaded"', | ||||
| 				'// Array means "loading", array contains callbacks', | ||||
| 				"var installedChunks = {", | ||||
| 				this.indent( | ||||
| 					chunk.ids.map(function(id) { | ||||
| 						return id + ":0" | ||||
| 					}).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; | ||||
| 		var chunkHashMap = {}; | ||||
| 		(function addChunk(c) { | ||||
| 			if(c.id in chunkHashMap) return; | ||||
| 			if(c.entry) | ||||
| 				chunkHashMap[c.id] = undefined; | ||||
| 			else | ||||
| 				chunkHashMap[c.id] = c.renderedHash; | ||||
| 			c.chunks.forEach(addChunk); | ||||
| 		}(chunk)); | ||||
| 		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';", | ||||
| 				"script.src = " + this.requireFn + ".p + " + | ||||
| 					JSON.stringify(chunkFilename.replace(Template.REGEXP_NAME, "")) | ||||
| 					.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | ||||
| 					.replace(Template.REGEXP_CHUNKHASH, "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"") | ||||
| 					.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", | ||||
| 				"head.appendChild(script);" | ||||
| 			]), | ||||
| 			"}" | ||||
| 		]); | ||||
| 	}); | ||||
| 	mainTemplate.plugin("bootstrap", function(source, chunk, hash) { | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || "")); | ||||
| 			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([ | ||||
| 					'// add "moreModules" to the modules object,', | ||||
| 					'// then flag all "chunkIds" as loaded and fire callback', | ||||
| 					"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;", | ||||
| 							this.requireFn + "(0);" | ||||
| 						]), | ||||
| 						"}" | ||||
| 					] : "") | ||||
| 				]), | ||||
| 				"};" | ||||
| 			]); | ||||
| 		} | ||||
| 		return source; | ||||
| 	}); | ||||
| 	mainTemplate.plugin("hot-bootstrap", function(source, chunk, hash) { | ||||
| 		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)) | ||||
| 	}); | ||||
| 	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 + ""); | ||||
| 	}); | ||||
| }; | ||||
|  | @ -2,7 +2,7 @@ | |||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var JsonpMainTemplate = require("./JsonpMainTemplate"); | ||||
| var JsonpMainTemplatePlugin = require("./JsonpMainTemplatePlugin"); | ||||
| var JsonpChunkTemplate = require("./JsonpChunkTemplate"); | ||||
| var JsonpHotUpdateChunkTemplate = require("./JsonpHotUpdateChunkTemplate"); | ||||
| 
 | ||||
|  | @ -12,7 +12,9 @@ function JsonpTemplatePlugin(options) { | |||
| module.exports = JsonpTemplatePlugin; | ||||
| JsonpTemplatePlugin.prototype.apply = function(compiler) { | ||||
| 	var options = this.options; | ||||
| 	compiler.mainTemplate = new JsonpMainTemplate(options); | ||||
| 	compiler.plugin("this-compilation", function(compilation) { | ||||
| 		compilation.mainTemplate.apply(new JsonpMainTemplatePlugin()); | ||||
| 	}); | ||||
| 	compiler.chunkTemplate = new JsonpChunkTemplate(options); | ||||
| 	compiler.hotUpdateChunkTemplate = new JsonpHotUpdateChunkTemplate(options); | ||||
| }; | ||||
|  | @ -2,7 +2,7 @@ | |||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var SetVarMainTemplateDecorator = require("./SetVarMainTemplateDecorator"); | ||||
| var SetVarMainTemplatePlugin = require("./SetVarMainTemplatePlugin"); | ||||
| 
 | ||||
| function accessorToObjectAccess(accessor) { | ||||
| 	return accessor.map(function(a) { | ||||
|  | @ -26,43 +26,45 @@ function LibraryTemplatePlugin(name, target) { | |||
| } | ||||
| module.exports = LibraryTemplatePlugin; | ||||
| LibraryTemplatePlugin.prototype.apply = function(compiler) { | ||||
| 	switch(this.target) { | ||||
| 	case "var": | ||||
| 		compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "var " + accessorAccess(false, this.name)); | ||||
| 		break; | ||||
| 	case "assign": | ||||
| 		compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, accessorAccess(undefined, this.name)); | ||||
| 		break; | ||||
| 	case "this": | ||||
| 	case "window": | ||||
| 	case "global": | ||||
| 		if(this.name) | ||||
| 			compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, accessorAccess(this.target, this.name)); | ||||
| 		else | ||||
| 			compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, this.target, true); | ||||
| 		break; | ||||
| 	case "commonjs": | ||||
| 		if(this.name) | ||||
| 			compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, accessorAccess("exports", this.name)); | ||||
| 		else | ||||
| 			compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "exports", true); | ||||
| 		break; | ||||
| 	case "commonjs2": | ||||
| 		compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "module.exports"); | ||||
| 		break; | ||||
| 	case "amd": | ||||
| 		var AmdMainTemplateDecorator = require("./AmdMainTemplateDecorator"); | ||||
| 		compiler.mainTemplate = new AmdMainTemplateDecorator(compiler.mainTemplate, this.name); | ||||
| 		break; | ||||
| 	case "umd": | ||||
| 		var UmdMainTemplateDecorator = require("./UmdMainTemplateDecorator"); | ||||
| 		compiler.mainTemplate = new UmdMainTemplateDecorator(compiler.mainTemplate, this.name); | ||||
| 		break; | ||||
| 	case "jsonp": | ||||
| 		var JsonpExportMainTemplateDecorator = require("./JsonpExportMainTemplateDecorator"); | ||||
| 		compiler.mainTemplate = new JsonpExportMainTemplateDecorator(compiler.mainTemplate, this.name); | ||||
| 		break; | ||||
| 	default: | ||||
| 		throw new Error(this.target + " is not a valid Library target"); | ||||
| 	} | ||||
| 	compiler.plugin("this-compilation", function(compilation) { | ||||
| 		switch(this.target) { | ||||
| 		case "var": | ||||
| 			compilation.mainTemplate.apply(new SetVarMainTemplatePlugin("var " + accessorAccess(false, this.name))); | ||||
| 			break; | ||||
| 		case "assign": | ||||
| 			compilation.mainTemplate.apply(new SetVarMainTemplatePlugin(accessorAccess(undefined, this.name))); | ||||
| 			break; | ||||
| 		case "this": | ||||
| 		case "window": | ||||
| 		case "global": | ||||
| 			if(this.name) | ||||
| 				compilation.mainTemplate.apply(new SetVarMainTemplatePlugin(accessorAccess(this.target, this.name))); | ||||
| 			else | ||||
| 				compilation.mainTemplate.apply(new SetVarMainTemplatePlugin(this.target, true)); | ||||
| 			break; | ||||
| 		case "commonjs": | ||||
| 			if(this.name) | ||||
| 				compilation.mainTemplate.apply(new SetVarMainTemplatePlugin(accessorAccess("exports", this.name))); | ||||
| 			else | ||||
| 				compilation.mainTemplate.apply(new SetVarMainTemplatePlugin("exports", true)); | ||||
| 			break; | ||||
| 		case "commonjs2": | ||||
| 			compilation.mainTemplate.apply(new SetVarMainTemplatePlugin("module.exports")); | ||||
| 			break; | ||||
| 		case "amd": | ||||
| 			var AmdMainTemplatePlugin = require("./AmdMainTemplatePlugin"); | ||||
| 			compilation.mainTemplate.apply(new AmdMainTemplatePlugin(this.name)); | ||||
| 			break; | ||||
| 		case "umd": | ||||
| 			var UmdMainTemplatePlugin = require("./UmdMainTemplatePlugin"); | ||||
| 			compilation.mainTemplate.apply(new UmdMainTemplatePlugin(this.name)); | ||||
| 			break; | ||||
| 		case "jsonp": | ||||
| 			var JsonpExportMainTemplatePlugin = require("./JsonpExportMainTemplatePlugin"); | ||||
| 			compilation.mainTemplate.apply(new JsonpExportMainTemplatePlugin(this.name)); | ||||
| 			break; | ||||
| 		default: | ||||
| 			throw new Error(this.target + " is not a valid Library target"); | ||||
| 		} | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -9,6 +9,98 @@ var Template = require("./Template"); | |||
| 
 | ||||
| function MainTemplate(outputOptions) { | ||||
| 	Template.call(this, outputOptions); | ||||
| 	this.plugin("startup", function(source, chunk, hash) { | ||||
| 		var buf = []; | ||||
| 		if(chunk.modules.some(function(m) { return m.id === 0; })) { | ||||
| 			buf.push(""); | ||||
| 			buf.push("// Load entry module and return exports"); | ||||
| 			buf.push("return " + this.renderRequireFunctionForModule(hash, chunk, "0") + "(0);"); | ||||
| 		} | ||||
| 		return this.asString(buf); | ||||
| 	}); | ||||
| 	this.plugin("render", function(bootstrapSource, chunk, hash, moduleTemplate, dependencyTemplates) { | ||||
| 		var source = new ConcatSource(); | ||||
| 		source.add("/******/ (function(modules) { // webpackBootstrap\n"); | ||||
| 		source.add(new PrefixSource("/******/", bootstrapSource)); | ||||
| 		source.add("\n/******/ })\n"); | ||||
| 		source.add("/************************************************************************/\n"); | ||||
| 		source.add("/******/ ("); | ||||
| 		var modules = this.renderChunkModules(chunk, moduleTemplate, dependencyTemplates, "/******/ "); | ||||
| 		source.add(this.applyPluginsWaterfall("modules", modules, chunk, hash, moduleTemplate, dependencyTemplates)); | ||||
| 		source.add(")"); | ||||
| 		return source; | ||||
| 	}); | ||||
| 	this.plugin("local-vars", function(source, chunk, hash) { | ||||
| 		return this.asString([ | ||||
| 			source, | ||||
| 			"// The module cache", | ||||
| 			"var installedModules = {};" | ||||
| 		]); | ||||
| 	}); | ||||
| 	this.plugin("require", function(source, chunk, hash) { | ||||
| 		return this.asString([ | ||||
| 			source, | ||||
| 			"// Check if module is in cache", | ||||
| 			"if(installedModules[moduleId])", | ||||
| 			this.indent("return installedModules[moduleId].exports;"), | ||||
| 			"", | ||||
| 			"// Create a new module (and put it into the cache)", | ||||
| 			"var module = installedModules[moduleId] = {", | ||||
| 			this.indent(this.applyPluginsWaterfall("module-obj", chunk, hash, "moduleId")), | ||||
| 			"};", | ||||
| 			"", | ||||
| 			"// Execute the module function", | ||||
| 			"modules[moduleId].call(module.exports, module, module.exports, " + this.renderRequireFunctionForModule(hash, chunk, "moduleId") + ");", | ||||
| 			"", | ||||
| 			"// Flag the module as loaded", | ||||
| 			"module.loaded = true;", | ||||
| 			"", | ||||
| 			"// Return the exports of the module", | ||||
| 			"return module.exports;" | ||||
| 		]); | ||||
| 	}); | ||||
| 	this.plugin("module-obj", function(source, chunk, hash, varModuleId) { | ||||
| 		return this.asString([ | ||||
| 			"exports: {},", | ||||
| 			"id: moduleId,", | ||||
| 			"loaded: false" | ||||
| 		]); | ||||
| 	}); | ||||
| 	this.plugin("require-extensions", function(source, chunk, hash) { | ||||
| 		var buf = []; | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			buf.push("// This file contains only the entry chunk."); | ||||
| 			buf.push("// The chunk loading function for additional chunks"); | ||||
| 			buf.push(this.requireFn + ".e = function requireEnsure(chunkId, callback) {"); | ||||
| 			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__)"); | ||||
| 		buf.push(this.requireFn + ".m = modules;"); | ||||
| 
 | ||||
| 		buf.push(""); | ||||
| 		buf.push("// expose the module cache"); | ||||
| 		buf.push(this.requireFn + ".c = installedModules;"); | ||||
| 
 | ||||
| 		var publicPath = this.outputOptions.publicPath || ""; | ||||
| 		publicPath = publicPath.replace(Template.REGEXP_HASH, hash); | ||||
| 		buf.push(""); | ||||
| 		buf.push("// __webpack_public_path__"); | ||||
| 		buf.push(this.requireFn + ".p = " + JSON.stringify(publicPath) + ";"); | ||||
| 		return this.asString(buf); | ||||
| 	}); | ||||
| 	this.plugin("global-hash", function(chunk) { | ||||
| 		var publicPath = this.outputOptions.publicPath || ""; | ||||
| 		var filename = this.outputOptions.filename || ""; | ||||
| 		var chunkFilename = this.outputOptions.chunkFilename || ""; | ||||
| 		if(Template.REGEXP_HASH.test(publicPath) || Template.REGEXP_CHUNKHASH.test(publicPath)) | ||||
| 			return true; | ||||
| 		if(Template.REGEXP_HASH.test(filename) || Template.REGEXP_CHUNKHASH.test(filename)) | ||||
| 			return true; | ||||
| 		if(Template.REGEXP_HASH.test(chunkFilename) || Template.REGEXP_CHUNKHASH.test(chunkFilename)) | ||||
| 			return true; | ||||
| 	}); | ||||
| } | ||||
| module.exports = MainTemplate; | ||||
| 
 | ||||
|  | @ -16,139 +108,32 @@ MainTemplate.prototype = Object.create(Template.prototype); | |||
| MainTemplate.prototype.requireFn = "__webpack_require__"; | ||||
| MainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	var buf = []; | ||||
| 	buf.push(this.asString(this.renderAdditions(hash, chunk, moduleTemplate, dependencyTemplates))); | ||||
| 	buf.push(this.asString(this.renderLocalVars(hash, chunk))); | ||||
| 	buf.push(this.applyPluginsWaterfall("bootstrap", "", chunk, hash, moduleTemplate, dependencyTemplates)); | ||||
| 	buf.push(this.applyPluginsWaterfall("local-vars", "", chunk, hash)); | ||||
| 	buf.push(""); | ||||
| 	buf.push("// The require function"); | ||||
| 	buf.push("function " + this.requireFn + "(moduleId) {"); | ||||
| 	buf.push(this.indent(this.renderRequireContent(hash, chunk))); | ||||
| 	buf.push(this.indent(this.applyPluginsWaterfall("require", "", chunk, hash))); | ||||
| 	buf.push("}"); | ||||
| 	buf.push(""); | ||||
| 	buf.push(this.asString(this.renderRequireExtensions(hash, chunk))); | ||||
| 	buf.push(this.asString(this.renderInit(hash, chunk))); | ||||
| 	if(chunk.modules.some(function(m) { return m.id === 0; })) { | ||||
| 		buf.push(""); | ||||
| 		buf.push("// Load entry module and return exports"); | ||||
| 		buf.push("return " + this.renderRequireFunctionForModule(hash, chunk, "0") + "(0);"); | ||||
| 	} | ||||
| 	var source = new ConcatSource(); | ||||
| 	source.add("/******/ (function(modules) { // webpackBootstrap\n"); | ||||
| 	source.add(new PrefixSource("/******/ \t", new OriginalSource(this.asString(buf), "webpack/bootstrap " + hash))); | ||||
| 	source.add("\n/******/ })\n"); | ||||
| 	source.add("/************************************************************************/\n"); | ||||
| 	source.add("/******/ ("); | ||||
| 	source.add(this.renderModules(hash, chunk, moduleTemplate, dependencyTemplates)); | ||||
| 	source.add(")"); | ||||
| 	buf.push(this.asString(this.applyPluginsWaterfall("require-extensions", "", chunk, hash))); | ||||
| 	buf.push(this.asString(this.applyPluginsWaterfall("startup", "", chunk, hash))); | ||||
| 	var source = this.applyPluginsWaterfall("render", new OriginalSource(this.prefix(buf, " \t"), "webpack/bootstrap " + hash), chunk, hash, moduleTemplate, dependencyTemplates); | ||||
| 	if(!source) throw new Error("Compiler error: MainTemplate plugin 'render' should return something"); | ||||
| 	chunk.rendered = true; | ||||
| 	return source; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderModules = function renderModules(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	return this.renderChunkModules(chunk, moduleTemplate, dependencyTemplates, "/******/ "); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.indent = function indent(str) { | ||||
| 	if(Array.isArray(str)) { | ||||
| 		return str.map(indent).join("\n"); | ||||
| 	} else { | ||||
| 		return "\t" + str.trimRight().replace(/\n/g, "\n\t"); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.prefix = function(str, prefix) { | ||||
| 	if(Array.isArray(str)) { | ||||
| 		str = str.join("\n"); | ||||
| 	} | ||||
| 	return prefix + str.trim().replace(/\n/g, "\n" + prefix); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.asString = function(str) { | ||||
| 	if(Array.isArray(str)) { | ||||
| 		return str.join("\n"); | ||||
| 	} | ||||
| 	return str; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderLocalVars = function(hash, chunk) { | ||||
| 	return [ | ||||
| 		"// The module cache", | ||||
| 		"var installedModules = {};" | ||||
| 	]; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderRequireContent = function(hash, chunk) { | ||||
| 	return [ | ||||
| 		"// Check if module is in cache", | ||||
| 		"if(installedModules[moduleId])", | ||||
| 		this.indent("return installedModules[moduleId].exports;"), | ||||
| 		"", | ||||
| 		"// Create a new module (and put it into the cache)", | ||||
| 		"var module = installedModules[moduleId] = {", | ||||
| 		this.indent(this.renderModule(hash, chunk, "moduleId")), | ||||
| 		"};", | ||||
| 		"", | ||||
| 		"// Execute the module function", | ||||
| 		"modules[moduleId].call(module.exports, module, module.exports, " + this.renderRequireFunctionForModule(hash, chunk, "moduleId") + ");", | ||||
| 		"", | ||||
| 		"// Flag the module as loaded", | ||||
| 		"module.loaded = true;", | ||||
| 		"", | ||||
| 		"// Return the exports of the module", | ||||
| 		"return module.exports;" | ||||
| 	]; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderRequireFunctionForModule = function(hash, chunk, varModuleId) { | ||||
| 	return this.requireFn; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderModule = function(hash, chunk, varModuleId) { | ||||
| 	return [ | ||||
| 		"exports: {},", | ||||
| 		"id: moduleId,", | ||||
| 		"loaded: false" | ||||
| 	]; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderRequireExtensions = function(hash, chunk) { | ||||
| 	var buf = []; | ||||
| 	if(chunk.chunks.length > 0) { | ||||
| 		buf.push("// This file contains only the entry chunk."); | ||||
| 		buf.push("// The chunk loading function for additional chunks"); | ||||
| 		buf.push(this.requireFn + ".e = function requireEnsure(chunkId, callback) {"); | ||||
| 		buf.push(this.indent(this.renderRequireEnsure(hash, chunk))); | ||||
| 		buf.push("};"); | ||||
| 	} | ||||
| 	buf.push(""); | ||||
| 	buf.push("// expose the modules object (__webpack_modules__)"); | ||||
| 	buf.push(this.requireFn + ".m = modules;"); | ||||
| 
 | ||||
| 	buf.push(""); | ||||
| 	buf.push("// expose the module cache"); | ||||
| 	buf.push(this.requireFn + ".c = installedModules;"); | ||||
| 
 | ||||
| 	var publicPath = this.outputOptions.publicPath || ""; | ||||
| 	publicPath = publicPath.replace(Template.REGEXP_HASH, hash); | ||||
| 	buf.push(""); | ||||
| 	buf.push("// __webpack_public_path__"); | ||||
| 	buf.push(this.requireFn + ".p = " + JSON.stringify(publicPath) + ";"); | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderInit = function(hash, chunk) { | ||||
| 	return []; | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderAdditions = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	return []; | ||||
| 	return this.applyPluginsWaterfall("module-require", this.requireFn, chunk, hash, varModuleId); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderAddModule = function(hash, chunk, varModuleId, varModule) { | ||||
| 	return ["modules[" + varModuleId + "] = " + varModule + ";"]; | ||||
| 	return this.applyPluginsWaterfall("add-module", "modules[" + varModuleId + "] = " + varModule + ";", chunk, hash, varModuleId, varModule); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.renderCurrentHashCode = function(hash) { | ||||
| 	return JSON.stringify(hash); | ||||
| 	return this.applyPluginsWaterfall("current-hash", JSON.stringify(hash)); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.entryPointInChildren = function(chunk) { | ||||
|  | @ -165,16 +150,11 @@ MainTemplate.prototype.entryPointInChildren = function(chunk) { | |||
| 
 | ||||
| MainTemplate.prototype.updateHash = function(hash) { | ||||
| 	hash.update("maintemplate"); | ||||
| 	hash.update("2"); | ||||
| 	hash.update("3"); | ||||
| 	hash.update(this.outputOptions.publicPath + ""); | ||||
| 	this.applyPlugins("hash", hash); | ||||
| }; | ||||
| 
 | ||||
| MainTemplate.prototype.useChunkHash = function(chunk) { | ||||
| 	var publicPath = this.outputOptions.publicPath || ""; | ||||
| 	var filename = this.outputOptions.filename || ""; | ||||
| 	var chunkFilename = this.outputOptions.chunkFilename || ""; | ||||
| 	var hashInPublicPath = Template.REGEXP_HASH.test(publicPath) || Template.REGEXP_CHUNKHASH.test(publicPath); | ||||
| 	var hashInFilename = Template.REGEXP_HASH.test(filename) || Template.REGEXP_CHUNKHASH.test(filename); | ||||
| 	var hashInChunkFilename = Template.REGEXP_HASH.test(chunkFilename) || Template.REGEXP_CHUNKHASH.test(chunkFilename); | ||||
| 	return !hashInPublicPath && !hashInFilename && !hashInChunkFilename; | ||||
| 	return this.applyPluginsBailResult("global-hash", chunk); | ||||
| }; | ||||
|  | @ -1,40 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function SetVarMainTemplateDecorator(mainTemplate, varExpression, copyObject) { | ||||
| 	this.mainTemplate = mainTemplate; | ||||
| 	this.varExpression = varExpression; | ||||
| 	this.copyObject = copyObject; | ||||
| } | ||||
| module.exports = SetVarMainTemplateDecorator; | ||||
| SetVarMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates); | ||||
| 	var varExpression = this.varExpression | ||||
| 		.replace(Template.REGEXP_HASH, hash) | ||||
| 		.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 		.replace(Template.REGEXP_ID, chunk.id) | ||||
| 		.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 	if(this.copyObject) { | ||||
| 		return new ConcatSource("(function(e, a) { for(var i in a) e[i] = a[i]; }(" + | ||||
| 			varExpression + ", ", source, "))"); | ||||
| 	} else { | ||||
| 		var prefix = varExpression + " =\n"; | ||||
| 		return new ConcatSource(prefix, source); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| SetVarMainTemplateDecorator.prototype.useChunkHash = function(chunk) { | ||||
| 	if(!this.mainTemplate.useChunkHash || !this.mainTemplate.useChunkHash(chunk)) return false; | ||||
| 	return !Template.REGEXP_HASH.test(this.varExpression || ""); | ||||
| }; | ||||
| 
 | ||||
| SetVarMainTemplateDecorator.prototype.updateHash = function(hash) { | ||||
| 	hash.update("set var"); | ||||
| 	hash.update(this.varExpression + ""); | ||||
| 	hash.update(this.copyObject + ""); | ||||
| 	this.mainTemplate.updateHash(hash); | ||||
| }; | ||||
|  | @ -0,0 +1,37 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function SetVarMainTemplatePlugin(varExpression, copyObject) { | ||||
| 	this.varExpression = varExpression; | ||||
| 	this.copyObject = copyObject; | ||||
| } | ||||
| module.exports = SetVarMainTemplatePlugin; | ||||
| SetVarMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	mainTemplate.plugin("render", function(source, chunk, hash) { | ||||
| 		var varExpression = this.varExpression | ||||
| 			.replace(Template.REGEXP_HASH, hash) | ||||
| 			.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 			.replace(Template.REGEXP_ID, chunk.id) | ||||
| 			.replace(Template.REGEXP_NAME, chunk.name || ""); | ||||
| 		if(this.copyObject) { | ||||
| 			return new ConcatSource("(function(e, a) { for(var i in a) e[i] = a[i]; }(" + | ||||
| 				varExpression + ", ", source, "))"); | ||||
| 		} else { | ||||
| 			var prefix = varExpression + " =\n"; | ||||
| 			return new ConcatSource(prefix, source); | ||||
| 		} | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("global-hash", function(chunk) { | ||||
| 		if(Template.REGEXP_HASH.test(this.varExpression || "")) | ||||
| 			return true; | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("set var"); | ||||
| 		hash.update(this.varExpression + ""); | ||||
| 		hash.update(this.copyObject + ""); | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -2,9 +2,11 @@ | |||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var Tapable = require("tapable"); | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| 
 | ||||
| function Template(outputOptions) { | ||||
| 	Tapable.call(this); | ||||
| 	this.outputOptions = outputOptions || {}; | ||||
| } | ||||
| module.exports = Template; | ||||
|  | @ -17,11 +19,15 @@ Template.REGEXP_FILE = /\[file\]/gi; | |||
| Template.REGEXP_QUERY = /\[query\]/gi; | ||||
| Template.REGEXP_FILEBASE = /\[filebase\]/gi; | ||||
| 
 | ||||
| Template.prototype = Object.create(Tapable.prototype); | ||||
| 
 | ||||
| Template.prototype.indent = function indent(str) { | ||||
| 	if(Array.isArray(str)) { | ||||
| 		return str.map(indent).join("\n"); | ||||
| 	} else { | ||||
| 		return "\t" + str.trimRight().replace(/\n/g, "\n\t"); | ||||
| 		str = str.trimRight(); | ||||
| 		if(!str) return ""; | ||||
| 		return (str[0] === "\n" ? "" : "\t") + str.replace(/\n([^\n])/g, "\n\t$1"); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
|  | @ -29,7 +35,9 @@ Template.prototype.prefix = function(str, prefix) { | |||
| 	if(Array.isArray(str)) { | ||||
| 		str = str.join("\n"); | ||||
| 	} | ||||
| 	return prefix + str.trim().replace(/\n/g, "\n" + prefix); | ||||
| 	str = str.trim(); | ||||
| 	if(!str) return ""; | ||||
| 	return (str[0] === "\n" ? "" : prefix) + str.replace(/\n([^\n])/g, "\n" + prefix + "$1"); | ||||
| }; | ||||
| 
 | ||||
| Template.prototype.asString = function(str) { | ||||
|  |  | |||
|  | @ -1,103 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var OriginalSource = require("webpack-core/lib/OriginalSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function accessorToObjectAccess(accessor) { | ||||
| 	return accessor.map(function(a) { | ||||
| 		return "[" + JSON.stringify(a) + "]"; | ||||
| 	}).join(""); | ||||
| } | ||||
| 
 | ||||
| function accessorAccess(base, accessor) { | ||||
| 	accessor = [].concat(accessor); | ||||
| 	return accessor.map(function(a, idx) { | ||||
| 		a = base + accessorToObjectAccess(accessor.slice(0, idx+1)); | ||||
| 		if(idx === accessor.length - 1) return a; | ||||
| 		return a + " = " + a + " || {}"; | ||||
| 	}).join(", "); | ||||
| } | ||||
| 
 | ||||
| function UmdMainTemplateDecorator(mainTemplate, name) { | ||||
| 	this.mainTemplate = mainTemplate; | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = UmdMainTemplateDecorator; | ||||
| UmdMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 	var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates); | ||||
| 	var externals = chunk.modules.filter(function(m) { | ||||
| 		return m.external; | ||||
| 	}); | ||||
| 	function replaceKeys(str) { | ||||
| 		return (str | ||||
| 			.replace(Template.REGEXP_HASH, hash) | ||||
| 			.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 			.replace(Template.REGEXP_ID, chunk.id) | ||||
| 			.replace(Template.REGEXP_NAME, chunk.name || "")); | ||||
| 	} | ||||
| 	function externalsDepsArray() { | ||||
| 		return "[" + replaceKeys(externals.map(function(m) { | ||||
| 			return JSON.stringify(typeof m.request === "object" ? m.request.amd : m.request); | ||||
| 		}).join(", ")) + "]"; | ||||
| 	} | ||||
| 	function externalsRootArray() { | ||||
| 		return replaceKeys(externals.map(function(m) { | ||||
| 			var request = m.request; | ||||
| 			if(typeof request === "object") request = request.root; | ||||
| 			return "root" + accessorToObjectAccess([].concat(request)); | ||||
| 		}).join(", ")); | ||||
| 	} | ||||
| 	function externalsRequireArray(type) { | ||||
| 		return replaceKeys(externals.map(function(m) { | ||||
| 			var request = m.request; | ||||
| 			if(typeof request === "object") request = request[type]; | ||||
| 			if(Array.isArray(request)) { | ||||
| 				return "require(" + JSON.stringify(request[0]) + ")" + accessorToObjectAccess(request.slice(1)); | ||||
| 			} else  | ||||
| 				return "require(" + JSON.stringify(request) + ")"; | ||||
| 		}).join(", ")); | ||||
| 	} | ||||
| 	var externalsArguments = externals.map(function(m) { | ||||
| 		return "__WEBPACK_EXTERNAL_MODULE_" + m.id + "__"; | ||||
| 	}).join(", "); | ||||
| 	return new ConcatSource(new OriginalSource( | ||||
| 		"(function webpackUniversalModuleDefinition(root, factory) {\n" + | ||||
| 		"	if(typeof exports === 'object' && typeof module === 'object')\n" + | ||||
| 		"		module.exports = factory(" + externalsRequireArray("commonjs2") + ");\n" + | ||||
| 		"	else if(typeof define === 'function' && define.amd)\n" + | ||||
| 		(externalsArguments ? | ||||
| 		"		define(" + externalsDepsArray() + ", factory);\n" | ||||
| 		: | ||||
| 		"		define(factory);\n" | ||||
| 		) + | ||||
| 		(this.name ? | ||||
| 		"	else if(typeof exports === 'object')\n" + | ||||
| 		"		exports[" + JSON.stringify(replaceKeys([].concat(this.name).pop())) + "] = factory(" + externalsRequireArray("commonjs") + ");\n" + | ||||
| 		"	else\n" + | ||||
| 		"		" + replaceKeys(accessorAccess("root", this.name)) + " = factory(" + externalsRootArray() + ");\n" | ||||
| 		: | ||||
| 		"	else {\n" + | ||||
| 		(externalsArguments ? | ||||
| 		"		var a = typeof exports === 'object' ? factory(" + externalsRequireArray("commonjs") + ") : factory(" + externalsRootArray() + ");\n" | ||||
| 		: | ||||
| 		"		var a = factory();\n" | ||||
| 		) + | ||||
| 		"		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n" + | ||||
| 		"	}\n" | ||||
| 		) + | ||||
| 		"})(this, function(" + externalsArguments + ") {\nreturn ", "webpack/universalModuleDefinition"), source, "\n})\n"); | ||||
| }; | ||||
| 
 | ||||
| UmdMainTemplateDecorator.prototype.useChunkHash = function(chunk) { | ||||
| 	if(!this.mainTemplate.useChunkHash || !this.mainTemplate.useChunkHash(chunk)) return false; | ||||
| 	return !Template.REGEXP_HASH.test([].concat(this.name || "").join("|")); | ||||
| }; | ||||
| 
 | ||||
| UmdMainTemplateDecorator.prototype.updateHash = function(hash) { | ||||
| 	hash.update("umd"); | ||||
| 	hash.update(this.name + ""); | ||||
| 	this.mainTemplate.updateHash(hash); | ||||
| }; | ||||
|  | @ -0,0 +1,100 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var ConcatSource = require("webpack-core/lib/ConcatSource"); | ||||
| var OriginalSource = require("webpack-core/lib/OriginalSource"); | ||||
| var Template = require("./Template"); | ||||
| 
 | ||||
| function accessorToObjectAccess(accessor) { | ||||
| 	return accessor.map(function(a) { | ||||
| 		return "[" + JSON.stringify(a) + "]"; | ||||
| 	}).join(""); | ||||
| } | ||||
| 
 | ||||
| function accessorAccess(base, accessor) { | ||||
| 	accessor = [].concat(accessor); | ||||
| 	return accessor.map(function(a, idx) { | ||||
| 		a = base + accessorToObjectAccess(accessor.slice(0, idx+1)); | ||||
| 		if(idx === accessor.length - 1) return a; | ||||
| 		return a + " = " + a + " || {}"; | ||||
| 	}).join(", "); | ||||
| } | ||||
| 
 | ||||
| function UmdMainTemplatePlugin(name) { | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = UmdMainTemplatePlugin; | ||||
| UmdMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	mainTemplate.plugin("render", function(source, chunk, hash) { | ||||
| 		var externals = chunk.modules.filter(function(m) { | ||||
| 			return m.external; | ||||
| 		}); | ||||
| 		function replaceKeys(str) { | ||||
| 			return (str | ||||
| 				.replace(Template.REGEXP_HASH, hash) | ||||
| 				.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash) | ||||
| 				.replace(Template.REGEXP_ID, chunk.id) | ||||
| 				.replace(Template.REGEXP_NAME, chunk.name || "")); | ||||
| 		} | ||||
| 		function externalsDepsArray() { | ||||
| 			return "[" + replaceKeys(externals.map(function(m) { | ||||
| 				return JSON.stringify(typeof m.request === "object" ? m.request.amd : m.request); | ||||
| 			}).join(", ")) + "]"; | ||||
| 		} | ||||
| 		function externalsRootArray() { | ||||
| 			return replaceKeys(externals.map(function(m) { | ||||
| 				var request = m.request; | ||||
| 				if(typeof request === "object") request = request.root; | ||||
| 				return "root" + accessorToObjectAccess([].concat(request)); | ||||
| 			}).join(", ")); | ||||
| 		} | ||||
| 		function externalsRequireArray(type) { | ||||
| 			return replaceKeys(externals.map(function(m) { | ||||
| 				var request = m.request; | ||||
| 				if(typeof request === "object") request = request[type]; | ||||
| 				if(Array.isArray(request)) { | ||||
| 					return "require(" + JSON.stringify(request[0]) + ")" + accessorToObjectAccess(request.slice(1)); | ||||
| 				} else  | ||||
| 					return "require(" + JSON.stringify(request) + ")"; | ||||
| 			}).join(", ")); | ||||
| 		} | ||||
| 		var externalsArguments = externals.map(function(m) { | ||||
| 			return "__WEBPACK_EXTERNAL_MODULE_" + m.id + "__"; | ||||
| 		}).join(", "); | ||||
| 		return new ConcatSource(new OriginalSource( | ||||
| 			"(function webpackUniversalModuleDefinition(root, factory) {\n" + | ||||
| 			"	if(typeof exports === 'object' && typeof module === 'object')\n" + | ||||
| 			"		module.exports = factory(" + externalsRequireArray("commonjs2") + ");\n" + | ||||
| 			"	else if(typeof define === 'function' && define.amd)\n" + | ||||
| 			(externalsArguments ? | ||||
| 			"		define(" + externalsDepsArray() + ", factory);\n" | ||||
| 			: | ||||
| 			"		define(factory);\n" | ||||
| 			) + | ||||
| 			(this.name ? | ||||
| 			"	else if(typeof exports === 'object')\n" + | ||||
| 			"		exports[" + JSON.stringify(replaceKeys([].concat(this.name).pop())) + "] = factory(" + externalsRequireArray("commonjs") + ");\n" + | ||||
| 			"	else\n" + | ||||
| 			"		" + replaceKeys(accessorAccess("root", this.name)) + " = factory(" + externalsRootArray() + ");\n" | ||||
| 			: | ||||
| 			"	else {\n" + | ||||
| 			(externalsArguments ? | ||||
| 			"		var a = typeof exports === 'object' ? factory(" + externalsRequireArray("commonjs") + ") : factory(" + externalsRootArray() + ");\n" | ||||
| 			: | ||||
| 			"		var a = factory();\n" | ||||
| 			) + | ||||
| 			"		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n" + | ||||
| 			"	}\n" | ||||
| 			) + | ||||
| 			"})(this, function(" + externalsArguments + ") {\nreturn ", "webpack/universalModuleDefinition"), source, "\n})\n"); | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("global-hash", function(chunk) { | ||||
| 		if(Template.REGEXP_HASH.test([].concat(this.name || "").join("|"))) | ||||
| 			return true; | ||||
| 	}.bind(this)); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("umd"); | ||||
| 		hash.update(this.name + ""); | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -1,161 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var MainTemplate = require("../MainTemplate"); | ||||
| var Template = require("../Template"); | ||||
| 
 | ||||
| function NodeMainTemplate(outputOptions, asyncChunkLoading) { | ||||
| 	MainTemplate.call(this, outputOptions); | ||||
| 	this.asyncChunkLoading = asyncChunkLoading; | ||||
| } | ||||
| module.exports = NodeMainTemplate; | ||||
| 
 | ||||
| NodeMainTemplate.prototype = Object.create(MainTemplate.prototype); | ||||
| NodeMainTemplate.prototype.constructor = NodeMainTemplate; | ||||
| 
 | ||||
| NodeMainTemplate.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 chunks", | ||||
| 			'// "1" means "already loaded"', | ||||
| 			"var installedChunks = {", | ||||
| 			this.indent( | ||||
| 				chunk.ids.map(function(id) { | ||||
| 					return id + ":1" | ||||
| 				}).join(",\n") | ||||
| 			), | ||||
| 			"};" | ||||
| 		); | ||||
| 	} | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| NodeMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) { | ||||
| 	var filename = this.outputOptions.filename || "bundle.js"; | ||||
| 	var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; | ||||
| 	var insertMoreModules = [ | ||||
| 		"var moreModules = chunk.modules, chunkIds = chunk.ids;", | ||||
| 		"for(var moduleId in moreModules) {", | ||||
| 		this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | ||||
| 		"}" | ||||
| 	]; | ||||
| 	if(this.asyncChunkLoading) { | ||||
| 		return [ | ||||
| 			"if(installedChunks[chunkId] === 1) callback.call(null, " + this.requireFn + ");", | ||||
| 			"else if(!installedChunks[chunkId]) {", | ||||
| 			this.indent([ | ||||
| 				"installedChunks[chunkId] = [callback];", | ||||
| 				"var filename = __dirname + " + JSON.stringify("/" + chunkFilename | ||||
| 						.replace(Template.REGEXP_HASH, hash) | ||||
| 						.replace(Template.REGEXP_NAME, "")) | ||||
| 					.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", | ||||
| 				"require('fs').readFile(filename, 'utf-8',  function(err, content) {", | ||||
| 				this.indent([ | ||||
| 					"if(err) { if(" + this.requireFn + ".onError) return " + this.requireFn + ".onError(err); else throw err; }", | ||||
| 					"var chunk = {};", | ||||
| 					"require('vm').runInThisContext('(function(exports) {' + content + '\\n})', filename)(chunk);", | ||||
| 				].concat(insertMoreModules).concat([ | ||||
| 					"var callbacks = [];", | ||||
| 					"for(var i = 0; i < chunkIds.length; i++) {", | ||||
| 					this.indent([ | ||||
| 						"if(Array.isArray(installedChunks[chunkIds[i]]))", | ||||
| 						this.indent([ | ||||
| 							"callbacks = callbacks.concat(installedChunks[chunkIds[i]]);" | ||||
| 						]), | ||||
| 						"installedChunks[chunkIds[i]] = 1;" | ||||
| 					]), | ||||
| 					"}", | ||||
| 					"for(i = 0; i < callbacks.length; i++)", | ||||
| 					this.indent("callbacks[i].call(null, " + this.requireFn + ");") | ||||
| 				])), | ||||
| 				"});" | ||||
| 			]), | ||||
| 			"} else installedChunks[chunkId].push(callback);", | ||||
| 		]; | ||||
| 	} else { | ||||
| 		return [ | ||||
| 			"// \"1\" is the signal for \"already loaded\"", | ||||
| 			"if(!installedChunks[chunkId]) {", | ||||
| 			this.indent([ | ||||
| 				"var chunk = require(" + | ||||
| 					JSON.stringify("./" + chunkFilename | ||||
| 						.replace(Template.REGEXP_HASH, hash) | ||||
| 						.replace(Template.REGEXP_NAME, "")) | ||||
| 					.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");" | ||||
| 			].concat(insertMoreModules).concat([ | ||||
| 				"for(var i = 0; i < chunkIds.length; i++)", | ||||
| 				this.indent("installedChunks[chunkIds[i]] = 1;"), | ||||
| 			])), | ||||
| 			"}", | ||||
| 			"callback.call(null, " + this.requireFn + ");", | ||||
| 		]; | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| NodeMainTemplate.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 Template.getFunctionContent(this.asyncChunkLoading ? function() { | ||||
| 		function hotDownloadUpdateChunk(chunkId) { | ||||
| 			var filename = require("path").join(__dirname, $hotChunkFilename$); | ||||
| 			require("fs").readFile(filename, "utf-8", function(err, content) { | ||||
| 				if(err) { | ||||
| 					if($require$.onError) | ||||
| 						return $require$.onError(err); | ||||
| 					else | ||||
| 						throw err; | ||||
| 				} | ||||
| 				var chunk = {}; | ||||
| 				require("vm").runInThisContext("(function(exports) {" + content + "\n})", filename)(chunk); | ||||
| 				hotAddUpdateChunk(chunk.id, chunk.modules); | ||||
| 			}); | ||||
| 		} | ||||
| 
 | ||||
| 		function hotDownloadManifest(callback) { | ||||
| 			var filename = require("path").join(__dirname, $hotMainFilename$); | ||||
| 			require("fs").readFile(filename, "utf-8", function(err, content) { | ||||
| 				if(err) return callback(); | ||||
| 				try { | ||||
| 					var update = JSON.parse(content); | ||||
| 				} catch(e) { | ||||
| 					return callback(e); | ||||
| 				} | ||||
| 				callback(null, update); | ||||
| 			}); | ||||
| 		} | ||||
| 	} : function() { | ||||
| 		function hotDownloadUpdateChunk(chunkId) { | ||||
| 			var chunk = require("./" + $hotChunkFilename$); | ||||
| 			hotAddUpdateChunk(chunk.id, chunk.modules); | ||||
| 		} | ||||
| 
 | ||||
| 		function hotDownloadManifest(callback) { | ||||
| 			try { | ||||
| 				var update = require("./" + $hotMainFilename$); | ||||
| 			} catch(e) { | ||||
| 				return callback(); | ||||
| 			} | ||||
| 			callback(null, update); | ||||
| 		} | ||||
| 	}) | ||||
| 		.replace(/\$require\$/g, this.requireFn) | ||||
| 		.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) | ||||
| 		.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename); | ||||
| }; | ||||
| 
 | ||||
| NodeMainTemplate.prototype.updateHash = function(hash) { | ||||
| 	MainTemplate.prototype.updateHash.call(this, hash); | ||||
| 	hash.update("node"); | ||||
| 	hash.update("3"); | ||||
| 	hash.update(this.outputOptions.filename + ""); | ||||
| 	hash.update(this.outputOptions.chunkFilename + ""); | ||||
| }; | ||||
|  | @ -0,0 +1,154 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var Template = require("../Template"); | ||||
| 
 | ||||
| function NodeMainTemplatePlugin(asyncChunkLoading) { | ||||
| 	this.asyncChunkLoading = asyncChunkLoading; | ||||
| } | ||||
| module.exports = NodeMainTemplatePlugin; | ||||
| NodeMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	var self = this; | ||||
| 	mainTemplate.plugin("local-vars", function(source, chunk, hash) { | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			return this.asString([ | ||||
| 				source, | ||||
| 				"", | ||||
| 				"// object to store loaded chunks", | ||||
| 				'// "1" means "already loaded"', | ||||
| 				"var installedChunks = {", | ||||
| 				this.indent( | ||||
| 					chunk.ids.map(function(id) { | ||||
| 						return id + ":1" | ||||
| 					}).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; | ||||
| 		var insertMoreModules = [ | ||||
| 			"var moreModules = chunk.modules, chunkIds = chunk.ids;", | ||||
| 			"for(var moduleId in moreModules) {", | ||||
| 			this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | ||||
| 			"}" | ||||
| 		]; | ||||
| 		if(self.asyncChunkLoading) { | ||||
| 			return this.asString([ | ||||
| 				"if(installedChunks[chunkId] === 1) callback.call(null, " + this.requireFn + ");", | ||||
| 				"else if(!installedChunks[chunkId]) {", | ||||
| 				this.indent([ | ||||
| 					"installedChunks[chunkId] = [callback];", | ||||
| 					"var filename = __dirname + " + JSON.stringify("/" + chunkFilename | ||||
| 							.replace(Template.REGEXP_HASH, hash) | ||||
| 							.replace(Template.REGEXP_NAME, "")) | ||||
| 						.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", | ||||
| 					"require('fs').readFile(filename, 'utf-8',  function(err, content) {", | ||||
| 					this.indent([ | ||||
| 						"if(err) { if(" + this.requireFn + ".onError) return " + this.requireFn + ".onError(err); else throw err; }", | ||||
| 						"var chunk = {};", | ||||
| 						"require('vm').runInThisContext('(function(exports) {' + content + '\\n})', filename)(chunk);", | ||||
| 					].concat(insertMoreModules).concat([ | ||||
| 						"var callbacks = [];", | ||||
| 						"for(var i = 0; i < chunkIds.length; i++) {", | ||||
| 						this.indent([ | ||||
| 							"if(Array.isArray(installedChunks[chunkIds[i]]))", | ||||
| 							this.indent([ | ||||
| 								"callbacks = callbacks.concat(installedChunks[chunkIds[i]]);" | ||||
| 							]), | ||||
| 							"installedChunks[chunkIds[i]] = 1;" | ||||
| 						]), | ||||
| 						"}", | ||||
| 						"for(i = 0; i < callbacks.length; i++)", | ||||
| 						this.indent("callbacks[i].call(null, " + this.requireFn + ");") | ||||
| 					])), | ||||
| 					"});" | ||||
| 				]), | ||||
| 				"} else installedChunks[chunkId].push(callback);", | ||||
| 			]); | ||||
| 		} else { | ||||
| 			return this.asString([ | ||||
| 				"// \"1\" is the signal for \"already loaded\"", | ||||
| 				"if(!installedChunks[chunkId]) {", | ||||
| 				this.indent([ | ||||
| 					"var chunk = require(" + | ||||
| 						JSON.stringify("./" + chunkFilename | ||||
| 							.replace(Template.REGEXP_HASH, hash) | ||||
| 							.replace(Template.REGEXP_NAME, "")) | ||||
| 						.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");" | ||||
| 				].concat(insertMoreModules).concat([ | ||||
| 					"for(var i = 0; i < chunkIds.length; i++)", | ||||
| 					this.indent("installedChunks[chunkIds[i]] = 1;"), | ||||
| 				])), | ||||
| 				"}", | ||||
| 				"callback.call(null, " + this.requireFn + ");", | ||||
| 			]); | ||||
| 		} | ||||
| 	}); | ||||
| 	mainTemplate.plugin("hot-bootstrap", function(source, chunk, hash) { | ||||
| 		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 Template.getFunctionContent(self.asyncChunkLoading ? function() { | ||||
| 			function hotDownloadUpdateChunk(chunkId) { | ||||
| 				var filename = require("path").join(__dirname, $hotChunkFilename$); | ||||
| 				require("fs").readFile(filename, "utf-8", function(err, content) { | ||||
| 					if(err) { | ||||
| 						if($require$.onError) | ||||
| 							return $require$.onError(err); | ||||
| 						else | ||||
| 							throw err; | ||||
| 					} | ||||
| 					var chunk = {}; | ||||
| 					require("vm").runInThisContext("(function(exports) {" + content + "\n})", filename)(chunk); | ||||
| 					hotAddUpdateChunk(chunk.id, chunk.modules); | ||||
| 				}); | ||||
| 			} | ||||
| 
 | ||||
| 			function hotDownloadManifest(callback) { | ||||
| 				var filename = require("path").join(__dirname, $hotMainFilename$); | ||||
| 				require("fs").readFile(filename, "utf-8", function(err, content) { | ||||
| 					if(err) return callback(); | ||||
| 					try { | ||||
| 						var update = JSON.parse(content); | ||||
| 					} catch(e) { | ||||
| 						return callback(e); | ||||
| 					} | ||||
| 					callback(null, update); | ||||
| 				}); | ||||
| 			} | ||||
| 		} : function() { | ||||
| 			function hotDownloadUpdateChunk(chunkId) { | ||||
| 				var chunk = require("./" + $hotChunkFilename$); | ||||
| 				hotAddUpdateChunk(chunk.id, chunk.modules); | ||||
| 			} | ||||
| 
 | ||||
| 			function hotDownloadManifest(callback) { | ||||
| 				try { | ||||
| 					var update = require("./" + $hotMainFilename$); | ||||
| 				} catch(e) { | ||||
| 					return callback(); | ||||
| 				} | ||||
| 				callback(null, update); | ||||
| 			} | ||||
| 		}) | ||||
| 			.replace(/\$require\$/g, this.requireFn) | ||||
| 			.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) | ||||
| 			.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename); | ||||
| 	}); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("node"); | ||||
| 		hash.update("3"); | ||||
| 		hash.update(this.outputOptions.filename + ""); | ||||
| 		hash.update(this.outputOptions.chunkFilename + ""); | ||||
| 	}); | ||||
| }; | ||||
|  | @ -2,7 +2,7 @@ | |||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var NodeMainTemplate = require("./NodeMainTemplate"); | ||||
| var NodeMainTemplatePlugin = require("./NodeMainTemplatePlugin"); | ||||
| var NodeChunkTemplate = require("./NodeChunkTemplate"); | ||||
| var NodeHotUpdateChunkTemplate = require("./NodeHotUpdateChunkTemplate"); | ||||
| 
 | ||||
|  | @ -13,7 +13,9 @@ function NodeTemplatePlugin(options, asyncChunkLoading) { | |||
| module.exports = NodeTemplatePlugin; | ||||
| NodeTemplatePlugin.prototype.apply = function(compiler) { | ||||
| 	var options = this.options; | ||||
| 	compiler.mainTemplate = new NodeMainTemplate(options, this.asyncChunkLoading); | ||||
| 	compiler.plugin("this-compilation", function(compilation) { | ||||
| 		compilation.mainTemplate.apply(new NodeMainTemplatePlugin(this.asyncChunkLoading)); | ||||
| 	}.bind(this)); | ||||
| 	compiler.chunkTemplate = new NodeChunkTemplate(options); | ||||
| 	compiler.hotUpdateChunkTemplate = new NodeHotUpdateChunkTemplate(options); | ||||
| }; | ||||
|  |  | |||
|  | @ -102,13 +102,13 @@ DedupePlugin.prototype.apply = function(compiler) { | |||
| 	}); | ||||
| 	compiler.plugin("after-plugins", function(compiler) { | ||||
| 		compiler.moduleTemplate = new DedupModuleTemplateDecorator(compiler.moduleTemplate); | ||||
| 		compiler.mainTemplate = Object.create(compiler.mainTemplate); | ||||
| 		var oldRenderAddModule = compiler.mainTemplate.renderAddModule; | ||||
| 		compiler.mainTemplate.renderAddModule = function(hash, chunk, varModuleId, varModule) { | ||||
| 	}); | ||||
| 	compiler.plugin("compilation", function(compilation) { | ||||
| 		compilation.mainTemplate.plugin("add-module", function(source, chunk, hash, varModuleId, varModule) { | ||||
| 			if(!chunk._DedupePlugin_hasDeduplicatedModules) { | ||||
| 				return oldRenderAddModule.call(this, hash, chunk, varModuleId, varModule); | ||||
| 				return source; | ||||
| 			} | ||||
| 			return [ | ||||
| 			return this.asString([ | ||||
| 				"var _m = " + varModule + ";", | ||||
| 				"", | ||||
| 				"// Check if module is deduplicated", | ||||
|  | @ -140,12 +140,11 @@ DedupePlugin.prototype.apply = function(compiler) { | |||
| 					"modules[" + varModuleId + "] = _m;" | ||||
| 				]), | ||||
| 				"}" | ||||
| 			] | ||||
| 		}; | ||||
| 		var oldRenderModules = compiler.mainTemplate.renderModules; | ||||
| 		compiler.mainTemplate.renderModules = function renderModules(hash, chunk, moduleTemplate, dependencyTemplates) { | ||||
| 			]); | ||||
| 		}); | ||||
| 		compilation.mainTemplate.plugin("modules", function(orginalSource, chunk, hash, moduleTemplate, dependencyTemplates) { | ||||
| 			if(!chunk._DedupePlugin_hasDeduplicatedModules) { | ||||
| 				return oldRenderModules.call(this, hash, chunk, moduleTemplate, dependencyTemplates); | ||||
| 				return orginalSource; | ||||
| 			} | ||||
| 			var source = new ConcatSource(); | ||||
| 			source.add("(function(modules) {\n"); | ||||
|  | @ -180,10 +179,10 @@ DedupePlugin.prototype.apply = function(compiler) { | |||
| 				"return modules;" | ||||
| 			])); | ||||
| 			source.add("\n}("); | ||||
| 			source.add(oldRenderModules.call(this, hash, chunk, moduleTemplate, dependencyTemplates)); | ||||
| 			source.add(orginalSource); | ||||
| 			source.add("))"); | ||||
| 			return source; | ||||
| 		}; | ||||
| 		}); | ||||
| 	}); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,84 +0,0 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var MainTemplate = require("../MainTemplate"); | ||||
| var Template = require("../Template"); | ||||
| 
 | ||||
| function WebWorkerMainTemplate(outputOptions) { | ||||
| 	MainTemplate.call(this, outputOptions); | ||||
| } | ||||
| module.exports = WebWorkerMainTemplate; | ||||
| 
 | ||||
| WebWorkerMainTemplate.prototype = Object.create(MainTemplate.prototype); | ||||
| 
 | ||||
| WebWorkerMainTemplate.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 chunks", | ||||
| 			'// "1" means "already loaded"', | ||||
| 			"var installedChunks = {", | ||||
| 			this.indent( | ||||
| 				chunk.ids.map(function(id) { | ||||
| 					return id + ":1" | ||||
| 				}).join(",\n") | ||||
| 			), | ||||
| 			"};" | ||||
| 		); | ||||
| 	} | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| WebWorkerMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) { | ||||
| 	var filename = this.outputOptions.filename || "bundle.js"; | ||||
| 	var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; | ||||
| 	return [ | ||||
| 		"// \"1\" is the signal for \"already loaded\"", | ||||
| 		"if(!installedChunks[chunkId]) {", | ||||
| 		this.indent([ | ||||
| 			"importScripts(" + | ||||
| 				JSON.stringify(chunkFilename | ||||
| 					.replace(Template.REGEXP_NAME, "")) | ||||
| 				.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | ||||
| 				.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");" | ||||
| 		]), | ||||
| 		"}", | ||||
| 		"callback.call(null, " + this.requireFn + ");" | ||||
| 	]; | ||||
| }; | ||||
| 
 | ||||
| WebWorkerMainTemplate.prototype.renderInit = function(hash, chunk) { | ||||
| 	var buf = MainTemplate.prototype.renderInit.call(this, hash, chunk); | ||||
| 	if(chunk.chunks.length > 0) { | ||||
| 		var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || "")); | ||||
| 		buf.push( | ||||
| 			"this[" + JSON.stringify(chunkCallbackName) + "] = function webpackChunkCallback(chunkIds, moreModules) {", | ||||
| 			this.indent([ | ||||
| 				"for(var moduleId in moreModules) {", | ||||
| 				this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | ||||
| 				"}", | ||||
| 				"while(chunkIds.length)", | ||||
| 				this.indent("installedChunks[chunkIds.pop()] = 1;") | ||||
| 			]), | ||||
| 			"};" | ||||
| 		); | ||||
| 	} | ||||
| 	return buf; | ||||
| }; | ||||
| 
 | ||||
| WebWorkerMainTemplate.prototype.renderCurrentHashCode = function(hash) { | ||||
| 	return JSON.stringify(hash); | ||||
| }; | ||||
| 
 | ||||
| WebWorkerMainTemplate.prototype.updateHash = function(hash) { | ||||
| 	MainTemplate.prototype.updateHash.call(this, hash); | ||||
| 	hash.update("webworker"); | ||||
| 	hash.update("3"); | ||||
| 	hash.update(this.outputOptions.publicPath + ""); | ||||
| 	hash.update(this.outputOptions.filename + ""); | ||||
| 	hash.update(this.outputOptions.chunkFilename + ""); | ||||
| 	hash.update(this.outputOptions.chunkCallbackName + ""); | ||||
| 	hash.update(this.outputOptions.library + ""); | ||||
| }; | ||||
|  | @ -0,0 +1,74 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var Template = require("../Template"); | ||||
| 
 | ||||
| function WebWorkerMainTemplatePlugin() { | ||||
| } | ||||
| module.exports = WebWorkerMainTemplatePlugin; | ||||
| 
 | ||||
| WebWorkerMainTemplatePlugin.prototype.apply = function(mainTemplate) { | ||||
| 	mainTemplate.plugin("local-vars", function(source, chunk, hash) { | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			return this.asString([ | ||||
| 				source, | ||||
| 				"", | ||||
| 				"// object to store loaded chunks", | ||||
| 				'// "1" means "already loaded"', | ||||
| 				"var installedChunks = {", | ||||
| 				this.indent( | ||||
| 					chunk.ids.map(function(id) { | ||||
| 						return id + ":1" | ||||
| 					}).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; | ||||
| 		return this.asString([ | ||||
| 			"// \"1\" is the signal for \"already loaded\"", | ||||
| 			"if(!installedChunks[chunkId]) {", | ||||
| 			this.indent([ | ||||
| 				"importScripts(" + | ||||
| 					JSON.stringify(chunkFilename | ||||
| 						.replace(Template.REGEXP_NAME, "")) | ||||
| 					.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"") | ||||
| 					.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");" | ||||
| 			]), | ||||
| 			"}", | ||||
| 			"callback.call(null, " + this.requireFn + ");" | ||||
| 		]); | ||||
| 	}); | ||||
| 	mainTemplate.plugin("bootstrap", function(source, chunk, hash) { | ||||
| 		if(chunk.chunks.length > 0) { | ||||
| 			var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || "")); | ||||
| 			return this.asString([ | ||||
| 				source, | ||||
| 				"this[" + JSON.stringify(chunkCallbackName) + "] = function webpackChunkCallback(chunkIds, moreModules) {", | ||||
| 				this.indent([ | ||||
| 					"for(var moduleId in moreModules) {", | ||||
| 					this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), | ||||
| 					"}", | ||||
| 					"while(chunkIds.length)", | ||||
| 					this.indent("installedChunks[chunkIds.pop()] = 1;") | ||||
| 				]), | ||||
| 				"};" | ||||
| 			]); | ||||
| 		} | ||||
| 		return source; | ||||
| 	}); | ||||
| 	mainTemplate.plugin("hash", function(hash) { | ||||
| 		hash.update("webworker"); | ||||
| 		hash.update("3"); | ||||
| 		hash.update(this.outputOptions.publicPath + ""); | ||||
| 		hash.update(this.outputOptions.filename + ""); | ||||
| 		hash.update(this.outputOptions.chunkFilename + ""); | ||||
| 		hash.update(this.outputOptions.chunkCallbackName + ""); | ||||
| 		hash.update(this.outputOptions.library + ""); | ||||
| 	}); | ||||
| }; | ||||
|  | @ -2,7 +2,7 @@ | |||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var WebWorkerMainTemplate = require("./WebWorkerMainTemplate"); | ||||
| var WebWorkerMainTemplatePlugin = require("./WebWorkerMainTemplatePlugin"); | ||||
| var WebWorkerChunkTemplate = require("./WebWorkerChunkTemplate"); | ||||
| 
 | ||||
| function WebWorkerTemplatePlugin(options) { | ||||
|  | @ -11,6 +11,8 @@ function WebWorkerTemplatePlugin(options) { | |||
| module.exports = WebWorkerTemplatePlugin; | ||||
| WebWorkerTemplatePlugin.prototype.apply = function(compiler) { | ||||
| 	var options = this.options; | ||||
| 	compiler.mainTemplate = new WebWorkerMainTemplate(options); | ||||
| 	compiler.plugin("this-compilation", function(compilation) { | ||||
| 		compilation.mainTemplate.apply(new WebWorkerMainTemplatePlugin()); | ||||
| 	}); | ||||
| 	compiler.chunkTemplate = new WebWorkerChunkTemplate(options); | ||||
| }; | ||||
|  | @ -13,7 +13,7 @@ | |||
| 		"clone": "0.1.x", | ||||
| 		"webpack-core": "0.4.x", | ||||
| 		"node-libs-browser": "0.3.x", | ||||
| 		"tapable": "0.1.x" | ||||
| 		"tapable": "~0.1.6" | ||||
| 	}, | ||||
| 	"licenses": [ | ||||
| 		{ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue