diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index aca3cfa75527..438335e5b9e5 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -294,7 +294,9 @@ const privateNameHandlerSpec = { value, ]); } - return t.callExpression(file.addHelper("classPrivateMethodSet"), []); + return t.callExpression(file.addHelper("readOnlyError"), [ + t.stringLiteral(`#${name}`), + ]); } return t.callExpression(file.addHelper("classPrivateFieldSet"), [ this.receiver(member), diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index f05e23bcc4d0..9eec007db4ca 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -2092,11 +2092,14 @@ helpers.classPrivateMethodGet = helper("7.1.6")` } `; -helpers.classPrivateMethodSet = helper("7.1.6")` - export default function _classPrivateMethodSet() { - throw new TypeError("attempted to reassign private method"); - } -`; +if (!process.env.BABEL_8_BREAKING) { + // Use readOnlyError instead + helpers.classPrivateMethodSet = helper("7.1.6")` + export default function _classPrivateMethodSet() { + throw new TypeError("attempted to reassign private method"); + } + `; +} helpers.wrapRegExp = helper("7.2.6")` import wrapNativeSuper from "wrapNativeSuper"; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js index f6bb09d910fb..7fe1e2be6f07 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js @@ -14,7 +14,7 @@ class Cl { value: 0 }); - babelHelpers.classPrivateMethodSet(); + babelHelpers.readOnlyError("#privateFieldValue"); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js new file mode 100644 index 000000000000..4bdbb3b3acd9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js @@ -0,0 +1,9 @@ +class A { + #method() {} + + run() { + this.#method = 2; + } +} + +expect(() => new A().run()).toThrow(TypeError); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js new file mode 100644 index 000000000000..6667af5411fa --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js @@ -0,0 +1,7 @@ +class A { + #method() {} + + run() { + this.#method = 2; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js new file mode 100644 index 000000000000..72ecfd257690 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js @@ -0,0 +1,14 @@ +var _method = new WeakSet(); + +class A { + constructor() { + _method.add(this); + } + + run() { + babelHelpers.readOnlyError("#method"); + } + +} + +var _method2 = function _method2() {};