Skip to content

Commit 90c8565

Browse files
committed
Add various methods to configure default plugins
1 parent d23aa92 commit 90c8565

19 files changed

+899
-60
lines changed

index.js

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,110 @@ const publicApi = {
102102
return this;
103103
},
104104

105+
/**
106+
* Allows you to configure the paths and the options passed to the clean-webpack-plugin.
107+
* A list of available options can be found at https://github.com/johnagan/clean-webpack-plugin
108+
*
109+
* For example:
110+
*
111+
* Encore.configureCleanWebpackPlugin(['*.js'], (options) => {
112+
* options.dry = true;
113+
* })
114+
*
115+
* @param {Array} paths Paths that should be cleaned, relative to the "root" option
116+
* @param {function} cleanWebpackPluginOptionsCallback
117+
* @returns {exports}
118+
*/
119+
configureCleanWebpackPlugin(paths = ['**/*'], cleanWebpackPluginOptionsCallback = () => {}) {
120+
webpackConfig.configureCleanWebpackPlugin(paths, cleanWebpackPluginOptionsCallback);
121+
122+
return this;
123+
},
124+
125+
/**
126+
* Allows you to configure the options passed to the DefinePlugin.
127+
* A list of available options can be found at https://webpack.js.org/plugins/define-plugin/
128+
*
129+
* For example:
130+
*
131+
* Encore.configureDefinePlugin((options) => {
132+
* options.VERSION = JSON.stringify('1.0.0');
133+
* })
134+
*
135+
* @param {function} definePluginOptionsCallback
136+
* @returns {exports}
137+
*/
138+
configureDefinePlugin(definePluginOptionsCallback = () => {}) {
139+
webpackConfig.configureDefinePlugin(definePluginOptionsCallback);
140+
141+
return this;
142+
},
143+
144+
/**
145+
* Allows you to configure the options passed to the extract-text-webpack-plugin.
146+
* A list of available options can be found at https://github.com/webpack-contrib/extract-text-webpack-plugin
147+
*
148+
* For example:
149+
*
150+
* Encore.configureExtractTextPlugin((options) => {
151+
* options.ignoreOrder = true;
152+
* })
153+
*
154+
* @param {function} extractTextPluginOptionsCallback
155+
* @returns {exports}
156+
*/
157+
configureExtractTextPlugin(extractTextPluginOptionsCallback = () => {}) {
158+
webpackConfig.configureExtractTextPlugin(extractTextPluginOptionsCallback);
159+
160+
return this;
161+
},
162+
163+
/**
164+
* Allows you to configure the options passed to the friendly-errors-webpack-plugin.
165+
* A list of available options can be found at https://github.com/geowarin/friendly-errors-webpack-plugin
166+
*
167+
* For example:
168+
*
169+
* Encore.configureFriendlyErrorsPlugin((options) => {
170+
* options.clearConsole = true;
171+
* })
172+
*
173+
* @param {function} friendlyErrorsPluginOptionsCallback
174+
* @returns {exports}
175+
*/
176+
configureFriendlyErrorsPlugin(friendlyErrorsPluginOptionsCallback = () => {}) {
177+
webpackConfig.configureFriendlyErrorsPlugin(friendlyErrorsPluginOptionsCallback);
178+
179+
return this;
180+
},
181+
182+
/**
183+
* Allows you to configure the options passed to the LoaderOptionsPlugins.
184+
* A list of available options can be found at https://webpack.js.org/plugins/loader-options-plugin/
185+
*
186+
* For example:
187+
*
188+
* Encore.configureLoaderOptionsPlugin((options) => {
189+
* options.minimize = true;
190+
* })
191+
*
192+
* @param {function} loaderOptionsPluginOptionsCallback
193+
* @returns {exports}
194+
*/
195+
configureLoaderOptionsPlugin(loaderOptionsPluginOptionsCallback = () => {}) {
196+
webpackConfig.configureLoaderOptionsPlugin(loaderOptionsPluginOptionsCallback);
197+
198+
return this;
199+
},
200+
105201
/**
106202
* Allows you to configure the options passed to webpack-manifest-plugin.
107203
* A list of available options can be found at https://github.com/danethurber/webpack-manifest-plugin
108204
*
109205
* For example:
110206
*
111-
* Encore.configureManifestPlugin(function(options){
112-
* options.fileName: '../../var/assets/manifest.json'
207+
* Encore.configureManifestPlugin((options) => {
208+
* options.fileName = '../../var/assets/manifest.json';
113209
* })
114210
*
115211
* @param {function} manifestPluginOptionsCallback
@@ -121,6 +217,26 @@ const publicApi = {
121217
return this;
122218
},
123219

220+
/**
221+
* Allows you to configure the options passed to the uglifyjs-webpack-plugin.
222+
* A list of available options can be found at https://github.com/webpack-contrib/uglifyjs-webpack-plugin/tree/v0.4.6
223+
*
224+
* For example:
225+
*
226+
* Encore.configureUglifyJsPlugin((options) => {
227+
* options.compress = false;
228+
* options.beautify = true;
229+
* })
230+
*
231+
* @param {function} uglifyJsPluginOptionsCallback
232+
* @returns {exports}
233+
*/
234+
configureUglifyJsPlugin(uglifyJsPluginOptionsCallback = () => {}) {
235+
webpackConfig.configureUglifyJsPlugin(uglifyJsPluginOptionsCallback);
236+
237+
return this;
238+
},
239+
124240
/**
125241
* Adds a JavaScript file that should be webpacked:
126242
*

lib/WebpackConfig.js

Lines changed: 94 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,60 @@ function validateRuntimeConfig(runtimeConfig) {
3030
class WebpackConfig {
3131
constructor(runtimeConfig) {
3232
validateRuntimeConfig(runtimeConfig);
33+
3334
this.runtimeConfig = runtimeConfig;
34-
this.outputPath = null;
35-
this.publicPath = null;
36-
this.manifestKeyPrefix = null;
3735
this.entries = new Map();
3836
this.styleEntries = new Map();
3937
this.plugins = [];
38+
this.loaders = [];
39+
40+
// Global settings
41+
this.outputPath = null;
42+
this.publicPath = null;
43+
this.manifestKeyPrefix = null;
44+
this.sharedCommonsEntryName = null;
45+
this.providedVariables = {};
46+
this.configuredFilenames = {};
47+
48+
// Features/Loaders flags
4049
this.useVersioning = false;
4150
this.useSourceMaps = false;
51+
this.cleanupOutput = false;
52+
this.useImagesLoader = true;
53+
this.useFontsLoader = true;
4254
this.usePostCssLoader = false;
43-
this.postCssLoaderOptionsCallback = function() {};
44-
this.useSassLoader = false;
45-
this.sassLoaderOptionsCallback = function() {};
46-
this.sassOptions = {
47-
resolve_url_loader: true
48-
};
4955
this.useLessLoader = false;
50-
this.lessLoaderOptionsCallback = function() {};
51-
this.cleanupOutput = false;
52-
this.sharedCommonsEntryName = null;
53-
this.providedVariables = {};
54-
this.babelConfigurationCallback = function() {};
56+
this.useSassLoader = false;
5557
this.useReact = false;
5658
this.useVueLoader = false;
57-
this.vueLoaderOptionsCallback = () => {};
58-
this.loaders = [];
5959
this.useTypeScriptLoader = false;
60-
this.tsConfigurationCallback = function() {};
6160
this.useForkedTypeScriptTypeChecking = false;
61+
62+
// Features/Loaders options
63+
this.sassOptions = {
64+
resolve_url_loader: true
65+
};
66+
67+
// Features/Loaders options callbacks
68+
this.postCssLoaderOptionsCallback = () => {};
69+
this.sassLoaderOptionsCallback = () => {};
70+
this.lessLoaderOptionsCallback = () => {};
71+
this.babelConfigurationCallback = () => {};
72+
this.vueLoaderOptionsCallback = () => {};
73+
this.tsConfigurationCallback = () => {};
74+
75+
// Plugins options
76+
this.cleanWebpackPluginPaths = ['**/*'];
77+
78+
// Plugins callbacks
79+
this.cleanWebpackPluginOptionsCallback = () => {};
80+
this.definePluginOptionsCallback = () => {};
81+
this.extractTextPluginOptionsCallback = () => {};
6282
this.forkedTypeScriptTypesCheckOptionsCallback = () => {};
63-
this.useImagesLoader = true;
64-
this.useFontsLoader = true;
65-
this.configuredFilenames = {};
66-
this.manifestPluginOptionsCallback = function() {};
83+
this.friendlyErrorsPluginOptionsCallback = () => {};
84+
this.loaderOptionsPluginOptionsCallback = () => {};
85+
this.manifestPluginOptionsCallback = () => {};
86+
this.uglifyJsPluginOptionsCallback = () => {};
6787
}
6888

6989
getContext() {
@@ -118,6 +138,51 @@ class WebpackConfig {
118138
this.manifestKeyPrefix = manifestKeyPrefix;
119139
}
120140

141+
configureCleanWebpackPlugin(paths = ['**/*'], cleanWebpackPluginOptionsCallback = () => {}) {
142+
if (!Array.isArray(paths)) {
143+
throw new Error('Argument 1 to configureCleanWebpackPlugin() must be an Array');
144+
}
145+
146+
if (typeof cleanWebpackPluginOptionsCallback !== 'function') {
147+
throw new Error('Argument 2 to configureCleanWebpackPlugin() must be a callback function');
148+
}
149+
150+
this.cleanWebpackPluginPaths = paths;
151+
this.cleanWebpackPluginOptionsCallback = cleanWebpackPluginOptionsCallback;
152+
}
153+
154+
configureDefinePlugin(definePluginOptionsCallback = () => {}) {
155+
if (typeof definePluginOptionsCallback !== 'function') {
156+
throw new Error('Argument 1 to configureDefinePlugin() must be a callback function');
157+
}
158+
159+
this.definePluginOptionsCallback = definePluginOptionsCallback;
160+
}
161+
162+
configureExtractTextPlugin(extractTextPluginOptionsCallback = () => {}) {
163+
if (typeof extractTextPluginOptionsCallback !== 'function') {
164+
throw new Error('Argument 1 to configureExtractTextPlugin() must be a callback function');
165+
}
166+
167+
this.extractTextPluginOptionsCallback = extractTextPluginOptionsCallback;
168+
}
169+
170+
configureFriendlyErrorsPlugin(friendlyErrorsPluginOptionsCallback = () => {}) {
171+
if (typeof friendlyErrorsPluginOptionsCallback !== 'function') {
172+
throw new Error('Argument 1 to configureFriendlyErrorsPlugin() must be a callback function');
173+
}
174+
175+
this.friendlyErrorsPluginOptionsCallback = friendlyErrorsPluginOptionsCallback;
176+
}
177+
178+
configureLoaderOptionsPlugin(loaderOptionsPluginOptionsCallback = () => {}) {
179+
if (typeof loaderOptionsPluginOptionsCallback !== 'function') {
180+
throw new Error('Argument 1 to configureLoaderOptionsPlugin() must be a callback function');
181+
}
182+
183+
this.loaderOptionsPluginOptionsCallback = loaderOptionsPluginOptionsCallback;
184+
}
185+
121186
configureManifestPlugin(manifestPluginOptionsCallback = () => {}) {
122187
if (typeof manifestPluginOptionsCallback !== 'function') {
123188
throw new Error('Argument 1 to configureManifestPlugin() must be a callback function');
@@ -126,6 +191,14 @@ class WebpackConfig {
126191
this.manifestPluginOptionsCallback = manifestPluginOptionsCallback;
127192
}
128193

194+
configureUglifyJsPlugin(uglifyJsPluginOptionsCallback = () => {}) {
195+
if (typeof uglifyJsPluginOptionsCallback !== 'function') {
196+
throw new Error('Argument 1 to configureUglifyJsPlugin() must be a callback function');
197+
}
198+
199+
this.uglifyJsPluginOptionsCallback = uglifyJsPluginOptionsCallback;
200+
}
201+
129202
/**
130203
* Returns the value that should be used as the publicPath,
131204
* which can be overridden by enabling the webpackDevServer

lib/config-generator.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const loaderOptionsPluginUtil = require('./plugins/loader-options');
2626
const versioningPluginUtil = require('./plugins/versioning');
2727
const variableProviderPluginUtil = require('./plugins/variable-provider');
2828
const cleanPluginUtil = require('./plugins/clean');
29-
const commonChunksPluginUtil = require('./plugins/common-chunks');
29+
const commonsChunksPluginUtil = require('./plugins/commons-chunks');
3030
const definePluginUtil = require('./plugins/define');
3131
const uglifyPluginUtil = require('./plugins/uglify');
3232
const friendlyErrorPluginUtil = require('./plugins/friendly-errors');
@@ -218,15 +218,15 @@ class ConfigGenerator {
218218

219219
variableProviderPluginUtil(plugins, this.webpackConfig);
220220

221-
cleanPluginUtil(plugins, this.webpackConfig, ['**/*']);
221+
cleanPluginUtil(plugins, this.webpackConfig);
222222

223-
commonChunksPluginUtil(plugins, this.webpackConfig);
223+
commonsChunksPluginUtil(plugins, this.webpackConfig);
224224

225-
// todo - options here should be configurable
226225
definePluginUtil(plugins, this.webpackConfig);
226+
227227
uglifyPluginUtil(plugins, this.webpackConfig);
228228

229-
let friendlyErrorPlugin = friendlyErrorPluginUtil();
229+
const friendlyErrorPlugin = friendlyErrorPluginUtil(this.webpackConfig);
230230
plugins.push(friendlyErrorPlugin);
231231

232232
assetOutputDisplay(plugins, this.webpackConfig, friendlyErrorPlugin);

lib/plugins/clean.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,26 @@ const CleanWebpackPlugin = require('clean-webpack-plugin');
1616
*
1717
* @param {Array} plugins to push to
1818
* @param {WebpackConfig} webpackConfig read only variable
19-
* @param {Array} paths to clean
20-
* @param {Object} cleanUpOptions
2119
* @return {void}
2220
*/
23-
module.exports = function(plugins, webpackConfig, paths, cleanUpOptions = {}) {
21+
module.exports = function(plugins, webpackConfig) {
2422

2523
if (!webpackConfig.cleanupOutput) {
2624
return;
2725
}
2826

29-
let config = Object.assign({}, cleanUpOptions, {
27+
const cleanWebpackPluginOptions = {
3028
root: webpackConfig.outputPath,
3129
verbose: false,
32-
});
30+
};
3331

34-
plugins.push(new CleanWebpackPlugin(paths, config));
32+
webpackConfig.cleanWebpackPluginOptionsCallback.apply(
33+
cleanWebpackPluginOptions,
34+
[cleanWebpackPluginOptions]
35+
);
36+
37+
plugins.push(new CleanWebpackPlugin(
38+
webpackConfig.cleanWebpackPluginPaths,
39+
cleanWebpackPluginOptions
40+
));
3541
};
File renamed without changes.

lib/plugins/define.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,24 @@ const webpack = require('webpack');
1414
/**
1515
* @param {Array} plugins
1616
* @param {WebpackConfig} webpackConfig
17-
* @param {Object} defineOptions
1817
* @return {void}
1918
*/
20-
module.exports = function(plugins, webpackConfig, defineOptions = {}) {
19+
module.exports = function(plugins, webpackConfig) {
2120

2221
if (!webpackConfig.isProduction()) {
2322
return;
2423
}
2524

26-
let defineConfig = Object.assign({}, defineOptions, {
25+
const definePluginOptions = {
2726
'process.env': {
2827
NODE_ENV: '"production"'
2928
}
30-
});
31-
let define = new webpack.DefinePlugin(defineConfig);
29+
};
3230

33-
plugins.push(define);
31+
webpackConfig.definePluginOptionsCallback.apply(
32+
definePluginOptions,
33+
[definePluginOptions]
34+
);
35+
36+
plugins.push(new webpack.DefinePlugin(definePluginOptions));
3437
};

0 commit comments

Comments
 (0)