From a8d788ca85ce1ff3ace0fb4acf08975fb7049206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 26 Feb 2021 16:11:07 -0500 Subject: [PATCH 1/5] fix: support static private field destructure set ([C.#p] = [0]) --- .../src/fields.js | 14 ++++++-- packages/babel-helpers/src/helpers.js | 33 +++++++++++++++++-- .../exec.js | 14 ++++++++ .../input.js | 7 ++++ .../output.js | 13 ++++++++ .../exec.js | 14 ++++++++ .../input.js | 7 ++++ .../output.js | 15 +++++++++ .../exec.js | 14 ++++++++ .../input.js | 7 ++++ .../output.js | 11 +++++++ .../exec.js | 14 ++++++++ .../input.js | 7 ++++ .../output.js | 13 ++++++++ .../accessors-loose/set-only-getter/exec.js | 1 + .../accessors-loose/set-only-getter/input.js | 1 + .../accessors-loose/set-only-getter/output.js | 1 + .../set-only-getter/exec.js | 1 + .../set-only-getter/input.js | 1 + .../set-only-getter/output.js | 1 + .../accessors/set-only-getter/exec.js | 2 ++ .../accessors/set-only-getter/input.js | 1 + .../accessors/set-only-getter/output.js | 2 +- .../fixtures/private-method/read-only/exec.js | 1 + .../private-method/read-only/input.js | 1 + .../private-method/read-only/output.js | 1 + .../private-static-method/read-only/exec.js | 10 ++++++ .../private-static-method/read-only/input.js | 8 +++++ .../private-static-method/read-only/output.js | 9 +++++ .../destructure-set/exec.js | 10 ++++++ .../destructure-set/input.js | 9 +++++ .../destructure-set/output.js | 24 ++++++++++++++ .../set-only-getter/exec.js | 13 ++++---- .../set-only-getter/input.js | 16 +++++---- .../set-only-getter/output.js | 20 ++++++----- .../destructure-set/exec.js | 10 ++++++ .../destructure-set/input.js | 9 +++++ .../destructure-set/output.js | 24 ++++++++++++++ .../set-only-getter/exec.js | 13 ++++---- .../set-only-getter/input.js | 16 +++++---- .../set-only-getter/output.js | 20 ++++++----- .../static-accessors/destructure-set/exec.js | 10 ++++++ .../static-accessors/destructure-set/input.js | 9 +++++ .../destructure-set/output.js | 20 +++++++++++ .../static-accessors/set-only-getter/exec.js | 13 ++++---- .../static-accessors/set-only-getter/input.js | 16 +++++---- .../set-only-getter/output.js | 16 +++++---- 47 files changed, 425 insertions(+), 67 deletions(-) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/output.js 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 fd8f6d311bee..bdfbe3dee3eb 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -318,9 +318,19 @@ const privateNameHandlerSpec = { }, destructureSet(member) { - const { privateNamesMap, file } = this; + const { classRef, privateNamesMap, file } = this; const { name } = member.node.property.id; - const { id } = privateNamesMap.get(name); + const { id, static: isStatic } = privateNamesMap.get(name); + if (isStatic) { + return t.memberExpression( + t.callExpression( + file.addHelper("classStaticPrivateFieldDestructureSet"), + [this.receiver(member), t.cloneNode(classRef), t.cloneNode(id)], + ), + t.identifier("value"), + ); + } + return t.memberExpression( t.callExpression(file.addHelper("classPrivateFieldDestructureSet"), [ this.receiver(member), diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 0de3ea2d1efa..d942aea68f5f 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -1336,9 +1336,6 @@ helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` helpers.classPrivateFieldDestructureSet = helper("7.4.4")` export default function _classPrivateFieldDestructureSet(receiver, privateMap) { - if (privateMap === undefined) { - throw new TypeError("attempted to set private static field before its declaration"); - } if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } @@ -1419,6 +1416,36 @@ helpers.classStaticPrivateMethodSet = helper("7.3.2")` } `; +helpers.classStaticPrivateFieldDestructureSet = helper("7.99.0")` + export default function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + if (descriptor === undefined) { + throw new TypeError("attempted to set private static field before its declaration"); + } + if (descriptor.set) { + if (!("__destrObj" in descriptor)) { + descriptor.__destrObj = { + set value(v) { + descriptor.set.call(receiver, v) + }, + }; + } + return descriptor.__destrObj; + } else { + if (!descriptor.writable) { + // This should only throw in strict mode, but class bodies are + // always strict and private fields can only be used inside + // class bodies. + throw new TypeError("attempted to set read only private field"); + } + + return descriptor; + } + } +`; + helpers.decorate = helper("7.1.5")` import toArray from "toArray"; import toPropertyKey from "toPropertyKey"; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/exec.js new file mode 100644 index 000000000000..91a0cb6f1c4f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/exec.js @@ -0,0 +1,14 @@ +class Foo { + static #client + + constructor(props) { + ;([Foo.#client] = props); + } + + getClient() { + return Foo.#client; + } +} + +const foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/input.js new file mode 100644 index 000000000000..8a1891c52ae0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/input.js @@ -0,0 +1,7 @@ +class Foo { + static #client + + constructor(props) { + ([Foo.#client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/output.js new file mode 100644 index 000000000000..8c39a0a1e34a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-static/output.js @@ -0,0 +1,13 @@ +var _client = babelHelpers.classPrivateFieldLooseKey("client"); + +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + [babelHelpers.classPrivateFieldLooseBase(Foo, _client)[_client]] = props; +}; + +Object.defineProperty(Foo, _client, { + writable: true, + value: void 0 +}); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/exec.js new file mode 100644 index 000000000000..210a7cb7efa8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/exec.js @@ -0,0 +1,14 @@ +class Foo { + static #client + + constructor(props) { + ;({ client: Foo.#client } = props) + } + + getClient() { + return Foo.#client; + } +} + +const foo = new Foo({ client: 'bar' }); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/input.js new file mode 100644 index 000000000000..1763144424eb --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/input.js @@ -0,0 +1,7 @@ +class Foo { + static #client + + constructor(props) { + ({ client: Foo.#client } = props) + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/output.js new file mode 100644 index 000000000000..35dea608619f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-static/output.js @@ -0,0 +1,15 @@ +var _client = babelHelpers.classPrivateFieldLooseKey("client"); + +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + ({ + client: babelHelpers.classPrivateFieldLooseBase(Foo, _client)[_client] + } = props); +}; + +Object.defineProperty(Foo, _client, { + writable: true, + value: void 0 +}); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/exec.js new file mode 100644 index 000000000000..91a0cb6f1c4f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/exec.js @@ -0,0 +1,14 @@ +class Foo { + static #client + + constructor(props) { + ;([Foo.#client] = props); + } + + getClient() { + return Foo.#client; + } +} + +const foo = new Foo(['bar']); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/input.js new file mode 100644 index 000000000000..8a1891c52ae0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/input.js @@ -0,0 +1,7 @@ +class Foo { + static #client + + constructor(props) { + ([Foo.#client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/output.js new file mode 100644 index 000000000000..eb37343647ac --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-static/output.js @@ -0,0 +1,11 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + [babelHelpers.classStaticPrivateFieldDestructureSet(Foo, Foo, _client).value] = props; +}; + +var _client = { + writable: true, + value: void 0 +}; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/exec.js new file mode 100644 index 000000000000..210a7cb7efa8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/exec.js @@ -0,0 +1,14 @@ +class Foo { + static #client + + constructor(props) { + ;({ client: Foo.#client } = props) + } + + getClient() { + return Foo.#client; + } +} + +const foo = new Foo({ client: 'bar' }); +expect(foo.getClient()).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/input.js new file mode 100644 index 000000000000..1763144424eb --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/input.js @@ -0,0 +1,7 @@ +class Foo { + static #client + + constructor(props) { + ({ client: Foo.#client } = props) + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/output.js new file mode 100644 index 000000000000..ad99586eb604 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-static/output.js @@ -0,0 +1,13 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + ({ + client: babelHelpers.classStaticPrivateFieldDestructureSet(Foo, Foo, _client).value + } = props); +}; + +var _client = { + writable: true, + value: void 0 +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/exec.js index 64dd9738fd4f..e3878e3caa73 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/exec.js @@ -7,6 +7,7 @@ class Cl { constructor() { expect(() => this.#privateFieldValue = 1).toThrow(TypeError); + expect(() => ([this.#privateFieldValue] = [1])).toThrow(TypeError); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/input.js index a3385ef16034..b8a024c4f9e6 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/input.js @@ -7,5 +7,6 @@ class Cl { constructor() { this.#privateFieldValue = 1; + ([this.#privateFieldValue] = [1]); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/output.js index 3ae50780168c..b729b1e848e4 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-loose/set-only-getter/output.js @@ -13,6 +13,7 @@ class Cl { value: 0 }); babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = 1; + [babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]] = [1]; } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js index 64dd9738fd4f..e3878e3caa73 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js @@ -7,6 +7,7 @@ class Cl { constructor() { expect(() => this.#privateFieldValue = 1).toThrow(TypeError); + expect(() => ([this.#privateFieldValue] = [1])).toThrow(TypeError); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js index a3385ef16034..b8a024c4f9e6 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js @@ -7,5 +7,6 @@ class Cl { constructor() { this.#privateFieldValue = 1; + ([this.#privateFieldValue] = [1]); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js index 3ae50780168c..b729b1e848e4 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js @@ -13,6 +13,7 @@ class Cl { value: 0 }); babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = 1; + [babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]] = [1]; } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/exec.js index 7467e2627108..0239071c40fe 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/exec.js @@ -14,6 +14,8 @@ class Cl { constructor() { expect(() => this.self.#privateFieldValue = 1).toThrow(TypeError); expect(this.counter).toBe(1); + expect(() => ([this.self.#privateFieldValue] = [1])).toThrow(TypeError); + expect(this.counter).toBe(2); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/input.js index f48aebaff219..767e5f4b75f1 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/input.js @@ -13,6 +13,7 @@ class Cl { constructor() { this.self.#privateFieldValue = 1 + ([this.self.#privateFieldValue] = [1]); } } 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 c6c0ca1757c8..28258522e2e1 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 @@ -20,7 +20,7 @@ class Cl { }); babelHelpers.defineProperty(this, "counter", 0); - this.self, 1, babelHelpers.readOnlyError("#privateFieldValue"); + this.self, 1([babelHelpers.classPrivateFieldDestructureSet(this.self, _privateFieldValue).value] = [1]), 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 index 4c02ddac7c18..45cdcd1e5dfe 100644 --- 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 @@ -9,6 +9,7 @@ class A { constructor() { expect(() => this.self().#method = 2).toThrow(TypeError); expect(this.counter).toBe(1); + expect(() => ([this.#method] = [2])).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 index ac074319f290..47edc88d42f7 100644 --- 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 @@ -8,5 +8,6 @@ class A { constructor() { this.self().#method = 2; + ([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 index 7c1aa2790021..a4e3bed68f6b 100644 --- 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 @@ -11,6 +11,7 @@ class A { babelHelpers.defineProperty(this, "counter", 0); this.self(), 2, babelHelpers.readOnlyError("#method"); + [babelHelpers.classPrivateFieldDestructureSet(this, _method).value] = [2]; } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/exec.js new file mode 100644 index 000000000000..0ea4f705802a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/exec.js @@ -0,0 +1,10 @@ +class A { + static #method() {} + + run() { + expect(() => A.#method = 2).toThrow(TypeError); + expect(() => ([A.#method] = [2])).toThrow(TypeError); + } +} + + diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/input.js new file mode 100644 index 000000000000..2a08731865ba --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/input.js @@ -0,0 +1,8 @@ +class A { + static #method() {} + + run() { + A.#method = 2; + ([A.#method] = [2]); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/output.js new file mode 100644 index 000000000000..11ad335c5263 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method/read-only/output.js @@ -0,0 +1,9 @@ +class A { + run() { + babelHelpers.classStaticPrivateMethodSet(A, A, _method, 2); + [babelHelpers.classStaticPrivateFieldDestructureSet(A, A, _method).value] = [2]; + } + +} + +var _method = function _method() {}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/exec.js new file mode 100644 index 000000000000..a54bafb72aef --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/exec.js @@ -0,0 +1,10 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + expect(C.#q).toBe(0); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/input.js new file mode 100644 index 000000000000..e6919dccdc7e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/input.js @@ -0,0 +1,9 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/output.js new file mode 100644 index 000000000000..85649bc4c284 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/destructure-set/output.js @@ -0,0 +1,24 @@ +var _p = babelHelpers.classPrivateFieldLooseKey("p"); + +var _q = babelHelpers.classPrivateFieldLooseKey("q"); + +class C { + constructor() { + [babelHelpers.classPrivateFieldLooseBase(C, _p)[_p]] = [0]; + } + +} + +var _set_p = function (v) { + babelHelpers.classPrivateFieldLooseBase(C, _q)[_q] = v; +}; + +Object.defineProperty(C, _p, { + get: void 0, + set: _set_p +}); +Object.defineProperty(C, _q, { + writable: true, + value: void 0 +}); +new C(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/exec.js index 7069abfadc9d..161aa995a447 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/exec.js @@ -1,13 +1,14 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + expect(() => Cl.#privateFieldValue = 1).toThrow(TypeError); + expect(() => ([Cl.#privateFieldValue] = [1])).toThrow(TypeError); } } -expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError); \ No newline at end of file +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/input.js index d54ce4e2c2d0..041681e06600 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/input.js @@ -1,11 +1,15 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + Cl.#privateFieldValue = 1; + ([Cl.#privateFieldValue] = [1]); } -} \ No newline at end of file +} + +const cl = new Cl(); + diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/output.js index 2dfa44c30302..1619ba7b3755 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-loose/set-only-getter/output.js @@ -1,23 +1,25 @@ -var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD"); +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); -var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue"); +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); class Cl { - static setPrivateStaticFieldValue() { - babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = 1; + constructor() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = 1; + [babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]] = [1]; } } -var _get_privateStaticFieldValue = function () { - return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; }; -Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, { +Object.defineProperty(Cl, _privateField, { writable: true, value: 0 }); -Object.defineProperty(Cl, _privateStaticFieldValue, { - get: _get_privateStaticFieldValue, +Object.defineProperty(Cl, _privateFieldValue, { + get: _get_privateFieldValue, set: void 0 }); +var cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/exec.js new file mode 100644 index 000000000000..a54bafb72aef --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/exec.js @@ -0,0 +1,10 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + expect(C.#q).toBe(0); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/input.js new file mode 100644 index 000000000000..e6919dccdc7e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/input.js @@ -0,0 +1,9 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/output.js new file mode 100644 index 000000000000..85649bc4c284 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/destructure-set/output.js @@ -0,0 +1,24 @@ +var _p = babelHelpers.classPrivateFieldLooseKey("p"); + +var _q = babelHelpers.classPrivateFieldLooseKey("q"); + +class C { + constructor() { + [babelHelpers.classPrivateFieldLooseBase(C, _p)[_p]] = [0]; + } + +} + +var _set_p = function (v) { + babelHelpers.classPrivateFieldLooseBase(C, _q)[_q] = v; +}; + +Object.defineProperty(C, _p, { + get: void 0, + set: _set_p +}); +Object.defineProperty(C, _q, { + writable: true, + value: void 0 +}); +new C(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js index 7069abfadc9d..161aa995a447 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js @@ -1,13 +1,14 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + expect(() => Cl.#privateFieldValue = 1).toThrow(TypeError); + expect(() => ([Cl.#privateFieldValue] = [1])).toThrow(TypeError); } } -expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError); \ No newline at end of file +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js index d54ce4e2c2d0..041681e06600 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js @@ -1,11 +1,15 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + Cl.#privateFieldValue = 1; + ([Cl.#privateFieldValue] = [1]); } -} \ No newline at end of file +} + +const cl = new Cl(); + diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js index 2dfa44c30302..5ece5975f594 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js @@ -1,23 +1,25 @@ -var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD"); +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); -var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue"); +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); class Cl { - static setPrivateStaticFieldValue() { - babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = 1; + constructor() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = 1; + [babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]] = [1]; } } -var _get_privateStaticFieldValue = function () { - return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; }; -Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, { +Object.defineProperty(Cl, _privateField, { writable: true, value: 0 }); -Object.defineProperty(Cl, _privateStaticFieldValue, { - get: _get_privateStaticFieldValue, +Object.defineProperty(Cl, _privateFieldValue, { + get: _get_privateFieldValue, set: void 0 }); +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/exec.js new file mode 100644 index 000000000000..a54bafb72aef --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/exec.js @@ -0,0 +1,10 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + expect(C.#q).toBe(0); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/input.js new file mode 100644 index 000000000000..e6919dccdc7e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/input.js @@ -0,0 +1,9 @@ +class C { + static set #p(v) { C.#q = v } + static #q; + constructor() { + ([C.#p] = [0]); + } +} + +new C; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/output.js new file mode 100644 index 000000000000..03dde3c12092 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/destructure-set/output.js @@ -0,0 +1,20 @@ +class C { + constructor() { + [babelHelpers.classStaticPrivateFieldDestructureSet(C, C, _p).value] = [0]; + } + +} + +var _set_p = function (v) { + babelHelpers.classStaticPrivateFieldSpecSet(C, C, _q, v); +}; + +var _p = { + get: void 0, + set: _set_p +}; +var _q = { + writable: true, + value: void 0 +}; +new C(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/exec.js index 7069abfadc9d..161aa995a447 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/exec.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/exec.js @@ -1,13 +1,14 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + expect(() => Cl.#privateFieldValue = 1).toThrow(TypeError); + expect(() => ([Cl.#privateFieldValue] = [1])).toThrow(TypeError); } } -expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError); \ No newline at end of file +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/input.js index d54ce4e2c2d0..041681e06600 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/input.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/input.js @@ -1,11 +1,15 @@ class Cl { - static #PRIVATE_STATIC_FIELD = 0; + static #privateField = 0; - static get #privateStaticFieldValue() { - return Cl.#PRIVATE_STATIC_FIELD; + static get #privateFieldValue() { + return this.#privateField; } - static setPrivateStaticFieldValue() { - Cl.#privateStaticFieldValue = 1; + constructor() { + Cl.#privateFieldValue = 1; + ([Cl.#privateFieldValue] = [1]); } -} \ No newline at end of file +} + +const cl = new Cl(); + diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/output.js index fa3aebd45bfc..2175a3e7662d 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors/set-only-getter/output.js @@ -1,19 +1,21 @@ class Cl { - static setPrivateStaticFieldValue() { - babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateStaticFieldValue, 1); + constructor() { + babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _privateFieldValue, 1); + [babelHelpers.classStaticPrivateFieldDestructureSet(Cl, Cl, _privateFieldValue).value] = [1]; } } -var _get_privateStaticFieldValue = function () { - return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _PRIVATE_STATIC_FIELD); +var _get_privateFieldValue = function () { + return babelHelpers.classStaticPrivateFieldSpecGet(this, Cl, _privateField); }; -var _PRIVATE_STATIC_FIELD = { +var _privateField = { writable: true, value: 0 }; -var _privateStaticFieldValue = { - get: _get_privateStaticFieldValue, +var _privateFieldValue = { + get: _get_privateFieldValue, set: void 0 }; +var cl = new Cl(); From 21317c173bbccde196a1fa147dbf91823695907e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 26 Feb 2021 16:16:47 -0500 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Makefile b/Makefile index ebe41c0c32d0..5f5d14af8f8d 100644 --- a/Makefile +++ b/Makefile @@ -196,6 +196,16 @@ prepublish: IS_PUBLISH=true $(MAKE) test new-version: + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!! Update classStaticPrivateFieldDestructureSet !!!!!!" + @echo "!!!!!! helper version in !!!!!!" + @echo "!!!!!! packages/babel-helpers/src/helpers.js !!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @exit 1 git pull --rebase $(YARN) release-tool version -f @babel/standalone From 0a4f3dcb4f24a7b33589c37830795f34302544ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 26 Feb 2021 17:32:29 -0500 Subject: [PATCH 3/5] fix: add compatibility warning for older @babel/helper versions --- Makefile | 1 + .../src/fields.js | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 5f5d14af8f8d..b93d50e06eea 100644 --- a/Makefile +++ b/Makefile @@ -202,6 +202,7 @@ new-version: @echo "!!!!!! Update classStaticPrivateFieldDestructureSet !!!!!!" @echo "!!!!!! helper version in !!!!!!" @echo "!!!!!! packages/babel-helpers/src/helpers.js !!!!!!" + @echo "!!!!!! packages/babel-helper-create-class-features-plugin/src/fields.js" @echo "!!!!!! !!!!!!" @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 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 bdfbe3dee3eb..fe8005956787 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -322,11 +322,22 @@ const privateNameHandlerSpec = { const { name } = member.node.property.id; const { id, static: isStatic } = privateNamesMap.get(name); if (isStatic) { + try { + // classStaticPrivateFieldDestructureSet was introduced in 7.99.0 + // eslint-disable-next-line no-var + var helper = file.addHelper("classStaticPrivateFieldDestructureSet"); + } catch { + throw new Error( + "Babel can not transpile `[C.#p] = [0]` with @babel/helper < 7.99.0, \n" + + "please update @babel/helper to the latest version", + ); + } return t.memberExpression( - t.callExpression( - file.addHelper("classStaticPrivateFieldDestructureSet"), - [this.receiver(member), t.cloneNode(classRef), t.cloneNode(id)], - ), + t.callExpression(helper, [ + this.receiver(member), + t.cloneNode(classRef), + t.cloneNode(id), + ]), t.identifier("value"), ); } From 79417bbe07e5e843e555b4e0d23d0b6426ea88fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 27 Feb 2021 10:39:27 -0500 Subject: [PATCH 4/5] refactor: extract common routines among classPrivateFiled helpers --- packages/babel-helpers/src/helpers.js | 168 +++++++++++++------------- 1 file changed, 85 insertions(+), 83 deletions(-) diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index d942aea68f5f..02ee7036778d 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -1299,113 +1299,69 @@ helpers.classPrivateFieldLooseBase = helper("7.0.0-beta.0")` `; helpers.classPrivateFieldGet = helper("7.0.0-beta.0")` + import classApplyDescriptorGet from "classApplyDescriptorGet"; + import classExtractFieldDescriptor from "classExtractFieldDescriptor"; export default function _classPrivateFieldGet(receiver, privateMap) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to get private field on non-instance"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; + var descriptor = classExtractFieldDescriptor(receiver, privateMap, "get"); + return classApplyDescriptorGet(receiver, descriptor); } `; helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` + import classApplyDescriptorSet from "classApplyDescriptorSet"; + import classExtractFieldDescriptor from "classExtractFieldDescriptor"; export default function _classPrivateFieldSet(receiver, privateMap, value) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to set private field on non-instance"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - - descriptor.value = value; - } - + var descriptor = classExtractFieldDescriptor(receiver, privateMap, "set"); + classApplyDescriptorSet(receiver, descriptor, value); return value; } `; helpers.classPrivateFieldDestructureSet = helper("7.4.4")` + import classApplyDescriptorDestructureSet from "classApplyDescriptorDestructureSet"; + import classExtractFieldDescriptor from "classExtractFieldDescriptor"; export default function _classPrivateFieldDestructureSet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - var descriptor = privateMap.get(receiver); - if (descriptor.set) { - if (!("__destrObj" in descriptor)) { - descriptor.__destrObj = { - set value(v) { - descriptor.set.call(receiver, v) - }, - }; - } - return descriptor.__destrObj; - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } + var descriptor = classExtractFieldDescriptor(receiver, privateMap, "set"); + return classApplyDescriptorDestructureSet(receiver, descriptor); + } +`; - return descriptor; +helpers.classExtractFieldDescriptor = helper("7.99.0")` + export default function _classExtractFieldDescriptor(receiver, privateMap, action) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to " + action + " private field on non-instance"); } + return privateMap.get(receiver); } `; helpers.classStaticPrivateFieldSpecGet = helper("7.0.2")` + import classApplyDescriptorGet from "classApplyDescriptorGet"; + import classCheckPrivateStaticAccess from "classCheckPrivateStaticAccess"; + import classCheckPrivateStaticFieldDescriptor from "classCheckPrivateStaticFieldDescriptor"; export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor === undefined) { - throw new TypeError("attempted to get private static field before its declaration"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; + classCheckPrivateStaticAccess(receiver, classConstructor); + classCheckPrivateStaticFieldDescriptor(descriptor, "get"); + return classApplyDescriptorGet(receiver, descriptor); } `; helpers.classStaticPrivateFieldSpecSet = helper("7.0.2")` + import classApplyDescriptorSet from "classApplyDescriptorSet"; + import classCheckPrivateStaticAccess from "classCheckPrivateStaticAccess"; + import classCheckPrivateStaticFieldDescriptor from "classCheckPrivateStaticFieldDescriptor"; export default function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor === undefined) { - throw new TypeError("attempted to set private static field before its declaration"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - descriptor.value = value; - } - + classCheckPrivateStaticAccess(receiver, classConstructor); + classCheckPrivateStaticFieldDescriptor(descriptor, "set"); + classApplyDescriptorSet(receiver, descriptor, value); return value; } `; helpers.classStaticPrivateMethodGet = helper("7.3.2")` + import classCheckPrivateStaticAccess from "classCheckPrivateStaticAccess"; export default function _classStaticPrivateMethodGet(receiver, classConstructor, method) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } + classCheckPrivateStaticAccess(receiver, classConstructor); return method; } `; @@ -1416,14 +1372,33 @@ helpers.classStaticPrivateMethodSet = helper("7.3.2")` } `; -helpers.classStaticPrivateFieldDestructureSet = helper("7.99.0")` - export default function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); +helpers.classApplyDescriptorGet = helper("7.99.0")` + export default function _classApplyDescriptorGet(receiver, descriptor) { + if (descriptor.get) { + return descriptor.get.call(receiver); } - if (descriptor === undefined) { - throw new TypeError("attempted to set private static field before its declaration"); + return descriptor.value; + } +`; + +helpers.classApplyDescriptorSet = helper("7.99.0")` + export default function _classApplyDescriptorSet(receiver, descriptor, value) { + if (descriptor.set) { + descriptor.set.call(receiver, value); + } else { + if (!descriptor.writable) { + // This should only throw in strict mode, but class bodies are + // always strict and private fields can only be used inside + // class bodies. + throw new TypeError("attempted to set read only private field"); + } + descriptor.value = value; } + } +`; + +helpers.classApplyDescriptorDestructureSet = helper("7.99.0")` + export default function _classApplyDescriptorDestructureSet(receiver, descriptor) { if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { @@ -1446,6 +1421,33 @@ helpers.classStaticPrivateFieldDestructureSet = helper("7.99.0")` } `; +helpers.classStaticPrivateFieldDestructureSet = helper("7.99.0")` + import classApplyDescriptorDestructureSet from "classApplyDescriptorDestructureSet"; + import classCheckPrivateStaticAccess from "classCheckPrivateStaticAccess"; + import classCheckPrivateStaticFieldDescriptor from "classCheckPrivateStaticFieldDescriptor"; + export default function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) { + classCheckPrivateStaticAccess(receiver, classConstructor); + classCheckPrivateStaticFieldDescriptor(descriptor, "set"); + return classApplyDescriptorDestructureSet(receiver, descriptor); + } +`; + +helpers.classCheckPrivateStaticAccess = helper("7.99.0")` + export default function _classCheckPrivateStaticAccess(receiver, classConstructor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + } +`; + +helpers.classCheckPrivateStaticFieldDescriptor = helper("7.99.0")` + export default function _classCheckPrivateStaticFieldDescriptor(descriptor, action) { + if (descriptor === undefined) { + throw new TypeError("attempted to " + action + " private static field before its declaration"); + } + } +`; + helpers.decorate = helper("7.1.5")` import toArray from "toArray"; import toPropertyKey from "toPropertyKey"; From c5e03f9e96a41388ed280d371d672409af7e7233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 27 Feb 2021 10:49:14 -0500 Subject: [PATCH 5/5] =?UTF-8?q?More=20=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 7 ++++--- Makefile | 5 ++++- .../src/fields.js | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e9341e60d45..d2b77d2b866a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,7 +49,9 @@ jobs: git config user.email "babel-bot@users.noreply.github.com" - name: Create new version - run: yarn release-tool version -f @babel/standalone --yes patch + run: | + make new-version-checklist + yarn release-tool version -f @babel/standalone --yes patch - name: Push to GitHub id: push @@ -167,5 +169,4 @@ jobs: - name: Delete temporary branch from GitHub if: needs.git-version.result == 'success' - run: - git push "https://babel-bot:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git" :${{ needs.git-version.outputs.branch }} + run: git push "https://babel-bot:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git" :${{ needs.git-version.outputs.branch }} diff --git a/Makefile b/Makefile index b93d50e06eea..7f67330abc8c 100644 --- a/Makefile +++ b/Makefile @@ -195,7 +195,7 @@ prepublish: $(MAKE) prepublish-build IS_PUBLISH=true $(MAKE) test -new-version: +new-version-checklist: @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @echo "!!!!!! !!!!!!" @@ -207,6 +207,9 @@ new-version: @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @exit 1 + +new-version: + $(MAKE) new-version-checklist git pull --rebase $(YARN) release-tool version -f @babel/standalone 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 fe8005956787..5c935a751352 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -328,8 +328,8 @@ const privateNameHandlerSpec = { var helper = file.addHelper("classStaticPrivateFieldDestructureSet"); } catch { throw new Error( - "Babel can not transpile `[C.#p] = [0]` with @babel/helper < 7.99.0, \n" + - "please update @babel/helper to the latest version", + "Babel can not transpile `[C.#p] = [0]` with @babel/helpers < 7.99.0, \n" + + "please update @babel/helpers to the latest version.", ); } return t.memberExpression(