From 0e3494e67cfd539cceba9c84b2d72bc3d956f690 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Sat, 26 Nov 2022 01:56:18 +0800 Subject: [PATCH 1/6] fix: Deleting super property should throw --- .../babel-helper-replace-supers/package.json | 1 + .../babel-helper-replace-supers/src/index.ts | 29 ++++++-- .../test/fixtures/regression/15169/exec.js | 3 + .../test/fixtures/regression/15169/input.js | 1 + .../test/fixtures/regression/15169/output.js | 8 +++ .../exec.js | 23 +++++++ .../input.js | 18 +++++ .../output.js | 45 ++++++++++++ .../spec/delete-super-property/exec.js | 27 ++++++++ .../spec/delete-super-property/input.js | 18 +++++ .../spec/delete-super-property/output.js | 69 +++++++++++++++++++ yarn.lock | 1 + 12 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/exec.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/exec.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/output.js diff --git a/packages/babel-helper-replace-supers/package.json b/packages/babel-helper-replace-supers/package.json index 2440757f93c6..b557302aad59 100644 --- a/packages/babel-helper-replace-supers/package.json +++ b/packages/babel-helper-replace-supers/package.json @@ -14,6 +14,7 @@ }, "main": "./lib/index.js", "dependencies": { + "@babel/core": "workspace:^", "@babel/helper-environment-visitor": "workspace:^", "@babel/helper-member-expression-to-functions": "workspace:^", "@babel/helper-optimise-call-expression": "workspace:^", diff --git a/packages/babel-helper-replace-supers/src/index.ts b/packages/babel-helper-replace-supers/src/index.ts index 4699b7fdddf0..b87f4834a03a 100644 --- a/packages/babel-helper-replace-supers/src/index.ts +++ b/packages/babel-helper-replace-supers/src/index.ts @@ -1,9 +1,11 @@ -import type { NodePath, Scope } from "@babel/traverse"; -import traverse from "@babel/traverse"; +import { template } from "@babel/core"; +import type { File } from "@babel/core"; +import environmentVisitor from "@babel/helper-environment-visitor"; import memberExpressionToFunctions from "@babel/helper-member-expression-to-functions"; import type { HandlerState } from "@babel/helper-member-expression-to-functions"; import optimiseCall from "@babel/helper-optimise-call-expression"; -import environmentVisitor from "@babel/helper-environment-visitor"; +import traverse from "@babel/traverse"; +import type { NodePath, Scope } from "@babel/traverse"; import { assignmentExpression, booleanLiteral, @@ -16,7 +18,6 @@ import { thisExpression, } from "@babel/types"; import type * as t from "@babel/types"; -import type { File } from "@babel/core"; // TODO (Babel 8): Don't export this. export { @@ -64,6 +65,26 @@ const visitor = traverse.visitors.merge< Super(path, state) { const { node, parentPath } = path; if (!parentPath.isMemberExpression({ object: node })) return; + if (parentPath.parentPath.isUnaryExpression({ operator: "delete" })) { + const deletePath = parentPath.parentPath; + if (parentPath.node.computed) { + deletePath.replaceWith( + sequenceExpression([ + callExpression(this.file.addHelper("toPropertyKey"), [ + cloneNode(parentPath.node.property as t.Expression), + ]), + template.expression.ast` + function () { throw new ReferenceError("'delete super[expr]' is invalid"); }() + `, + ]), + ); + } else { + deletePath.replaceWith(template.expression.ast` + function () { throw new ReferenceError("'delete super.prop' is invalid"); }() + `); + } + return; + } state.handle(parentPath); }, }, diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js new file mode 100644 index 000000000000..08fc1f81450d --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js @@ -0,0 +1,3 @@ +expect(() => { + class x { static y = delete super[0]; } +}).toThrow(ReferenceError); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js new file mode 100644 index 000000000000..39ae1b49e8a3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js @@ -0,0 +1 @@ +class x { static y = delete super[0]; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js new file mode 100644 index 000000000000..371f6ac35993 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js @@ -0,0 +1,8 @@ +var x = /*#__PURE__*/babelHelpers.createClass(function x() { + "use strict"; + + babelHelpers.classCallCheck(this, x); +}); +babelHelpers.defineProperty(x, "y", (babelHelpers.toPropertyKey(0), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); +}())); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/exec.js new file mode 100644 index 000000000000..1106e7bce89c --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/exec.js @@ -0,0 +1,23 @@ +// [Symbol.toPrimitive] must be called if exist +var counter = 0; +expect(() => { + (new class { + f() { + delete super[{ + [Symbol.toPrimitive]: function() { ++counter; return 0; }, + }]; + } + }).f(); +}).toThrow(ReferenceError); +expect(counter).toBe(1); + +// [Symbol.toPrimitive] must return a primitive value +expect(() => { + (new class { + f() { + delete super[{ + [Symbol.toPrimitive]: function() { return {}; }, + }]; + } + }).f(); +}).toThrow(TypeError); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/input.js new file mode 100644 index 000000000000..27844647551a --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/input.js @@ -0,0 +1,18 @@ +// [Symbol.toPrimitive] must be called if exist +var counter = 0; +(new class { + f() { + delete super[{ + [Symbol.toPrimitive]: function() { ++counter; return 0; }, + }]; + } +}).f(); + +// [Symbol.toPrimitive] must return a primitive value +(new class { + f() { + delete super[{ + [Symbol.toPrimitive]: function() { return {}; }, + }]; + } +}).f(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/output.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/output.js new file mode 100644 index 000000000000..6d8decbf3295 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property-to-property-key/output.js @@ -0,0 +1,45 @@ +// [Symbol.toPrimitive] must be called if exist +var counter = 0; +new ( /*#__PURE__*/function () { + "use strict"; + + function _class() { + babelHelpers.classCallCheck(this, _class); + } + babelHelpers.createClass(_class, [{ + key: "f", + value: function f() { + babelHelpers.toPropertyKey({ + [Symbol.toPrimitive]: function () { + ++counter; + return 0; + } + }), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }(); + } + }]); + return _class; +}())().f(); + +// [Symbol.toPrimitive] must return a primitive value +new ( /*#__PURE__*/function () { + "use strict"; + + function _class2() { + babelHelpers.classCallCheck(this, _class2); + } + babelHelpers.createClass(_class2, [{ + key: "f", + value: function f() { + babelHelpers.toPropertyKey({ + [Symbol.toPrimitive]: function () { + return {}; + } + }), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }(); + } + }]); + return _class2; +}())().f(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/exec.js new file mode 100644 index 000000000000..b7263306e35f --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/exec.js @@ -0,0 +1,27 @@ +expect(() => { + (new class { + f() { delete super.x; } + }).f(); +}).toThrow(ReferenceError); + +expect(() => { + (new class { + f() { delete super[0]; } + }).f(); +}).toThrow(ReferenceError); + +// [expr] should be evaluated +var counter = 0; +expect(() => { + (new class { + f() { delete super[++counter]; } + }).f(); +}).toThrow(ReferenceError); +expect(counter).toBe(1); + +// TypeError before ReferenceError +expect(() => { + (new class { + f() { delete super[0()]; } + }).f(); +}).toThrow(TypeError); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/input.js new file mode 100644 index 000000000000..7e7fea3ee5d2 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/input.js @@ -0,0 +1,18 @@ +(new class { + f() { delete super.x; } +}).f(); + +(new class { + f() { delete super[0]; } +}).f(); + +// [expr] should be evaluated +var counter = 0; +(new class { + f() { delete super[++counter]; } +}).f(); + +// TypeError before ReferenceError +(new class { + f() { delete super[0()]; } +}).f(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/output.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/output.js new file mode 100644 index 000000000000..e486ce97555e --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/delete-super-property/output.js @@ -0,0 +1,69 @@ +new ( /*#__PURE__*/function () { + "use strict"; + + function _class() { + babelHelpers.classCallCheck(this, _class); + } + babelHelpers.createClass(_class, [{ + key: "f", + value: function f() { + (function () { + throw new ReferenceError("'delete super.prop' is invalid"); + })(); + } + }]); + return _class; +}())().f(); +new ( /*#__PURE__*/function () { + "use strict"; + + function _class2() { + babelHelpers.classCallCheck(this, _class2); + } + babelHelpers.createClass(_class2, [{ + key: "f", + value: function f() { + babelHelpers.toPropertyKey(0), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }(); + } + }]); + return _class2; +}())().f(); + +// [expr] should be evaluated +var counter = 0; +new ( /*#__PURE__*/function () { + "use strict"; + + function _class3() { + babelHelpers.classCallCheck(this, _class3); + } + babelHelpers.createClass(_class3, [{ + key: "f", + value: function f() { + babelHelpers.toPropertyKey(++counter), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }(); + } + }]); + return _class3; +}())().f(); + +// TypeError before ReferenceError +new ( /*#__PURE__*/function () { + "use strict"; + + function _class4() { + babelHelpers.classCallCheck(this, _class4); + } + babelHelpers.createClass(_class4, [{ + key: "f", + value: function f() { + babelHelpers.toPropertyKey(0()), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }(); + } + }]); + return _class4; +}())().f(); diff --git a/yarn.lock b/yarn.lock index 8ba1cf3aed27..167a756ffac6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -879,6 +879,7 @@ __metadata: version: 0.0.0-use.local resolution: "@babel/helper-replace-supers@workspace:packages/babel-helper-replace-supers" dependencies: + "@babel/core": "workspace:^" "@babel/helper-environment-visitor": "workspace:^" "@babel/helper-member-expression-to-functions": "workspace:^" "@babel/helper-optimise-call-expression": "workspace:^" From 61bbf47d339f1f209ff13aa28f79453619048401 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Sat, 26 Nov 2022 05:31:09 +0800 Subject: [PATCH 2/6] Fix @babel/core dependency --- packages/babel-helper-replace-supers/package.json | 7 ++++++- yarn.lock | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/babel-helper-replace-supers/package.json b/packages/babel-helper-replace-supers/package.json index b557302aad59..9dc24b73aa96 100644 --- a/packages/babel-helper-replace-supers/package.json +++ b/packages/babel-helper-replace-supers/package.json @@ -14,13 +14,18 @@ }, "main": "./lib/index.js", "dependencies": { - "@babel/core": "workspace:^", "@babel/helper-environment-visitor": "workspace:^", "@babel/helper-member-expression-to-functions": "workspace:^", "@babel/helper-optimise-call-expression": "workspace:^", "@babel/traverse": "workspace:^", "@babel/types": "workspace:^" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "devDependencies": { + "@babel/core": "workspace:^" + }, "engines": { "node": ">=6.9.0" }, diff --git a/yarn.lock b/yarn.lock index 167a756ffac6..3a28d569b7c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -885,6 +885,8 @@ __metadata: "@babel/helper-optimise-call-expression": "workspace:^" "@babel/traverse": "workspace:^" "@babel/types": "workspace:^" + peerDependencies: + "@babel/core": ^7.0.0-0 languageName: unknown linkType: soft From a7169ad8961edf9ad9ff01d5fa11fa1340629ae7 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Sun, 27 Nov 2022 18:40:28 +0800 Subject: [PATCH 3/6] Use @babel/template instead of @babel/core --- packages/babel-helper-replace-supers/package.json | 7 +------ packages/babel-helper-replace-supers/src/index.ts | 2 +- yarn.lock | 4 +--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/babel-helper-replace-supers/package.json b/packages/babel-helper-replace-supers/package.json index 9dc24b73aa96..145ae5fa8e91 100644 --- a/packages/babel-helper-replace-supers/package.json +++ b/packages/babel-helper-replace-supers/package.json @@ -17,15 +17,10 @@ "@babel/helper-environment-visitor": "workspace:^", "@babel/helper-member-expression-to-functions": "workspace:^", "@babel/helper-optimise-call-expression": "workspace:^", + "@babel/template": "workspace:^", "@babel/traverse": "workspace:^", "@babel/types": "workspace:^" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "devDependencies": { - "@babel/core": "workspace:^" - }, "engines": { "node": ">=6.9.0" }, diff --git a/packages/babel-helper-replace-supers/src/index.ts b/packages/babel-helper-replace-supers/src/index.ts index b87f4834a03a..8ef8fbe5de14 100644 --- a/packages/babel-helper-replace-supers/src/index.ts +++ b/packages/babel-helper-replace-supers/src/index.ts @@ -1,9 +1,9 @@ -import { template } from "@babel/core"; import type { File } from "@babel/core"; import environmentVisitor from "@babel/helper-environment-visitor"; import memberExpressionToFunctions from "@babel/helper-member-expression-to-functions"; import type { HandlerState } from "@babel/helper-member-expression-to-functions"; import optimiseCall from "@babel/helper-optimise-call-expression"; +import template from "@babel/template"; import traverse from "@babel/traverse"; import type { NodePath, Scope } from "@babel/traverse"; import { diff --git a/yarn.lock b/yarn.lock index 3a28d569b7c8..5ba26097eed9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -879,14 +879,12 @@ __metadata: version: 0.0.0-use.local resolution: "@babel/helper-replace-supers@workspace:packages/babel-helper-replace-supers" dependencies: - "@babel/core": "workspace:^" "@babel/helper-environment-visitor": "workspace:^" "@babel/helper-member-expression-to-functions": "workspace:^" "@babel/helper-optimise-call-expression": "workspace:^" + "@babel/template": "workspace:^" "@babel/traverse": "workspace:^" "@babel/types": "workspace:^" - peerDependencies: - "@babel/core": ^7.0.0-0 languageName: unknown linkType: soft From 38dcf9d2b364c1d181a6b34553ef6b1d6c78c683 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Mon, 28 Nov 2022 20:31:55 +0800 Subject: [PATCH 4/6] Add optional delete in Handler --- .../src/index.ts | 12 +++++ .../babel-helper-replace-supers/src/index.ts | 45 ++++++++++--------- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/babel-helper-member-expression-to-functions/src/index.ts b/packages/babel-helper-member-expression-to-functions/src/index.ts index 7f8f74ab361d..23a31d3430e3 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.ts +++ b/packages/babel-helper-member-expression-to-functions/src/index.ts @@ -247,6 +247,11 @@ const handle = { } else if (parentIsCall) { // `(a?.#b)()` to `(a == null ? void 0 : a.#b.bind(a))()` member.replaceWith(this.boundGet(member)); + } else if ( + this.delete && + parentPath.isUnaryExpression({ operator: "delete" }) + ) { + parentPath.replaceWith(this.delete(member)); } else { member.replaceWith(this.get(member)); } @@ -491,6 +496,12 @@ const handle = { return; } + // delete MEMBER -> _delete(MEMBER) + if (this.delete && parentPath.isUnaryExpression({ operator: "delete" })) { + parentPath.replaceWith(this.delete(member)); + return; + } + // for (MEMBER of ARR) // for (MEMBER in ARR) // { KEY: MEMBER } = OBJ -> { KEY: _destructureSet(MEMBER) } = OBJ @@ -562,6 +573,7 @@ export interface Handler { member: Member, args: t.OptionalCallExpression["arguments"], ): t.Expression; + delete?(this: HandlerState & State, member: Member): t.Expression; } export interface HandlerState extends Handler { diff --git a/packages/babel-helper-replace-supers/src/index.ts b/packages/babel-helper-replace-supers/src/index.ts index 8ef8fbe5de14..95b8f1c75c48 100644 --- a/packages/babel-helper-replace-supers/src/index.ts +++ b/packages/babel-helper-replace-supers/src/index.ts @@ -65,26 +65,6 @@ const visitor = traverse.visitors.merge< Super(path, state) { const { node, parentPath } = path; if (!parentPath.isMemberExpression({ object: node })) return; - if (parentPath.parentPath.isUnaryExpression({ operator: "delete" })) { - const deletePath = parentPath.parentPath; - if (parentPath.node.computed) { - deletePath.replaceWith( - sequenceExpression([ - callExpression(this.file.addHelper("toPropertyKey"), [ - cloneNode(parentPath.node.property as t.Expression), - ]), - template.expression.ast` - function () { throw new ReferenceError("'delete super[expr]' is invalid"); }() - `, - ]), - ); - } else { - deletePath.replaceWith(template.expression.ast` - function () { throw new ReferenceError("'delete super.prop' is invalid"); }() - `); - } - return; - } state.handle(parentPath); }, }, @@ -128,7 +108,13 @@ type SuperMember = NodePath< interface SpecHandler extends Pick< Handler, - "get" | "set" | "destructureSet" | "call" | "optionalCall" | "memoise" + | "memoise" + | "get" + | "set" + | "destructureSet" + | "call" + | "optionalCall" + | "delete" > { _get( this: Handler & SpecHandler, @@ -261,6 +247,23 @@ const specHandlers: SpecHandler = { true, ); }, + + delete(this: Handler & SpecHandler, superMember: SuperMember) { + if (superMember.node.computed) { + return sequenceExpression([ + callExpression(this.file.addHelper("toPropertyKey"), [ + cloneNode(superMember.node.property), + ]), + template.expression.ast` + function () { throw new ReferenceError("'delete super[expr]' is invalid"); }() + `, + ]); + } else { + return template.expression.ast` + function () { throw new ReferenceError("'delete super.prop' is invalid"); }() + `; + } + }, }; const looseHandlers = { From 9604c1add9190ece2a9ab8d1c7b1feefdf2f7603 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 19:42:17 +0800 Subject: [PATCH 5/6] Update test --- .../public/delete-super-property/exec.js | 15 ++++++++ .../public/delete-super-property/input.js | 7 ++++ .../public/delete-super-property/output.js | 38 +++++++++++++++++++ .../test/fixtures/regression/15169/exec.js | 3 -- .../test/fixtures/regression/15169/input.js | 1 - .../test/fixtures/regression/15169/output.js | 8 ---- 6 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/output.js delete mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js delete mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js delete mode 100644 packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/exec.js new file mode 100644 index 000000000000..81cd1316437e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/exec.js @@ -0,0 +1,15 @@ +expect(() => { + new class { y = delete super.x; }; +}).toThrow(ReferenceError); + +expect(() => { + new class { y = delete super[0]; }; +}).toThrow(ReferenceError); + +expect(() => { + class X1 { static y = delete super.x; } +}).toThrow(ReferenceError); + +expect(() => { + class X2 { static y = delete super[0]; } +}).toThrow(ReferenceError); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/input.js new file mode 100644 index 000000000000..d26af64a6c62 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/input.js @@ -0,0 +1,7 @@ +new class { y = delete super.x; }; + +new class { y = delete super[0]; }; + +class X1 { static y = delete super.x; } + +class X2 { static y = delete super[0]; } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/output.js new file mode 100644 index 000000000000..659f3fe45998 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-super-property/output.js @@ -0,0 +1,38 @@ +new ( /*#__PURE__*/function () { + "use strict"; + + function _class2() { + babelHelpers.classCallCheck(this, _class2); + babelHelpers.defineProperty(this, "y", function () { + throw new ReferenceError("'delete super.prop' is invalid"); + }()); + } + return babelHelpers.createClass(_class2); +}())(); +new ( /*#__PURE__*/function () { + "use strict"; + + function _class4() { + babelHelpers.classCallCheck(this, _class4); + babelHelpers.defineProperty(this, "y", (babelHelpers.toPropertyKey(0), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); + }())); + } + return babelHelpers.createClass(_class4); +}())(); +var X1 = /*#__PURE__*/babelHelpers.createClass(function X1() { + "use strict"; + + babelHelpers.classCallCheck(this, X1); +}); +babelHelpers.defineProperty(X1, "y", function () { + throw new ReferenceError("'delete super.prop' is invalid"); +}()); +var X2 = /*#__PURE__*/babelHelpers.createClass(function X2() { + "use strict"; + + babelHelpers.classCallCheck(this, X2); +}); +babelHelpers.defineProperty(X2, "y", (babelHelpers.toPropertyKey(0), function () { + throw new ReferenceError("'delete super[expr]' is invalid"); +}())); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js deleted file mode 100644 index 08fc1f81450d..000000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/exec.js +++ /dev/null @@ -1,3 +0,0 @@ -expect(() => { - class x { static y = delete super[0]; } -}).toThrow(ReferenceError); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js deleted file mode 100644 index 39ae1b49e8a3..000000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/input.js +++ /dev/null @@ -1 +0,0 @@ -class x { static y = delete super[0]; } diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js deleted file mode 100644 index 371f6ac35993..000000000000 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/15169/output.js +++ /dev/null @@ -1,8 +0,0 @@ -var x = /*#__PURE__*/babelHelpers.createClass(function x() { - "use strict"; - - babelHelpers.classCallCheck(this, x); -}); -babelHelpers.defineProperty(x, "y", (babelHelpers.toPropertyKey(0), function () { - throw new ReferenceError("'delete super[expr]' is invalid"); -}())); From 7ce2779b656209e531d4cd3eed1a836b8f6dc790 Mon Sep 17 00:00:00 2001 From: Tianlan Zhou Date: Wed, 30 Nov 2022 17:29:16 +0800 Subject: [PATCH 6/6] Update packages/babel-helper-member-expression-to-functions/src/index.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- .../babel-helper-member-expression-to-functions/src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/babel-helper-member-expression-to-functions/src/index.ts b/packages/babel-helper-member-expression-to-functions/src/index.ts index 23a31d3430e3..cf69866eaf2d 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.ts +++ b/packages/babel-helper-member-expression-to-functions/src/index.ts @@ -573,6 +573,8 @@ export interface Handler { member: Member, args: t.OptionalCallExpression["arguments"], ): t.Expression; + // TODO(Babel 8): Consider making this required, since `.get` doesn't + // really work as a fallback for `.delete` delete?(this: HandlerState & State, member: Member): t.Expression; }