diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 3143cdbe091d..4baf42a83075 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -59,7 +59,7 @@ "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" }, "devDependencies": { diff --git a/packages/babel-helper-create-class-features-plugin/package.json b/packages/babel-helper-create-class-features-plugin/package.json index f7af9f264318..76ebd55a2db6 100644 --- a/packages/babel-helper-create-class-features-plugin/package.json +++ b/packages/babel-helper-create-class-features-plugin/package.json @@ -24,6 +24,7 @@ "@babel/helper-member-expression-to-functions": "workspace:^", "@babel/helper-optimise-call-expression": "workspace:^", "@babel/helper-replace-supers": "workspace:^", + "@babel/helper-skip-transparent-expression-wrappers": "workspace:^", "@babel/helper-split-export-declaration": "workspace:^" }, "peerDependencies": { diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.ts b/packages/babel-helper-create-class-features-plugin/src/fields.ts index af304cd4fb05..e6580367716a 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.ts +++ b/packages/babel-helper-create-class-features-plugin/src/fields.ts @@ -10,6 +10,7 @@ import type { } from "@babel/helper-member-expression-to-functions"; import optimiseCall from "@babel/helper-optimise-call-expression"; import annotateAsPure from "@babel/helper-annotate-as-pure"; +import { isTransparentExprWrapper } from "@babel/helper-skip-transparent-expression-wrappers"; import * as ts from "./typescript"; @@ -890,6 +891,15 @@ type ReplaceThisState = { const thisContextVisitor = traverse.visitors.merge([ { ThisExpression(path, state) { + // Replace `delete this` with `true` + const parent = path.findParent( + path => !isTransparentExprWrapper(path.node), + ); + if (t.isUnaryExpression(parent.node, { operator: "delete" })) { + path.parentPath.replaceWith(t.booleanLiteral(true)); + return; + } + state.needsClassRef = true; path.replaceWith(t.cloneNode(state.classRef)); }, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/exec.js new file mode 100644 index 000000000000..df366e052065 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/exec.js @@ -0,0 +1,7 @@ +class Foo { + x = delete this; + static x = delete this; +} + +expect(new Foo().x).toBe(true); +expect(Foo.x).toBe(true); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/input.js new file mode 100644 index 000000000000..135489233d33 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/input.js @@ -0,0 +1,4 @@ +class Foo { + x = delete this; + static x = delete this; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/output.js new file mode 100644 index 000000000000..d6e082c07a0f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/delete-this/output.js @@ -0,0 +1,7 @@ +var Foo = /*#__PURE__*/babelHelpers.createClass(function Foo() { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + babelHelpers.defineProperty(this, "x", delete this); +}); +babelHelpers.defineProperty(Foo, "x", true); diff --git a/scripts/integration-tests/e2e-jest.sh b/scripts/integration-tests/e2e-jest.sh index c774e21eb52a..fea1ec390750 100755 --- a/scripts/integration-tests/e2e-jest.sh +++ b/scripts/integration-tests/e2e-jest.sh @@ -48,7 +48,6 @@ if [ "$BABEL_8_BREAKING" = true ] ; then # Jest depends on @types/babel__traverse for Babel 7, and they contain the removed Noop node sed -i 's/t.Noop/any/g' node_modules/@types/babel__traverse/index.d.ts - sed -i 's/t.Noop/any/g' node_modules/@types/babel__traverse/ts4.1/index.d.ts node -e " var pkg = require('./package.json'); diff --git a/yarn.lock b/yarn.lock index f98f2734cd5e..beed2115eaba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -366,7 +366,7 @@ __metadata: convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.1 + json5: ^2.2.2 rimraf: ^3.0.0 semver: "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" languageName: unknown @@ -591,6 +591,7 @@ __metadata: "@babel/helper-optimise-call-expression": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-replace-supers": "workspace:^" + "@babel/helper-skip-transparent-expression-wrappers": "workspace:^" "@babel/helper-split-export-declaration": "workspace:^" "@babel/plugin-syntax-class-static-block": ^7.14.5 "@babel/preset-env": "workspace:^" @@ -10784,12 +10785,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" +"json5@npm:^2.1.2, json5@npm:^2.2.1, json5@npm:^2.2.2": + version: 2.2.2 + resolution: "json5@npm:2.2.2" bin: json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + checksum: 9a878d66b72157b073cf0017f3e5d93ec209fa5943abcb38d37a54b208917c166bd473c26a24695e67a016ce65759aeb89946592991f8f9174fb96c8e2492683 languageName: node linkType: hard