feat(presets): poc of presets

This commit is contained in:
Sean Larkin 2018-01-27 00:39:39 -08:00
parent ae0dc62b7b
commit eab8cf68bb
5 changed files with 98 additions and 57 deletions

12
lib/PresetsApply.js Normal file
View File

@ -0,0 +1,12 @@
const merge = require("webpack-merge");
class PresetsApply {
constructor() {
this.presets = new Set();
}
process(options) {
return merge({}, options, ...Array.from(this.presets));
}
}
module.exports = PresetsApply;

View File

@ -0,0 +1,20 @@
const path = require("path");
const PresetsApply = require("./PresetsApply");
const pkgPath = path.join(process.cwd(), "package.json");
const pkg = require(pkgPath);
const presets = Object.keys(pkg.devDependencies)
.filter(pkgName => pkgName.startsWith("webpack-preset-"))
.map(pkgName => path.resolve(process.cwd(), "node_modules", pkgName))
.map(require);
class WebpackPresetsApply extends PresetsApply {
constructor() {
super(); // will set this.presets;
presets.forEach(preset => {
this.presets.add(preset);
});
}
}
module.exports = WebpackPresetsApply;

View File

@ -12,8 +12,10 @@ const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter");
const validateSchema = require("./validateSchema"); const validateSchema = require("./validateSchema");
const WebpackOptionsValidationError = require("./WebpackOptionsValidationError"); const WebpackOptionsValidationError = require("./WebpackOptionsValidationError");
const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
const WebpackPresetsApply = require("./WebpackPresetsApply");
const webpack = (options, callback) => { const webpack = (options, callback) => {
console.log("WERBPERK");
const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options); const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options);
if(webpackOptionsValidationErrors.length) { if(webpackOptionsValidationErrors.length) {
throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); throw new WebpackOptionsValidationError(webpackOptionsValidationErrors);
@ -22,8 +24,8 @@ const webpack = (options, callback) => {
if(Array.isArray(options)) { if(Array.isArray(options)) {
compiler = new MultiCompiler(options.map(options => webpack(options))); compiler = new MultiCompiler(options.map(options => webpack(options)));
} else if(typeof options === "object") { } else if(typeof options === "object") {
options = new WebpackPresetsApply().process(options);
options = new WebpackOptionsDefaulter().process(options); options = new WebpackOptionsDefaulter().process(options);
compiler = new Compiler(options.context); compiler = new Compiler(options.context);
compiler.options = options; compiler.options = options;
new NodeEnvironmentPlugin().apply(compiler); new NodeEnvironmentPlugin().apply(compiler);
@ -41,7 +43,7 @@ const webpack = (options, callback) => {
if(callback) { if(callback) {
if(typeof callback !== "function") throw new Error("Invalid argument: callback"); if(typeof callback !== "function") throw new Error("Invalid argument: callback");
if(options.watch === true || (Array.isArray(options) && options.some(o => o.watch))) { if(options.watch === true || (Array.isArray(options) && options.some(o => o.watch))) {
const watchOptions = Array.isArray(options) ? options.map(o => o.watchOptions || {}) : (options.watchOptions || {}); const watchOptions = Array.isArray(options) ? options.map(o => o.watchOptions || {}) : options.watchOptions || {};
return compiler.watch(watchOptions, callback); return compiler.watch(watchOptions, callback);
} }
compiler.run(callback); compiler.run(callback);
@ -71,64 +73,64 @@ const exportPlugins = (obj, mappings) => {
}; };
exportPlugins(exports, { exportPlugins(exports, {
"AutomaticPrefetchPlugin": () => require("./AutomaticPrefetchPlugin"), AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"),
"BannerPlugin": () => require("./BannerPlugin"), BannerPlugin: () => require("./BannerPlugin"),
"CachePlugin": () => require("./CachePlugin"), CachePlugin: () => require("./CachePlugin"),
"ContextExclusionPlugin": () => require("./ContextExclusionPlugin"), ContextExclusionPlugin: () => require("./ContextExclusionPlugin"),
"ContextReplacementPlugin": () => require("./ContextReplacementPlugin"), ContextReplacementPlugin: () => require("./ContextReplacementPlugin"),
"DefinePlugin": () => require("./DefinePlugin"), DefinePlugin: () => require("./DefinePlugin"),
"DllPlugin": () => require("./DllPlugin"), DllPlugin: () => require("./DllPlugin"),
"DllReferencePlugin": () => require("./DllReferencePlugin"), DllReferencePlugin: () => require("./DllReferencePlugin"),
"EnvironmentPlugin": () => require("./EnvironmentPlugin"), EnvironmentPlugin: () => require("./EnvironmentPlugin"),
"EvalDevToolModulePlugin": () => require("./EvalDevToolModulePlugin"), EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"),
"EvalSourceMapDevToolPlugin": () => require("./EvalSourceMapDevToolPlugin"), EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"),
"ExtendedAPIPlugin": () => require("./ExtendedAPIPlugin"), ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"),
"ExternalsPlugin": () => require("./ExternalsPlugin"), ExternalsPlugin: () => require("./ExternalsPlugin"),
"HashedModuleIdsPlugin": () => require("./HashedModuleIdsPlugin"), HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"),
"HotModuleReplacementPlugin": () => require("./HotModuleReplacementPlugin"), HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"),
"IgnorePlugin": () => require("./IgnorePlugin"), IgnorePlugin: () => require("./IgnorePlugin"),
"LibraryTemplatePlugin": () => require("./LibraryTemplatePlugin"), LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"),
"LoaderOptionsPlugin": () => require("./LoaderOptionsPlugin"), LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"),
"LoaderTargetPlugin": () => require("./LoaderTargetPlugin"), LoaderTargetPlugin: () => require("./LoaderTargetPlugin"),
"MemoryOutputFileSystem": () => require("./MemoryOutputFileSystem"), MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"),
"ModuleFilenameHelpers": () => require("./ModuleFilenameHelpers"), ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"),
"NamedChunksPlugin": () => require("./NamedChunksPlugin"), NamedChunksPlugin: () => require("./NamedChunksPlugin"),
"NamedModulesPlugin": () => require("./NamedModulesPlugin"), NamedModulesPlugin: () => require("./NamedModulesPlugin"),
"NoEmitOnErrorsPlugin": () => require("./NoEmitOnErrorsPlugin"), NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"),
"NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"), NormalModuleReplacementPlugin: () => require("./NormalModuleReplacementPlugin"),
"PrefetchPlugin": () => require("./PrefetchPlugin"), PrefetchPlugin: () => require("./PrefetchPlugin"),
"ProgressPlugin": () => require("./ProgressPlugin"), ProgressPlugin: () => require("./ProgressPlugin"),
"ProvidePlugin": () => require("./ProvidePlugin"), ProvidePlugin: () => require("./ProvidePlugin"),
"SetVarMainTemplatePlugin": () => require("./SetVarMainTemplatePlugin"), SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"),
"SingleEntryPlugin": () => require("./SingleEntryPlugin"), SingleEntryPlugin: () => require("./SingleEntryPlugin"),
"SourceMapDevToolPlugin": () => require("./SourceMapDevToolPlugin"), SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"),
"Stats": () => require("./Stats"), Stats: () => require("./Stats"),
"UmdMainTemplatePlugin": () => require("./UmdMainTemplatePlugin"), UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"),
"WatchIgnorePlugin": () => require("./WatchIgnorePlugin"), WatchIgnorePlugin: () => require("./WatchIgnorePlugin")
}); });
exportPlugins(exports.optimize = {}, { exportPlugins((exports.optimize = {}), {
"AggressiveMergingPlugin": () => require("./optimize/AggressiveMergingPlugin"), AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"),
"AggressiveSplittingPlugin": () => require("./optimize/AggressiveSplittingPlugin"), AggressiveSplittingPlugin: () => require("./optimize/AggressiveSplittingPlugin"),
"ChunkModuleIdRangePlugin": () => require("./optimize/ChunkModuleIdRangePlugin"), ChunkModuleIdRangePlugin: () => require("./optimize/ChunkModuleIdRangePlugin"),
"LimitChunkCountPlugin": () => require("./optimize/LimitChunkCountPlugin"), LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"),
"MinChunkSizePlugin": () => require("./optimize/MinChunkSizePlugin"), MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"),
"ModuleConcatenationPlugin": () => require("./optimize/ModuleConcatenationPlugin"), ModuleConcatenationPlugin: () => require("./optimize/ModuleConcatenationPlugin"),
"OccurrenceOrderPlugin": () => require("./optimize/OccurrenceOrderPlugin"), OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"),
"RuntimeChunkPlugin": () => require("./optimize/RuntimeChunkPlugin"), RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"),
"SideEffectsFlagPlugin": () => require("./optimize/SideEffectsFlagPlugin"), SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"),
"SplitChunksPlugin": () => require("./optimize/SplitChunksPlugin"), SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin")
}); });
exportPlugins(exports.web = {}, { exportPlugins((exports.web = {}), {
"FetchCompileWasmTemplatePlugin": () => require("./web/FetchCompileWasmTemplatePlugin"), FetchCompileWasmTemplatePlugin: () => require("./web/FetchCompileWasmTemplatePlugin"),
"JsonpTemplatePlugin": () => require("./web/JsonpTemplatePlugin"), JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin")
}); });
exportPlugins(exports.webworker = {}, { exportPlugins((exports.webworker = {}), {
"WebWorkerTemplatePlugin": () => require("./webworker/WebWorkerTemplatePlugin"), WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin")
}); });
exportPlugins(exports.node = {}, { exportPlugins((exports.node = {}), {
"NodeTemplatePlugin": () => require("./node/NodeTemplatePlugin"), NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"),
"ReadFileCompileWasmTemplatePlugin": () => require("./node/ReadFileCompileWasmTemplatePlugin"), ReadFileCompileWasmTemplatePlugin: () => require("./node/ReadFileCompileWasmTemplatePlugin")
}); });
exportPlugins(exports.debug = {}, { exportPlugins((exports.debug = {}), {
"ProfilingPlugin": () => require("./debug/ProfilingPlugin"), ProfilingPlugin: () => require("./debug/ProfilingPlugin")
}); });

View File

@ -22,6 +22,7 @@
"tapable": "^1.0.0-beta.5", "tapable": "^1.0.0-beta.5",
"uglifyjs-webpack-plugin": "^1.1.1", "uglifyjs-webpack-plugin": "^1.1.1",
"watchpack": "^1.4.0", "watchpack": "^1.4.0",
"webpack-merge": "^4.1.1",
"webpack-sources": "^1.0.1" "webpack-sources": "^1.0.1"
}, },
"devDependencies": { "devDependencies": {

View File

@ -4261,6 +4261,12 @@ webpack-dev-middleware@^1.9.0:
range-parser "^1.0.3" range-parser "^1.0.3"
time-stamp "^2.0.0" time-stamp "^2.0.0"
webpack-merge@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555"
dependencies:
lodash "^4.17.4"
webpack-sources@^1.0.1: webpack-sources@^1.0.1:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"