| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-09 02:11:26 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | const Template = require("./Template"); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | const ConstDependency = require("./dependencies/ConstDependency"); | 
					
						
							|  |  |  | const ParserHelpers = require("./ParserHelpers"); | 
					
						
							|  |  |  | const NullFactory = require("./NullFactory"); | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | const REPLACEMENTS = { | 
					
						
							| 
									
										
										
										
											2018-06-27 19:48:13 +08:00
										 |  |  | 	// eslint-disable-next-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_hash__: "__webpack_require__.h", | 
					
						
							|  |  |  | 	// eslint-disable-next-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_chunkname__: "__webpack_require__.cn" | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | const REPLACEMENT_TYPES = { | 
					
						
							| 
									
										
										
										
											2018-06-27 19:48:13 +08:00
										 |  |  | 	// eslint-disable-next-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_hash__: "string", | 
					
						
							|  |  |  | 	// eslint-disable-next-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_chunkname__: "string" | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-09-14 18:04:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | class ExtendedAPIPlugin { | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							|  |  |  | 			"ExtendedAPIPlugin", | 
					
						
							|  |  |  | 			(compilation, { normalModuleFactory }) => { | 
					
						
							|  |  |  | 				compilation.dependencyFactories.set(ConstDependency, new NullFactory()); | 
					
						
							|  |  |  | 				compilation.dependencyTemplates.set( | 
					
						
							|  |  |  | 					ConstDependency, | 
					
						
							|  |  |  | 					new ConstDependency.Template() | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const mainTemplate = compilation.mainTemplate; | 
					
						
							|  |  |  | 				mainTemplate.hooks.requireExtensions.tap( | 
					
						
							|  |  |  | 					"ExtendedAPIPlugin", | 
					
						
							|  |  |  | 					(source, chunk, hash) => { | 
					
						
							|  |  |  | 						const buf = [source]; | 
					
						
							|  |  |  | 						buf.push(""); | 
					
						
							|  |  |  | 						buf.push("// __webpack_hash__"); | 
					
						
							|  |  |  | 						buf.push(`${mainTemplate.requireFn}.h = ${JSON.stringify(hash)};`); | 
					
						
							|  |  |  | 						buf.push(""); | 
					
						
							|  |  |  | 						buf.push("// __webpack_chunkname__"); | 
					
						
							|  |  |  | 						buf.push( | 
					
						
							|  |  |  | 							`${mainTemplate.requireFn}.cn = ${JSON.stringify(chunk.name)};` | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 						return Template.asString(buf); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				mainTemplate.hooks.globalHash.tap("ExtendedAPIPlugin", () => true); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const handler = (parser, parserOptions) => { | 
					
						
							|  |  |  | 					Object.keys(REPLACEMENTS).forEach(key => { | 
					
						
							|  |  |  | 						parser.hooks.expression | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							|  |  |  | 							.tap( | 
					
						
							|  |  |  | 								"ExtendedAPIPlugin", | 
					
						
							|  |  |  | 								ParserHelpers.toConstantDependencyWithWebpackRequire( | 
					
						
							|  |  |  | 									parser, | 
					
						
							|  |  |  | 									REPLACEMENTS[key] | 
					
						
							|  |  |  | 								) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						parser.hooks.evaluateTypeof | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							|  |  |  | 							.tap( | 
					
						
							|  |  |  | 								"ExtendedAPIPlugin", | 
					
						
							|  |  |  | 								ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							|  |  |  | 					.for("javascript/auto") | 
					
						
							|  |  |  | 					.tap("ExtendedAPIPlugin", handler); | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							|  |  |  | 					.for("javascript/dynamic") | 
					
						
							|  |  |  | 					.tap("ExtendedAPIPlugin", handler); | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							|  |  |  | 					.for("javascript/esm") | 
					
						
							|  |  |  | 					.tap("ExtendedAPIPlugin", handler); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ExtendedAPIPlugin; |