| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const path = require("path");const ParserHelpers = require("./ParserHelpers");const ConstDependency = require("./dependencies/ConstDependency");const NullFactory = require("./NullFactory");class NodeStuffPlugin {	constructor(options) {		this.options = options;	}	apply(compiler) {		const options = this.options;		compiler.hooks.compilation.tap(			"NodeStuffPlugin",			(compilation, { normalModuleFactory }) => {				compilation.dependencyFactories.set(ConstDependency, new NullFactory());				compilation.dependencyTemplates.set(					ConstDependency,					new ConstDependency.Template()				);				const handler = (parser, parserOptions) => {					if (parserOptions.node === false) return;					let localOptions = options;					if (parserOptions.node) {						localOptions = Object.assign({}, localOptions, parserOptions.node);					}					const setConstant = (expressionName, value) => {						parser.hooks.expression							.for(expressionName)							.tap("NodeStuffPlugin", () => {								parser.state.current.addVariable(									expressionName,									JSON.stringify(value)								);								return true;							});					};					const setModuleConstant = (expressionName, fn) => {						parser.hooks.expression							.for(expressionName)							.tap("NodeStuffPlugin", () => {								parser.state.current.addVariable(									expressionName,									JSON.stringify(fn(parser.state.module))								);								return true;							});					};					const context = compiler.context;					if (localOptions.__filename) {						if (localOptions.__filename === "mock") {							setConstant("__filename", "/index.js");						} else {							setModuleConstant("__filename", module =>								path.relative(context, module.resource)							);						}						parser.hooks.evaluateIdentifier							.for("__filename")							.tap("NodeStuffPlugin", expr => {								if (!parser.state.module) return;								const resource = parser.state.module.resource;								const i = resource.indexOf("?");								return ParserHelpers.evaluateToString(									i < 0 ? resource : resource.substr(0, i)								)(expr);							});					}					if (localOptions.__dirname) {						if (localOptions.__dirname === "mock") {							setConstant("__dirname", "/");						} else {							setModuleConstant("__dirname", module =>								path.relative(context, module.context)							);						}						parser.hooks.evaluateIdentifier							.for("__dirname")							.tap("NodeStuffPlugin", expr => {								if (!parser.state.module) return;								return ParserHelpers.evaluateToString(									parser.state.module.context								)(expr);							});					}					parser.hooks.expression						.for("require.extensions")						.tap(							"NodeStuffPlugin",							ParserHelpers.expressionIsUnsupported(								parser,								"require.extensions is not supported by webpack. Use a loader instead."							)						);				};				normalModuleFactory.hooks.parser					.for("javascript/auto")					.tap("NodeStuffPlugin", handler);				normalModuleFactory.hooks.parser					.for("javascript/dynamic")					.tap("NodeStuffPlugin", handler);			}		);	}}module.exports = NodeStuffPlugin;
 |