diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/private-loose/optional-chain-delete-property-with-transform/output.js b/packages/babel-plugin-transform-class-properties/test/fixtures/private-loose/optional-chain-delete-property-with-transform/output.js index 6b7307fe91a0..2ffef7b04320 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/private-loose/optional-chain-delete-property-with-transform/output.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/private-loose/optional-chain-delete-property-with-transform/output.js @@ -24,32 +24,32 @@ class Foo { (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(_deep$very$o.Foo, _self)[_self].unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self.unicorn; - (_ref = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? true : delete _ref.self.unicorn; - (_ref2 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? true : delete _ref2.self.unicorn; - (_ref3 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref3$self = _ref3.self) == null ? true : delete _ref3$self.self.unicorn; + (_ref = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || delete _ref.self.unicorn; + (_ref2 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null || delete _ref2.self.unicorn; + (_ref3 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref3$self = _ref3.self) == null || delete _ref3$self.self.unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf().unicorn; - (_ref4 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? true : delete _ref4.call(_babelHelpers$classPr).unicorn; - (_ref5 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? true : delete _ref5.getSelf().unicorn; - (_ref6 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref6.getSelf == null ? true : delete _ref6.getSelf().unicorn; - (_ref7 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? true : delete _ref7.self.unicorn; - (_ref8 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || (_ref8$call = _ref8.call(_babelHelpers$classPr2)) == null ? true : delete _ref8$call.self.unicorn; - (_ref9 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref9$getSelf = _ref9.getSelf()) == null ? true : delete _ref9$getSelf.self.unicorn; - (_ref10 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref10.getSelf == null || (_ref10$getSelf = _ref10.getSelf()) == null ? true : delete _ref10$getSelf.self.unicorn; + (_ref4 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || delete _ref4.call(_babelHelpers$classPr).unicorn; + (_ref5 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || delete _ref5.getSelf().unicorn; + (_ref6 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref6.getSelf == null || delete _ref6.getSelf().unicorn; + (_ref7 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null || delete _ref7.self.unicorn; + (_ref8 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || (_ref8$call = _ref8.call(_babelHelpers$classPr2)) == null || delete _ref8$call.self.unicorn; + (_ref9 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref9$getSelf = _ref9.getSelf()) == null || delete _ref9$getSelf.self.unicorn; + (_ref10 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref10.getSelf == null || (_ref10$getSelf = _ref10.getSelf()) == null || delete _ref10$getSelf.self.unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].unicorn; (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _self)[_self].unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self.unicorn; - (_ref11 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? true : delete _ref11.self.unicorn; - (_ref12 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? true : delete _ref12.self.unicorn; - (_ref13 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref13$self = _ref13.self) == null ? true : delete _ref13$self.self.unicorn; + (_ref11 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || delete _ref11.self.unicorn; + (_ref12 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null || delete _ref12.self.unicorn; + (_ref13 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref13$self = _ref13.self) == null || delete _ref13$self.self.unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf().unicorn; - (_ref14 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? true : delete _ref14.call(_babelHelpers$classPr3).unicorn; - (_ref15 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? true : delete _ref15.getSelf().unicorn; - (_ref16 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref16.getSelf == null ? true : delete _ref16.getSelf().unicorn; - (_ref17 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? true : delete _ref17.self.unicorn; - (_ref18 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || (_ref18$call = _ref18.call(_babelHelpers$classPr4)) == null ? true : delete _ref18$call.self.unicorn; - (_ref19 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref19$getSelf = _ref19.getSelf()) == null ? true : delete _ref19$getSelf.self.unicorn; - (_ref20 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref20.getSelf == null || (_ref20$getSelf = _ref20.getSelf()) == null ? true : delete _ref20$getSelf.self.unicorn; + (_ref14 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || delete _ref14.call(_babelHelpers$classPr3).unicorn; + (_ref15 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || delete _ref15.getSelf().unicorn; + (_ref16 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref16.getSelf == null || delete _ref16.getSelf().unicorn; + (_ref17 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null || delete _ref17.self.unicorn; + (_ref18 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || (_ref18$call = _ref18.call(_babelHelpers$classPr4)) == null || delete _ref18$call.self.unicorn; + (_ref19 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref19$getSelf = _ref19.getSelf()) == null || delete _ref19$getSelf.self.unicorn; + (_ref20 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref20.getSelf == null || (_ref20$getSelf = _ref20.getSelf()) == null || delete _ref20$getSelf.self.unicorn; } } Object.defineProperty(Foo, _x, { diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/private/optional-chain-delete-property-with-transform/output.js b/packages/babel-plugin-transform-class-properties/test/fixtures/private/optional-chain-delete-property-with-transform/output.js index 6b7307fe91a0..2ffef7b04320 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/private/optional-chain-delete-property-with-transform/output.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/private/optional-chain-delete-property-with-transform/output.js @@ -24,32 +24,32 @@ class Foo { (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(_deep$very$o.Foo, _self)[_self].unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self.unicorn; - (_ref = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? true : delete _ref.self.unicorn; - (_ref2 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? true : delete _ref2.self.unicorn; - (_ref3 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref3$self = _ref3.self) == null ? true : delete _ref3$self.self.unicorn; + (_ref = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || delete _ref.self.unicorn; + (_ref2 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null || delete _ref2.self.unicorn; + (_ref3 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref3$self = _ref3.self) == null || delete _ref3$self.self.unicorn; o === null || o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf().unicorn; - (_ref4 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? true : delete _ref4.call(_babelHelpers$classPr).unicorn; - (_ref5 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? true : delete _ref5.getSelf().unicorn; - (_ref6 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref6.getSelf == null ? true : delete _ref6.getSelf().unicorn; - (_ref7 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? true : delete _ref7.self.unicorn; - (_ref8 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || (_ref8$call = _ref8.call(_babelHelpers$classPr2)) == null ? true : delete _ref8$call.self.unicorn; - (_ref9 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref9$getSelf = _ref9.getSelf()) == null ? true : delete _ref9$getSelf.self.unicorn; - (_ref10 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref10.getSelf == null || (_ref10$getSelf = _ref10.getSelf()) == null ? true : delete _ref10$getSelf.self.unicorn; + (_ref4 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || delete _ref4.call(_babelHelpers$classPr).unicorn; + (_ref5 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || delete _ref5.getSelf().unicorn; + (_ref6 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref6.getSelf == null || delete _ref6.getSelf().unicorn; + (_ref7 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null || delete _ref7.self.unicorn; + (_ref8 = o === null || o === void 0 ? void 0 : (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null || (_ref8$call = _ref8.call(_babelHelpers$classPr2)) == null || delete _ref8$call.self.unicorn; + (_ref9 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || (_ref9$getSelf = _ref9.getSelf()) == null || delete _ref9$getSelf.self.unicorn; + (_ref10 = o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null || _ref10.getSelf == null || (_ref10$getSelf = _ref10.getSelf()) == null || delete _ref10$getSelf.self.unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].unicorn; (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _self)[_self].unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self.unicorn; - (_ref11 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? true : delete _ref11.self.unicorn; - (_ref12 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? true : delete _ref12.self.unicorn; - (_ref13 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref13$self = _ref13.self) == null ? true : delete _ref13$self.self.unicorn; + (_ref11 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || delete _ref11.self.unicorn; + (_ref12 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null || delete _ref12.self.unicorn; + (_ref13 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref13$self = _ref13.self) == null || delete _ref13$self.self.unicorn; fn === null || fn === void 0 ? true : delete babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf().unicorn; - (_ref14 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? true : delete _ref14.call(_babelHelpers$classPr3).unicorn; - (_ref15 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? true : delete _ref15.getSelf().unicorn; - (_ref16 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref16.getSelf == null ? true : delete _ref16.getSelf().unicorn; - (_ref17 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? true : delete _ref17.self.unicorn; - (_ref18 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || (_ref18$call = _ref18.call(_babelHelpers$classPr4)) == null ? true : delete _ref18$call.self.unicorn; - (_ref19 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref19$getSelf = _ref19.getSelf()) == null ? true : delete _ref19$getSelf.self.unicorn; - (_ref20 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref20.getSelf == null || (_ref20$getSelf = _ref20.getSelf()) == null ? true : delete _ref20$getSelf.self.unicorn; + (_ref14 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || delete _ref14.call(_babelHelpers$classPr3).unicorn; + (_ref15 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || delete _ref15.getSelf().unicorn; + (_ref16 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref16.getSelf == null || delete _ref16.getSelf().unicorn; + (_ref17 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null || delete _ref17.self.unicorn; + (_ref18 = fn === null || fn === void 0 ? void 0 : (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null || (_ref18$call = _ref18.call(_babelHelpers$classPr4)) == null || delete _ref18$call.self.unicorn; + (_ref19 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || (_ref19$getSelf = _ref19.getSelf()) == null || delete _ref19$getSelf.self.unicorn; + (_ref20 = fn === null || fn === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null || _ref20.getSelf == null || (_ref20$getSelf = _ref20.getSelf()) == null || delete _ref20$getSelf.self.unicorn; } } Object.defineProperty(Foo, _x, { diff --git a/packages/babel-plugin-transform-optional-chaining/src/transform.ts b/packages/babel-plugin-transform-optional-chaining/src/transform.ts index c97b06a91eba..558f2bea606e 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/transform.ts +++ b/packages/babel-plugin-transform-optional-chaining/src/transform.ts @@ -66,16 +66,15 @@ export function transformOptionalChain( path: NodePath, { pureGetters, noDocumentAll }: OptionalChainAssumptions, replacementPath: NodePath, - ifNullish: () => t.Expression, + ifNullish: t.Expression, wrapLast?: (value: t.Expression) => t.Expression, - willReplacementCastToBoolean: boolean = false, ) { const { scope } = path; // Replace `function (a, x = a.b?.c) {}` to `function (a, x = (() => a.b?.c)() ){}` // so the temporary variable can be injected in correct scope if (scope.path.isPattern() && needsMemoize(path)) { - path.replaceWith(template.ast`(() => ${path.node})()` as t.Statement); + path.replaceWith(template.expression.ast`(() => ${path.node})()`); // The injected optional chain will be queued and eventually transformed when visited return; } @@ -196,19 +195,24 @@ export function transformOptionalChain( let result = replacementPath.node; if (wrapLast) result = wrapLast(result); - if (willReplacementCastToBoolean) { - const check = checks - .map(noDocumentAll ? NULLISH_CHECK_NO_DDA_NEG : NULLISH_CHECK_NEG) - .reduce((expr, check) => t.logicalExpression("&&", expr, check)); - replacementPath.replaceWith(template.expression.ast`${check} && ${result}`); - } else { - const check = checks - .map(noDocumentAll ? NULLISH_CHECK_NO_DDA : NULLISH_CHECK) - .reduce((expr, check) => t.logicalExpression("||", expr, check)); - replacementPath.replaceWith( - template.expression.ast`${check} ? ${ifNullish()} : ${result}`, - ); - } + const ifNullishBoolean = t.isBooleanLiteral(ifNullish); + const ifNullishFalse = ifNullishBoolean && ifNullish.value === false; + + // prettier-ignore + const tpl = ifNullishFalse + ? (noDocumentAll ? NULLISH_CHECK_NO_DDA_NEG : NULLISH_CHECK_NEG) + : (noDocumentAll ? NULLISH_CHECK_NO_DDA : NULLISH_CHECK); + const logicalOp = ifNullishFalse ? "&&" : "||"; + + const check = checks + .map(tpl) + .reduce((expr, check) => t.logicalExpression(logicalOp, expr, check)); + + replacementPath.replaceWith( + ifNullishBoolean + ? t.logicalExpression(logicalOp, check, result) + : t.conditionalExpression(check, ifNullish, result), + ); } export function transform( @@ -221,10 +225,12 @@ export function transform( // or the path itself const maybeWrapped = findOutermostTransparentParent(path); const { parentPath } = maybeWrapped; - const willReplacementCastToBoolean = willPathCastToBoolean(maybeWrapped); if (parentPath.isUnaryExpression({ operator: "delete" })) { - transformOptionalChain(path, assumptions, parentPath, () => + transformOptionalChain( + path, + assumptions, + parentPath, t.booleanLiteral(true), ); } else { @@ -264,9 +270,10 @@ export function transform( path, assumptions, path, - () => scope.buildUndefinedNode(), + willPathCastToBoolean(maybeWrapped) + ? t.booleanLiteral(false) + : scope.buildUndefinedNode(), wrapLast, - willReplacementCastToBoolean, ); } } diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/output.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/output.js index a3f8bf3ab528..38ca699ee83d 100644 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/output.js +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/output.js @@ -6,7 +6,7 @@ const obj = { b: 0 } }; -let test = obj === null || obj === void 0 || (_obj$a = obj.a) === null || _obj$a === void 0 ? true : delete _obj$a.b; -test = obj === null || obj === void 0 ? true : delete obj.a.b; -test = obj === null || obj === void 0 || (_obj$b = obj.b) === null || _obj$b === void 0 ? true : delete _obj$b.b; -obj === null || obj === void 0 ? true : delete obj.a; +let test = obj === null || obj === void 0 || (_obj$a = obj.a) === null || _obj$a === void 0 || delete _obj$a.b; +test = obj === null || obj === void 0 || delete obj.a.b; +test = obj === null || obj === void 0 || (_obj$b = obj.b) === null || _obj$b === void 0 || delete _obj$b.b; +obj === null || obj === void 0 || delete obj.a;