From eab8cf68bb5a8bc59985b4c606d16ea267a55de3 Mon Sep 17 00:00:00 2001 From: Sean Larkin Date: Sat, 27 Jan 2018 00:39:39 -0800 Subject: [PATCH] feat(presets): poc of presets --- lib/PresetsApply.js | 12 ++++ lib/WebpackPresetsApply.js | 20 +++++++ lib/webpack.js | 116 +++++++++++++++++++------------------ package.json | 1 + yarn.lock | 6 ++ 5 files changed, 98 insertions(+), 57 deletions(-) create mode 100644 lib/PresetsApply.js create mode 100644 lib/WebpackPresetsApply.js diff --git a/lib/PresetsApply.js b/lib/PresetsApply.js new file mode 100644 index 000000000..08203212a --- /dev/null +++ b/lib/PresetsApply.js @@ -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; diff --git a/lib/WebpackPresetsApply.js b/lib/WebpackPresetsApply.js new file mode 100644 index 000000000..fafa81de1 --- /dev/null +++ b/lib/WebpackPresetsApply.js @@ -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; diff --git a/lib/webpack.js b/lib/webpack.js index edeca329b..a4119442b 100644 --- a/lib/webpack.js +++ b/lib/webpack.js @@ -12,8 +12,10 @@ const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter"); const validateSchema = require("./validateSchema"); const WebpackOptionsValidationError = require("./WebpackOptionsValidationError"); const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); +const WebpackPresetsApply = require("./WebpackPresetsApply"); const webpack = (options, callback) => { + console.log("WERBPERK"); const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options); if(webpackOptionsValidationErrors.length) { throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); @@ -22,8 +24,8 @@ const webpack = (options, callback) => { if(Array.isArray(options)) { compiler = new MultiCompiler(options.map(options => webpack(options))); } else if(typeof options === "object") { + options = new WebpackPresetsApply().process(options); options = new WebpackOptionsDefaulter().process(options); - compiler = new Compiler(options.context); compiler.options = options; new NodeEnvironmentPlugin().apply(compiler); @@ -41,7 +43,7 @@ const webpack = (options, callback) => { if(callback) { if(typeof callback !== "function") throw new Error("Invalid argument: callback"); 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); } compiler.run(callback); @@ -71,64 +73,64 @@ const exportPlugins = (obj, mappings) => { }; exportPlugins(exports, { - "AutomaticPrefetchPlugin": () => require("./AutomaticPrefetchPlugin"), - "BannerPlugin": () => require("./BannerPlugin"), - "CachePlugin": () => require("./CachePlugin"), - "ContextExclusionPlugin": () => require("./ContextExclusionPlugin"), - "ContextReplacementPlugin": () => require("./ContextReplacementPlugin"), - "DefinePlugin": () => require("./DefinePlugin"), - "DllPlugin": () => require("./DllPlugin"), - "DllReferencePlugin": () => require("./DllReferencePlugin"), - "EnvironmentPlugin": () => require("./EnvironmentPlugin"), - "EvalDevToolModulePlugin": () => require("./EvalDevToolModulePlugin"), - "EvalSourceMapDevToolPlugin": () => require("./EvalSourceMapDevToolPlugin"), - "ExtendedAPIPlugin": () => require("./ExtendedAPIPlugin"), - "ExternalsPlugin": () => require("./ExternalsPlugin"), - "HashedModuleIdsPlugin": () => require("./HashedModuleIdsPlugin"), - "HotModuleReplacementPlugin": () => require("./HotModuleReplacementPlugin"), - "IgnorePlugin": () => require("./IgnorePlugin"), - "LibraryTemplatePlugin": () => require("./LibraryTemplatePlugin"), - "LoaderOptionsPlugin": () => require("./LoaderOptionsPlugin"), - "LoaderTargetPlugin": () => require("./LoaderTargetPlugin"), - "MemoryOutputFileSystem": () => require("./MemoryOutputFileSystem"), - "ModuleFilenameHelpers": () => require("./ModuleFilenameHelpers"), - "NamedChunksPlugin": () => require("./NamedChunksPlugin"), - "NamedModulesPlugin": () => require("./NamedModulesPlugin"), - "NoEmitOnErrorsPlugin": () => require("./NoEmitOnErrorsPlugin"), - "NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"), - "PrefetchPlugin": () => require("./PrefetchPlugin"), - "ProgressPlugin": () => require("./ProgressPlugin"), - "ProvidePlugin": () => require("./ProvidePlugin"), - "SetVarMainTemplatePlugin": () => require("./SetVarMainTemplatePlugin"), - "SingleEntryPlugin": () => require("./SingleEntryPlugin"), - "SourceMapDevToolPlugin": () => require("./SourceMapDevToolPlugin"), - "Stats": () => require("./Stats"), - "UmdMainTemplatePlugin": () => require("./UmdMainTemplatePlugin"), - "WatchIgnorePlugin": () => require("./WatchIgnorePlugin"), + AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"), + BannerPlugin: () => require("./BannerPlugin"), + CachePlugin: () => require("./CachePlugin"), + ContextExclusionPlugin: () => require("./ContextExclusionPlugin"), + ContextReplacementPlugin: () => require("./ContextReplacementPlugin"), + DefinePlugin: () => require("./DefinePlugin"), + DllPlugin: () => require("./DllPlugin"), + DllReferencePlugin: () => require("./DllReferencePlugin"), + EnvironmentPlugin: () => require("./EnvironmentPlugin"), + EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"), + EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"), + ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"), + ExternalsPlugin: () => require("./ExternalsPlugin"), + HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"), + HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"), + IgnorePlugin: () => require("./IgnorePlugin"), + LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"), + LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"), + LoaderTargetPlugin: () => require("./LoaderTargetPlugin"), + MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"), + ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"), + NamedChunksPlugin: () => require("./NamedChunksPlugin"), + NamedModulesPlugin: () => require("./NamedModulesPlugin"), + NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"), + NormalModuleReplacementPlugin: () => require("./NormalModuleReplacementPlugin"), + PrefetchPlugin: () => require("./PrefetchPlugin"), + ProgressPlugin: () => require("./ProgressPlugin"), + ProvidePlugin: () => require("./ProvidePlugin"), + SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"), + SingleEntryPlugin: () => require("./SingleEntryPlugin"), + SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"), + Stats: () => require("./Stats"), + UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"), + WatchIgnorePlugin: () => require("./WatchIgnorePlugin") }); -exportPlugins(exports.optimize = {}, { - "AggressiveMergingPlugin": () => require("./optimize/AggressiveMergingPlugin"), - "AggressiveSplittingPlugin": () => require("./optimize/AggressiveSplittingPlugin"), - "ChunkModuleIdRangePlugin": () => require("./optimize/ChunkModuleIdRangePlugin"), - "LimitChunkCountPlugin": () => require("./optimize/LimitChunkCountPlugin"), - "MinChunkSizePlugin": () => require("./optimize/MinChunkSizePlugin"), - "ModuleConcatenationPlugin": () => require("./optimize/ModuleConcatenationPlugin"), - "OccurrenceOrderPlugin": () => require("./optimize/OccurrenceOrderPlugin"), - "RuntimeChunkPlugin": () => require("./optimize/RuntimeChunkPlugin"), - "SideEffectsFlagPlugin": () => require("./optimize/SideEffectsFlagPlugin"), - "SplitChunksPlugin": () => require("./optimize/SplitChunksPlugin"), +exportPlugins((exports.optimize = {}), { + AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"), + AggressiveSplittingPlugin: () => require("./optimize/AggressiveSplittingPlugin"), + ChunkModuleIdRangePlugin: () => require("./optimize/ChunkModuleIdRangePlugin"), + LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"), + MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"), + ModuleConcatenationPlugin: () => require("./optimize/ModuleConcatenationPlugin"), + OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"), + RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"), + SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"), + SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin") }); -exportPlugins(exports.web = {}, { - "FetchCompileWasmTemplatePlugin": () => require("./web/FetchCompileWasmTemplatePlugin"), - "JsonpTemplatePlugin": () => require("./web/JsonpTemplatePlugin"), +exportPlugins((exports.web = {}), { + FetchCompileWasmTemplatePlugin: () => require("./web/FetchCompileWasmTemplatePlugin"), + JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin") }); -exportPlugins(exports.webworker = {}, { - "WebWorkerTemplatePlugin": () => require("./webworker/WebWorkerTemplatePlugin"), +exportPlugins((exports.webworker = {}), { + WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin") }); -exportPlugins(exports.node = {}, { - "NodeTemplatePlugin": () => require("./node/NodeTemplatePlugin"), - "ReadFileCompileWasmTemplatePlugin": () => require("./node/ReadFileCompileWasmTemplatePlugin"), +exportPlugins((exports.node = {}), { + NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"), + ReadFileCompileWasmTemplatePlugin: () => require("./node/ReadFileCompileWasmTemplatePlugin") }); -exportPlugins(exports.debug = {}, { - "ProfilingPlugin": () => require("./debug/ProfilingPlugin"), +exportPlugins((exports.debug = {}), { + ProfilingPlugin: () => require("./debug/ProfilingPlugin") }); diff --git a/package.json b/package.json index 825389626..d5108c830 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "tapable": "^1.0.0-beta.5", "uglifyjs-webpack-plugin": "^1.1.1", "watchpack": "^1.4.0", + "webpack-merge": "^4.1.1", "webpack-sources": "^1.0.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 555ea00d5..70f20e76b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4261,6 +4261,12 @@ webpack-dev-middleware@^1.9.0: range-parser "^1.0.3" 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: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"