diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 3fb69e104bf5..f9f8f99ab84d 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -35,9 +35,10 @@ export default declare((api, options) => { optionalPath.isOptionalCallExpression() ) { const { node } = optionalPath; - const childPath = skipTransparentExprWrappers( - optionalPath.get("object") ?? optionalPath.get("callee"), - ); + const childKey = optionalPath.isOptionalMemberExpression() + ? "object" + : "callee"; + const childPath = skipTransparentExprWrappers(optionalPath.get(childKey)); if (node.optional) { return !scope.isStatic(childPath.node); } diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/input.js new file mode 100644 index 000000000000..882511b447f8 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/input.js @@ -0,0 +1,9 @@ +function f(a = x?.y) {} + +function g({ a, b = a?.c }) {} + +function h(a, { b = a.b?.c?.d.e }) {} + +function i(a, { b = (a.b?.c?.d).e }) {} + +function j(a, { b = a?.b?.c().d.e }) {} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/options.json new file mode 100644 index 000000000000..39ea3f99c7ff --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["proposal-optional-chaining", { "loose": true }]] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/output.js new file mode 100644 index 000000000000..f5cda260cbfe --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params-loose/output.js @@ -0,0 +1,34 @@ +function f(a = (() => { + var _x; + + return (_x = x) == null ? void 0 : _x.y; +})()) {} + +function g({ + a, + b = a == null ? void 0 : a.c +}) {} + +function h(a, { + b = (() => { + var _a$b, _a$b$c; + + return (_a$b = a.b) == null ? void 0 : (_a$b$c = _a$b.c) == null ? void 0 : _a$b$c.d.e; + })() +}) {} + +function i(a, { + b = (() => { + var _a$b2, _a$b2$c; + + return (_a$b2 = a.b) == null ? void 0 : (_a$b2$c = _a$b2.c) == null ? void 0 : _a$b2$c.d; + })().e +}) {} + +function j(a, { + b = (() => { + var _a$b3; + + return a == null ? void 0 : (_a$b3 = a.b) == null ? void 0 : _a$b3.c().d.e; + })() +}) {} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/input.js index 802d92c1342c..882511b447f8 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/input.js +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/input.js @@ -5,3 +5,5 @@ function g({ a, b = a?.c }) {} function h(a, { b = a.b?.c?.d.e }) {} function i(a, { b = (a.b?.c?.d).e }) {} + +function j(a, { b = a?.b?.c().d.e }) {} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/output.js index e2c8101d8d32..8d7909dc76fa 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/output.js +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/in-function-params/output.js @@ -24,3 +24,11 @@ function i(a, { return (_a$b2 = a.b) === null || _a$b2 === void 0 ? void 0 : (_a$b2$c = _a$b2.c) === null || _a$b2$c === void 0 ? void 0 : _a$b2$c.d; })().e }) {} + +function j(a, { + b = (() => { + var _a$b3; + + return a === null || a === void 0 ? void 0 : (_a$b3 = a.b) === null || _a$b3 === void 0 ? void 0 : _a$b3.c().d.e; + })() +}) {}