blob: d113491c969c38f7eecaf29a8776414a784672a1 [file] [log] [blame]
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const path = require("path");
const AMDRequireDependency = require("./AMDRequireDependency");
const AMDRequireItemDependency = require("./AMDRequireItemDependency");
const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
const AMDRequireContextDependency = require("./AMDRequireContextDependency");
const AMDDefineDependency = require("./AMDDefineDependency");
const UnsupportedDependency = require("./UnsupportedDependency");
const LocalModuleDependency = require("./LocalModuleDependency");
const NullFactory = require("../NullFactory");
const AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
const ParserHelpers = require("../ParserHelpers");
class AMDPlugin {
constructor(options, amdOptions) {
this.amdOptions = amdOptions;
this.options = options;
}
apply(compiler) {
const options = this.options;
const amdOptions = this.amdOptions;
compiler.hooks.compilation.tap(
"AMDPlugin",
(compilation, { contextModuleFactory, normalModuleFactory }) => {
compilation.dependencyFactories.set(
AMDRequireDependency,
new NullFactory()
);
compilation.dependencyTemplates.set(
AMDRequireDependency,
new AMDRequireDependency.Template()
);
compilation.dependencyFactories.set(
AMDRequireItemDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
AMDRequireItemDependency,
new AMDRequireItemDependency.Template()
);
compilation.dependencyFactories.set(
AMDRequireArrayDependency,
new NullFactory()
);
compilation.dependencyTemplates.set(
AMDRequireArrayDependency,
new AMDRequireArrayDependency.Template()
);
compilation.dependencyFactories.set(
AMDRequireContextDependency,
contextModuleFactory
);
compilation.dependencyTemplates.set(
AMDRequireContextDependency,
new AMDRequireContextDependency.Template()
);
compilation.dependencyFactories.set(
AMDDefineDependency,
new NullFactory()
);
compilation.dependencyTemplates.set(
AMDDefineDependency,
new AMDDefineDependency.Template()
);
compilation.dependencyFactories.set(
UnsupportedDependency,
new NullFactory()
);
compilation.dependencyTemplates.set(
UnsupportedDependency,
new UnsupportedDependency.Template()
);
compilation.dependencyFactories.set(
LocalModuleDependency,
new NullFactory()
);
compilation.dependencyTemplates.set(
LocalModuleDependency,
new LocalModuleDependency.Template()
);
const handler = (parser, parserOptions) => {
if (parserOptions.amd !== undefined && !parserOptions.amd) return;
const setExpressionToModule = (outerExpr, module) => {
parser.hooks.expression.for(outerExpr).tap("AMDPlugin", expr => {
const dep = new AMDRequireItemDependency(module, expr.range);
dep.userRequest = outerExpr;
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
return true;
});
};
new AMDRequireDependenciesBlockParserPlugin(options).apply(parser);
new AMDDefineDependencyParserPlugin(options).apply(parser);
setExpressionToModule("require.amd", "!!webpack amd options");
setExpressionToModule("define.amd", "!!webpack amd options");
setExpressionToModule("define", "!!webpack amd define");
parser.hooks.expression
.for("__webpack_amd_options__")
.tap("AMDPlugin", () =>
parser.state.current.addVariable(
"__webpack_amd_options__",
JSON.stringify(amdOptions)
)
);
parser.hooks.evaluateTypeof
.for("define.amd")
.tap(
"AMDPlugin",
ParserHelpers.evaluateToString(typeof amdOptions)
);
parser.hooks.evaluateTypeof
.for("require.amd")
.tap(
"AMDPlugin",
ParserHelpers.evaluateToString(typeof amdOptions)
);
parser.hooks.evaluateIdentifier
.for("define.amd")
.tap(
"AMDPlugin",
ParserHelpers.evaluateToIdentifier("define.amd", true)
);
parser.hooks.evaluateIdentifier
.for("require.amd")
.tap(
"AMDPlugin",
ParserHelpers.evaluateToIdentifier("require.amd", true)
);
parser.hooks.typeof
.for("define")
.tap(
"AMDPlugin",
ParserHelpers.toConstantDependency(
parser,
JSON.stringify("function")
)
);
parser.hooks.evaluateTypeof
.for("define")
.tap("AMDPlugin", ParserHelpers.evaluateToString("function"));
parser.hooks.canRename
.for("define")
.tap("AMDPlugin", ParserHelpers.approve);
parser.hooks.rename.for("define").tap("AMDPlugin", expr => {
const dep = new AMDRequireItemDependency(
"!!webpack amd define",
expr.range
);
dep.userRequest = "define";
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
return false;
});
parser.hooks.typeof
.for("require")
.tap(
"AMDPlugin",
ParserHelpers.toConstantDependency(
parser,
JSON.stringify("function")
)
);
parser.hooks.evaluateTypeof
.for("require")
.tap("AMDPlugin", ParserHelpers.evaluateToString("function"));
};
normalModuleFactory.hooks.parser
.for("javascript/auto")
.tap("AMDPlugin", handler);
normalModuleFactory.hooks.parser
.for("javascript/dynamic")
.tap("AMDPlugin", handler);
}
);
compiler.hooks.afterResolvers.tap("AMDPlugin", () => {
compiler.resolverFactory.hooks.resolver
.for("normal")
.tap("AMDPlugin", resolver => {
new AliasPlugin(
"described-resolve",
{
name: "amdefine",
alias: path.join(
__dirname,
"..",
"..",
"buildin",
"amd-define.js"
)
},
"resolve"
).apply(resolver);
new AliasPlugin(
"described-resolve",
{
name: "webpack amd options",
alias: path.join(
__dirname,
"..",
"..",
"buildin",
"amd-options.js"
)
},
"resolve"
).apply(resolver);
new AliasPlugin(
"described-resolve",
{
name: "webpack amd define",
alias: path.join(
__dirname,
"..",
"..",
"buildin",
"amd-define.js"
)
},
"resolve"
).apply(resolver);
});
});
}
}
module.exports = AMDPlugin;