| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Yuta Hiroto @hiroppy | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Generator = require("../Generator"); | 
					
						
							|  |  |  | const { compareModulesById } = require("../util/comparators"); | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | const AssetGenerator = require("./AssetGenerator"); | 
					
						
							|  |  |  | const AssetJavascriptGenerator = require("./AssetJavascriptGenerator"); | 
					
						
							|  |  |  | const AssetParser = require("./AssetParser"); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("webpack-sources").Source} Source */ | 
					
						
							|  |  |  | /** @typedef {import("../Chunk")} Chunk */ | 
					
						
							|  |  |  | /** @typedef {import("../ChunkTemplate")} ChunkTemplate */ | 
					
						
							|  |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							|  |  |  | /** @typedef {import("../MainTemplate")} MainTemplate */ | 
					
						
							|  |  |  | /** @typedef {import("../Module")} Module */ | 
					
						
							|  |  |  | /** @typedef {import("../ModuleTemplate")} ModuleTemplate */ | 
					
						
							|  |  |  | /** @typedef {import("../ModuleTemplate").RenderContext} RenderContext */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | const type = "asset"; | 
					
						
							|  |  |  | const plugin = "AssetModulesPlugin"; | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 19:33:45 +08:00
										 |  |  | class AssetModulesPlugin { | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler webpack compiler | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							|  |  |  | 			plugin, | 
					
						
							|  |  |  | 			(compilation, { normalModuleFactory }) => { | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.createParser.for(type).tap(plugin, () => { | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 					return new AssetParser(); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.createGenerator.for(type).tap(plugin, () => { | 
					
						
							|  |  |  | 					return Generator.byType({ | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 						asset: new AssetGenerator(), | 
					
						
							|  |  |  | 						javascript: new AssetJavascriptGenerator(compilation) | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				compilation.mainTemplate.hooks.renderManifest.tap( | 
					
						
							|  |  |  | 					plugin, | 
					
						
							|  |  |  | 					(result, options) => { | 
					
						
							| 
									
										
										
										
											2019-07-16 19:33:45 +08:00
										 |  |  | 						const { chunkGraph, moduleGraph } = compilation; | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 						const { | 
					
						
							|  |  |  | 							chunk, | 
					
						
							|  |  |  | 							moduleTemplates, | 
					
						
							|  |  |  | 							dependencyTemplates, | 
					
						
							|  |  |  | 							runtimeTemplate | 
					
						
							|  |  |  | 						} = options; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						const { outputOptions } = runtimeTemplate; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						for (const module of chunkGraph.getOrderedChunkModulesIterable( | 
					
						
							|  |  |  | 							chunk, | 
					
						
							|  |  |  | 							compareModulesById(chunkGraph) | 
					
						
							|  |  |  | 						)) { | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 							if (module.getSourceTypes().has("asset")) { | 
					
						
							| 
									
										
										
										
											2019-06-06 05:29:53 +08:00
										 |  |  | 								const filename = module.nameForCondition(); | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 								const filenameTemplate = outputOptions.assetModuleFilename; | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 								result.push({ | 
					
						
							|  |  |  | 									render: () => | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 										this.renderAsset(module, moduleTemplates.asset, { | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 											chunk, | 
					
						
							|  |  |  | 											chunkGraph, | 
					
						
							|  |  |  | 											moduleGraph, | 
					
						
							|  |  |  | 											dependencyTemplates, | 
					
						
							|  |  |  | 											runtimeTemplate | 
					
						
							|  |  |  | 										}), | 
					
						
							|  |  |  | 									filenameTemplate, | 
					
						
							|  |  |  | 									pathOptions: { | 
					
						
							|  |  |  | 										module, | 
					
						
							|  |  |  | 										filename, | 
					
						
							|  |  |  | 										chunkGraph | 
					
						
							|  |  |  | 									}, | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 									identifier: `assetModule${chunkGraph.getModuleId(module)}`, | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 									hash: chunkGraph.getModuleHash(module) | 
					
						
							|  |  |  | 								}); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return result; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Module} module the module to render | 
					
						
							|  |  |  | 	 * @param {ModuleTemplate} moduleTemplate the module template | 
					
						
							| 
									
										
										
										
											2019-07-16 19:33:45 +08:00
										 |  |  | 	 * @param {RenderContext} renderContext the render context | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 	 * @returns {Source} the rendered source | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	/* eslint-enable */ | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | 	renderAsset(module, moduleTemplate, renderContext) { | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 		return moduleTemplate.render(module, renderContext); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | module.exports = AssetModulesPlugin; |