From 9863445cb74e01d3b477489104a0259631653eb1 Mon Sep 17 00:00:00 2001 From: Abenezer Abebe Date: Thu, 17 Jan 2019 16:20:47 +0100 Subject: [PATCH] fix: reset files Move files back to uglify --- MIGRATE.md | 8 +- package-lock.json | 6 - packages/generators/init-generator.ts | 8 +- packages/generators/utils/plugins.ts | 4 +- packages/generators/utils/tooltip.ts | 6 +- packages/migrate/__testfixtures__/failing.js | 3 +- .../__snapshots__/migrate.test.ts.snap | 62 ++++----- .../loaderOptionsPlugin.test.ts.snap | 9 +- .../loaderOptionsPlugin-1.input.js | 15 +- .../loaderOptionsPlugin.ts | 4 +- packages/migrate/migrate.ts | 6 +- .../__snapshots__/uglifyJsPlugin.test.js.snap | 119 ++++++++++++++++ .../uglifyJsPlugin-0.input.js | 7 + .../uglifyJsPlugin-1.input.js | 10 ++ .../uglifyJsPlugin-2.input.js | 10 ++ .../uglifyJsPlugin-3.input.js | 26 ++++ .../uglifyJsPlugin-4.input.js | 28 ++++ .../uglifyJsPlugin/uglifyJsPlugin.test.js | 9 ++ .../migrate/uglifyJsPlugin/uglifyJsPlugin.ts | 128 ++++++++++++++++++ packages/utils/__tests__/ast-utils.test.ts | 12 +- 20 files changed, 398 insertions(+), 82 deletions(-) create mode 100644 packages/migrate/uglifyJsPlugin/__snapshots__/uglifyJsPlugin.test.js.snap create mode 100644 packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-0.input.js create mode 100644 packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-1.input.js create mode 100644 packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-2.input.js create mode 100644 packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-3.input.js create mode 100644 packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-4.input.js create mode 100644 packages/migrate/uglifyJsPlugin/uglifyJsPlugin.test.js create mode 100644 packages/migrate/uglifyJsPlugin/uglifyJsPlugin.ts diff --git a/MIGRATE.md b/MIGRATE.md index 68fd749e565..cc47ba5b368 100644 --- a/MIGRATE.md +++ b/MIGRATE.md @@ -34,7 +34,7 @@ Given a basic configuration file like so: const ExtractTextPlugin = require('extract-text-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); -const TerserPlugin = require('terser-webpack-plugin'); +const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const webpack = require('webpack'); module.exports = { @@ -68,7 +68,7 @@ module.exports = { }, plugins: [ - new TerserPlugin(), + new UglifyJSPlugin(), new ExtractTextPlugin('styles-[contentHash].css'), @@ -115,7 +115,7 @@ After it has run, we have our new webpack config file! const ExtractTextPlugin = require('extract-text-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); -const TerserPlugin = require('terser-webpack-plugin'); +const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const webpack = require('webpack'); module.exports = { @@ -154,7 +154,7 @@ module.exports = { }, plugins: [ - new TerserPlugin(), + new UglifyJSPlugin(), new ExtractTextPlugin('styles-[contentHash].css'), diff --git a/package-lock.json b/package-lock.json index d9ba3031a3f..741b984d2a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12524,14 +12524,8 @@ "dev": true }, "os-locale": { -<<<<<<< HEAD "version": "3.1.0", "bundled": true, -======= - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", ->>>>>>> 0b7b0f2... fix: replace lookups for TerserPlugin in webpack.optimise "dev": true, "requires": { "execa": "^1.0.0", diff --git a/packages/generators/init-generator.ts b/packages/generators/init-generator.ts index 410f109d00c..3b63041c45d 100644 --- a/packages/generators/init-generator.ts +++ b/packages/generators/init-generator.ts @@ -43,7 +43,7 @@ export default class InitGenerator extends Generator { this.dependencies = [ "webpack", "webpack-cli", - "terser-webpack-plugin", + "uglifyjs-webpack-plugin", "babel-plugin-syntax-dynamic-import", ]; this.configuration = { @@ -430,12 +430,12 @@ export default class InitGenerator extends Generator { public installPlugins() { if (this.isProd) { this.dependencies = this.dependencies.filter( - (p: string) => p !== "terser-webpack-plugin", + (p: string) => p !== "uglifyjs-webpack-plugin", ); } else { this.configuration.config.topScope.push( - tooltip.terser(), - "const TerserPlugin = require('terser-webpack-plugin');", + tooltip.uglify(), + "const UglifyJSPlugin = require('uglifyjs-webpack-plugin');", "\n", ); } diff --git a/packages/generators/utils/plugins.ts b/packages/generators/utils/plugins.ts index 6c2d202e8ae..56e8ea89c86 100644 --- a/packages/generators/utils/plugins.ts +++ b/packages/generators/utils/plugins.ts @@ -3,9 +3,9 @@ * Callable function with the initial plugins * * @returns {Function} An function that returns an array - * that consists of the terser plugin + * that consists of the uglify plugin */ export default function(_?: void): string[] { - return ["new TerserPlugin()"]; + return ["new UglifyJSPlugin()"]; } diff --git a/packages/generators/utils/tooltip.ts b/packages/generators/utils/tooltip.ts index f317a56c225..ad0fa1c575a 100644 --- a/packages/generators/utils/tooltip.ts +++ b/packages/generators/utils/tooltip.ts @@ -50,12 +50,12 @@ export default { */`; }, - terser: (_?: void): string => { + uglify: (_?: void): string => { return `/* - * We've enabled TerserJSPlugin for you! This minifies your app + * We've enabled UglifyJSPlugin for you! This minifies your app * in order to load faster and run less javascript. * - * https://github.com/webpack-contrib/terser-webpack-plugin + * https://github.com/webpack-contrib/uglifyjs-webpack-plugin * */`; }, diff --git a/packages/migrate/__testfixtures__/failing.js b/packages/migrate/__testfixtures__/failing.js index ff73dc9c53f..204550782b4 100644 --- a/packages/migrate/__testfixtures__/failing.js +++ b/packages/migrate/__testfixtures__/failing.js @@ -1,7 +1,6 @@ const webpack = require('webpack'); const nodeEnvironment = process.env.NODE_ENV; const _ = require("lodash"); -const TerserPlugin = require('terser-webpack-plugin'); const config = { entry: { @@ -44,7 +43,7 @@ const config = { switch (nodeEnvironment) { case "production": - config.plugins.push(new TerserPlugin()); + config.plugins.push(new webpack.optimize.UglifyJsPlugin()); case "preproduction": config.output.path = __dirname + "/dist"; config.plugins.push(new webpack.optimize.DedupePlugin()); diff --git a/packages/migrate/__tests__/__snapshots__/migrate.test.ts.snap b/packages/migrate/__tests__/__snapshots__/migrate.test.ts.snap index 3a2f7ab6983..7da8c9cc8a4 100644 --- a/packages/migrate/__tests__/__snapshots__/migrate.test.ts.snap +++ b/packages/migrate/__tests__/__snapshots__/migrate.test.ts.snap @@ -22,7 +22,7 @@ module.exports = { modules: ['node_modules'] }, plugins: [ - new TerserPlugin(), + new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.OccurrenceOrderPlugin() ], debug: true @@ -50,7 +50,7 @@ module.exports = { modules: ['node_modules'] }, plugins: [ - new TerserPlugin(), + new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.OccurrenceOrderPlugin() ], debug: true @@ -61,18 +61,15 @@ module.exports = { exports[`transform should respect recast options 1`] = ` " module.exports = { - devtool: 'eval', - - entry: [ + devtool: 'eval', + entry: [ './src/index' ], - - output: { + output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, - - module: { + module: { rules: [{ test: /.js$/, use: [{ @@ -81,18 +78,15 @@ module.exports = { include: path.join(__dirname, 'src') }] }, - - resolve: { + resolve: { modules: ['node_modules', path.resolve('/src')], }, - - plugins: [ - new TerserPlugin(), - new webpack.LoaderOptionsPlugin({ - debug: true, - minimize: true, - }) - ], + plugins: [new webpack.LoaderOptionsPlugin({ + debug: true, + })], + optimization: { + minimize: true, + } }; " `; @@ -122,7 +116,7 @@ module.exports = { modules: ['node_modules'] }, plugins: [ - new TerserPlugin(), + new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.OccurrenceOrderPlugin() ], debug: true @@ -133,18 +127,15 @@ module.exports = { exports[`transform should transform using all transformations 1`] = ` " module.exports = { - devtool: 'eval', - - entry: [ + devtool: 'eval', + entry: [ './src/index' ], - - output: { + output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, - - module: { + module: { rules: [{ test: /.js$/, use: [{ @@ -153,18 +144,15 @@ module.exports = { include: path.join(__dirname, 'src') }] }, - - resolve: { + resolve: { modules: ['node_modules', path.resolve('/src')] }, - - plugins: [ - new TerserPlugin(), - new webpack.LoaderOptionsPlugin({ - debug: true, - minimize: true - }) - ] + plugins: [new webpack.LoaderOptionsPlugin({ + debug: true + })], + optimization: { + minimize: true + } }; " `; diff --git a/packages/migrate/loaderOptionsPlugin/__tests__/__snapshots__/loaderOptionsPlugin.test.ts.snap b/packages/migrate/loaderOptionsPlugin/__tests__/__snapshots__/loaderOptionsPlugin.test.ts.snap index 53b8bc5af31..cb72fbea538 100644 --- a/packages/migrate/loaderOptionsPlugin/__tests__/__snapshots__/loaderOptionsPlugin.test.ts.snap +++ b/packages/migrate/loaderOptionsPlugin/__tests__/__snapshots__/loaderOptionsPlugin.test.ts.snap @@ -11,16 +11,15 @@ module.exports = { `; exports[`loaderOptionsPlugin transforms correctly using "loaderOptionsPlugin-1" data 1`] = ` -"const TerserPlugin = require(\\"terser-webpack-plugin\\"); -module.exports = { +"module.exports = { plugins: [ - new TerserPlugin(), - new webpack.LoaderOptionsPlugin({ + new webpack.optimize.UglifyJsPlugin(), + new webpack.LoaderOptionsPlugin({ foo: 'bar', debug: true, minimize: true }) - ] + ] } " `; diff --git a/packages/migrate/loaderOptionsPlugin/__tests__/__testfixtures__/loaderOptionsPlugin-1.input.js b/packages/migrate/loaderOptionsPlugin/__tests__/__testfixtures__/loaderOptionsPlugin-1.input.js index 9540ce30441..3b8ac854d12 100644 --- a/packages/migrate/loaderOptionsPlugin/__tests__/__testfixtures__/loaderOptionsPlugin-1.input.js +++ b/packages/migrate/loaderOptionsPlugin/__tests__/__testfixtures__/loaderOptionsPlugin-1.input.js @@ -1,10 +1,9 @@ -const TerserPlugin = require("terser-webpack-plugin"); module.exports = { - debug: true, - plugins: [ - new TerserPlugin(), - new webpack.LoaderOptionsPlugin({ - foo: 'bar' - }) - ] + debug: true, + plugins: [ + new webpack.optimize.UglifyJsPlugin(), + new webpack.LoaderOptionsPlugin({ + foo: 'bar' + }) + ] } diff --git a/packages/migrate/loaderOptionsPlugin/loaderOptionsPlugin.ts b/packages/migrate/loaderOptionsPlugin/loaderOptionsPlugin.ts index 45b1c81cc17..681ff9579cd 100644 --- a/packages/migrate/loaderOptionsPlugin/loaderOptionsPlugin.ts +++ b/packages/migrate/loaderOptionsPlugin/loaderOptionsPlugin.ts @@ -37,8 +37,8 @@ export default function(j: IJSCodeshift, ast: INode): INode { }); } - // If there is TerserPlugin, set minimize: true - if (findPluginsByName(j, ast, ["TerserPlugin"]).size()) { + // If there is UglifyJsPlugin, set minimize: true + if (findPluginsByName(j, ast, ["webpack.optimize.UglifyJsPlugin"]).size()) { loaderOptions.minimize = true; } diff --git a/packages/migrate/migrate.ts b/packages/migrate/migrate.ts index d3d5fb1ca60..09baf1b087d 100644 --- a/packages/migrate/migrate.ts +++ b/packages/migrate/migrate.ts @@ -11,8 +11,8 @@ import noEmitOnErrorsPluginTransform from "./noEmitOnErrorsPlugin/noEmitOnErrors import removeDeprecatedPluginsTransform from "./removeDeprecatedPlugins/removeDeprecatedPlugins"; import removeJsonLoaderTransform from "./removeJsonLoader/removeJsonLoader"; import resolveTransform from "./resolve/resolve"; -import terserPluginTransform from "./terserPlugin/terserPlugin"; import { INode } from "./types/NodePath"; +import uglifyJsPluginTransform from "./uglifyJsPlugin/uglifyJsPlugin"; interface ITransformsObject { bannerPluginTransform: object; @@ -24,7 +24,7 @@ interface ITransformsObject { removeDeprecatedPluginsTransform: object; removeJsonLoaderTransform: object; resolveTransform: object; - terserPluginTransform: object; + uglifyJsPluginTransform: object; } /* tslint:disable object-literal-sort-keys */ @@ -32,7 +32,7 @@ const transformsObject: ITransformsObject = { loadersTransform, resolveTransform, removeJsonLoaderTransform, - terserPluginTransform, + uglifyJsPluginTransform, loaderOptionsPluginTransform, bannerPluginTransform, extractTextPluginTransform, diff --git a/packages/migrate/uglifyJsPlugin/__snapshots__/uglifyJsPlugin.test.js.snap b/packages/migrate/uglifyJsPlugin/__snapshots__/uglifyJsPlugin.test.js.snap new file mode 100644 index 00000000000..b53445ca5a1 --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__snapshots__/uglifyJsPlugin.test.js.snap @@ -0,0 +1,119 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`uglifyJsPlugin transforms correctly using "uglifyJsPlugin-0" data 1`] = ` +"module.exports = { + optimization: { + minimize: true + } +} +" +`; + +exports[`uglifyJsPlugin transforms correctly using "uglifyJsPlugin-1" data 1`] = ` +"const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +module.exports = { + devtool: \\"source-map\\", + optimization: { + minimize: true, + + minimizer: [new UglifyJsPlugin({ + sourceMap: true, + compress: {} + })] + } +} +" +`; + +exports[`uglifyJsPlugin transforms correctly using "uglifyJsPlugin-2" data 1`] = ` +"const Uglify = require('uglifyjs-webpack-plugin'); +module.exports = { + devtool: \\"source-map\\", + optimization: { + minimize: true, + + minimizer: [new Uglify({ + sourceMap: true, + compress: {} + })] + } +} +" +`; + +exports[`uglifyJsPlugin transforms correctly using "uglifyJsPlugin-3" data 1`] = ` +"module.exports = { + devtool: 'eval', + + entry: [ + './src/index' + ], + + output: { + path: path.join(__dirname, 'dist'), + filename: 'index.js' + }, + + module: { + loaders: [{ + test: /.js$/, + loaders: ['babel'], + include: path.join(__dirname, 'src') + }] + }, + + resolve: { + root: path.resolve('/src'), + modules: ['node_modules'] + }, + + plugins: [new webpack.optimize.OccurrenceOrderPlugin()], + debug: true, + + optimization: { + minimize: true + } +}; +" +`; + +exports[`uglifyJsPlugin transforms correctly using "uglifyJsPlugin-4" data 1`] = ` +"const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +module.exports = { + devtool: 'eval', + + entry: [ + './src/index' + ], + + output: { + path: path.join(__dirname, 'dist'), + filename: 'index.js' + }, + + module: { + loaders: [{ + test: /.js$/, + loaders: ['babel'], + include: path.join(__dirname, 'src') + }] + }, + + resolve: { + root: path.resolve('/src'), + modules: ['node_modules'] + }, + + plugins: [new webpack.optimize.OccurrenceOrderPlugin()], + debug: true, + + optimization: { + minimize: true, + + minimizer: [new UglifyJsPlugin({ + sourceMap: true + })] + } +}; +" +`; diff --git a/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-0.input.js b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-0.input.js new file mode 100644 index 00000000000..a577b5143a6 --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-0.input.js @@ -0,0 +1,7 @@ +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); + +module.exports = { + plugins: [ + new UglifyJsPlugin() + ] +} diff --git a/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-1.input.js b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-1.input.js new file mode 100644 index 00000000000..1b8d983f3bd --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-1.input.js @@ -0,0 +1,10 @@ +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +module.exports = { + devtool: "source-map", + plugins: [ + new UglifyJsPlugin({ + sourceMap: true, + compress: {} + }) + ] +} diff --git a/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-2.input.js b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-2.input.js new file mode 100644 index 00000000000..db172f05e29 --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-2.input.js @@ -0,0 +1,10 @@ +const Uglify = require('uglifyjs-webpack-plugin'); +module.exports = { + devtool: "source-map", + plugins: [ + new Uglify({ + sourceMap: true, + compress: {} + }) + ] +} diff --git a/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-3.input.js b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-3.input.js new file mode 100644 index 00000000000..4f104918915 --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-3.input.js @@ -0,0 +1,26 @@ +module.exports = { + devtool: 'eval', + entry: [ + './src/index' + ], + output: { + path: path.join(__dirname, 'dist'), + filename: 'index.js' + }, + module: { + loaders: [{ + test: /.js$/, + loaders: ['babel'], + include: path.join(__dirname, 'src') + }] + }, + resolve: { + root: path.resolve('/src'), + modules: ['node_modules'] + }, + plugins: [ + new webpack.optimize.UglifyJsPlugin(), + new webpack.optimize.OccurrenceOrderPlugin() + ], + debug: true +}; diff --git a/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-4.input.js b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-4.input.js new file mode 100644 index 00000000000..707400c20bd --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/__testfixtures__/uglifyJsPlugin-4.input.js @@ -0,0 +1,28 @@ +module.exports = { + devtool: 'eval', + entry: [ + './src/index' + ], + output: { + path: path.join(__dirname, 'dist'), + filename: 'index.js' + }, + module: { + loaders: [{ + test: /.js$/, + loaders: ['babel'], + include: path.join(__dirname, 'src') + }] + }, + resolve: { + root: path.resolve('/src'), + modules: ['node_modules'] + }, + plugins: [ + new webpack.optimize.UglifyJsPlugin({ + sourceMap: true + }), + new webpack.optimize.OccurrenceOrderPlugin() + ], + debug: true +}; diff --git a/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.test.js b/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.test.js new file mode 100644 index 00000000000..d60cd4ba928 --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.test.js @@ -0,0 +1,9 @@ +"use strict"; + +const defineTest = require("@webpack-cli/utils/defineTest").default; + +defineTest(__dirname, "uglifyJsPlugin", "uglifyJsPlugin-0"); +defineTest(__dirname, "uglifyJsPlugin", "uglifyJsPlugin-1"); +defineTest(__dirname, "uglifyJsPlugin", "uglifyJsPlugin-2"); +defineTest(__dirname, "uglifyJsPlugin", "uglifyJsPlugin-3"); +defineTest(__dirname, "uglifyJsPlugin", "uglifyJsPlugin-4"); diff --git a/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.ts b/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.ts new file mode 100644 index 00000000000..dbf5f8152fa --- /dev/null +++ b/packages/migrate/uglifyJsPlugin/uglifyJsPlugin.ts @@ -0,0 +1,128 @@ +import { + createProperty, + findPluginsArrayAndRemoveIfEmpty, + findPluginsByName, + getRequire, + safeTraverse, +} from "@webpack-cli/utils/ast-utils"; + +import { IJSCodeshift, INode } from "../types/NodePath"; + +/** + * + * Transform which: + * Removes UglifyWebpackPlugin from plugins array, if no options is passed to the plugin. + * and adds `optimization.minimize: true` to config + * + * If any configuration is passed to UglifyWebpackPlugin + * plugin instantiation is moved to `optimization.minimizer`. + * + * @param {Object} j - jscodeshift top-level import + * @param {Node} ast - jscodeshift ast to transform + * @returns {Node} ast - jscodeshift ast + */ + +export default function(j: IJSCodeshift, ast: INode): INode { + + let pluginVariableAssignment: string = null; + + const searchForRequirePlugin: INode = ast + .find(j.VariableDeclarator) + .filter( + j.filters.VariableDeclarator.requiresModule("uglifyjs-webpack-plugin"), + ); + + /** + * Look for a variable declaration which requires uglifyjs-webpack-plugin + * saves the name of this variable. + */ + searchForRequirePlugin.forEach((node: INode): void => { + pluginVariableAssignment = node.value.id.name; + }); + + pluginVariableAssignment = !pluginVariableAssignment + ? "webpack.optimize.UglifyJsPlugin" + : pluginVariableAssignment; + + findPluginsByName(j, ast, [pluginVariableAssignment]) + .forEach((node: INode): void => { + let expressionContent: object = null; + + const configBody: INode = safeTraverse(node, ["parent", "parent", "parent"]); + + // options passed to plugin + const pluginOptions: INode[] = node.value.arguments; + + /** + * check if there are any options passed to UglifyWebpackPlugin + * If so, they are moved to optimization.minimizer. + * Otherwise, rely on default options + */ + if (pluginOptions.length) { + /* + * If user is using UglifyJsPlugin directly from webpack + * transformation must: + * - remove it + * - add require for uglify-webpack-plugin + * - add to minimizer + */ + if (pluginVariableAssignment && pluginVariableAssignment.includes("webpack")) { + // create require for uglify-webpack-plugin + const pathRequire: INode = getRequire( + j, + "UglifyJsPlugin", + "uglifyjs-webpack-plugin", + ); + // append to source code. + ast + .find(j.Program) + .replaceWith((p: INode): INode => + j.program([].concat(pathRequire).concat(p.value.body)), + ); + + expressionContent = j.property( + "init", + j.identifier("minimizer"), + j.arrayExpression([ + j.newExpression(j.identifier("UglifyJsPlugin"), [pluginOptions[0]]), + ]), + ); + } else { + expressionContent = j.property( + "init", + j.identifier("minimizer"), + j.arrayExpression([node.value]), + ); + } + } else { + searchForRequirePlugin.forEach((n: INode): void => j(n).remove()); + } + + const minimizeProperty = createProperty(j, "minimize", "true"); + // creates optimization property at the body of the config. + if (expressionContent) { + configBody.value.properties.push( + j.property( + "init", + j.identifier("optimization"), + j.objectExpression([minimizeProperty, expressionContent]), + ), + ); + } else { + configBody.value.properties.push( + j.property( + "init", + j.identifier("optimization"), + j.objectExpression([minimizeProperty]), + ), + ); + } + + // remove the old Uglify plugin from Plugins array. + j(node).remove(); + }); + + findPluginsArrayAndRemoveIfEmpty(j, ast); + + return ast; +} diff --git a/packages/utils/__tests__/ast-utils.test.ts b/packages/utils/__tests__/ast-utils.test.ts index 1642d1954dc..b9c8e34576c 100644 --- a/packages/utils/__tests__/ast-utils.test.ts +++ b/packages/utils/__tests__/ast-utils.test.ts @@ -35,28 +35,28 @@ describe("utils", () => { describe("findPluginsByName", () => { it("should find plugins in AST", () => { const ast = j(` -{ foo: new TerserPlugin() } +{ foo: new webpack.optimize.UglifyJsPlugin() } `); - const res = utils.findPluginsByName(j, ast, ["TerserPlugin"]); + const res = utils.findPluginsByName(j, ast, ["webpack.optimize.UglifyJsPlugin"]); expect(res.size()).toEqual(1); }); it("should find all plugins in AST", () => { const ast = j(` [ - new TerserPlugin(), + new UglifyJsPlugin(), new TestPlugin() ] `); - const res = utils.findPluginsByName(j, ast, ["TerserPlugin", "TestPlugin"]); + const res = utils.findPluginsByName(j, ast, ["UglifyJsPlugin", "TestPlugin"]); expect(res.size()).toEqual(2); }); it("should not find false positives", () => { const ast = j(` -{ foo: new webpack.optimize.TerserPlugin() } +{ foo: new UglifyJsPlugin() } `); - const res = utils.findPluginsByName(j, ast, ["TerserPlugin"]); + const res = utils.findPluginsByName(j, ast, ["webpack.optimize.UglifyJsPlugin"]); expect(res.size()).toEqual(0); }); });