diff --git a/packages/babel-plugin-transform-optional-chaining/src/transform.ts b/packages/babel-plugin-transform-optional-chaining/src/transform.ts index aac579cea298..d47d559c2386 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/transform.ts +++ b/packages/babel-plugin-transform-optional-chaining/src/transform.ts @@ -68,7 +68,9 @@ export function transformOptionalChain( // 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); + replacementPath.replaceWith( + template.expression.ast`(() => ${replacementPath.node})()`, + ); // The injected optional chain will be queued and eventually transformed when visited return; } diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/input.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/input.js new file mode 100644 index 000000000000..44cfc096d50f --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/input.js @@ -0,0 +1 @@ +function f(x = delete a()?.b) {} diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/output.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/output.js new file mode 100644 index 000000000000..0b2247b29b00 --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete-in-function-params/output.js @@ -0,0 +1,4 @@ +function f(x = (() => { + var _a; + return (_a = a()) === null || _a === void 0 ? true : delete _a.b; +})()) {}