From 9d9ec1a2a7acece39a95e76e86b90e23217c18bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 25 May 2020 13:15:29 -0400 Subject: [PATCH] add loose test cases --- .../exec.js | 0 .../input.js | 0 .../options.json | 2 +- .../output.js | 34 ++--- .../optional-chain-before-member-call/exec.js | 122 +++++++++++++++++ .../input.js | 0 .../options.json | 4 + .../output.js | 0 .../exec.js | 0 .../input.js | 0 .../options.json | 1 + .../output.js | 34 ++--- .../optional-chain-before-property/exec.js | 121 +++++++++++++++++ .../input.js | 0 .../options.json | 4 + .../output.js | 0 .../exec.js | 126 ++++++++++++++++++ .../input.js | 71 ++++++++++ .../options.json | 1 + .../output.js | 98 ++++++++++++++ .../exec.js | 126 ++++++++++++++++++ .../input.js | 71 ++++++++++ .../options.json | 4 + .../output.js | 98 ++++++++++++++ .../exec.js | 126 ++++++++++++++++++ .../input.js | 70 ++++++++++ .../options.json | 2 +- .../output.js | 98 ++++++++++++++ .../exec.js | 126 ++++++++++++++++++ .../input.js | 70 ++++++++++ .../options.json | 4 + .../output.js | 98 ++++++++++++++ .../exec.js | 125 +++++++++++++++++ .../input.js | 69 ++++++++++ .../options.json | 6 + .../output.js | 90 +++++++++++++ .../optional-chain-optional-property/exec.js | 125 +++++++++++++++++ .../optional-chain-optional-property/input.js | 70 ++++++++++ .../options.json | 4 + .../output.js | 90 +++++++++++++ 40 files changed, 2054 insertions(+), 36 deletions(-) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call-with-transform => optional-chain-before-member-call-with-transform}/exec.js (100%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call-with-transform => optional-chain-before-member-call-with-transform}/input.js (100%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call-with-transform => optional-chain-before-member-call-with-transform}/options.json (58%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call-with-transform => optional-chain-before-member-call-with-transform}/output.js (62%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call => optional-chain-before-member-call}/input.js (100%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call => optional-chain-before-member-call}/output.js (100%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-with-transform => optional-chain-before-property-with-transform}/exec.js (100%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-with-transform => optional-chain-before-property-with-transform}/input.js (100%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain => optional-chain-before-property-with-transform}/options.json (58%) rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-with-transform => optional-chain-before-property-with-transform}/output.js (61%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain => optional-chain-before-property}/input.js (100%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain => optional-chain-before-property}/output.js (100%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-private-call => optional-chain-member-optional-call-with-transform}/options.json (58%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js rename packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/{optional-chain-with-transform => optional-chain-optional-member-call-with-transform}/options.json (58%) create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json create mode 100644 packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/exec.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/exec.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/exec.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/input.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/input.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/input.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json similarity index 58% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/options.json rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json index 9a7eaaa890b3..124133b5af2b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json @@ -1,6 +1,6 @@ { "plugins": [ - "proposal-optional-chaining", + ["proposal-optional-chaining", { "loose": true }], ["proposal-class-properties", { "loose": true }] ] } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js similarity index 62% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/output.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js index 9bd6511f49f6..a7f5c767a7b2 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call-with-transform/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js @@ -10,7 +10,7 @@ class Foo { } static test() { - var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref17$getSelf, _ref18, _ref19, _ref20, _ref21, _ref22, _ref22$getSelf; + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22; const o = { Foo: Foo @@ -32,41 +32,41 @@ class Foo { o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m](); o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString; o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString(); - (_deep$very$o = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); - (_deep$very$o2 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; - (_deep$very$o3 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m](); o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m](); (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m](); (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m](); - (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m](); (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _m)[_m](); (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m](); - (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref14 === void 0 ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m](); - (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref15 === void 0 ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); - (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref16 === void 0 ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); - (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref17 === void 0 ? void 0 : (_ref17$getSelf = _ref17.getSelf) === null || _ref17$getSelf === void 0 ? void 0 : _ref17$getSelf.call(_ref17)) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf == null ? void 0 : _ref17.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m](); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString(); - (_fnDeep$very$o = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); - (_fnDeep$very$o2 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; - (_fnDeep$very$o3 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m](); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m](); (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m](); (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m](); - (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m](); (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _m)[_m](); (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m](); - (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref19 === void 0 ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m](); - (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); - (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); - (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); } } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js new file mode 100644 index 000000000000..13cc95662d95 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js @@ -0,0 +1,122 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(1); + expect(o?.Foo.#m().toString).toEqual(1..toString); + expect(o?.Foo.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m()).toEqual(1); + expect(deep?.very.o?.Foo.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m()).toEqual(1); + expect(o?.Foo.#self.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#m()).toEqual(1); + expect(fn?.().Foo.#m().toString).toEqual(1..toString); + expect(fn?.().Foo.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(undefined); + expect(o?.Foo.#m().toString).toEqual(undefined); + expect(o?.Foo.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#m()).toEqual(undefined); + expect(fn?.().Foo.#m().toString).toEqual(undefined); + expect(fn?.().Foo.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/input.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/input.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/input.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/output.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/output.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/exec.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/exec.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/exec.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/input.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/input.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/input.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json similarity index 58% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/options.json rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json index 1d89a5dde92f..124133b5af2b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json @@ -1,5 +1,6 @@ { "plugins": [ + ["proposal-optional-chaining", { "loose": true }], ["proposal-class-properties", { "loose": true }] ] } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js similarity index 61% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/output.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js index e247de3d3c63..c48dfe3de5a9 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js @@ -10,7 +10,7 @@ class Foo { } static test() { - var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref17$getSelf, _ref18, _ref19, _ref20, _ref21, _ref22, _ref22$getSelf; + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22; const o = { Foo: Foo @@ -32,41 +32,41 @@ class Foo { o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x]; o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString; o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString(); - (_deep$very$o = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _x)[_x]; - (_deep$very$o2 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _x)[_x].toString; - (_deep$very$o3 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _x)[_x].toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _x)[_x]; + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _x)[_x].toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _x)[_x].toString(); o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _x)[_x]; o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _x)[_x]; (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _x)[_x]; (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _x)[_x]; - (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _x)[_x]; + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _x)[_x]; o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _x)[_x]; (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _x)[_x]; (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _x)[_x]; - (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref14 === void 0 ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _x)[_x]; + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _x)[_x]; (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _x)[_x]; - (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref15 === void 0 ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _x)[_x]; - (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref16 === void 0 ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _x)[_x]; - (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref17 === void 0 ? void 0 : (_ref17$getSelf = _ref17.getSelf) === null || _ref17$getSelf === void 0 ? void 0 : _ref17$getSelf.call(_ref17)) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _x)[_x]; + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _x)[_x]; + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _x)[_x]; + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf == null ? void 0 : _ref17.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _x)[_x]; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x]; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString(); - (_fnDeep$very$o = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _x)[_x]; - (_fnDeep$very$o2 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _x)[_x].toString; - (_fnDeep$very$o3 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _x)[_x].toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _x)[_x]; + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _x)[_x].toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _x)[_x].toString(); fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _x)[_x]; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _x)[_x]; (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _x)[_x]; (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _x)[_x]; - (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _x)[_x]; + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _x)[_x]; fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _x)[_x]; (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _x)[_x]; (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _x)[_x]; - (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref19 === void 0 ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _x)[_x]; + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _x)[_x]; (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _x)[_x]; - (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _x)[_x]; - (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _x)[_x]; - (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _x)[_x]; + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _x)[_x]; + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _x)[_x]; + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _x)[_x]; } } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js new file mode 100644 index 000000000000..98ac8e7a7e12 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js @@ -0,0 +1,121 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(1); + expect(o?.Foo.#x.toString).toEqual(1..toString); + expect(o?.Foo.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#x).toEqual(1); + expect(deep?.very.o?.Foo.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self.#x).toEqual(1); + expect(o?.Foo.#self.self.#x).toEqual(1); + expect(o?.Foo.#self?.self.#x).toEqual(1); + expect(o?.Foo.#self.self?.self.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf().#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + + expect(fn?.().Foo.#x).toEqual(1); + expect(fn?.().Foo.#x.toString).toEqual(1..toString); + expect(fn?.().Foo.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#x).toEqual(1); + expect(fn?.().Foo.#self.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(undefined); + expect(o?.Foo.#x.toString).toEqual(undefined); + expect(o?.Foo.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#x).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self.#x).toEqual(undefined); + expect(o?.Foo.#self.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#x).toEqual(undefined); + expect(fn?.().Foo.#x.toString).toEqual(undefined); + expect(fn?.().Foo.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/input.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/input.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/input.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/output.js similarity index 100% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain/output.js rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/output.js diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json similarity index 58% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/options.json rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json index 1d89a5dde92f..124133b5af2b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-private-call/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json @@ -1,5 +1,6 @@ { "plugins": [ + ["proposal-optional-chaining", { "loose": true }], ["proposal-class-properties", { "loose": true }] ] } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js new file mode 100644 index 000000000000..c51884d907f3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _classPrivateFieldLoo, _classPrivateFieldLoo2, _ref, _ref2, _self2, _classPrivateFieldLoo3, _classPrivateFieldLoo4, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo5, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _classPrivateFieldLoo6, _classPrivateFieldLoo7, _ref7, _ref8, _self3, _classPrivateFieldLoo8, _classPrivateFieldLoo9, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo10, _call2, _getSelf5, _getSelf6, _classPrivateFieldLoo11, _classPrivateFieldLoo12, _classPrivateFieldLoo13, _classPrivateFieldLoo14, _classPrivateFieldLoo15, _classPrivateFieldLoo16, _classPrivateFieldLoo17, _classPrivateFieldLoo18, _classPrivateFieldLoo19, _classPrivateFieldLoo20, _classPrivateFieldLoo21, _classPrivateFieldLoo22, _classPrivateFieldLoo23, _classPrivateFieldLoo24, _classPrivateFieldLoo25, _classPrivateFieldLoo26, _classPrivateFieldLoo27, _classPrivateFieldLoo28, _ref13, _ref14, _classPrivateFieldLoo29, _classPrivateFieldLoo30, _classPrivateFieldLoo31, _classPrivateFieldLoo32, _ref15, _classPrivateFieldLoo33, _classPrivateFieldLoo34, _ref16, _classPrivateFieldLoo35, _classPrivateFieldLoo36, _classPrivateFieldLoo37, _classPrivateFieldLoo38, _ref17, _classPrivateFieldLoo39, _classPrivateFieldLoo40, _classPrivateFieldLoo41, _classPrivateFieldLoo42, _ref18, _classPrivateFieldLoo43, _classPrivateFieldLoo44, _ref19, _classPrivateFieldLoo45, _classPrivateFieldLoo46, _ref20, _classPrivateFieldLoo47, _classPrivateFieldLoo48, _classPrivateFieldLoo49, _classPrivateFieldLoo50, _classPrivateFieldLoo51, _classPrivateFieldLoo52, _classPrivateFieldLoo53, _classPrivateFieldLoo54, _classPrivateFieldLoo55, _classPrivateFieldLoo56, _classPrivateFieldLoo57, _classPrivateFieldLoo58, _classPrivateFieldLoo59, _classPrivateFieldLoo60, _ref21, _ref22, _classPrivateFieldLoo61, _classPrivateFieldLoo62, _classPrivateFieldLoo63, _classPrivateFieldLoo64, _ref23, _classPrivateFieldLoo65, _classPrivateFieldLoo66, _ref24, _classPrivateFieldLoo67, _classPrivateFieldLoo68, _classPrivateFieldLoo69, _classPrivateFieldLoo70, _ref25, _classPrivateFieldLoo71, _classPrivateFieldLoo72, _classPrivateFieldLoo73, _classPrivateFieldLoo74, _ref26, _classPrivateFieldLoo75, _classPrivateFieldLoo76, _ref27, _classPrivateFieldLoo77, _classPrivateFieldLoo78, _ref28, _classPrivateFieldLoo79, _classPrivateFieldLoo80; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + (_classPrivateFieldLoo11 = (_classPrivateFieldLoo12 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo11.call(_classPrivateFieldLoo12); + (_classPrivateFieldLoo13 = (_classPrivateFieldLoo14 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo13.call(_classPrivateFieldLoo14).toString; + (_classPrivateFieldLoo15 = (_classPrivateFieldLoo16 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo15.call(_classPrivateFieldLoo16).toString(); + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo17 = (_classPrivateFieldLoo18 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo17.call(_classPrivateFieldLoo18); + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo19 = (_classPrivateFieldLoo20 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo19.call(_classPrivateFieldLoo20).toString; + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo21 = (_classPrivateFieldLoo22 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo21.call(_classPrivateFieldLoo22).toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : (_classPrivateFieldLoo23 = (_classPrivateFieldLoo24 = _classPrivateFieldLooseBase(_deep$very$o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo23.call(_classPrivateFieldLoo24); + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : (_classPrivateFieldLoo25 = (_classPrivateFieldLoo26 = _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo25.call(_classPrivateFieldLoo26).toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : (_classPrivateFieldLoo27 = (_classPrivateFieldLoo28 = _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo27.call(_classPrivateFieldLoo28).toString(); + (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m]) == null ? void 0 : _ref13.call(_classPrivateFieldLoo); + (_ref14 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m]) == null ? void 0 : _ref14.call(_classPrivateFieldLoo2); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : (_classPrivateFieldLoo29 = (_classPrivateFieldLoo30 = _classPrivateFieldLooseBase(_ref.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo29.call(_classPrivateFieldLoo30); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : (_classPrivateFieldLoo31 = (_classPrivateFieldLoo32 = _classPrivateFieldLooseBase(_ref2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo31.call(_classPrivateFieldLoo32); + (_self2 = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref15.self) === null || _self2 === void 0 ? void 0 : (_classPrivateFieldLoo33 = (_classPrivateFieldLoo34 = _classPrivateFieldLooseBase(_self2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo33.call(_classPrivateFieldLoo34); + (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m]) == null ? void 0 : _ref16.call(_classPrivateFieldLoo3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : (_classPrivateFieldLoo35 = (_classPrivateFieldLoo36 = _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo4), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo35.call(_classPrivateFieldLoo36); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : (_classPrivateFieldLoo37 = (_classPrivateFieldLoo38 = _classPrivateFieldLooseBase(_ref4.getSelf(), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo37.call(_classPrivateFieldLoo38); + (_getSelf = (_ref17 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf) === null || _getSelf === void 0 ? void 0 : (_classPrivateFieldLoo39 = (_classPrivateFieldLoo40 = _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo39.call(_classPrivateFieldLoo40); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : (_classPrivateFieldLoo41 = (_classPrivateFieldLoo42 = _classPrivateFieldLooseBase(_ref6.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo41.call(_classPrivateFieldLoo42); + (_call = (_ref18 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo5 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref18.call(_classPrivateFieldLoo5)) === null || _call === void 0 ? void 0 : (_classPrivateFieldLoo43 = (_classPrivateFieldLoo44 = _classPrivateFieldLooseBase(_call.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo43.call(_classPrivateFieldLoo44); + (_getSelf2 = (_ref19 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf()) === null || _getSelf2 === void 0 ? void 0 : (_classPrivateFieldLoo45 = (_classPrivateFieldLoo46 = _classPrivateFieldLooseBase(_getSelf2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo45.call(_classPrivateFieldLoo46); + (_getSelf3 = (_ref20 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref20.getSelf == null ? void 0 : _ref20.getSelf()) === null || _getSelf3 === void 0 ? void 0 : (_classPrivateFieldLoo47 = (_classPrivateFieldLoo48 = _classPrivateFieldLooseBase(_getSelf3.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo47.call(_classPrivateFieldLoo48); + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo49 = (_classPrivateFieldLoo50 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo49.call(_classPrivateFieldLoo50); + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo51 = (_classPrivateFieldLoo52 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo51.call(_classPrivateFieldLoo52).toString; + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo53 = (_classPrivateFieldLoo54 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo53.call(_classPrivateFieldLoo54).toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : (_classPrivateFieldLoo55 = (_classPrivateFieldLoo56 = _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo55.call(_classPrivateFieldLoo56); + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : (_classPrivateFieldLoo57 = (_classPrivateFieldLoo58 = _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo57.call(_classPrivateFieldLoo58).toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : (_classPrivateFieldLoo59 = (_classPrivateFieldLoo60 = _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo59.call(_classPrivateFieldLoo60).toString(); + (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo6 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m]) == null ? void 0 : _ref21.call(_classPrivateFieldLoo6); + (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo7 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m]) == null ? void 0 : _ref22.call(_classPrivateFieldLoo7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : (_classPrivateFieldLoo61 = (_classPrivateFieldLoo62 = _classPrivateFieldLooseBase(_ref7.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo61.call(_classPrivateFieldLoo62); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : (_classPrivateFieldLoo63 = (_classPrivateFieldLoo64 = _classPrivateFieldLooseBase(_ref8.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo63.call(_classPrivateFieldLoo64); + (_self3 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref23.self) === null || _self3 === void 0 ? void 0 : (_classPrivateFieldLoo65 = (_classPrivateFieldLoo66 = _classPrivateFieldLooseBase(_self3.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo65.call(_classPrivateFieldLoo66); + (_ref24 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo8 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m]) == null ? void 0 : _ref24.call(_classPrivateFieldLoo8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo9 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : (_classPrivateFieldLoo67 = (_classPrivateFieldLoo68 = _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo9), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo67.call(_classPrivateFieldLoo68); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : (_classPrivateFieldLoo69 = (_classPrivateFieldLoo70 = _classPrivateFieldLooseBase(_ref10.getSelf(), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo69.call(_classPrivateFieldLoo70); + (_getSelf4 = (_ref25 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref25.getSelf) === null || _getSelf4 === void 0 ? void 0 : (_classPrivateFieldLoo71 = (_classPrivateFieldLoo72 = _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo71.call(_classPrivateFieldLoo72); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : (_classPrivateFieldLoo73 = (_classPrivateFieldLoo74 = _classPrivateFieldLooseBase(_ref12.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo73.call(_classPrivateFieldLoo74); + (_call2 = (_ref26 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo10 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref26.call(_classPrivateFieldLoo10)) === null || _call2 === void 0 ? void 0 : (_classPrivateFieldLoo75 = (_classPrivateFieldLoo76 = _classPrivateFieldLooseBase(_call2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo75.call(_classPrivateFieldLoo76); + (_getSelf5 = (_ref27 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref27.getSelf()) === null || _getSelf5 === void 0 ? void 0 : (_classPrivateFieldLoo77 = (_classPrivateFieldLoo78 = _classPrivateFieldLooseBase(_getSelf5.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo77.call(_classPrivateFieldLoo78); + (_getSelf6 = (_ref28 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref28.getSelf == null ? void 0 : _ref28.getSelf()) === null || _getSelf6 === void 0 ? void 0 : (_classPrivateFieldLoo79 = (_classPrivateFieldLoo80 = _classPrivateFieldLooseBase(_getSelf6.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo79.call(_classPrivateFieldLoo80); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js new file mode 100644 index 000000000000..16be28736749 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _classPrivateFieldLoo, _classPrivateFieldLoo2, _ref, _ref2, _self2, _classPrivateFieldLoo3, _classPrivateFieldLoo4, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo5, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _classPrivateFieldLoo6, _classPrivateFieldLoo7, _ref7, _ref8, _self3, _classPrivateFieldLoo8, _classPrivateFieldLoo9, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo10, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + _classPrivateFieldLooseBase(Foo, _m)[_m]?.(); + _classPrivateFieldLooseBase(Foo, _m)[_m]?.().toString; + _classPrivateFieldLooseBase(Foo, _m)[_m]?.().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.().toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m]?.(); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]?.().toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]?.().toString(); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m])?.call(_classPrivateFieldLoo); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m])?.call(_classPrivateFieldLoo2); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m]?.(); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m]?.(); + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m]?.(); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m])?.call(_classPrivateFieldLoo3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo4), _m)[_m]?.(); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m]?.(); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m]?.(); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m]?.(); + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo5 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo5)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m]?.(); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m]?.(); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m]?.(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.().toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m]?.(); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]?.().toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]?.().toString(); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo6 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m])?.call(_classPrivateFieldLoo6); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo7 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m])?.call(_classPrivateFieldLoo7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m]?.(); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m]?.(); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m]?.(); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo8 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m])?.call(_classPrivateFieldLoo8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo9 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo9), _m)[_m]?.(); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m]?.(); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m]?.(); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m]?.(); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo10 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo10)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m]?.(); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m]?.(); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m]?.(); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js new file mode 100644 index 000000000000..80f689342109 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo?.#m(); + o?.Foo?.#m().toString; + o?.Foo?.#m().toString(); + + deep?.very.o?.Foo?.#m(); + deep?.very.o?.Foo?.#m().toString; + deep?.very.o?.Foo?.#m().toString(); + + o?.Foo.#self?.#m(); + o?.Foo.#self.self?.#m(); + o?.Foo.#self?.self?.#m(); + o?.Foo.#self.self?.self?.#m(); + o?.Foo.#self?.self?.self?.#m(); + + o?.Foo.#self.getSelf()?.#m(); + o?.Foo.#self.getSelf?.()?.#m(); + o?.Foo.#self?.getSelf()?.#m(); + o?.Foo.#self?.getSelf?.()?.#m(); + o?.Foo.#self.getSelf()?.self?.#m(); + o?.Foo.#self.getSelf?.()?.self?.#m(); + o?.Foo.#self?.getSelf()?.self?.#m(); + o?.Foo.#self?.getSelf?.()?.self?.#m(); + + fn?.().Foo?.#m(); + fn?.().Foo?.#m().toString; + fn?.().Foo?.#m().toString(); + + fnDeep?.().very.o?.Foo?.#m(); + fnDeep?.().very.o?.Foo?.#m().toString; + fnDeep?.().very.o?.Foo?.#m().toString(); + + fn?.().Foo.#self?.#m(); + fn?.().Foo.#self.self?.#m(); + fn?.().Foo.#self?.self?.#m(); + fn?.().Foo.#self.self?.self?.#m(); + fn?.().Foo.#self?.self?.self?.#m(); + + fn?.().Foo.#self.getSelf()?.#m(); + fn?.().Foo.#self.getSelf?.()?.#m(); + fn?.().Foo.#self?.getSelf()?.#m(); + fn?.().Foo.#self?.getSelf?.()?.#m(); + fn?.().Foo.#self.getSelf()?.self?.#m(); + fn?.().Foo.#self.getSelf?.()?.self?.#m(); + fn?.().Foo.#self?.getSelf()?.self?.#m(); + fn?.().Foo.#self?.getSelf?.()?.self?.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json similarity index 58% rename from packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/options.json rename to packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json index 9a7eaaa890b3..124133b5af2b 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-with-transform/options.json +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json @@ -1,6 +1,6 @@ { "plugins": [ - "proposal-optional-chaining", + ["proposal-optional-chaining", { "loose": true }], ["proposal-class-properties", { "loose": true }] ] } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js new file mode 100644 index 000000000000..b4f91f63bf6c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m](); + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString(); + (_o$Foo = o == null ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _m)[_m](); + (_o$Foo2 = o == null ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _m)[_m]().toString; + (_o$Foo3 = o == null ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _m)[_m]().toString(); + (_deep$very$o$Foo = deep == null ? void 0 : (_deep$very$o = deep.very.o) == null ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _m)[_m](); + (_deep$very$o$Foo2 = deep == null ? void 0 : (_deep$very$o2 = deep.very.o) == null ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _m)[_m]().toString; + (_deep$very$o$Foo3 = deep == null ? void 0 : (_deep$very$o3 = deep.very.o) == null ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _m)[_m]().toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _m)[_m](); + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _m)[_m](); + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _m)[_m](); + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref9$self = _ref9.self) == null ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _m)[_m](); + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref10.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _m)[_m](); + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _m)[_m](); + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref12.getSelf == null ? void 0 : _ref12.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _m)[_m](); + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _m)[_m](); + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref14$call = _ref14.call(_classPrivateFieldLoo2)) == null ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _m)[_m](); + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref15$getSelf = _ref15.getSelf()) == null ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _m)[_m](); + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf == null ? void 0 : (_ref16$getSelf = _ref16.getSelf()) == null ? void 0 : _ref16$getSelf.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _m)[_m](); + (_fn$Foo = fn == null ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _m)[_m](); + (_fn$Foo2 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _m)[_m]().toString; + (_fn$Foo3 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _m)[_m]().toString(); + (_fnDeep$very$o$Foo = fnDeep == null ? void 0 : (_fnDeep$very$o = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _m)[_m](); + (_fnDeep$very$o$Foo2 = fnDeep == null ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _m)[_m]().toString; + (_fnDeep$very$o$Foo3 = fnDeep == null ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _m)[_m]().toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _m)[_m](); + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _m)[_m](); + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _m)[_m](); + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _m)[_m](); + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref19$self = _ref19.self) == null ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _m)[_m](); + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _m)[_m](); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _m)[_m](); + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _m)[_m](); + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _m)[_m](); + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _m)[_m](); + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref24$call = _ref24.call(_classPrivateFieldLoo4)) == null ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _m)[_m](); + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref25$getSelf = _ref25.getSelf()) == null ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _m)[_m](); + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref26.getSelf == null ? void 0 : (_ref26$getSelf = _ref26.getSelf()) == null ? void 0 : _ref26$getSelf.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js new file mode 100644 index 000000000000..a5c222687ee8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js new file mode 100644 index 000000000000..dfb6357ed971 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m](); + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m](); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m](); + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _m)[_m](); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m](); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m](); + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m](); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m](); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m](); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _m)[_m](); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m](); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m](); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js new file mode 100644 index 000000000000..968eeaf3cb44 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js @@ -0,0 +1,69 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js new file mode 100644 index 000000000000..b1ede3a8c4c9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js @@ -0,0 +1,90 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x]; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString(); + (_o$Foo = o == null ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _x)[_x]; + (_o$Foo2 = o == null ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _x)[_x].toString; + (_o$Foo3 = o == null ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _x)[_x].toString(); + (_deep$very$o$Foo = deep == null ? void 0 : (_deep$very$o = deep.very.o) == null ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _x)[_x]; + (_deep$very$o$Foo2 = deep == null ? void 0 : (_deep$very$o2 = deep.very.o) == null ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _x)[_x].toString; + (_deep$very$o$Foo3 = deep == null ? void 0 : (_deep$very$o3 = deep.very.o) == null ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _x)[_x].toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _x)[_x]; + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _x)[_x]; + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _x)[_x]; + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref9$self = _ref9.self) == null ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _x)[_x]; + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref10.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _x)[_x]; + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _x)[_x]; + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref12.getSelf == null ? void 0 : _ref12.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _x)[_x]; + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _x)[_x]; + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref14$call = _ref14.call(_classPrivateFieldLoo2)) == null ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _x)[_x]; + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref15$getSelf = _ref15.getSelf()) == null ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _x)[_x]; + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf == null ? void 0 : (_ref16$getSelf = _ref16.getSelf()) == null ? void 0 : _ref16$getSelf.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _x)[_x]; + (_fn$Foo = fn == null ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _x)[_x]; + (_fn$Foo2 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _x)[_x].toString; + (_fn$Foo3 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _x)[_x].toString(); + (_fnDeep$very$o$Foo = fnDeep == null ? void 0 : (_fnDeep$very$o = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _x)[_x]; + (_fnDeep$very$o$Foo2 = fnDeep == null ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _x)[_x].toString; + (_fnDeep$very$o$Foo3 = fnDeep == null ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _x)[_x].toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _x)[_x]; + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _x)[_x]; + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _x)[_x]; + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _x)[_x]; + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref19$self = _ref19.self) == null ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _x)[_x]; + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _x)[_x]; + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _x)[_x]; + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _x)[_x]; + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _x)[_x]; + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _x)[_x]; + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref24$call = _ref24.call(_classPrivateFieldLoo4)) == null ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _x)[_x]; + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref25$getSelf = _ref25.getSelf()) == null ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _x)[_x]; + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref26.getSelf == null ? void 0 : (_ref26$getSelf = _ref26.getSelf()) == null ? void 0 : _ref26$getSelf.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js new file mode 100644 index 000000000000..aecba329a27a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js new file mode 100644 index 000000000000..d3912701eb1a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js @@ -0,0 +1,90 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x]; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString(); + (_o$Foo = o?.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _x)[_x]; + (_o$Foo2 = o?.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _x)[_x].toString; + (_o$Foo3 = o?.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _x)[_x].toString(); + (_deep$very$o$Foo = deep?.very.o?.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _x)[_x]; + (_deep$very$o$Foo2 = deep?.very.o?.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _x)[_x].toString; + (_deep$very$o$Foo3 = deep?.very.o?.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _x)[_x].toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _x)[_x]; + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _x)[_x]; + (_self3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self)?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _x)[_x]; + (_self$self = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self?.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _x)[_x]; + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _x)[_x]; + (_getSelf = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _x)[_x]; + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _x)[_x]; + (_self4 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf())?.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _x)[_x]; + (_call$self = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)?.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _x)[_x]; + (_getSelf$self = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()?.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _x)[_x]; + (_getSelf$self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()?.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _x)[_x]; + (_fn$Foo = fn?.().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _x)[_x]; + (_fn$Foo2 = fn?.().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _x)[_x].toString; + (_fn$Foo3 = fn?.().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _x)[_x].toString(); + (_fnDeep$very$o$Foo = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _x)[_x]; + (_fnDeep$very$o$Foo2 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _x)[_x].toString; + (_fnDeep$very$o$Foo3 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _x)[_x].toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _x)[_x]; + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _x)[_x]; + (_self5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _x)[_x]; + (_self6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self)?.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _x)[_x]; + (_self$self2 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self?.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _x)[_x]; + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _x)[_x]; + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _x)[_x]; + (_getSelf3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _x)[_x]; + (_getSelf4 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _x)[_x]; + (_self7 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf())?.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _x)[_x]; + (_call$self2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)?.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _x)[_x]; + (_getSelf$self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()?.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _x)[_x]; + (_getSelf$self4 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()?.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test();