From 93e71d51d1d3ade0392f686f98048cdf72ea37d3 Mon Sep 17 00:00:00 2001 From: Boopathi Rajaa Date: Mon, 14 Aug 2017 11:05:39 +0200 Subject: [PATCH] Use evaluate helper in removeUndefined transform + [x] Add option `tdz` in transform-remove-undefined + [x] Udpate tdz option in preset + [x] Update docs + [x] Tests Fix #614 --- .../README.md | 4 +++ .../package.json | 5 +++- .../src/index.js | 26 +++++++++++++------ packages/babel-preset-minify/README.md | 2 +- .../__tests__/babili-es2015-tests.js | 22 ++++++++++++++++ packages/babel-preset-minify/src/index.js | 2 +- 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/packages/babel-plugin-transform-remove-undefined/README.md b/packages/babel-plugin-transform-remove-undefined/README.md index 6b48e2313..32f7f5a52 100644 --- a/packages/babel-plugin-transform-remove-undefined/README.md +++ b/packages/babel-plugin-transform-remove-undefined/README.md @@ -57,3 +57,7 @@ require("babel-core").transform("code", { plugins: ["babel-plugin-transform-remove-undefined"] }); ``` + +## Options + ++ `tdz` - Detect usages before declaration/initialization in let/const(throws) and var(void 0) diff --git a/packages/babel-plugin-transform-remove-undefined/package.json b/packages/babel-plugin-transform-remove-undefined/package.json index cd720c436..f12b5671f 100644 --- a/packages/babel-plugin-transform-remove-undefined/package.json +++ b/packages/babel-plugin-transform-remove-undefined/package.json @@ -10,5 +10,8 @@ "license": "MIT", "author": "shinew", "main": "lib/index.js", - "repository": "https://github.com/babel/minify/tree/master/packages/babel-plugin-transform-remove-undefined" + "repository": "https://github.com/babel/minify/tree/master/packages/babel-plugin-transform-remove-undefined", + "dependencies": { + "babel-helper-evaluate-path": "^0.1.0" + } } diff --git a/packages/babel-plugin-transform-remove-undefined/src/index.js b/packages/babel-plugin-transform-remove-undefined/src/index.js index 5cfccd11b..6cb210ea7 100644 --- a/packages/babel-plugin-transform-remove-undefined/src/index.js +++ b/packages/babel-plugin-transform-remove-undefined/src/index.js @@ -1,6 +1,11 @@ "use strict"; -function isPureAndUndefined(rval, scope = { hasBinding: () => false }) { +const evaluate = require("babel-helper-evaluate-path"); + +function isPureAndUndefined( + rval, + { tdz, scope = { hasBinding: () => false } } = {} +) { if (rval.isIdentifier() && rval.node.name === "undefined") { // deopt right away if undefined is a local binding if (scope.hasBinding(rval.node.name, true /* no globals */)) { @@ -12,7 +17,7 @@ function isPureAndUndefined(rval, scope = { hasBinding: () => false }) { if (!rval.isPure()) { return false; } - const evaluation = rval.evaluate(); + const evaluation = evaluate(rval, { tdz }); return evaluation.confident === true && evaluation.value === undefined; } @@ -96,12 +101,12 @@ module.exports = function() { return { name: "transform-remove-undefined", visitor: { - SequenceExpression(path) { + SequenceExpression(path, { opts: { tdz } = {} }) { const expressions = path.get("expressions"); for (let i = 0; i < expressions.length; i++) { const expr = expressions[i]; - if (!isPureAndUndefined(expr, path.scope)) continue; + if (!isPureAndUndefined(expr, { tdz, scope: path.scope })) continue; // last value if (i === expressions.length - 1) { @@ -114,21 +119,26 @@ module.exports = function() { } }, - ReturnStatement(path) { + ReturnStatement(path, { opts: { tdz } = {} }) { if (path.node.argument !== null) { - if (isPureAndUndefined(path.get("argument"), path.scope)) { + if ( + isPureAndUndefined(path.get("argument"), { + tdz, + scope: path.scope + }) + ) { path.node.argument = null; } } }, - VariableDeclaration(path) { + VariableDeclaration(path, { opts: { tdz } = {} }) { switch (path.node.kind) { case "const": break; case "let": for (const declarator of path.get("declarations")) { - if (isPureAndUndefined(declarator.get("init"))) { + if (isPureAndUndefined(declarator.get("init"), { tdz })) { declarator.node.init = null; } } diff --git a/packages/babel-preset-minify/README.md b/packages/babel-preset-minify/README.md index 94eb91f0a..33de53a43 100644 --- a/packages/babel-preset-minify/README.md +++ b/packages/babel-preset-minify/README.md @@ -100,7 +100,7 @@ OptionName | Plugins ---------- | ------- keepFnName | Passed to [mangle][mangle] & [deadcode][deadcode] keepClassName | Passed to [mangle][mangle] & [deadcode][deadcode] -tdz | Passed to [builtIns][builtIns], [evaluate][evaluate] & [deadcode][deadcode] +tdz | Passed to [builtIns][builtIns], [evaluate][evaluate], [deadcode][deadcode], [removeUndefined][removeUndefined] **Examples** diff --git a/packages/babel-preset-minify/__tests__/babili-es2015-tests.js b/packages/babel-preset-minify/__tests__/babili-es2015-tests.js index 8d21da040..49cc15e93 100644 --- a/packages/babel-preset-minify/__tests__/babili-es2015-tests.js +++ b/packages/babel-preset-minify/__tests__/babili-es2015-tests.js @@ -42,4 +42,26 @@ describe("preset along with es2015", () => { key = obj.k, foo(); ` ); + + thePlugin( + "should fix issue#614", + ` + function a() { + var c = 1 + class B {} + return B + } + `, + ` + "use strict"; + + function _classCallCheck(a, b) { if (!(a instanceof b)) throw new TypeError("Cannot call a class as a function"); } + + function a() { + return function a() { + _classCallCheck(this, a); + }; + } + ` + ); }); diff --git a/packages/babel-preset-minify/src/index.js b/packages/babel-preset-minify/src/index.js index f6d5963f3..2784a1121 100644 --- a/packages/babel-preset-minify/src/index.js +++ b/packages/babel-preset-minify/src/index.js @@ -34,7 +34,7 @@ const PLUGINS = [ const PROXIES = { keepFnName: ["mangle", "deadcode"], keepClassName: ["mangle", "deadcode"], - tdz: ["builtIns", "evaluate", "deadcode"] + tdz: ["builtIns", "evaluate", "deadcode", "removeUndefined"] }; module.exports = preset;