webpack/lib/WebpackOptionsApply.js

269 lines
11 KiB
JavaScript
Raw Normal View History

2013-01-30 18:49:25 +01:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var OptionsApply = require("./OptionsApply");
var FunctionModulePlugin = require("./FunctionModulePlugin");
var EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");
2013-03-26 16:54:41 +01:00
var SourceMapDevToolPlugin = require("./SourceMapDevToolPlugin");
2013-01-30 18:49:25 +01:00
var SingleEntryPlugin = require("./SingleEntryPlugin");
var MultiEntryPlugin = require("./MultiEntryPlugin");
2013-05-31 12:22:40 +02:00
var RecordIdsPlugin = require("./RecordIdsPlugin");
2013-01-30 18:49:25 +01:00
var APIPlugin = require("./APIPlugin");
var ConstPlugin = require("./ConstPlugin");
2013-02-13 21:24:00 +01:00
var RequireJsStuffPlugin = require("./RequireJsStuffPlugin");
var NodeStuffPlugin = require("./NodeStuffPlugin");
2013-01-30 18:49:25 +01:00
var CompatibilityPlugin = require("./CompatibilityPlugin");
var CommonJsPlugin = require("./dependencies/CommonJsPlugin");
var AMDPlugin = require("./dependencies/AMDPlugin");
2013-02-26 12:36:34 +01:00
var LabeledModulesPlugin = require("./dependencies/LabeledModulesPlugin");
2013-01-30 18:49:25 +01:00
var RequireContextPlugin = require("./dependencies/RequireContextPlugin");
var RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
2013-02-15 17:08:14 +01:00
var RequireIncludePlugin = require("./dependencies/RequireIncludePlugin");
2013-01-30 18:49:25 +01:00
var RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
var RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
var MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
var FlagIncludedChunksPlugin = require("./optimize/FlagIncludedChunksPlugin");
2013-01-30 18:49:25 +01:00
var UnsafeCachePlugin = require("enhanced-resolve/lib/UnsafeCachePlugin");
2013-01-30 18:49:25 +01:00
var ModulesInDirectoriesPlugin = require("enhanced-resolve/lib/ModulesInDirectoriesPlugin");
2013-02-04 10:47:00 +01:00
var ModulesInRootPlugin = require("enhanced-resolve/lib/ModulesInRootPlugin");
2013-01-30 18:49:25 +01:00
var ModuleTemplatesPlugin = require("enhanced-resolve/lib/ModuleTemplatesPlugin");
var ModuleAsFilePlugin = require("enhanced-resolve/lib/ModuleAsFilePlugin");
var ModuleAsDirectoryPlugin = require("enhanced-resolve/lib/ModuleAsDirectoryPlugin");
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
var DirectoryDefaultFilePlugin = require("enhanced-resolve/lib/DirectoryDefaultFilePlugin");
var DirectoryDescriptionFilePlugin = require("enhanced-resolve/lib/DirectoryDescriptionFilePlugin");
var FileAppendPlugin = require("enhanced-resolve/lib/FileAppendPlugin");
var DirectoryResultPlugin = require("enhanced-resolve/lib/DirectoryResultPlugin");
function WebpackOptionsApply() {
OptionsApply.call(this);
}
module.exports = WebpackOptionsApply;
WebpackOptionsApply.prototype = Object.create(OptionsApply.prototype);
WebpackOptionsApply.prototype.process = function(options, compiler) {
if(options.plugins && Array.isArray(options.plugins)) {
compiler.apply.apply(compiler, options.plugins);
}
compiler.outputPath = options.output.path;
2013-05-31 12:22:40 +02:00
compiler.recordsInputPath = options.recordsInputPath || options.recordsPath;
compiler.recordsOutputPath = options.recordsOutputPath || options.recordsPath;
switch(options.target) {
case "web":
2013-07-10 23:20:07 +02:00
var JsonpTemplatePlugin = require("./JsonpTemplatePlugin");
var NodeSourcePlugin = require("./node/NodeSourcePlugin");
compiler.apply(
new JsonpTemplatePlugin(options.output),
new FunctionModulePlugin(options.context, options.output),
new NodeSourcePlugin(options.node)
);
break;
case "webworker":
2013-07-10 23:20:07 +02:00
var WebWorkerTemplatePlugin = require("./webworker/WebWorkerTemplatePlugin");
var NodeSourcePlugin = require("./node/NodeSourcePlugin");
compiler.apply(
new WebWorkerTemplatePlugin(options.output),
new FunctionModulePlugin(options.context, options.output),
new NodeSourcePlugin(options.node)
);
break;
case "node":
2013-07-10 23:20:07 +02:00
var NodeTemplatePlugin = require("./node/NodeTemplatePlugin");
var NodeTargetPlugin = require("./node/NodeTargetPlugin");
compiler.apply(
new NodeTemplatePlugin(options.output),
new FunctionModulePlugin(options.context, options.output),
new NodeTargetPlugin()
);
break;
}
2013-06-19 11:53:03 +02:00
if(options.output.library || options.output.libraryTarget != "var") {
2013-07-10 23:20:07 +02:00
var LibraryTemplatePlugin = require("./LibraryTemplatePlugin");
2013-01-30 18:49:25 +01:00
compiler.apply(new LibraryTemplatePlugin(options.output.library, options.output.libraryTarget));
2013-06-19 11:53:03 +02:00
}
if(options.hot) {
2013-07-10 23:20:07 +02:00
var HotModuleReplacementPlugin = require("./HotModuleReplacementPlugin");
compiler.apply(new HotModuleReplacementPlugin(options.output));
} else {
2013-07-10 23:20:07 +02:00
var NoHotModuleReplacementPlugin = require("./NoHotModuleReplacementPlugin");
compiler.apply(new NoHotModuleReplacementPlugin());
}
2013-01-30 18:49:25 +01:00
if(options.devtool == "eval")
compiler.apply(new EvalDevToolModulePlugin());
else if(options.devtool == "@eval")
compiler.apply(new EvalDevToolModulePlugin("//@ sourceURL=[url]"));
else if(options.devtool == "#eval")
compiler.apply(new EvalDevToolModulePlugin("//# sourceURL=[url]"));
else if(options.devtool == "#@eval")
compiler.apply(new EvalDevToolModulePlugin("//@ sourceURL=[url]\n//# sourceURL=[url]"));
2013-03-26 16:54:41 +01:00
else if(options.devtool == "sourcemap" || options.devtool == "source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, options.output.sourceMapFilename));
else if(options.devtool == "@sourcemap" || options.devtool == "@source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, options.output.sourceMapFilename, "\n/*\n//@ sourceMappingURL=[url]\n*/"));
else if(options.devtool == "#sourcemap" || options.devtool == "#source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, options.output.sourceMapFilename, "\n//# sourceMappingURL=[url]"));
else if(options.devtool == "#@sourcemap" || options.devtool == "#@source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, options.output.sourceMapFilename, "\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/"));
2013-03-26 16:54:41 +01:00
else if(options.devtool == "inlinesourcemap" ||
options.devtool == "inline-sourcemap" ||
options.devtool == "inline-source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context));
else if(options.devtool == "@inlinesourcemap" ||
options.devtool == "@inline-sourcemap" ||
options.devtool == "@inline-source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, null, "\n/*\n//@ sourceMappingURL=[url]\n*/"));
else if(options.devtool == "#inlinesourcemap" ||
options.devtool == "#inline-sourcemap" ||
options.devtool == "#inline-source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, null, "\n//# sourceMappingURL=[url]"));
else if(options.devtool == "#@inlinesourcemap" ||
options.devtool == "#@inline-sourcemap" ||
options.devtool == "#@inline-source-map")
compiler.apply(new SourceMapDevToolPlugin(options.context, null, "\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/"));
2013-06-19 11:53:03 +02:00
function itemToPlugin(item, name) {
if(Array.isArray(item))
return new MultiEntryPlugin(options.context, item, name);
else
return new SingleEntryPlugin(options.context, item, name)
}
if(typeof options.entry == "string" || Array.isArray(options.entry)) {
compiler.apply(itemToPlugin(options.entry, "main"));
2013-01-30 18:49:25 +01:00
} else if(typeof options.entry == "object") {
Object.keys(options.entry).forEach(function(name) {
compiler.apply(itemToPlugin(options.entry[name], name));
2013-01-30 18:49:25 +01:00
});
}
2013-06-19 11:53:03 +02:00
2013-05-13 13:34:00 +02:00
if(options.prefetch) {
2013-07-10 23:20:07 +02:00
var PrefetchPlugin = require("./PrefetchPlugin");
2013-05-13 13:34:00 +02:00
options.prefetch.map(function(request) {
compiler.apply(new PrefetchPlugin(options.context, request));
});
}
2013-01-30 18:49:25 +01:00
compiler.apply(
new CompatibilityPlugin(),
new NodeStuffPlugin(options.node),
2013-02-13 21:24:00 +01:00
new RequireJsStuffPlugin(),
2013-01-30 18:49:25 +01:00
new APIPlugin(),
new ConstPlugin(),
2013-02-15 17:08:14 +01:00
new RequireIncludePlugin(),
2013-01-30 18:49:25 +01:00
new RequireEnsurePlugin(),
new RequireContextPlugin(options.resolve.modulesDirectories, options.resolve.extensions),
new AMDPlugin(options.amd || {}),
2013-02-26 12:36:34 +01:00
new CommonJsPlugin(),
new LabeledModulesPlugin()
2013-01-30 18:49:25 +01:00
);
compiler.apply(
new RemoveParentModulesPlugin(),
new RemoveEmptyChunksPlugin(),
new MergeDuplicateChunksPlugin(),
new FlagIncludedChunksPlugin()
2013-01-30 18:49:25 +01:00
);
2013-05-08 13:28:54 +02:00
2013-05-31 12:22:40 +02:00
compiler.apply(new RecordIdsPlugin());
2013-07-10 23:20:07 +02:00
if(options.optimize && options.optimize.occurenceOrder) {
var OccurenceOrderPlugin = require("./optimize/OccurenceOrderPlugin");
2013-05-08 13:28:54 +02:00
compiler.apply(new OccurenceOrderPlugin(options.optimize.occurenceOrderPreferEntry));
2013-07-10 23:20:07 +02:00
}
2013-05-08 13:28:54 +02:00
2013-07-10 23:20:07 +02:00
if(options.optimize && options.optimize.minChunkSize) {
var MinChunkSizePlugin = require("./optimize/MinChunkSizePlugin");
2013-06-17 18:55:11 +02:00
compiler.apply(new MinChunkSizePlugin(options.optimize));
2013-07-10 23:20:07 +02:00
}
2013-02-11 10:52:19 +01:00
2013-07-10 23:20:07 +02:00
if(options.optimize && options.optimize.maxChunks) {
var LimitChunkCountPlugin = require("./optimize/LimitChunkCountPlugin");
2013-01-30 18:49:25 +01:00
compiler.apply(new LimitChunkCountPlugin(options.optimize));
2013-07-10 23:20:07 +02:00
}
2013-01-30 18:49:25 +01:00
2013-07-10 23:20:07 +02:00
if(options.optimize.minimize) {
var UglifyJsPlugin = require("./optimize/UglifyJsPlugin");
if(options.optimize.minimize === true)
compiler.apply(new UglifyJsPlugin());
else
compiler.apply(new UglifyJsPlugin(options.optimize.minimize));
}
2013-01-30 18:49:25 +01:00
2013-07-10 23:20:07 +02:00
if(options.optimize.dedupe === true) {
var DedupePlugin = require("./optimize/DedupePlugin");
compiler.apply(new DedupePlugin());
2013-07-10 23:20:07 +02:00
}
2013-07-10 23:20:07 +02:00
if(options.cache === undefined ? options.watch : options.cache) {
var CachePlugin = require("./CachePlugin");
2013-01-30 18:49:25 +01:00
compiler.apply(new CachePlugin(typeof options.cache == "object" ? options.cache : null));
2013-07-10 23:20:07 +02:00
}
2013-01-30 18:49:25 +01:00
2013-02-10 20:37:30 +01:00
if(typeof options.provide === "object") {
2013-07-10 23:20:07 +02:00
var ProvidePlugin = require("./ProvidePlugin");
2013-02-10 20:37:30 +01:00
for(var name in options.provide) {
compiler.apply(new ProvidePlugin(name, options.provide[name]));
}
}
2013-01-30 18:49:25 +01:00
compiler.applyPlugins("after-plugins", compiler);
compiler.resolvers.normal.apply(
new UnsafeCachePlugin(options.resolve.unsafeCache),
2013-01-30 18:49:25 +01:00
new ModuleAliasPlugin(options.resolve.alias),
2013-02-10 20:37:30 +01:00
makeRootPlugin("module", options.resolve.root),
2013-02-04 13:59:43 +01:00
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
2013-02-10 20:37:30 +01:00
makeRootPlugin("module", options.resolve.fallback),
2013-01-30 18:49:25 +01:00
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryDescriptionFilePlugin("package.json", ["webpack", "browserify", "web", ["jam", "main"], "main"]),
new DirectoryDefaultFilePlugin(["index"]),
new FileAppendPlugin(options.resolve.extensions)
);
compiler.resolvers.context.apply(
new UnsafeCachePlugin(options.resolve.unsafeCache),
2013-01-30 18:49:25 +01:00
new ModuleAliasPlugin(options.resolve.alias),
2013-02-10 20:37:30 +01:00
makeRootPlugin("module", options.resolve.root),
2013-02-04 13:59:43 +01:00
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
2013-02-10 20:37:30 +01:00
makeRootPlugin("module", options.resolve.fallback),
2013-01-30 18:49:25 +01:00
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryResultPlugin()
);
compiler.resolvers.loader.apply(
new UnsafeCachePlugin(options.resolve.unsafeCache),
2013-01-30 18:49:25 +01:00
new ModuleAliasPlugin(options.resolveLoader.alias),
2013-02-10 20:37:30 +01:00
makeRootPlugin("loader-module", options.resolveLoader.root),
2013-02-04 13:59:43 +01:00
new ModulesInDirectoriesPlugin("loader-module", options.resolveLoader.modulesDirectories),
2013-02-10 20:37:30 +01:00
makeRootPlugin("loader-module", options.resolveLoader.fallback),
2013-01-30 18:49:25 +01:00
new ModuleTemplatesPlugin("loader-module", options.resolveLoader.moduleTemplates, "module"),
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryDescriptionFilePlugin("package.json", ["webpackLoader", "webLoader", "loader", "main"]),
new DirectoryDefaultFilePlugin(["index"]),
new FileAppendPlugin(options.resolveLoader.extensions)
);
compiler.applyPlugins("after-resolvers", compiler);
return options;
2013-02-04 10:47:00 +01:00
}
2013-02-10 20:37:30 +01:00
function makeRootPlugin(name, root) {
2013-02-04 10:47:00 +01:00
if(typeof root === "string")
2013-02-10 20:37:30 +01:00
return new ModulesInRootPlugin(name, root);
2013-02-04 10:47:00 +01:00
else if(Array.isArray(root)) {
return function() {
root.forEach(function(root) {
2013-02-11 11:10:15 +01:00
this.apply(new ModulesInRootPlugin(name, root));
2013-02-04 10:47:00 +01:00
}, this);
}
}
return function() {};
}