| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Yuta Hiroto @hiroppy | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-18 00:49:48 +08:00
										 |  |  | const validateOptions = require("schema-utils"); | 
					
						
							| 
									
										
										
										
											2019-10-16 22:38:04 +08:00
										 |  |  | const { compareModulesByIdentifier } = require("../util/comparators"); | 
					
						
							| 
									
										
										
										
											2019-12-04 01:48:31 +08:00
										 |  |  | const memorize = require("../util/memorize"); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("webpack-sources").Source} Source */ | 
					
						
							|  |  |  | /** @typedef {import("../Chunk")} Chunk */ | 
					
						
							|  |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							|  |  |  | /** @typedef {import("../Module")} Module */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | const getGeneratorSchema = memorize(() => | 
					
						
							|  |  |  | 	require("../../schemas/plugins/AssetModulesPluginGenerator.json") | 
					
						
							| 
									
										
										
										
											2019-12-02 23:37:55 +08:00
										 |  |  | ); | 
					
						
							| 
									
										
										
										
											2020-01-23 18:27:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const getGeneratorSchemaMap = { | 
					
						
							| 
									
										
										
										
											2020-01-29 21:48:46 +08:00
										 |  |  | 	asset: getGeneratorSchema, | 
					
						
							| 
									
										
										
										
											2020-01-23 18:27:12 +08:00
										 |  |  | 	"asset/resource": memorize(() => { | 
					
						
							|  |  |  | 		const base = getGeneratorSchema(); | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			...base, | 
					
						
							|  |  |  | 			properties: { | 
					
						
							|  |  |  | 				...base.properties, | 
					
						
							|  |  |  | 				dataUrl: false | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	"asset/inline": memorize(() => { | 
					
						
							|  |  |  | 		const base = getGeneratorSchema(); | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			...base, | 
					
						
							|  |  |  | 			properties: { | 
					
						
							|  |  |  | 				...base.properties, | 
					
						
							|  |  |  | 				filename: false | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | const getParserSchema = memorize(() => | 
					
						
							|  |  |  | 	require("../../schemas/plugins/AssetModulesPluginParser.json") | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | const getAssetGenerator = memorize(() => require("./AssetGenerator")); | 
					
						
							|  |  |  | const getAssetParser = memorize(() => require("./AssetParser")); | 
					
						
							|  |  |  | const getAssetSourceGenerator = memorize(() => | 
					
						
							|  |  |  | 	require("./AssetSourceGenerator") | 
					
						
							| 
									
										
										
										
											2019-12-02 23:37:55 +08:00
										 |  |  | ); | 
					
						
							| 
									
										
										
										
											2019-11-26 21:09:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-04-23 16:48:36 +08:00
										 |  |  | 	 * Apply the plugin | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler the compiler instance | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							|  |  |  | 			plugin, | 
					
						
							|  |  |  | 			(compilation, { normalModuleFactory }) => { | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 				normalModuleFactory.hooks.createParser | 
					
						
							|  |  |  | 					.for("asset") | 
					
						
							|  |  |  | 					.tap(plugin, parserOptions => { | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 						validateOptions(getParserSchema(), parserOptions, { | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 							name: "Asset Modules Plugin", | 
					
						
							|  |  |  | 							baseDataPath: "parser" | 
					
						
							| 
									
										
										
										
											2019-11-18 00:49:48 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 						let dataUrlCondition = parserOptions.dataUrlCondition; | 
					
						
							|  |  |  | 						if (!dataUrlCondition || typeof dataUrlCondition === "object") { | 
					
						
							|  |  |  | 							dataUrlCondition = { | 
					
						
							|  |  |  | 								maxSize: 8096, | 
					
						
							|  |  |  | 								...dataUrlCondition | 
					
						
							|  |  |  | 							}; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 						const AssetParser = getAssetParser(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 						return new AssetParser(dataUrlCondition); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.createParser | 
					
						
							|  |  |  | 					.for("asset/inline") | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 					.tap(plugin, parserOptions => { | 
					
						
							|  |  |  | 						const AssetParser = getAssetParser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return new AssetParser(true); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 				normalModuleFactory.hooks.createParser | 
					
						
							|  |  |  | 					.for("asset/resource") | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 					.tap(plugin, parserOptions => { | 
					
						
							|  |  |  | 						const AssetParser = getAssetParser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return new AssetParser(false); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-11-26 21:05:07 +08:00
										 |  |  | 				normalModuleFactory.hooks.createParser | 
					
						
							|  |  |  | 					.for("asset/source") | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 					.tap(plugin, parserOptions => { | 
					
						
							|  |  |  | 						const AssetParser = getAssetParser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return new AssetParser(false); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-29 21:48:46 +08:00
										 |  |  | 				for (const type of ["asset", "asset/inline", "asset/resource"]) { | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 					normalModuleFactory.hooks.createGenerator | 
					
						
							|  |  |  | 						.for(type) | 
					
						
							| 
									
										
										
										
											2019-11-26 21:09:22 +08:00
										 |  |  | 						// eslint-disable-next-line no-loop-func
 | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 						.tap(plugin, generatorOptions => { | 
					
						
							| 
									
										
										
										
											2020-01-23 18:27:12 +08:00
										 |  |  | 							validateOptions(getGeneratorSchemaMap[type](), generatorOptions, { | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 								name: "Asset Modules Plugin", | 
					
						
							|  |  |  | 								baseDataPath: "generator" | 
					
						
							|  |  |  | 							}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-29 21:48:46 +08:00
										 |  |  | 							let dataUrl = undefined; | 
					
						
							|  |  |  | 							if (type !== "asset/resource") { | 
					
						
							|  |  |  | 								dataUrl = generatorOptions.dataUrl; | 
					
						
							|  |  |  | 								if (!dataUrl || typeof dataUrl === "object") { | 
					
						
							|  |  |  | 									dataUrl = { | 
					
						
							|  |  |  | 										encoding: "base64", | 
					
						
							|  |  |  | 										mimetype: undefined, | 
					
						
							|  |  |  | 										...dataUrl | 
					
						
							|  |  |  | 									}; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							let filename = undefined; | 
					
						
							|  |  |  | 							if (type !== "asset/inline") { | 
					
						
							|  |  |  | 								filename = generatorOptions.filename; | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 							const AssetGenerator = getAssetGenerator(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-29 21:48:46 +08:00
										 |  |  | 							return new AssetGenerator(compilation, dataUrl, filename); | 
					
						
							| 
									
										
										
										
											2019-11-26 20:56:27 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-11-26 21:05:07 +08:00
										 |  |  | 				normalModuleFactory.hooks.createGenerator | 
					
						
							|  |  |  | 					.for("asset/source") | 
					
						
							| 
									
										
										
										
											2019-12-04 01:31:39 +08:00
										 |  |  | 					.tap(plugin, () => { | 
					
						
							|  |  |  | 						const AssetSourceGenerator = getAssetSourceGenerator(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return new AssetSourceGenerator(); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 				compilation.hooks.renderManifest.tap(plugin, (result, options) => { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 					const { chunkGraph } = compilation; | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 					const { chunk, codeGenerationResults } = options; | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-20 18:20:34 +08:00
										 |  |  | 					const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType( | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 						chunk, | 
					
						
							| 
									
										
										
										
											2019-11-20 18:20:34 +08:00
										 |  |  | 						"asset", | 
					
						
							| 
									
										
										
										
											2019-10-16 22:38:04 +08:00
										 |  |  | 						compareModulesByIdentifier | 
					
						
							| 
									
										
										
										
											2019-11-20 18:20:34 +08:00
										 |  |  | 					); | 
					
						
							|  |  |  | 					if (modules) { | 
					
						
							|  |  |  | 						for (const module of modules) { | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 							result.push({ | 
					
						
							|  |  |  | 								render: () => | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 									codeGenerationResults.getSource(module, chunk.runtime, type), | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 								filename: module.buildInfo.filename, | 
					
						
							|  |  |  | 								info: module.buildInfo.assetInfo, | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 								auxiliary: true, | 
					
						
							|  |  |  | 								identifier: `assetModule${chunkGraph.getModuleId(module)}`, | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 								hash: module.buildInfo.fullContentHash | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					return result; | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2019-03-31 22:12:19 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 19:16:27 +08:00
										 |  |  | module.exports = AssetModulesPlugin; |