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 b3d2ccff0ebd..c6fb3da40ded 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -211,6 +211,19 @@ const privateNameHandlerSpec = { ]); }, + destructureSet(member) { + const { privateNamesMap, file } = this; + const { name } = member.node.property.id; + const { id } = privateNamesMap.get(name); + return t.memberExpression( + t.callExpression(file.addHelper("classPrivateFieldDestructureSet"), [ + this.receiver(member), + t.cloneNode(id), + ]), + t.identifier("value"), + ); + }, + call(member, args) { // The first access (the get) should do the memo assignment. this.memoise(member, 1); diff --git a/packages/babel-helper-member-expression-to-functions/src/index.js b/packages/babel-helper-member-expression-to-functions/src/index.js index e44c3eb78496..88b8514c2cdf 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.js +++ b/packages/babel-helper-member-expression-to-functions/src/index.js @@ -100,6 +100,34 @@ const handle = { return; } + // { KEY: MEMBER } = OBJ -> { KEY: _destructureSet(MEMBER) } = OBJ + // { KEY: MEMBER = _VALUE } = OBJ -> { KEY: _destructureSet(MEMBER) = _VALUE } = OBJ + // {...MEMBER} -> {..._destructureSet(MEMBER)} + // + // [MEMBER] = ARR -> [_destructureSet(MEMBER)] = ARR + // [MEMBER = _VALUE] = ARR -> [_destructureSet(MEMBER) = _VALUE] = ARR + // [...MEMBER] -> [..._destructureSet(MEMBER)] + if ( + // { KEY: MEMBER } = OBJ + (parentPath.isObjectProperty({ value: node }) && + parentPath.parentPath.isObjectPattern()) || + // { KEY: MEMBER = _VALUE } = OBJ + (parentPath.isAssignmentPattern({ left: node }) && + parentPath.parentPath.isObjectProperty({ value: parent }) && + parentPath.parentPath.parentPath.isObjectPattern()) || + // [MEMBER] = ARR + parentPath.isArrayPattern() || + // [MEMBER = _VALUE] = ARR + (parentPath.isAssignmentPattern({ left: node }) && + parentPath.parentPath.isArrayPattern()) || + // {...MEMBER} + // [...MEMBER] + parentPath.isRestElement() + ) { + member.replaceWith(this.destructureSet(member)); + return; + } + // MEMBER -> _get(MEMBER) member.replaceWith(this.get(member)); }, diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 2e445c0c76e8..3412d321caf2 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -125,6 +125,12 @@ const specHandlers = { ]); }, + destructureSet(superMember) { + throw superMember.buildCodeFrameError( + `Destructuring to a super field is not supported yet.`, + ); + }, + call(superMember, args) { return optimiseCall(this.get(superMember), t.thisExpression(), args); }, @@ -174,6 +180,13 @@ const looseHandlers = { value, ); }, + + destructureSet(superMember) { + const { computed } = superMember.node; + const prop = this.prop(superMember); + + return t.memberExpression(t.thisExpression(), prop, computed); + }, }; export default class ReplaceSupers { diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 99eab0132ad0..69fcfc1f2684 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -701,7 +701,6 @@ helpers.superPropBase = helper("7.0.0-beta.0")` `; helpers.get = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; import superPropBase from "superPropBase"; export default function _get(target, property, receiver) { @@ -726,7 +725,6 @@ helpers.get = helper("7.0.0-beta.0")` `; helpers.set = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; import superPropBase from "superPropBase"; import defineProperty from "defineProperty"; @@ -1104,6 +1102,34 @@ helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` } `; +helpers.classPrivateFieldDestructureSet = helper("7.4.4")` + 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"); + } + + return descriptor; + } + } +`; + helpers.classStaticPrivateFieldSpecGet = helper("7.0.2")` export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js new file mode 100644 index 000000000000..e9b210909117 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([undefined, 'bar']); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe(1); +expect(foo.y).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..fa30cf5cf1e4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ([this.x = this.#client, this.#client, this.y = this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..125c49f49cd1 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-1/output.js @@ -0,0 +1,13 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 1; + [this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], this.y = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js new file mode 100644 index 000000000000..c502fd3c3dc0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;([x, ...this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['foo', 'bar', 'baz', 'quu']); +expect(foo.getClient()).toEqual(['bar', 'baz', 'quu']); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js new file mode 100644 index 000000000000..e04fee2eb915 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([x, ...this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js new file mode 100644 index 000000000000..9b6c4ea89d62 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-2/output.js @@ -0,0 +1,12 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + [x, ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js new file mode 100644 index 000000000000..1882aa63236d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([]); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js new file mode 100644 index 000000000000..1a5a134409e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js new file mode 100644 index 000000000000..a784a6b0f3df --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern-3/output.js @@ -0,0 +1,12 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + [babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js new file mode 100644 index 000000000000..33310d6da0ca --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } + + getClient() { + return this.#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/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js new file mode 100644 index 000000000000..264e1bc6ef27 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js new file mode 100644 index 000000000000..6d27b1b7faf0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-array-pattern/output.js @@ -0,0 +1,12 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + [babelHelpers.classPrivateFieldLooseBase(this, _client)[_client]] = props; +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js new file mode 100644 index 000000000000..64797efce7c9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ y: 'bar' }); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe('foo'); +expect(foo.z).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..bd3bbacb8cdc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..c4738101c521 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-1/output.js @@ -0,0 +1,17 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 'foo'; + ({ + x: this.x = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], + y: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client], + z: this.z = babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/exec.js new file mode 100644 index 000000000000..944db11a8f3e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;({ x, ...this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ x: 'foo', y: 'bar', z: 'baz' }); +expect(foo.getClient()).toEqual({ y: 'bar', z: 'baz' }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json new file mode 100644 index 000000000000..4a36349a0499 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2-exec/options.json @@ -0,0 +1,15 @@ +{ + "plugins": [ + "transform-destructuring", + [ + "external-helpers", + { + "helperVersion": "7.4.4" + } + ], + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js new file mode 100644 index 000000000000..9c020dcd126f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ x, ...this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js new file mode 100644 index 000000000000..9786b38d6210 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-2/output.js @@ -0,0 +1,15 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ({ + x, + ...babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js new file mode 100644 index 000000000000..109ea2b6c62b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client = 5 } = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({}); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js new file mode 100644 index 000000000000..6f43a4ba0171 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client = 5 } = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js new file mode 100644 index 000000000000..e4ed8b749f51 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern-3/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ({ + client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] = 5 + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js new file mode 100644 index 000000000000..97a5263bdfb8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } + + getClient() { + return this.#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/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js new file mode 100644 index 000000000000..b46622eeb3e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js new file mode 100644 index 000000000000..989cacb99791 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/destructuring-object-pattern/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _client, { + writable: true, + value: void 0 + }); + ({ + client: babelHelpers.classPrivateFieldLooseBase(this, _client)[_client] + } = props); +}; + +var _client = babelHelpers.classPrivateFieldLooseKey("client"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js new file mode 100644 index 000000000000..e9b210909117 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ;([this.x = this.#client, this.#client, this.y = this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([undefined, 'bar']); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe(1); +expect(foo.y).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..fa30cf5cf1e4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 1; + ([this.x = this.#client, this.#client, this.y = this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..50ee938ef1bb --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-1/output.js @@ -0,0 +1,15 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + babelHelpers.classPrivateFieldSet(this, _client, 1); + [this.x = babelHelpers.classPrivateFieldGet(this, _client), babelHelpers.classPrivateFieldDestructureSet(this, _client).value, this.y = babelHelpers.classPrivateFieldGet(this, _client)] = props; +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js new file mode 100644 index 000000000000..c502fd3c3dc0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;([x, ...this.#client] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo(['foo', 'bar', 'baz', 'quu']); +expect(foo.getClient()).toEqual(['bar', 'baz', 'quu']); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js new file mode 100644 index 000000000000..e04fee2eb915 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([x, ...this.#client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js new file mode 100644 index 000000000000..6e66641ab3a7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-2/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + [x, ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js new file mode 100644 index 000000000000..1882aa63236d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo([]); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js new file mode 100644 index 000000000000..1a5a134409e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client = 5] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js new file mode 100644 index 000000000000..e7426334167a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern-3/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + [babelHelpers.classPrivateFieldDestructureSet(this, _client).value = 5] = props; +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js new file mode 100644 index 000000000000..33310d6da0ca --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;([this.#client] = props); + } + + getClient() { + return this.#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/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js new file mode 100644 index 000000000000..264e1bc6ef27 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ([this.#client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js new file mode 100644 index 000000000000..8cfd77e1e36f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-array-pattern/output.js @@ -0,0 +1,14 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + [babelHelpers.classPrivateFieldDestructureSet(this, _client).value] = props; +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js new file mode 100644 index 000000000000..64797efce7c9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/exec.js @@ -0,0 +1,17 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ;({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ y: 'bar' }); +expect(foo.getClient()).toBe('bar'); +expect(foo.x).toBe('foo'); +expect(foo.z).toBe('bar'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..bd3bbacb8cdc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/input.js @@ -0,0 +1,8 @@ +class Foo { + #client + + constructor(props) { + this.#client = 'foo'; + ({ x: this.x = this.#client, y: this.#client, z: this.z = this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..a9623d18db3d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-1/output.js @@ -0,0 +1,19 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + babelHelpers.classPrivateFieldSet(this, _client, 'foo'); + ({ + x: this.x = babelHelpers.classPrivateFieldGet(this, _client), + y: babelHelpers.classPrivateFieldDestructureSet(this, _client).value, + z: this.z = babelHelpers.classPrivateFieldGet(this, _client) + } = props); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/exec.js new file mode 100644 index 000000000000..944db11a8f3e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/exec.js @@ -0,0 +1,15 @@ +class Foo { + #client + + constructor(props) { + let x; + ;({ x, ...this.#client } = props) + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({ x: 'foo', y: 'bar', z: 'baz' }); +expect(foo.getClient()).toEqual({ y: 'bar', z: 'baz' }); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json new file mode 100644 index 000000000000..4a36349a0499 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2-exec/options.json @@ -0,0 +1,15 @@ +{ + "plugins": [ + "transform-destructuring", + [ + "external-helpers", + { + "helperVersion": "7.4.4" + } + ], + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js new file mode 100644 index 000000000000..9c020dcd126f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ x, ...this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js new file mode 100644 index 000000000000..22b58fd39617 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-2/output.js @@ -0,0 +1,17 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ({ + x, + ...babelHelpers.classPrivateFieldDestructureSet(this, _client).value + } = props); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js new file mode 100644 index 000000000000..60fab21660a3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ({x: this.#client = 5} = props); + } + + getClient() { + return this.#client; + } +} + +const foo = new Foo({}); +expect(foo.getClient()).toEqual(5); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js new file mode 100644 index 000000000000..47a6958c0145 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({x: this.#client = 5} = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js new file mode 100644 index 000000000000..3509915f38a5 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern-3/output.js @@ -0,0 +1,16 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ({ + x: babelHelpers.classPrivateFieldDestructureSet(this, _client).value = 5 + } = props); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js new file mode 100644 index 000000000000..97a5263bdfb8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/exec.js @@ -0,0 +1,14 @@ +class Foo { + #client + + constructor(props) { + ;({ client: this.#client } = props) + } + + getClient() { + return this.#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/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js new file mode 100644 index 000000000000..b46622eeb3e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/input.js @@ -0,0 +1,7 @@ +class Foo { + #client + + constructor(props) { + ({ client: this.#client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js new file mode 100644 index 000000000000..e49b06dd952c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/destructuring-object-pattern/output.js @@ -0,0 +1,16 @@ +var Foo = function Foo(props) { + "use strict"; + + babelHelpers.classCallCheck(this, Foo); + + _client.set(this, { + writable: true, + value: void 0 + }); + + ({ + client: babelHelpers.classPrivateFieldDestructureSet(this, _client).value + } = props); +}; + +var _client = new WeakMap(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json index beb3d1d5c569..5e2180d412eb 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/options.json @@ -3,7 +3,7 @@ [ "external-helpers", { - "helperVersion": "7.0.2" + "helperVersion": "7.4.4" } ], "proposal-class-properties", diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..bc8f7e6aa311 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..aa6fb16c74d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-array-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..19705340451c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..45845d4e16b5 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..d9d73e427633 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/public/super-destructuring-object-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "proposal-class-properties", + "transform-classes", + "transform-block-scoping", + "syntax-class-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..5b3864b52b67 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js new file mode 100644 index 000000000000..79753b87162a --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern-1/output.js @@ -0,0 +1,16 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + [x, ...this.client] = props; + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..96267163e8ad --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js new file mode 100644 index 000000000000..0672ad62fdab --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-array-pattern/output.js @@ -0,0 +1,16 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + [this.client] = props; + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..f90c1a21039d --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js new file mode 100644 index 000000000000..896273e40f43 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern-1/output.js @@ -0,0 +1,19 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + ({ + x, + ...this.client + } = props); + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..391378c2af5e --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + foo(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js new file mode 100644 index 000000000000..816071362136 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/super-destructuring-object-pattern/output.js @@ -0,0 +1,18 @@ +var Foo = +/*#__PURE__*/ +function () { + "use strict"; + + function Foo() {} + + var _proto = Foo.prototype; + + _proto.foo = function foo(props) { + ; + ({ + client: this.client + } = props); + }; + + return Foo; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..bc8f7e6aa311 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([x, ...super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..aa6fb16c74d4 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;([super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-array-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..19705340451c --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ x, ...super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..45845d4e16b5 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +class Foo { + constructor(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..15c260b243c0 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/super-destructuring-object-pattern/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js new file mode 100644 index 000000000000..e9757ea1ef41 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;([x, ...super.client] = props); + } +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern-1/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js new file mode 100644 index 000000000000..e4ee0d05beb8 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;([super.client] = props); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-array-pattern/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js new file mode 100644 index 000000000000..232d42042fdc --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;({ x, ...super.client } = props) + } +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern-1/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js new file mode 100644 index 000000000000..5400ca56b6b6 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/input.js @@ -0,0 +1,5 @@ +const foo = { + bar(props) { + ;({ client: super.client } = props) + } +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json new file mode 100644 index 000000000000..7975cd686c73 --- /dev/null +++ b/packages/babel-plugin-transform-object-super/test/fixtures/object-super/super-destructuring-object-pattern/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + "transform-object-super", + "transform-shorthand-properties" + ], + "throws": "Destructuring to a super field is not supported yet." +} diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index e18d0e49763c..55eb1cde2863 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -19,7 +19,12 @@ defineType("AssignmentPattern", { fields: { ...patternLikeCommon, left: { - validate: assertNodeType("Identifier", "ObjectPattern", "ArrayPattern"), + validate: assertNodeType( + "Identifier", + "ObjectPattern", + "ArrayPattern", + "MemberExpression", + ), }, right: { validate: assertNodeType("Expression"),