From f56f54b0ecbbf655640d674feffd229c460ec9ff Mon Sep 17 00:00:00 2001 From: macabeus Date: Sat, 4 Jan 2020 23:49:18 +0000 Subject: [PATCH] fix: optional-chaining should work correctly with ts non-null operator --- .../babel-plugin-proposal-optional-chaining/src/index.js | 5 +++++ .../input.ts | 1 + .../options.json | 4 ++++ .../output.js | 3 +++ .../input.ts | 1 + .../options.json | 6 ++++++ .../output.js | 3 +++ .../input.ts | 1 + .../options.json | 6 ++++++ .../output.js | 1 + 10 files changed, 31 insertions(+) create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/output.js diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 6a30dc74b909..7830b814e2dd 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -34,6 +34,11 @@ export default declare((api, options) => { optionalPath.node.type = "CallExpression"; optionalPath = optionalPath.get("callee"); } + + // unwrap a TSNonNullExpression if need + if (optionalPath.isTSNonNullExpression()) { + optionalPath.replaceWith(optionalPath.node.expression); + } } let replacementPath = path; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/input.ts new file mode 100644 index 000000000000..2f226b314a3f --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/input.ts @@ -0,0 +1 @@ +a?.b!.c diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/options.json new file mode 100644 index 000000000000..dd5a2ab5b31a --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-optional-chaining"], + "presets": ["../../../../../babel-preset-typescript"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/output.js new file mode 100644 index 000000000000..44183a7d8f68 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-preset-typescript/output.js @@ -0,0 +1,3 @@ +var _a; + +(_a = a) === null || _a === void 0 ? void 0 : _a.b.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/input.ts new file mode 100644 index 000000000000..2f226b314a3f --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/input.ts @@ -0,0 +1 @@ +a?.b!.c diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/options.json new file mode 100644 index 000000000000..3bfa42040c1d --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "proposal-optional-chaining", + "../../../../../babel-plugin-syntax-typescript" + ] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/output.js new file mode 100644 index 000000000000..44183a7d8f68 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-proposal-optional-chaining-and-typescript-syntax/output.js @@ -0,0 +1,3 @@ +var _a; + +(_a = a) === null || _a === void 0 ? void 0 : _a.b.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/input.ts new file mode 100644 index 000000000000..2f226b314a3f --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/input.ts @@ -0,0 +1 @@ +a?.b!.c diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/options.json new file mode 100644 index 000000000000..b24a7f03b4a7 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "../../../../../babel-plugin-syntax-optional-chaining", + "../../../../../babel-plugin-transform-typescript" + ] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/output.js new file mode 100644 index 000000000000..e0603fc5f0f9 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-syntax-optional-chaining-and-transform-typescript/output.js @@ -0,0 +1 @@ +a?.b.c;