diff --git a/CHANGELOG.md b/CHANGELOG.md index caa03c264..314117d3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v5.25.0 + - Regex properties added to reserved property mangler (#1471) + - `pure_new` option added to drop unused `new` expressions. + ## v5.24.0 - Improve formatting performance in V8 by keeping a small work string and a large output string diff --git a/README.md b/README.md index c3e1f1563..64e65f360 100644 --- a/README.md +++ b/README.md @@ -820,6 +820,9 @@ If you happen to need the source map as a raw object, set `sourceMap.asObject` t Specify `"strict"` to treat `foo.bar` as side-effect-free only when `foo` is certain to not throw, i.e. not `null` or `undefined`. +- `pure_new` (default: `false`) -- Set to `true` to assume `new X()` never has + side effects. + - `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and used as constant values. diff --git a/lib/compress/index.js b/lib/compress/index.js index 462a6b2c5..879d55bb1 100644 --- a/lib/compress/index.js +++ b/lib/compress/index.js @@ -251,6 +251,7 @@ class Compressor extends TreeWalker { properties : !false_by_default, pure_getters : !false_by_default && "strict", pure_funcs : null, + pure_new : false, reduce_funcs : !false_by_default, reduce_vars : !false_by_default, sequences : !false_by_default, diff --git a/lib/compress/inference.js b/lib/compress/inference.js index 2068274e1..41c1713b7 100644 --- a/lib/compress/inference.js +++ b/lib/compress/inference.js @@ -828,6 +828,9 @@ AST_Call.DEFMETHOD("is_callee_pure", function(compressor) { return true; } } + if ((this instanceof AST_New) && compressor.option("pure_new")) { + return true; + } return !!has_annotation(this, _PURE) || !compressor.pure_funcs(this); }); diff --git a/package-lock.json b/package-lock.json index 28966e6f4..5726c8e99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "terser", - "version": "5.24.0", + "version": "5.25.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "terser", - "version": "5.24.0", + "version": "5.25.0", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", diff --git a/package.json b/package.json index 2e731d50e..d2fb494e4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "https://terser.org", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "5.24.0", + "version": "5.25.0", "engines": { "node": ">=10" }, diff --git a/test/compress/new.js b/test/compress/new.js index 511a23e04..8a155e811 100644 --- a/test/compress/new.js +++ b/test/compress/new.js @@ -116,3 +116,22 @@ dot_parenthesis_2: { expect_exact: "console.log(typeof new function(){Math.random()}.constructor);" expect_stdout: "function" } + +new_pure: { + options = { + pure_new: true, + defaults: true, + } + input: { + new function() {}; + (new function() { + this.pass = () => console.log("PASS"); + }).pass(); + } + expect: { + (new function() { + this.pass = () => console.log("PASS"); + }).pass(); + } + expect_stdout: "PASS" +} diff --git a/tools/terser.d.ts b/tools/terser.d.ts index 9f9bc0610..df19eafc7 100644 --- a/tools/terser.d.ts +++ b/tools/terser.d.ts @@ -50,6 +50,7 @@ export interface CompressOptions { passes?: number; properties?: boolean; pure_funcs?: string[]; + pure_new?: boolean; pure_getters?: boolean | 'strict'; reduce_funcs?: boolean; reduce_vars?: boolean;