diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index ff5da3baef..4509bd6149 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -113,6 +113,12 @@ export default function(api, options) { if (path.key == "callee" && parentPath.isCallExpression()) { return false; } + if ( + path.key == "argument" && + parentPath.isUnaryExpression({ operator: "delete" }) + ) { + return false; + } return true; }); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/call.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/call.js deleted file mode 100644 index b3c044c519..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/call.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -let calls = 0; -const obj = { - a: { - b(val) { - assert.equal(val, 1); - assert.equal(this, obj.a); - return calls++; - }, - }, - c(val) { - assert.equal(val, 1); - assert.equal(this, obj); - return calls++; - }, -}; - -let ab = obj?.a?.b(1); -assert.equal(ab, 0); - -ab = obj?.a.b(1); -assert.equal(ab, 1); - -ab = obj?.a?.b?.(1); -assert.equal(ab, 2); - -ab = obj?.a.b?.(1); -assert.equal(ab, 3); - -ab = obj?.b?.b(1); -assert.equal(ab, undefined); - -ab = obj?.b?.b?.(1); -assert.equal(ab, undefined); - -let c = obj?.c(1); -assert.equal(c, 4); - -c = obj?.c?.(1); -assert.equal(c, 5); - -c = obj?.d?.(1); -assert.equal(c, undefined); - -obj?.a.b(1); -assert.equal(calls, 7); - -obj?.a?.b(1); -assert.equal(calls, 8); - -obj?.a?.b?.(1); -assert.equal(calls, 9); - -obj?.a.b?.(1); -assert.equal(calls, 10); - -obj?.c?.(1); -assert.equal(calls, 11); - -obj?.b?.b(1); -obj?.b?.b?.(1); -obj?.d?.(1); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-right.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/exec.js similarity index 100% rename from packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-right.js rename to packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/exec.js diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/input.js new file mode 100644 index 0000000000..86e2d6e46d --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/input.js @@ -0,0 +1,20 @@ +"use strict"; + +const obj = { + a: { + b: { + c: { + d: 2, + }, + }, + }, +}; + +const a = obj?.a; + +const b = obj?.a?.b; + +const bad = obj?.b?.b; + +let val; +val = obj?.a?.b; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/output.js new file mode 100644 index 0000000000..858df8d242 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignment/output.js @@ -0,0 +1,18 @@ +"use strict"; + +var _obj$a, _obj$b, _obj$a2; + +const obj = { + a: { + b: { + c: { + d: 2 + } + } + } +}; +const a = obj === null || obj === void 0 ? void 0 : obj.a; +const b = obj === null || obj === void 0 ? void 0 : (_obj$a = obj.a) === null || _obj$a === void 0 ? void 0 : _obj$a.b; +const bad = obj === null || obj === void 0 ? void 0 : (_obj$b = obj.b) === null || _obj$b === void 0 ? void 0 : _obj$b.b; +let val; +val = obj === null || obj === void 0 ? void 0 : (_obj$a2 = obj.a) === null || _obj$a2 === void 0 ? void 0 : _obj$a2.b; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/call/exec.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/call/exec.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/exec.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/exec.js new file mode 100644 index 0000000000..a397021233 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/exec.js @@ -0,0 +1,22 @@ +"use strict"; + +const obj = { + a: { + b: 0, + }, +}; + +let test = delete obj?.a?.b; +assert.equal(obj.a.b, undefined); +assert.equal(test, true); + +test = delete obj?.a.b; +assert.equal(obj.a.b, undefined); +assert.equal(test, true); + +test = delete obj?.b?.b; +assert.equal(obj.b, undefined); +assert.equal(test, undefined); + +delete obj?.a; +assert.equal(obj.a, undefined); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js new file mode 100644 index 0000000000..6fe7638e9d --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js @@ -0,0 +1,15 @@ +"use strict"; + +const obj = { + a: { + b: 0, + }, +}; + +let test = delete obj?.a?.b; + +test = delete obj?.a.b; + +test = delete obj?.b?.b; + +delete obj?.a; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js new file mode 100644 index 0000000000..5a9498166c --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js @@ -0,0 +1,13 @@ +"use strict"; + +var _obj$a, _obj$b; + +const obj = { + a: { + b: 0 + } +}; +let test = obj === null || obj === void 0 ? void 0 : (_obj$a = obj.a) === null || _obj$a === void 0 ? void 0 : delete _obj$a.b; +test = obj === null || obj === void 0 ? void 0 : delete obj.a.b; +test = obj === null || obj === void 0 ? void 0 : (_obj$b = obj.b) === null || _obj$b === void 0 ? void 0 : delete _obj$b.b; +obj === null || obj === void 0 ? void 0 : delete obj.a; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/unary.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/exec.js similarity index 100% rename from packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/unary.js rename to packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/exec.js diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/input.js new file mode 100644 index 0000000000..97dc72293f --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/input.js @@ -0,0 +1,15 @@ +"use strict"; + +const obj = { + a: { + b: 0, + }, +}; + +let test = +obj?.a?.b; + +test = +obj?.a.b; + +test = +obj?.b?.b; + +test = +obj?.b?.b; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/output.js new file mode 100644 index 0000000000..755c01fe53 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/unary/output.js @@ -0,0 +1,13 @@ +"use strict"; + +var _obj$a, _obj$b, _obj$b2; + +const obj = { + a: { + b: 0 + } +}; +let test = +(obj === null || obj === void 0 ? void 0 : (_obj$a = obj.a) === null || _obj$a === void 0 ? void 0 : _obj$a.b); +test = +(obj === null || obj === void 0 ? void 0 : obj.a.b); +test = +(obj === null || obj === void 0 ? void 0 : (_obj$b = obj.b) === null || _obj$b === void 0 ? void 0 : _obj$b.b); +test = +(obj === null || obj === void 0 ? void 0 : (_obj$b2 = obj.b) === null || _obj$b2 === void 0 ? void 0 : _obj$b2.b);