diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js b/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js index 813dcd761f7c..b3797f85be36 100644 --- a/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js +++ b/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js @@ -39,11 +39,18 @@ export default declare(api => { } } + const isRHSAnonymousFunction = t.isFunctionExpression(right, { + id: null, + }); + const rightExpression = isRHSAnonymousFunction + ? t.sequenceExpression([t.numericLiteral(0), right]) + : right; + path.replaceWith( t.logicalExpression( operator.slice(0, -1), lhs, - t.assignmentExpression("=", left, right), + t.assignmentExpression("=", left, rightExpression), ), ); }, diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js new file mode 100644 index 000000000000..426a65a92731 --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js @@ -0,0 +1,8 @@ +var a; +console.log((a ||= function () {}).name); + +var b = 1; +console.log((b &&= function () {}).name); + +var c; +console.log((c ??= function () {}).name); diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json new file mode 100644 index 000000000000..259c77d8e49c --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-logical-assignment-operators"] +} diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js new file mode 100644 index 000000000000..79297c746323 --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js @@ -0,0 +1,6 @@ +var a; +console.log((a || (a = (0, function () {}))).name); +var b = 1; +console.log((b && (b = (0, function () {}))).name); +var c; +console.log((c ?? (c = (0, function () {}))).name);