diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 2cfce5263b46..604f5a4fe8f4 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -44,6 +44,11 @@ export default declare((api, options) => { optionalPath.node.type = "CallExpression"; optionalPath = optionalPath.get("callee"); } + + // unwrap a TSNonNullExpression if need + if (optionalPath.isTSNonNullExpression()) { + optionalPath = optionalPath.get("expression"); + } } let replacementPath = path; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/input.ts new file mode 100644 index 000000000000..f263a5b2dfb3 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/input.ts @@ -0,0 +1,8 @@ +a?.b!.c; +a?.b!.c.d; +a?.b.c!.d; +a!.b?.c; +a?.b!?.c; +a?.b!.c?.c; +(a?.b!).c; +(a?.b)!.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/options.json new file mode 100644 index 000000000000..d48b5d0e7350 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "proposal-optional-chaining", + "syntax-typescript" + ] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js new file mode 100644 index 000000000000..5bcddf99c677 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js @@ -0,0 +1,10 @@ +var _a, _a2, _a3, _b, _a4, _ref, _a5, _c, _a6, _a7; + +(_a = a) === null || _a === void 0 ? void 0 : _a.b!.c; +(_a2 = a) === null || _a2 === void 0 ? void 0 : _a2.b!.c.d; +(_a3 = a) === null || _a3 === void 0 ? void 0 : _a3.b.c!.d; +(_b = a!.b) === null || _b === void 0 ? void 0 : _b.c; +(_a4 = a) === null || _a4 === void 0 ? void 0 : (_ref = _a4.b!) === null || _ref === void 0 ? void 0 : _ref.c; +(_a5 = a) === null || _a5 === void 0 ? void 0 : (_c = _a5.b!.c) === null || _c === void 0 ? void 0 : _c.c; +((_a6 = a) === null || _a6 === void 0 ? void 0 : _a6.b)!.c; +((_a7 = a) === null || _a7 === void 0 ? void 0 : _a7.b)!.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/input.ts new file mode 100644 index 000000000000..f263a5b2dfb3 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/input.ts @@ -0,0 +1,8 @@ +a?.b!.c; +a?.b!.c.d; +a?.b.c!.d; +a!.b?.c; +a?.b!?.c; +a?.b!.c?.c; +(a?.b!).c; +(a?.b)!.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/options.json new file mode 100644 index 000000000000..7249169ec0aa --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "transform-typescript"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js new file mode 100644 index 000000000000..8af9f8dc0f23 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js @@ -0,0 +1,10 @@ +var _a, _a2, _a3, _b, _a4, _ref, _a5, _c, _a6, _a7; + +(_a = a) === null || _a === void 0 ? void 0 : _a.b.c; +(_a2 = a) === null || _a2 === void 0 ? void 0 : _a2.b.c.d; +(_a3 = a) === null || _a3 === void 0 ? void 0 : _a3.b.c.d; +(_b = a.b) === null || _b === void 0 ? void 0 : _b.c; +(_a4 = a) === null || _a4 === void 0 ? void 0 : (_ref = _a4.b) === null || _ref === void 0 ? void 0 : _ref.c; +(_a5 = a) === null || _a5 === void 0 ? void 0 : (_c = _a5.b.c) === null || _c === void 0 ? void 0 : _c.c; +((_a6 = a) === null || _a6 === void 0 ? void 0 : _a6.b).c; +((_a7 = a) === null || _a7 === void 0 ? void 0 : _a7.b).c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/input.ts new file mode 100644 index 000000000000..f263a5b2dfb3 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/input.ts @@ -0,0 +1,8 @@ +a?.b!.c; +a?.b!.c.d; +a?.b.c!.d; +a!.b?.c; +a?.b!?.c; +a?.b!.c?.c; +(a?.b!).c; +(a?.b)!.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/options.json new file mode 100644 index 000000000000..5c79172a6082 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-typescript"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/output.js new file mode 100644 index 000000000000..b6d13e7877e7 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts/output.js @@ -0,0 +1,8 @@ +a?.b.c; +a?.b.c.d; +a?.b.c.d; +a.b?.c; +a?.b?.c; +a?.b.c?.c; +(a?.b).c; +(a?.b).c;