| 
									
										
										
										
											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 = { | 
					
						
							| 
									
										
										
										
											2017-03-22 23:09:53 +08:00
										 |  |  | 	__webpack_hash__: "__webpack_require__.h", // eslint-disable-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_chunkname__: "__webpack_require__.cn" // eslint-disable-line camelcase
 | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | const REPLACEMENT_TYPES = { | 
					
						
							| 
									
										
										
										
											2017-03-22 23:09:53 +08:00
										 |  |  | 	__webpack_hash__: "string", // eslint-disable-line camelcase
 | 
					
						
							|  |  |  | 	__webpack_chunkname__: "string" // eslint-disable-line camelcase
 | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2017-12-06 22:01:25 +08:00
										 |  |  | 		compiler.hooks.compilation.tap("ExtendedAPIPlugin", (compilation, { | 
					
						
							|  |  |  | 			normalModuleFactory | 
					
						
							|  |  |  | 		}) => { | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 			compilation.dependencyFactories.set(ConstDependency, new NullFactory()); | 
					
						
							|  |  |  | 			compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template()); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			const mainTemplate = compilation.mainTemplate; | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +08:00
										 |  |  | 			mainTemplate.hooks.requireExtensions.tap("ExtendedAPIPlugin", (source, chunk, hash) => { | 
					
						
							| 
									
										
										
										
											2017-02-27 16:21:35 +08:00
										 |  |  | 				const buf = [source]; | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 				buf.push(""); | 
					
						
							|  |  |  | 				buf.push("// __webpack_hash__"); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				buf.push(`${mainTemplate.requireFn}.h = ${JSON.stringify(hash)};`); | 
					
						
							| 
									
										
										
										
											2017-03-22 23:09:53 +08:00
										 |  |  | 				buf.push(""); | 
					
						
							|  |  |  | 				buf.push("// __webpack_chunkname__"); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				buf.push(`${mainTemplate.requireFn}.cn = ${JSON.stringify(chunk.name)};`); | 
					
						
							| 
									
										
										
										
											2017-12-07 16:42:33 +08:00
										 |  |  | 				return Template.asString(buf); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +08:00
										 |  |  | 			mainTemplate.hooks.globalHash.tap("ExtendedAPIPlugin", () => true); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +08:00
										 |  |  | 			const handler = (parser, parserOptions) => { | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 				Object.keys(REPLACEMENTS).forEach(key => { | 
					
						
							| 
									
										
										
										
											2017-12-19 21:35:30 +08:00
										 |  |  | 					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-02-26 23:49:41 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +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); | 
					
						
							| 
									
										
										
										
											2014-08-25 15:50:26 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-02-26 23:49:41 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ExtendedAPIPlugin; |