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;
|